HWM_MGRewardsStats

Статистика золота и элементов, полученных в ГН

اعتبارا من 29-12-2017. شاهد أحدث إصدار.

// ==UserScript==
// @name         HWM_MGRewardsStats
// @namespace    Небылица
// @version      1.01
// @description  Статистика золота и элементов, полученных в ГН
// @author       Небылица
// @include      /^https{0,1}:\/\/((www|qrator)\.heroeswm\.ru|178\.248\.235\.15)\/mercenary_guild\.php/
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

(function() {
    "use strict";

    // Вспомогательные функции
    function sendGETRequest(url, mimeType, callback){ // Универсалка для отправки GET-запроса к url с выставлением заданного MIME Type и исполнением функции callback при получении ответа
        var xhr = new XMLHttpRequest();
        xhr.open("GET", url, true);

        if (typeof mimeType === "string"){
            xhr.overrideMimeType(mimeType);
        }

        if (typeof callback === "function"){
            xhr.onreadystatechange = function(){
                if (xhr.readyState === 4 && xhr.status === 200){
                    callback.apply(xhr);
                }
            };
        }

        xhr.send();
    }
    function saveToFile(data, filename, type){ // Сохраняет данные data в файл с именем filename, используя blob-объект с типом type (на базе https://stackoverflow.com/a/30832210)
        var file = new Blob([data], {type: type});
        if (window.navigator.msSaveOrOpenBlob){ // IE10+
            window.navigator.msSaveOrOpenBlob(file, filename);
        } else{ // Others
            var a = document.createElement("a"),
                url = URL.createObjectURL(file);
            a.href = url;
            a.download = filename;
            document.body.appendChild(a);
            a.click();
            setTimeout(function(){
                document.body.removeChild(a);
                window.URL.revokeObjectURL(url);
            }, 0);
        }
    }
    function addLeadingZero(string){ // Вставляет ведущий ноль в строку с элементом даты/времени, если в ней только 1 цифра
        string = string.toString();
        if (string.length === 1){string = "0" + string;}
        return string;
    }
    //


    // Забиваем дефолтные значения в хранилище
    if (GM_getValue("dataCollectionSince") === undefined){ // дата начала сбора статистики
        var currentMoment = new Date(),
            currentMomentOnServer = new Date(Date.now() + currentMoment.getTimezoneOffset()*60000 + 10800000);

        GM_setValue("dataCollectionSince",
                    addLeadingZero(currentMomentOnServer.getDate()) + "." +
                    addLeadingZero((currentMomentOnServer.getMonth() + 1)) + "." +
                    currentMomentOnServer.getFullYear().toString().slice(2, 4) + " " +
                    addLeadingZero(currentMomentOnServer.getHours()) + ":" +
                    addLeadingZero(currentMomentOnServer.getMinutes())
                   );
    }
    if (GM_getValue("rewardsList") === undefined){GM_setValue("rewardsList", "");} // полный список наград

    if (GM_getValue("tasksTotal") === undefined){GM_setValue("tasksTotal", 0);} // общее число заданий
    if (GM_getValue("tasksAccomplished") === undefined){GM_setValue("tasksAccomplished", 0);} // успешно выполненных
    if (GM_getValue("tasksFailed") === undefined){GM_setValue("tasksFailed", 0);} // проваленных

    if (GM_getValue("goldTotal") === undefined){GM_setValue("goldTotal", 0);} // всего золота получено
    if (GM_getValue("elementsTotal") === undefined){GM_setValue("elementsTotal", 0);} // всего элементов получено
    if (GM_getValue("elementsDouble") === undefined){GM_setValue("elementsDouble", 0);} // двойных выпадений

    // счётчики полученного золота по типам заданий
    if (GM_getValue("goldFromArmies") === undefined){GM_setValue("goldFromArmies", 0);} // армии
    if (GM_getValue("goldFromConspirators") === undefined){GM_setValue("goldFromConspirators", 0);} // заговорщики
    if (GM_getValue("goldFromInvaders") === undefined){GM_setValue("goldFromInvaders", 0);} // захватчики
    if (GM_getValue("goldFromMonsters") === undefined){GM_setValue("goldFromMonsters", 0);} // монстры
    if (GM_getValue("goldFromRaids") === undefined){GM_setValue("goldFromRaids", 0);} // набеги
    if (GM_getValue("goldFromVanguards") === undefined){GM_setValue("goldFromVanguards", 0);} // отряды
    if (GM_getValue("goldFromBrigands") === undefined){GM_setValue("goldFromBrigands", 0);} // разбойники

    // счётчики выполненных заданий по типам
    if (GM_getValue("accomplishedArmies") === undefined){GM_setValue("accomplishedArmies", 0);} // армии
    if (GM_getValue("accomplishedConspirators") === undefined){GM_setValue("accomplishedConspirators", 0);} // заговорщики
    if (GM_getValue("accomplishedInvaders") === undefined){GM_setValue("accomplishedInvaders", 0);} // захватчики
    if (GM_getValue("accomplishedMonsters") === undefined){GM_setValue("accomplishedMonsters", 0);} // монстры
    if (GM_getValue("accomplishedRaids") === undefined){GM_setValue("accomplishedRaids", 0);} // набеги
    if (GM_getValue("accomplishedVanguards") === undefined){GM_setValue("accomplishedVanguards", 0);} // отряды
    if (GM_getValue("accomplishedBrigands") === undefined){GM_setValue("accomplishedBrigands", 0);} // разбойники

    // счётчики полученных элементов по типам
    if (GM_getValue("gainedAbrasives") === undefined){GM_setValue("gainedAbrasives", 0);} // арбазивы
    if (GM_getValue("gainedViperVenoms") === undefined){GM_setValue("gainedViperVenoms", 0);} // змеиные яды
    if (GM_getValue("gainedTigerClaws") === undefined){GM_setValue("gainedTigerClaws", 0);} // клыки тигра
    if (GM_getValue("gainedIceCrystals") === undefined){GM_setValue("gainedIceCrystals", 0);} // ледяные кристаллы
    if (GM_getValue("gainedMoonstones") === undefined){GM_setValue("gainedMoonstones", 0);} // лунные камни
    if (GM_getValue("gainedFireCrystals") === undefined){GM_setValue("gainedFireCrystals", 0);} // огненные кристаллы
    if (GM_getValue("gainedMeteoriteShards") === undefined){GM_setValue("gainedMeteoriteShards", 0);} // осколки метеорита
    if (GM_getValue("gainedWitchBlooms") === undefined){GM_setValue("gainedWitchBlooms", 0);} // цветки ведьм
    if (GM_getValue("gainedWindflowers") === undefined){GM_setValue("gainedWindflowers", 0);} // цветки ветров
    if (GM_getValue("gainedFernFlowers") === undefined){GM_setValue("gainedFernFlowers", 0);} // цветки папоротника
    if (GM_getValue("gainedToadstools") === undefined){GM_setValue("gainedToadstools", 0);} // ядовитые грибы
    //


    var documentInnerHTHL = document.documentElement.innerHTML,
        currentTask = GM_getValue("currentTask");
    // Код для страницы принятого задания
    if (documentInnerHTHL.indexOf("минут") !== -1 && documentInnerHTHL.indexOf("Принять") === -1 && documentInnerHTHL.indexOf("Вы еще не приняли это задание") === -1){
        // получаем и запоминаем текущее задание
        var currentTaskArr = documentInnerHTHL.match(/'<b>(.+?)<\/b>/);
        if (currentTaskArr !== null){
            GM_setValue("currentTask", currentTaskArr[1]);
        }
    } else if (documentInnerHTHL.indexOf("мин.") === -1){ // если ни принятого, ни сданного (но ещё не обсчитанного) задания нет, то стираем сохранённое значение
        GM_setValue("currentTask", "-1");
    }


    // Код для страницы сданного задания (с защитой от двойного прогона при обновлении страницы до появления нового)
    if (documentInnerHTHL.indexOf("мин.") !== -1 && currentTask !== "-1"){
        // увеличиваем счётчик сданных заданий
        GM_setValue("tasksTotal", GM_getValue("tasksTotal") + 1);

        // получаем текст награды (без статуса)
        var rewardArr = documentInnerHTHL.match(/<b>Вы\sполучаете\s(.+?)<\/b>/);
        if (rewardArr !== null){ // если награда есть
            var reward = rewardArr[1];

            // увеличиваем счётчик успешно выполненных заданий
            GM_setValue("tasksAccomplished", GM_getValue("tasksAccomplished") + 1);

            // увеличиваем кол-во полученного золота
            var gainedGold = parseInt(reward.match(/([\d]+?)\sзолота/)[1]);
            GM_setValue("goldTotal", GM_getValue("goldTotal") + gainedGold);

            // получаем тип задания
            var taskTypeArr = (currentTask !== undefined) ? currentTask.match(/(Армия|заговорщики|захватчики|монстр|набеги|Отряд|разбойники)/) : null,
                subKey = "";

            if (taskTypeArr !== null){
                // выставляем кусок ключа в зависимости от типа задания
                switch (taskTypeArr[1]){
                    case "Армия": subKey = "Armies";
                        break;

                    case "заговорщики": subKey = "Conspirators";
                        break;

                    case "захватчики": subKey = "Invaders";
                        break;

                    case "монстр": subKey = "Monsters";
                        break;

                    case "набеги": subKey = "Raids";
                        break;

                    case "Отряд": subKey = "Vanguards";
                        break;

                    case "разбойники": subKey = "Brigands";
                }

                // увеличиваем пару переменных (сумму полученного золота и счётчик выполненных), соответствующих типу задания
                if (subKey !== ""){
                    GM_setValue("goldFrom" + subKey, GM_getValue("goldFrom" + subKey) + gainedGold);
                    GM_setValue("accomplished" + subKey, GM_getValue("accomplished" + subKey) + 1);
                }
            }

            // получаем выпавшие элементы
            var gainedElementsArr = reward.match(/(абразив|змеиный\sяд|клык\sтигра|ледяной\sкристалл|лунный\sкамень|огненный\sкристалл|осколок\sметеорита|цветок\sведьм|цветок\sветров|цветок\sпапоротника|ядовитый\sгриб)/g);
            if (gainedElementsArr !== null){ // если элементы есть
                var gainedElementsNumber = gainedElementsArr.length;
                // увеличиваем общий счётчик выпавших элементов
                GM_setValue("elementsTotal", GM_getValue("elementsTotal") + gainedElementsNumber);

                // если выпало 2 элемента, то увеличиваем счётчик двойных
                if (gainedElementsNumber === 2){
                    GM_setValue("elementsDouble", GM_getValue("elementsDouble") + 1);
                }

                // цикл по массиву с элементами
                var i,
                    maxI = gainedElementsNumber;
                subKey = "";
                for (i=0;i<maxI;i++){
                    // выставляем кусок ключа в зависимости от типа элемента
                    switch (gainedElementsArr[i]){
                        case "абразив": subKey = "Abrasives";
                            break;

                        case "змеиный яд": subKey = "ViperVenoms";
                            break;

                        case "клык тигра": subKey = "TigerClaws";
                            break;

                        case "ледяной кристалл": subKey = "IceCrystals";
                            break;

                        case "лунный камень": subKey = "Moonstones";
                            break;

                        case "огненный кристалл": subKey = "FireCrystals";
                            break;

                        case "осколок метеорита": subKey = "MeteoriteShards";
                            break;

                        case "цветок ведьм": subKey = "WitchBlooms";
                            break;

                        case "цветок ветров": subKey = "Windflowers";
                            break;

                        case "цветок папоротника": subKey = "FernFlowers";
                            break;

                        case "ядовитый гриб": subKey = "Toadstools";
                    }

                    // увеличиваем счётчик выпадений соответствующего элемента
                    if (subKey !== ""){
                        GM_setValue("gained" + subKey, GM_getValue("gained" + subKey) + 1);
                    }
                }
            }

            // запрашиваем домашнюю страницу
            sendGETRequest("home.php", "text/html; charset=windows-1251", function(){
                // получаем номер выполненного задания
                var response = this.responseText,
                    taskNumberArr = response.match(/Гильдия\sНаемников:\s[\d]{1,2}\s\(([\d]+?)\)/),
                    taskNumber = (taskNumberArr !== null) ? taskNumberArr[1] : "",
                    rewardsList = GM_getValue("rewardsList");

                // записываем в хранилище строчку для очередной награды
                if (rewardsList !== ""){
                    GM_setValue("rewardsList", taskNumber + ": " + reward + " за '" + currentTask + "'" + "&#10;" + rewardsList);
                } else{
                    GM_setValue("rewardsList", taskNumber + ": " + reward + " за '" + currentTask + "'");
                }
            });
        } else{ // если награды нет
            // увеличиваем счётчик проваленных заданий
            GM_setValue("tasksFailed", GM_getValue("tasksFailed") + 1);
        }

        // забываем текущее задание
        GM_setValue("currentTask", "-1");
    }


    // Код отображения статистики
    var MGRewardsStatsHeaderDiv = document.createElement("div"); // создаём элемент для вставки
    MGRewardsStatsHeaderDiv.setAttribute("id", "MGRewardsStatsHeaderDiv"); // задаём ему id

    // вводим переменные для доступа к значениям из хранилища
    var rewardsList,

        tasksTotal = GM_getValue("tasksTotal"),
        tasksAccomplished = GM_getValue("tasksAccomplished"),
        tasksFailed = GM_getValue("tasksFailed"),

        goldTotal = GM_getValue("goldTotal"),
        elementsTotal = GM_getValue("elementsTotal"),
        elementsDouble = GM_getValue("elementsDouble"),

        goldFromArmies = GM_getValue("goldFromArmies"),
        goldFromConspirators = GM_getValue("goldFromConspirators"),
        goldFromInvaders = GM_getValue("goldFromInvaders"),
        goldFromMonsters = GM_getValue("goldFromMonsters"),
        goldFromRaids = GM_getValue("goldFromRaids"),
        goldFromVanguards = GM_getValue("goldFromVanguards"),
        goldFromBrigands = GM_getValue("goldFromBrigands"),

        accomplishedArmies = GM_getValue("accomplishedArmies"),
        accomplishedConspirators = GM_getValue("accomplishedConspirators"),
        accomplishedInvaders = GM_getValue("accomplishedInvaders"),
        accomplishedMonsters = GM_getValue("accomplishedMonsters"),
        accomplishedRaids = GM_getValue("accomplishedRaids"),
        accomplishedVanguards = GM_getValue("accomplishedVanguards"),
        accomplishedBrigands = GM_getValue("accomplishedBrigands"),

        gainedAbrasives = GM_getValue("gainedAbrasives"),
        gainedViperVenoms = GM_getValue("gainedViperVenoms"),
        gainedTigerClaws = GM_getValue("gainedTigerClaws"),
        gainedIceCrystals = GM_getValue("gainedIceCrystals"),
        gainedMoonstones = GM_getValue("gainedMoonstones"),
        gainedFireCrystals = GM_getValue("gainedFireCrystals"),
        gainedMeteoriteShards = GM_getValue("gainedMeteoriteShards"),
        gainedWitchBlooms = GM_getValue("gainedWitchBlooms"),
        gainedWindflowers = GM_getValue("gainedWindflowers"),
        gainedFernFlowers = GM_getValue("gainedFernFlowers"),
        gainedToadstools = GM_getValue("gainedToadstools");

    // собираем строчки с дополнительной информацией в скобках при различных показателях
    var tasksAccomplishedPercentageString = (tasksTotal !== 0) ? " (" + Math.round(tasksAccomplished/tasksTotal*100) + "%)" : "",
        tasksFailedPercentageString = (tasksTotal !== 0) ? " (" + Math.round(tasksFailed/tasksTotal*100) + "%)" : "",
        goldTotalPerTaskString = (tasksAccomplished !== 0) ? " (" + Math.round(goldTotal/tasksAccomplished) + "/зад.)" : "",
        elementsTotalPercentageString = (tasksAccomplished !== 0) ? " (<span title='Шанс на получение хотя бы одного элемента с задания'>" + Math.round((elementsTotal-elementsDouble)/tasksAccomplished*100) + "%</span>; <span title='Среднее количество элементов на задание (с учётом двойных)'>" + (elementsTotal/tasksAccomplished).toFixed(2) + "</span>)" : "",
        elementsDoublePercentageString = (tasksAccomplished !== 0) ? " (<span title='Шанс на двойное выпадение элементов в расчёте на задание'>" + (elementsDouble/tasksAccomplished*100).toFixed(2) + "%</span>)" : "",

        goldFromArmiesPerTaskString = (accomplishedArmies !== 0) ? " (" + Math.round(goldFromArmies/accomplishedArmies) + "/зад.)" : "",
        goldFromConspiratorsPerTaskString = (accomplishedConspirators !== 0) ? " (" + Math.round(goldFromConspirators/accomplishedConspirators) + "/зад.)" : "",
        goldFromInvadersPerTaskString = (accomplishedInvaders !== 0) ? " (" + Math.round(goldFromInvaders/accomplishedInvaders) + "/зад.)" : "",
        goldFromMonstersPerTaskString = (accomplishedMonsters !== 0) ? " (" + Math.round(goldFromMonsters/accomplishedMonsters) + "/зад.)" : "",
        goldFromRaidsPerTaskString = (accomplishedRaids !== 0) ? " (" + Math.round(goldFromRaids/accomplishedRaids) + "/зад.)" : "",
        goldFromVanguardsPerTaskString = (accomplishedVanguards !== 0) ? " (" + Math.round(goldFromVanguards/accomplishedVanguards) + "/зад.)" : "",
        goldFromBrigandsPerTaskString = (accomplishedBrigands !== 0) ? " (" + Math.round(goldFromBrigands/accomplishedBrigands) + "/зад.)" : "",

        gainedAbrasivesPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedAbrasives/elementsTotal*100) + "%)" : "",
        gainedViperVenomsPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedViperVenoms/elementsTotal*100) + "%)" : "",
        gainedTigerClawsPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedTigerClaws/elementsTotal*100) + "%)" : "",
        gainedIceCrystalsPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedIceCrystals/elementsTotal*100) + "%)" : "",
        gainedMoonstonesPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedMoonstones/elementsTotal*100) + "%)" : "",
        gainedFireCrystalsPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedFireCrystals/elementsTotal*100) + "%)" : "",
        gainedMeteoriteShardsPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedMeteoriteShards/elementsTotal*100) + "%)" : "",
        gainedWitchBloomsPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedWitchBlooms/elementsTotal*100) + "%)" : "",
        gainedWindflowersPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedWindflowers/elementsTotal*100) + "%)" : "",
        gainedFernFlowersPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedFernFlowers/elementsTotal*100) + "%)" : "",
        gainedToadstoolsPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedToadstools/elementsTotal*100) + "%)" : "";

    // задаём код элемента для вставки
    MGRewardsStatsHeaderDiv.innerHTML =
        "<style>" +

        "#MGRewardsStatsHeaderDiv{" +
        "margin: 7px 0px 5px 0px;" +
        "text-align: center;" +
        "}" +

        "#MGRewardsStatsHeaderTitleShowHide, #MGRewardsStatsInnerDiv2TitleShowHide, #MGRewardsStatsInnerDiv3TitleShowHide, #MGRewardsStatsInnerDiv4TitleShowHide, #MGRewardsStatsInnerDiv4TitleExportToFile{" +
        "color: blue;" +
        "cursor: pointer;" +
        "}" +

        "#MGRewardsStatsInnerDiv1{" +
        "margin: 5px 0px 15px 0px;" +
        "}" +

        "#MGRewardsStatsInnerDiv2InnerContainer, #MGRewardsStatsInnerDiv3InnerContainer, #MGRewardsStatsInnerDiv4InnerContainer{" +
        "margin: 5px 0px 5px 0px;" +
        "}" +

        "#MGRewardsStatsInnerDiv4InnerContainer{" +
        "padding: 0% 20% 0% 20%;" +
        "text-align: left;" +
        "white-space: pre-wrap;" +
        "}" +

        ".MGRewardsStatsInnerSpanLeft{" +
        "display: inline-block;" +
        "width: 53%;" +
        "text-align: right;" +
        "}" +

        ".MGRewardsStatsInnerSpanRight{" +
        "display: inline-block;" +
        "width: 47%;" +
        "text-align: left;" +
        "}" +

        "</style>" +


        "<hr width='90%'>" +
        "<div id='MGRewardsStatsHeaderTitle'>" +

        "<b>Статистика наград ГН</b>: " +
        "<font id='MGRewardsStatsHeaderTitleShowHide'>" +
        "показать информацию" +
        "</font>" +

        "</div>" +

        "<div id='MGRewardsStatsInnerContainer'>" +


        "<div id='MGRewardsStatsInnerDiv1'>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Сдано заданий: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + tasksTotal + "</b></span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Выполнено: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + tasksAccomplished + "</b>" + tasksAccomplishedPercentageString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Провалено: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + tasksFailed + "</b>" + tasksFailedPercentageString + "</span><br>" +
        "<br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Золота получено: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldTotal + "</b>" + goldTotalPerTaskString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Элементов: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + elementsTotal + "</b>" + elementsTotalPercentageString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Двойных: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + elementsDouble + "</b>" + elementsDoublePercentageString + "</span><br>" +
        "<br>" +
        "<font size='1'>Сбор данных идёт с " + GM_getValue("dataCollectionSince") + "</font>" +
        "</div>" +


        "<div id='MGRewardsStatsInnerDiv2'>" +

        "<div id='MGRewardsStatsInnerDiv2Title'>" +
        "<span class='MGRewardsStatsInnerSpanLeft'><b>Золото по заданиям</b>: </span><span class='MGRewardsStatsInnerSpanRight'>" + "<font id='MGRewardsStatsInnerDiv2TitleShowHide'>" +
        "показать" +
        "</font></span>" +
        "</div>" +

        "<div id='MGRewardsStatsInnerDiv2InnerContainer'>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Армии: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldFromArmies + "</b>" + goldFromArmiesPerTaskString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Заговорщики: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldFromConspirators + "</b>" + goldFromConspiratorsPerTaskString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Захватчики: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldFromInvaders + "</b>" + goldFromInvadersPerTaskString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Монстры: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldFromMonsters + "</b>" + goldFromMonstersPerTaskString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Набеги: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldFromRaids + "</b>" + goldFromRaidsPerTaskString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Отряды: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldFromVanguards + "</b>" + goldFromVanguardsPerTaskString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Разбойники: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldFromBrigands + "</b>" + goldFromBrigandsPerTaskString + "</span><br>" +
        "</div>" +

        "</div>" +


        "<div id='MGRewardsStatsInnerDiv3'>" +

        "<div id='MGRewardsStatsInnerDiv3Title'>" +
        "<span class='MGRewardsStatsInnerSpanLeft'><b>Элементы по видам</b>: </span><span class='MGRewardsStatsInnerSpanRight'>" + "<font id='MGRewardsStatsInnerDiv3TitleShowHide'>" +
        "показать" +
        "</font></span>" +
        "</div>" +

        "<div id='MGRewardsStatsInnerDiv3InnerContainer'>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Абразив: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedAbrasives + "</b>" + gainedAbrasivesPercentageString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Змеиный яд: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedViperVenoms + "</b>" + gainedViperVenomsPercentageString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Клык тигра: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedTigerClaws + "</b>" + gainedTigerClawsPercentageString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Ледяной кристалл: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedIceCrystals + "</b>" + gainedIceCrystalsPercentageString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Лунный камень: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedMoonstones + "</b>" + gainedMoonstonesPercentageString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Огненный кристалл: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedFireCrystals + "</b>" + gainedFireCrystalsPercentageString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Осколок метеорита: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedMeteoriteShards + "</b>" + gainedMeteoriteShardsPercentageString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Цветок ведьм: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedWitchBlooms + "</b>" + gainedWitchBloomsPercentageString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Цветок ветров: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedWindflowers + "</b>" + gainedWindflowersPercentageString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Цветок папоротника: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedFernFlowers + "</b>" + gainedFernFlowersPercentageString + "</span><br>" +
        "<span class='MGRewardsStatsInnerSpanLeft'>Ядовитый гриб: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedToadstools + "</b>" + gainedToadstoolsPercentageString + "</span><br>" +
        "</div>" +

        "</div>" +


        "<div id='MGRewardsStatsInnerDiv4'>" +

        "<div id='MGRewardsStatsInnerDiv4Title'>" +
        "<span class='MGRewardsStatsInnerSpanLeft'><b>Полный список наград</b>: </span><span class='MGRewardsStatsInnerSpanRight'>" +
        "<font id='MGRewardsStatsInnerDiv4TitleShowHide'>" +
        "показать" +
        "</font>" +
        " / " +
        "<font id='MGRewardsStatsInnerDiv4TitleExportToFile'>" +
        "сохранить в файл" +
        "</font>" +
        "</span>" +
        "</div>" +

        "<div id='MGRewardsStatsInnerDiv4InnerContainer'>" +
        "</div>" +

        "</div>" +


        "</div>";

    // увеличиваем отступ на странице сданного задания и при наличии доступного, но не просмотренного задания и нахождении в другом районе
    if (documentInnerHTHL.indexOf("мин.") !== -1 || documentInnerHTHL.indexOf("Для Вас есть задание") !== -1){
        MGRewardsStatsHeaderDiv.style.margin = "20px 0px 5px 0px";
    }
    // убираем дублирование горизонтальной линии при просмотре из другого района страницы сданного задания (без награды, с таймером до нового)
    if (documentInnerHTHL.indexOf("Вы находитесь в другом районе") !== -1 && documentInnerHTHL.indexOf("минут") === -1 && documentInnerHTHL.indexOf("Для Вас есть задание") === -1){
        var hr = document.querySelector("hr[width='90%']");
        hr.parentNode.removeChild(hr);
    }

    // вставляем элемент в страницу
    document.querySelector("td[rowspan='2']").appendChild(MGRewardsStatsHeaderDiv);

    // задаём переменные для доступа к добавленным элементам
    var MGRewardsStatsInnerContainer = document.getElementById("MGRewardsStatsInnerContainer"),
        MGRewardsStatsHeaderTitleShowHide = document.getElementById("MGRewardsStatsHeaderTitleShowHide"),

        MGRewardsStatsInnerDiv2InnerContainer = document.getElementById("MGRewardsStatsInnerDiv2InnerContainer"),
        MGRewardsStatsInnerDiv2TitleShowHide = document.getElementById("MGRewardsStatsInnerDiv2TitleShowHide"),

        MGRewardsStatsInnerDiv3InnerContainer = document.getElementById("MGRewardsStatsInnerDiv3InnerContainer"),
        MGRewardsStatsInnerDiv3TitleShowHide = document.getElementById("MGRewardsStatsInnerDiv3TitleShowHide"),

        MGRewardsStatsInnerDiv4InnerContainer = document.getElementById("MGRewardsStatsInnerDiv4InnerContainer"),
        MGRewardsStatsInnerDiv4TitleShowHide = document.getElementById("MGRewardsStatsInnerDiv4TitleShowHide"),
        MGRewardsStatsInnerDiv4TitleExportToFile = document.getElementById("MGRewardsStatsInnerDiv4TitleExportToFile");

    // по умолчанию скрываем внутренние блоки
    MGRewardsStatsInnerContainer.style.display = "none";
    MGRewardsStatsInnerDiv2InnerContainer.style.display = "none";
    MGRewardsStatsInnerDiv3InnerContainer.style.display = "none";
    MGRewardsStatsInnerDiv4InnerContainer.style.display = "none";

    // вешаем событие по клику на "показать/скрыть информацию" в заголовке главного информационного блока статистики
    MGRewardsStatsHeaderTitleShowHide.onclick = function(){
        // если скрыто, то показываем; если открыто, то скрываем; ставим соответствующий текст на кнопке
        if (MGRewardsStatsInnerContainer.style.display === "none"){
            MGRewardsStatsInnerContainer.style.display = "block";
            MGRewardsStatsHeaderTitleShowHide.innerHTML = "скрыть информацию";
        } else{
            MGRewardsStatsInnerContainer.style.display = "none";
            MGRewardsStatsHeaderTitleShowHide.innerHTML = "показать информацию";
        }
    };

    // задаём события по клику на "показать/скрыть" в заголовках внутренних блоков
    MGRewardsStatsInnerDiv2TitleShowHide.onclick = function(){
        // если скрыто, то показываем; если открыто, то скрываем; ставим соответствующий текст на кнопке
        if (MGRewardsStatsInnerDiv2InnerContainer.style.display === "none"){
            MGRewardsStatsInnerDiv2InnerContainer.style.display = "block";
            MGRewardsStatsInnerDiv2TitleShowHide.innerHTML = "скрыть";
        } else{
            MGRewardsStatsInnerDiv2InnerContainer.style.display = "none";
            MGRewardsStatsInnerDiv2TitleShowHide.innerHTML = "показать";
        }
    };

    MGRewardsStatsInnerDiv3TitleShowHide.onclick = function(){
        // если скрыто, то показываем; если открыто, то скрываем; ставим соответствующий текст на кнопке
        if (MGRewardsStatsInnerDiv3InnerContainer.style.display === "none"){
            MGRewardsStatsInnerDiv3InnerContainer.style.display = "block";
            MGRewardsStatsInnerDiv3TitleShowHide.innerHTML = "скрыть";
        } else{
            MGRewardsStatsInnerDiv3InnerContainer.style.display = "none";
            MGRewardsStatsInnerDiv3TitleShowHide.innerHTML = "показать";
        }
    };

    MGRewardsStatsInnerDiv4TitleShowHide.onclick = function(){
        rewardsList = GM_getValue("rewardsList");
        // задаём код элемента; если скрыт, то показываем; если открыт, то скрываем; ставим соответствующий текст на кнопке
        if (MGRewardsStatsInnerDiv4InnerContainer.style.display === "none"){
            if (rewardsList !== ""){ // вставляем плейсхолдер при отсутствии сохранённых наград
                MGRewardsStatsInnerDiv4InnerContainer.innerHTML = rewardsList;
            } else{
                MGRewardsStatsInnerDiv4InnerContainer.style.padding = "0px";
                MGRewardsStatsInnerDiv4InnerContainer.innerHTML = "<center>(пока не сохранено ни одной награды)</center>";
            }

            MGRewardsStatsInnerDiv4InnerContainer.style.display = "block";
            MGRewardsStatsInnerDiv4TitleShowHide.innerHTML = "скрыть";
        } else{
            MGRewardsStatsInnerDiv4InnerContainer.style.display = "none";
            MGRewardsStatsInnerDiv4TitleShowHide.innerHTML = "показать";
        }
    };

    // вешаем событие по клику на "сохранить в файл" в заголовке блока с полным списком наград
    MGRewardsStatsInnerDiv4TitleExportToFile.onclick = function(){
        rewardsList = GM_getValue("rewardsList");
        // получаем текущую дату в формате dd-mm-yy и сохраняем список наград в txt-файл
        var currentMoment = new Date(),
            currentMomentOnServer = new Date(Date.now() + currentMoment.getTimezoneOffset()*60000 + 10800000),

            filename =
            "Статистика наград ГН " +
            addLeadingZero(currentMomentOnServer.getDate()) + "-" +
            addLeadingZero(currentMomentOnServer.getMonth() + 1) + "-" +
            currentMomentOnServer.getFullYear().toString().slice(2, 4) +
            ".txt";

        saveToFile(rewardsList.replace(/&#10;/g, "\r\n"), filename, "text/plain");
    };
})();