HWM_MGRewardsStats

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

Från och med 2017-12-29. Se den senaste versionen.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==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");
    };
})();