HWM-UI-UX-MOD

try to take over the world!

As of 17/02/2021. See the latest version.

// ==UserScript==
// @name         HWM-UI-UX-MOD
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       achepta
// @include     /^https{0,1}:\/\/((www|qrator)(\.heroeswm\.ru|\.lordswm\.com)|178\.248\.235\.15)\/.+/
// @grant       unsafeWindow
// @grant    GM_xmlhttpRequest
// @grant    GM_log
// @run-at document-start
// ==/UserScript==

(function (window, undefined) {
    let w;
    if (typeof unsafeWindow !== undefined) {
        w = unsafeWindow;
    } else {
        w = window;
    }
    if (w.self !== w.top) {
        return;
    }
    if (/cgame/.test(location.href)) {
        return
    }
    let allTexts = getAllTexts()
    let defaultSettings = getDefaultSettings()

    let language = /lordswm/.test(location.href) ? "eng" : "rus"
    let settings = {}
    let headerInfo = {}
    let timersInfo = {}

    loadSettings();
    loadTimersInfo();

    if (settings['isDarkTheme'] && !/war\.php/.test(location.href)) {
        applyDarkTheme()
    }
    document.addEventListener("DOMContentLoaded", () => {
        if (!/war\.php/.test(location.href)) {
            processPage()
            addStyle();
            getHeaderInfo()
            drawNewHeader()
            processSettings();
            addMenu();
        } else {
            processBattle()
        }
    });


    function addStyle() {
        document.body.insertAdjacentHTML("beforeend", getStyles())
    }

    function addMenu() {
        $('hwm_header_settings_button').addEventListener('click', handleOnSettingsButtonClick);
    }


    // logic
    function processSettings() {
        if (settings.isTimeWithSeconds) {
            showTimeWithSeconds()
        }
        if (settings.isShowTimers) {
            showTimers()
        }
    }

    function getHeaderInfo() {
        headerInfo['logo'] = getHeaderLogo()
        headerInfo['notifications'] = getHeaderNotifications()
        headerInfo['homeColor'] = getHomeButtonColor()
        headerInfo['battleColor'] = getBattleButtonColor()
        headerInfo['resources'] = getHeaderResources()
        headerInfo['online'] = getHwmOnline()
    }

    function getHeaderLogo() {
        return document.querySelector("div.sh_logo > img").src
    }

    function getHeaderNotifications() {
        return Array.from(document.getElementsByClassName("NotificationIcon"))
    }

    function getHomeButtonColor() {
        return document.querySelector("#MenuHome").offsetParent.classList.value.split("_").slice(-1)[0]
    }

    function getBattleButtonColor() {
        return document.querySelector("#MenuBattles").offsetParent.classList.value.split("_").slice(-1)[0]
    }

    function getHeaderResources() {
        let resources = {}
        let resourceDivs = document.querySelectorAll("div.sh_ResourcesItem")
        Array.from(resourceDivs).forEach(item => {
            let resName = getResNameFromImage(item.firstChild.src)
            resources[resName] = item.lastChild.textContent
        })
        return resources
    }

    function getResNameFromImage(src) {
        return src.match(/(\w+)\.png/)[1]
    }

    function getHwmOnline() {
        return document.querySelector("div.sh_extra.sh_extra_right > div.mm_extra_separator").nextElementSibling.textContent
    }

    function drawNewHeader() {
        removeElement($('hwm_header'))
        document.body.insertAdjacentHTML('afterbegin', getNewHeaderTemplate())
        unsafeWindow.top_line_draw_canvas_heart(100, 100, 900)
        unsafeWindow.top_line_add_events_listeners()
    }

    function showTimeWithSeconds() {
        let hwmDate = hwmDateToHuman(getHwmDate());
        let timePlace = $('hwm_time');
        timePlace.innerHTML = hwmDate
        setTimeout(showTimeWithSeconds, 1000)
    }

    function showTimers() {
        $('timers_container').innerHTML = getTimersTemplate()
        setTimeout(showTimers, 1000)
    }

    function applyDarkTheme() {
        document.head.insertAdjacentHTML("beforeend", getDarkStyles())

    }

    function showEmptyBackground() {
        document.body.insertAdjacentHTML('beforeend', getEmptyBackgroundTemplate());
        $('empty_background').addEventListener('click', handleOnBackgroundClick);
    }

    function hideEmptyBackground() {
        removeElement($('empty_background'))
    }

    function showSettings() {
        document.body.insertAdjacentHTML('beforeend', getSettingsTemplate())
        fillSettings()
    }

    function fillSettings() {
        let settingsField = $('hwm_header_settings');
        for (const [key, value] of Object.entries(settings)) {
            settingsField.insertAdjacentHTML("beforeend",
                `<div id="${key}">
                            <input id="${key}_checkbox" type="checkbox" ${value ? ' checked' : ''}>
                            <label for="${key}_checkbox">${getTranslation(key)}</label>
                        </div>
                    `)
            $(`${key}`).addEventListener('click', () => {
                handleSettingsChange(key)
            })
        }
    }

    function hideSettings() {
        removeElement($('hwm_header_settings'))
    }

    function processButtonDropDown(buttonInfo) {
        if (buttonInfo.id === "MenuInventory" || buttonInfo.id === "MenuTavern") {
            return
        }
        let target = $(buttonInfo.id+"_expandable")
        if (buttonInfo.id === "MenuBattles") {
            Array.from(target.getElementsByTagName('a')).slice(8).forEach(item => {
                buttonInfo.dropDown.push([item.textContent, item.href, true])
            })
        }
        target.innerHTML = ''
        buttonInfo.dropDown.forEach(item => {
            if (item.length > 2) {
                target.insertAdjacentHTML('beforeend', `<a href="${item[1]}" style="text-decoration:none;"><div class="sh_dd_container_red">${item[0]}</div></a>`)
            } else {
                target.insertAdjacentHTML('beforeend', `<a href="${item[1]}" style="text-decoration:none;"><div>${getTranslation(item[0])}</div></a>`)
            }
        })
        target.insertAdjacentHTML("beforeend", `<img src="https://dcdn.heroeswm.ru/i/new_top/mm_dd_decorM.png" class="mm_decor2">`)
        target.insertAdjacentHTML("beforeend", `<img src="https://dcdn.heroeswm.ru/i/new_top/mm_dd_decorT.png" class="mm_decor3">`)
    }

    function processPage() {
        if (/home/.test(location.href)) {
            let isPremium = document.body.innerHTML.match(/star.gif/)
            timersInfo.isPremium = !!isPremium
        }
        if (/object_do/.test(location.href)) {
            if (document.body.textContent.match(/(successfully|устроены)/)) {
                timersInfo.labor_guild_timer_data = getHwmDate()
            }
        }
        let battleId = new URLSearchParams(new URL(document.referrer).search).get("warid")
        if (timersInfo.leader_guild_timer_data && !timersInfo.leader_guild_timer_data.timeSet && battleId === timersInfo.leader_guild_timer_data.battleId) {
            timersInfo.leader_guild_timer_data.timeSet = getHwmDate()
        } else if (timersInfo.thief_guild_timer_data && !timersInfo.thief_guild_timer_data.timeSet && battleId === timersInfo.thief_guild_timer_data.battleId) {
            timersInfo.thief_guild_timer_data.timeSet = getHwmDate()
        } else if (timersInfo.hunt_guild_timer_data && !timersInfo.hunt_guild_timer_data.timeSet && battleId === timersInfo.hunt_guild_timer_data.battleId) {
            timersInfo.hunt_guild_timer_data.timeSet = getHwmDate()
        }
        set("timers_data", timersInfo)
    }

    function processBattle() {
        let battleData = unsafeWindow.run_all.toString()
        let battleType = battleData.match(/btype\|(\d{1,10})/)[1]
        let battlePlayer = battleData.match(/plid1\|(\d{1,10})/)[1]
        let battleId = new URLSearchParams(window.location.search).get("warid")
        if (battlePlayer === getCookie("pl_id")) {
            if (battleType === "127") {
                if ("leader_guild_timer_data" in timersInfo) {
                    if (timersInfo.leader_guild_timer_data.battleId < battleId) {
                        timersInfo.leader_guild_timer_data = {"battleId": battleId}
                    }
                } else {
                    timersInfo.leader_guild_timer_data = {"battleId": battleId}
                }
            } else if (battleType === "66") {
                if ("thief_guild_timer_data" in timersInfo) {
                    if (timersInfo.thief_guild_timer_data.battleId < battleId) {
                        timersInfo.thief_guild_timer_data = {"battleId": battleId}
                    }
                } else {
                    timersInfo.thief_guild_timer_data = {"battleId": battleId}
                }
            } else if (battleType === "0") {
                if ("hunt_guild_timer_data" in timersInfo) {
                    if (timersInfo.hunt_guild_timer_data.battleId < battleId) {
                        timersInfo.hunt_guild_timer_data = {"battleId": battleId}
                    }
                } else {
                    timersInfo.hunt_guild_timer_data = {"battleId": battleId}
                }
            }
            set("timers_data", timersInfo)
        }
    }

    // listeners
    function handleOnSettingsButtonClick() {
        showEmptyBackground();
        showSettings();
    }

    function handleOnBackgroundClick() {
        hideEmptyBackground();
        hideSettings();
    }

    function handleSettingsChange(key) {
        settings[key] = $(`${key}_checkbox`).checked
        set('hwm_header_settings', settings)
    }

    // templates
    function getSettingsButtonTemplate() {
        return `
            <img 
                id="hwm_header_settings_button" 
                src="https://dcdn3.heroeswm.ru/i/combat/btn_settings.png?v=8" 
                height="18" 
                alt="Header settings"
                style="position: relative; filter: drop-shadow(0.01rem 0.01rem 0 black) drop-shadow(-0.01rem -0.01rem 0 black); transform: rotate(22.5deg)"
                title="Header settings"
            >`
    }

    function getEmptyBackgroundTemplate() {
        return `
        <div id="empty_background" style="
            position: absolute; 
            left: 0; 
            top: 0;
            width: 100%;
            height: ${getScrollHeight()};
            background: #000000;
            opacity: 0.5;
            z-index: 1100;
        "></div>
        `
    }

    function getSettingsTemplate() {
        return `
        <div id="hwm_header_settings" style="
            position: absolute;
            left: ${(getClientWidth() - 600) / 2}px;
            top: ${window.pageYOffset + 155}px;
            width: 600px;
            background: #F6F3EA;
            z-index: 1101;
        ">
            
        </div>
        `
    }

    function getNewHeaderTemplate() {
        return `
        <div id="new_header">
    <div class="top_line">
        <div class="top_left_container">
<!--            <div class="top_left_left">-->
<!--            </div>-->
            <div class="top_wing_middle">
                <div id="notifications">
                    ${getNotificationsTemplate()}
                </div>
            </div>
            <div class="top_left_right">
                <div id="heart_container">
                    <div class="sh_HMResIconBlock">
                        <canvas width="64px" height="64px" id="heart"></canvas>
                    </div>
                    <div style="display: none;" id="health_amount">100</div>
                </div>
            </div>
        </div>
        <div class="top_resource_container" id="top_resource_container">
            <div id="ResourcesPanel" class="sh_ResourcesPanel">
                ${getResourcesTemplate()}
            </div>
        </div>
        <div class="top_right_container">
            <div class="top_right_left">
                <div id="mana_container">
                    <div class="sh_HMResIconBlock mana"></div>
                    <div class="mana_animation"></div>
                    <div style="display: none" id="mana_amount">50</div>
                </div>
            </div>
            <div class="top_wing_middle">
                <div class="time_online_radio_container">
                    <div id="hwm_time"></div>
                    <div class="mm_extra_separator"></div>
                    <div id="hwm_online">${headerInfo['online']} online</div>
                    <div class="mm_extra_separator"></div>
                    <div class="mm_extra_radio" onclick="hwm_top_line_open_radio(620, 400);return false;"></div>
                    <div class="mm_extra_separator"></div>
                    <div id="">${getSettingsButtonTemplate()}</div>
                </div>
            </div>
<!--            <div class="top_right_right">-->

<!--            </div>-->
        </div>
    </div>
    <div class="new_header_menu">
<!--        <img src="https://dcdn.heroeswm.ru/i/new_top/mm_decor1.png" class="mm_decor1">-->
        <div class="left_dragon">
            <img height="70px" src="https://i.pinimg.com/originals/6c/2e/0b/6c2e0be6ebdad0e7f4bc86bc1f10e451.png">
        </div>
        <div class="middle_menus">
            <div class="timers_container" id="timers_container"></div>
            <div class="common_menu_container">
                ${getMenuButtonsTemplate()}
            </div>
        </div>
        
        <div class="right_dragon">
            <img height="70px" src="https://i.imgur.com/oqyVp7G.png">
        </div>
    </div>
</div>
        `
    }

    function getNotificationsTemplate() {
        return headerInfo['notifications'].reduce((result, current) => {
            // #говнокод
            if (current.src.includes("pismo")) {
                return result + `<a href="sms.php">${current.outerHTML.toString()}</a>`;
            } else {
                return result + current.outerHTML.toString()
            }}, "")
    }

    function getResourcesTemplate() {
        let newResources = []
        let resourceLinks = getResourceLinks()
        for (const [key, value] of Object.entries(headerInfo['resources'])) {
            let template = `
            <div class="sh_ResourcesItem">
                <a href="${resourceLinks[key]}">
                    <img class="sh_ResourcesItem_icon" src="https://dcdn.heroeswm.ru/i/r/48/${key}.png?v=3.23de65" alt="${key}" title="${key}">
                </a>
            <span class="select_auto_enabled">${value}</span></div>
            `
            newResources.push(template)
        }
        return newResources.join(`<div class="mm_rp_separator"></div>`)
    }

    function getMenuButtonsTemplate() {
        let buttonsToShow = getAvailableButtons()
        return buttonsToShow.reduce((result, current) => result + getMenuButtonHTML(current), "")
    }

    function getAvailableButtons() {
        let buttons = []
        for (const [key, value] of Object.entries(getButtonInfos())) {
            if (settings[key]) {
                buttons.push(value)
            }
        }
        return buttons
    }

    function getMenuButtonHTML(buttonInfo) {
        processButtonDropDown(buttonInfo)
        let buttonInside = ``
        if (settings['isTextButtons']) {
            buttonInside = `<div class="menu_button_text">${getTranslation(buttonInfo.id)}</div>`
        } else {
            buttonInside = `<img class="mm_item_icon" src="${buttonInfo.image}">`
        }
        let buttonColor = ``
        if (headerInfo['homeColor'] === 'red') {
            buttonColor = 'red'
        } else if (headerInfo['battleColor'] === 'orange' && buttonInfo.id === "MenuBattles") {
            buttonColor = 'orange'
        } else if (headerInfo['battleColor'] === 'red' && buttonInfo.id === "MenuBattles") {
            buttonColor = 'red'
        } else {
            buttonColor = 'blue'
        }
        return `
        <div class="mm_item mm_item_${buttonColor}">
            <a href="${buttonInfo.href}">
                <div class="mm_item_inside" id="${buttonInfo.id}" hwm_label="">
                    ${buttonInside}
                </div>
            </a>
        </div>
        `
    }

    function getTimersTemplate() {
        let isPremium = timersInfo.isPremium ? timersInfo.isPremium : false
        let result = ''
        if (timersInfo.labor_guild_timer_data) {
            let timeCount = isPremium ? 60 : 60
            result += `
            <div class="mm_item mm_item_blue">
                <div class="menu_button_text">${getTranslation("labor_guild")} ${getRemainingTime(timersInfo.labor_guild_timer_data, timeCount)}</div>
            </div>`
        } else {
            result += `
            <div class="mm_item mm_item_blue">
                <div class="menu_button_text">${getTranslation("labor_guild")} 00:00</div>
            </div>`
        }
        if (timersInfo.hunt_guild_timer_data && timersInfo.hunt_guild_timer_data.timeSet) {
            let timeCount = isPremium ? 28 : 40
            result += `
            <div class="mm_item mm_item_blue">
                <div class="menu_button_text">${getTranslation("hunt_guild")} ${getRemainingTime(timersInfo.hunt_guild_timer_data.timeSet, timeCount)}</div>
            </div>`
        } else {
            result += `
            <div class="mm_item mm_item_blue">
                <div class="menu_button_text">${getTranslation("hunt_guild")} 00:00</div>
            </div>`
        }
        if (timersInfo.thief_guild_timer_data && timersInfo.thief_guild_timer_data.timeSet) {
            let timeCount = isPremium ? 42 : 60
            result += `
            <div class="mm_item mm_item_blue">
                <div class="menu_button_text">${getTranslation("thief_guild")} ${getRemainingTime(timersInfo.thief_guild_timer_data.timeSet, timeCount)}</div>
            </div>`
        } else {
            result += `
            <div class="mm_item mm_item_blue">
                <div class="menu_button_text">${getTranslation("thief_guild")} 00:00</div>
            </div>`
        }
        if (timersInfo.leader_guild_timer_data && timersInfo.leader_guild_timer_data.timeSet) {
            let timeCount = isPremium ? 180 : 180
            result += `
            <div class="mm_item mm_item_blue">
                <div class="menu_button_text">${getTranslation("leader_guild")} ${getRemainingTime(timersInfo.leader_guild_timer_data.timeSet, timeCount)}</div>
            </div>`
        } else {
            result += `
            <div class="mm_item mm_item_blue">
                <div class="menu_button_text">${getTranslation("leader_guild")} 00:00</div>
            </div>`
        }
        return result
    }
    function getRemainingTime(timeSet, timeCount) {
        let hwmDate = getHwmDate()
        let timeSetHwm = new Date(timeSet)
        return secondsToHumanDate(diffDateInSeconds(timeSetHwm, hwmDate) + timeCount * 60)
    }
    function diffDateInSeconds(dt1, dt2) {
        return Math.round((dt1.getTime() - dt2.getTime()) / 1000);
    }
    // helpers
    function getCookie(name) {
        const value = `; ${document.cookie}`;
        const parts = value.split(`; ${name}=`);
        if (parts.length === 2) return parts.pop().split(';').shift();
    }

    function doGet(url, callback) {
        GM_xmlhttpRequest({
            method: "GET",
            url: url,
            overrideMimeType: "text/xml; charset=windows-1251",
            onload: function (res) {
                callback(new DOMParser().parseFromString(res.responseText, "text/html"))
            }
        });
    }

    function doPost(url, params, callback) {
        GM_xmlhttpRequest({
            method: "POST",
            url: url,
            data: params,
            onload: callback,
        });
    }

    function removeElement(element) {
        element.parentNode.removeChild(element)
    }

    function $(id, where = document) {
        return where.querySelector(`#${id}`);
    }

    function get(key, def) {
        let result = JSON.parse(localStorage[key] === undefined ? null : localStorage[key]);
        return result == null ? def : result;

    }

    function set(key, val) {
        localStorage[key] = JSON.stringify(val);
    }

    function getScrollHeight() {
        return Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);
    }

    function getClientWidth() {
        return document.compatMode === 'CSS1Compat' && document.documentElement ? document.documentElement.clientWidth : document.body.clientWidth;
    }

    function findAll(regexPattern, sourceString) {
        let output = []
        let match
        let regexPatternWithGlobal = RegExp(regexPattern, [...new Set("g" + regexPattern.flags)].join(""))
        while (match = regexPatternWithGlobal.exec(sourceString)) {
            delete match.input
            output.push(match)
        }
        return output
    }

    function sortByKey(array, key) {
        return array.sort((a, b) => {
            let x = a[key];
            let y = b[key];
            return ((x < y) ? -1 : ((x > y) ? 1 : 0));
        });
    }

    function getHwmDate() {
        let today = new Date();
        let localOffset = -(today.getTimezoneOffset() / 60);
        let destinationOffset = +3;

        let offset = destinationOffset - localOffset;
        return new Date(new Date().getTime() + offset * 3600 * 1000)

    }

    function hwmDateToHuman(hwmDate) {
        let hours =  hwmDate.getHours().toString().length === 1
            ? "0" + hwmDate.getHours().toString()
            : hwmDate.getHours().toString()
        let minutes = hwmDate.getMinutes().toString().length === 1
            ? "0" + hwmDate.getMinutes().toString()
            : hwmDate.getMinutes().toString()
        let seconds = hwmDate.getSeconds().toString().length === 1
            ? "0" + hwmDate.getSeconds().toString()
            : hwmDate.getSeconds().toString()
        return hours + ":" + minutes + ":" + seconds
    }

    function secondsToHumanDate(seconds) {
        // Hours, minutes and seconds
        var hrs = ~~(seconds / 3600);
        var mins = ~~((seconds % 3600) / 60);
        var secs = ~~seconds % 60;

        // Output like "1:01" or "4:03:59" or "123:03:59"
        var ret = "";
        if (hrs > 0) {
            ret += "" + hrs + ":" + (mins < 10 ? "0" : "");
        }
        ret += "" + mins + ":" + (secs < 10 ? "0" : "");
        ret += "" + secs;
        return ret;
    }

    function getTranslation(textId) {
        return allTexts[textId][language]
    }

    function loadSettings() {
        settings = get('hwm_header_settings', defaultSettings)
        for (const [key, value] of Object.entries(defaultSettings)) {
            if (settings[key] === undefined) {
                settings[key] = value
            }
        }
    }

    function loadTimersInfo() {
        timersInfo = get('timers_data', {})
    }
    function getAllTexts() {
        return {
            'isTimeWithSeconds': {
                "rus": "Показывать время с секундами",
                "eng": "Show time with seconds",
            },
            'isShowTimers': {
                "rus": "Показывать таймеры гильдий",
                "eng": "Show guilds' timers",
            },
            'isDarkTheme': {
                "rus": "Темная тема",
                "eng": "Dark theme"
            },
            'isTextButtons': {
                "rus": "Старые текстовые кнопки",
                "eng": "Show old text buttons"
            },
            'isHomeButton': {
                "rus": "Персонаж",
                "eng": "Home"
            },
            'isInventoryButton': {
                "rus": "Инвентарь",
                "eng": "Inventory"
            },
            'isMapButton': {
                "rus": "Карта",
                "eng": "Map"
            },
            'isBattleButton': {
                "rus": "Битвы",
                "eng": "Battles"
            },
            'isTavernButton': {
                "rus": "Таверна",
                "eng": "Tavern"
            },
            'isRouletteButton': {
                "rus": "Рулетка",
                "eng": "Roulette"
            },
            'isLeaderboardButton': {
                "rus": "Рейтинг",
                "eng": "Leaderboards"
            },
            'isForumButton': {
                "rus": "Форум",
                "eng": "Forum"
            },
            'isChatButton': {
                "rus": "Чат",
                "eng": "Chat"
            },
            'MenuHome': {
                "rus": "Персонаж",
                "eng": "Home"
            },
            'MenuInventory': {
                "rus": "Инвентарь",
                "eng": "Inventory"
            },
            'MenuMap': {
                "rus": "Карта",
                "eng": "Map"
            },
            'MenuBattles': {
                "rus": "Битвы",
                "eng": "Battles"
            },
            'MenuTavern': {
                "rus": "Таверна",
                "eng": "Tavern"
            },
            'MenuRoulette': {
                "rus": "Рулетка",
                "eng": "Roulette"
            },
            'MenuStat': {
                "rus": "Рейтинг",
                "eng": "Leaderboards"
            },
            'MenuForum': {
                "rus": "Форум",
                "eng": "Forum"
            },
            'MenuChat': {
                "rus": "Чат",
                "eng": "Chat"
            },
            'myself': {
                "rus": "Я",
                "eng": "Myself"
            },
            'inventory': {
                "rus": "Инвентарь",
                "eng": "Inventory"
            },
            'shop': {
                "rus": "Магазин",
                "eng": "Artifact shop"
            },
            'auction': {
                "rus": "Рынок",
                "eng": "Market"
            },
            'choose_army': {
                "rus": "Набор армии",
                "eng": "Recruiting"
            },
            'castle': {
                "rus": "Замок",
                "eng": "Castle"
            },
            'skills': {
                "rus": "Навыки",
                "eng": "Talents"
            },
            'mailbox': {
                "rus": "Почта",
                "eng": "Mailbox"
            },
            'transfer': {
                "rus": "Передача ресурсов",
                "eng": "Transfer"
            },
            'facility1': {
                "rus": "Добыча",
                "eng": "Mining"
            },
            'facility2': {
                "rus": "Обработка",
                "eng": "Machining"
            },
            'facility3': {
                "rus": "Производство",
                "eng": "Production"
            },
            'houses': {
                "rus": "Дома",
                "eng": "Public services"
            },
            'one_to_one': {
                "rus": "Дуэли",
                "eng": "Duels"
            },
            'many_to_many': {
                "rus": "Групповые бои",
                "eng": "Group battles"
            },
            'guild_pvp': {
                "rus": "Гильдия тактиков",
                "eng": "Commanders' guild"
            },
            'guild_task': {
                "rus": "Гильдия стражей",
                "eng": "Watchers' guild"
            },
            'guild_leader': {
                "rus": "Гильдия лидеров",
                "eng": "Leaders guild"
            },
            'clanwars': {
                "rus": "Бои за территории",
                "eng": "Clan wars"
            },
            'tournaments': {
                "rus": "Турниры",
                "eng": "Tounaments"
            },
            'spin_history': {
                "rus": "История игр",
                "eng": "Spin history"
            },
            'lucky_boxes': {
                "rus": "Редкие ларцы",
                "eng": "Chests of abundance"
            },
            'top_heroes': {
                "rus": "Рейтинг воинов",
                "eng": "Top warriors"
            },
            'top_clans': {
                "rus": "Рейтинг кланов",
                "eng": "Top clans"
            },
            'top_hunters': {
                "rus": "Рейтинг охотников",
                "eng": "Top hunters"
            },
            'top_mercenaries': {
                "rus": "Рейтинг наемников",
                "eng": "Top mercenaries"
            },
            'top_shareholders': {
                "rus": "Рейтинг акционеров",
                "eng": "Top shareholders"
            },
            'personal_records': {
                "rus": "Мои охоты",
                "eng": "My hunt records"
            },
            'general_forum': {
                "rus": "Общий форум",
                "eng": "General forum"
            },
            'help_forum': {
                "rus": "Помощь по игре",
                "eng": "Q&A forum"
            },
            'trade_forum': {
                "rus": "Торговый форум",
                "eng": "Trade forums"
            },
            'reference': {
                "rus": "Об игре",
                "eng": "About the game"
            },
            'hwm_newspaper': {
                "rus": "Новостная лента",
                "eng": "Daily news"
            },
            'chat_1': {
                "rus": "Комната вопросов",
                "eng": "Inquiry"
            },
            'chat_2': {
                "rus": "Общая комната",
                "eng": "Common"
            },
            'chat_3': {
                "rus": "Торговая палата",
                "eng": "Merchant"
            },
            'chat_4': {
                "rus": "Рулетка",
                "eng": "Roulette"
            },
            'chat_5': {
                "rus": "Карты",
                "eng": "Tavern"
            },
            'labor_guild': {
                "rus": "ГР",
                "eng": "LG"
            },
            'leader_guild': {
                "rus": "ГЛ",
                "eng": "LeG"
            },
            'hunt_guild': {
                "rus": "ГО",
                "eng": "HG"
            },
            'thief_guild': {
                "rus": "ГВ",
                "eng": "TG"
            },
            '': {
                "rus": "",
                "eng": ""
            },

        }
    }

    function getDefaultSettings() {
        return {
            "isTimeWithSeconds": true,
            "isShowTimers": true,
            "isDarkTheme": true,
            "isTextButtons": false,
            "isHomeButton": true,
            "isInventoryButton": false,
            "isMapButton": true,
            "isBattleButton": true,
            "isTavernButton": true,
            "isRouletteButton": true,
            "isLeaderboardButton": true,
            "isForumButton": true,
            "isChatButton": true,
        }
    }

    function getButtonInfos() {
        return {
            "isHomeButton": {
                "image": "https://dcdn.heroeswm.ru/i/new_top/_panelCharacter.png",
                "id": "MenuHome",
                "href": "home.php",
                "dropDown": [
                    ["myself", `pl_info.php?id=${getCookie("pl_id")}`],
                    ["inventory", "inventory.php"],
                    ["shop", "shop.php"],
                    ["auction", "auction.php"],
                    ["choose_army", "army.php"],
                    ["castle", "castle.php"],
                    ["skills", "skillwheel.php"],
                    ["mailbox", "sms.php"],
                    ["transfer", "transfer.php"],
                ]
            },
            "isInventoryButton": {
                "image": "https://dcdn.heroeswm.ru/i/mobile_view/icons/_panelInventory.png",
                "id": "MenuInventory",
                "href": "inventory.php",
                "dropDown": []
            },
            "isMapButton": {
                "image": "https://dcdn.heroeswm.ru/i/new_top/_panelMap.png",
                "id": "MenuMap",
                "href": "map.php",
                "dropDown": [
                    ["facility1", "map.php?st=mn"],
                    ["facility2", "map.php?st=fc"],
                    ["facility3", "map.php?st=sh"],
                    ["houses", "map.php?st=hs"],
                ]
            },
            "isBattleButton": {
                "image": "https://dcdn.heroeswm.ru/i/new_top/_panelBattles.png",
                "id": "MenuBattles",
                "href": "bselect.php",
                "dropDown": [
                    ["one_to_one", "one_to_one.php"],
                    ["many_to_many", "group_wars.php"],
                    ["guild_pvp", "pvp_guild.php"],
                    ["guild_task", "task_guild.php"],
                    ["guild_leader", "leader_guild.php"],
                    ["clanwars", "mapwars.php"],
                    ["tournaments", "tournaments.php"],
                ]
            },
            "isTavernButton": {
                "image": "https://dcdn.heroeswm.ru/i/new_top/_panelTavern.png",
                "id": "MenuTavern",
                "href": "tavern.php",
                "dropDown": []
            },
            "isRouletteButton": {
                "image": "https://dcdn.heroeswm.ru/i/new_top/_panelRoulette.png",
                "id": "MenuRoulette",
                "href": "roulette.php",
                "dropDown": [
                    ["spin_history", "allroul.php"],
                    ["lucky_boxes", "gift_box_log.php"],

                ]
            },
            "isLeaderboardButton": {
                "image": "https://dcdn.heroeswm.ru/i/new_top/_panelRate.png",
                "id": "MenuStat",
                "href": "plstats.php",
                "dropDown": [
                    ["top_heroes", "plstats.php"],
                    ["top_clans", "clanstat.php"],
                    ["top_hunters", "plstats_hunters.php"],
                    ["top_mercenaries", "plstats_merc.php"],
                    ["top_shareholders", "sholders_stat.php"],
                    ["personal_records", `pl_hunter_stat.php?id=${getCookie("pl_id")}`],

                ]
            },
            "isForumButton": {
                "image": "https://dcdn.heroeswm.ru/i/new_top/_panelForum.png",
                "id": "MenuForum",
                "href": "forum.php",
                "dropDown": [
                    ["general_forum", "forum_thread.php?id=2"],
                    ["help_forum", "forum_thread.php?id=10"],
                    ["trade_forum", "forum.php#t1"],
                    ["reference", "help.php"],
                    ["hwm_newspaper", "https://daily.heroeswm.ru/"],

                ]
            },
            "isChatButton": {
                "image": "https://dcdn.heroeswm.ru/i/new_top/_panelChat.png",
                "id": "MenuChat",
                "href": "frames.php",
                "dropDown": [
                    ["chat_1", "frames.php?room=0"],
                    ["chat_2", "frames.php?room=1"],
                    ["chat_3", "frames.php?room=2"],
                    ["chat_4", "frames.php?room=3"],
                    ["chat_5", "frames.php?room=4"],
                ]
            },
        }
    }

    function getResourceLinks() {
        return {
            "gold": "roulette.php",
            "wood": "auction.php?cat=res&sort=0&type=1",
            "ore": "auction.php?cat=res&sort=0&type=2",
            "mercury": "auction.php?cat=res&sort=0&type=3",
            "sulfur": "auction.php?cat=res&sort=0&type=4",
            "crystals": "auction.php?cat=res&sort=0&type=5",
            "gems": "auction.php?cat=res&sort=0&type=6",
            "diamonds": "hwm_donate_page_new.php",
        }
    }

    function getStyles() {
        return `
        <style>
        ${settings.isTextButtons ? ".mm_item, .mm_item_inside {height:24px}; .mm_item_inside {display: flex;     flex-direction: row; flex-wrap: nowrap;  align-items: center;} .menu_button_text{height:100%}" : ""};
    body {
        margin: 0;
        padding: 0;
    }

    #new_header {
        display: flex;
        flex-direction: column;
        align-items: center;
    }

    .top_line {
        width: 100%;
        height: 32px;
        display: flex;
        flex-direction: row;
        flex-wrap: nowrap;
    }

    .top_left_container, .top_right_container {
        height: 100%;
        display: flex;
        flex-direction: row;
        flex-wrap: nowrap;
        flex-grow: 1;
    }

    .top_left_left {
        height: 100%;
        width: 52px;
        background-image: url("https://dcdn.heroeswm.ru/i/new_top/extra_bg_side2.png");
        background-size: 256px 32px;
        background-repeat: no-repeat;
    }

    .top_left_right {
        min-width: 100px;
        background: url("https://dcdn.heroeswm.ru/i/new_top/extra_bg_side1.png") no-repeat top right;
        background-size: 256px 32px;

    }

    /*#logo_container {*/
    /*    position: relative;*/
    /*}*/
    
    /*.logo {*/
    /*    max-width: 128px;*/
    /*    max-height: 64px;*/
    /*}*/
    #notifications {
        height: 32px;
        float: right;
        display: flex;
        flex-direction: row;
        flex-wrap: nowrap;
        align-items: center;
        margin-right: 10%;
    }

    #heart_container {
        background-image: url("https://dcdn.heroeswm.ru/i/new_top/mm_rp_health.png");
        background-size: contain;
        width: 32px;
        height: 32px;
        margin: auto;
    }

    #heart_container:hover #health_amount {
        display: initial !important;
        position: absolute;
        color: white;
        transform: translate(10%, -100%);
        text-shadow: 1px 0 0 #000, 0 -1px 0 #000, 0 1px 0 #000, -1px 0 0 #000;

    }

    .sh_HMResIconBlock {
        position: relative;
        left: 15px;
        top: 15px;
    }

    .health_animation {
        position: relative;
    }

    #heart {
        width: 27px;
        height: 27px;
    }

    #mana_container {
        background-image: url("https://dcdn.heroeswm.ru/i/new_top/mm_rp_mana.png");
        background-size: contain;
        width: 32px;
        height: 32px;
        margin: auto;
        display: grid;
        grid-template-columns: 1fr;
        grid-template-rows: 1fr;
        overflow: hidden;
    }
    
    .mana_animation {
        position: relative;
        grid-column-start: 1;
        grid-row-start: 1;
        z-index: 4;
    }

    .mana {
        grid-column-start: 1;
        grid-row-start: 1;
        z-index: 3;
    }

    #mana_amount {
        grid-column-start: 1;
        grid-row-start: 1;
        z-index: 5;
        margin: auto;
        color: white;
    }

    #mana_container:hover #mana_amount {
        display: initial !important;
        color: white;
        text-shadow: 1px 0 0 #000, 0 -1px 0 #000, 0 1px 0 #000, -1px 0 0 #000;
    }

    .top_right_right {
        width: 52px;
        background: url("https://dcdn.heroeswm.ru/i/new_top/extra_bg_side2.png") no-repeat top right;
        background-size: 256px 32px;
    }

    .top_right_left {
        min-width: 100px;
        background: url("https://dcdn.heroeswm.ru/i/new_top/extra_bg_side1.png") no-repeat top left;
        background-size: 256px 32px;
    }

    .top_wing_middle {
        min-width: 175px;
        width: 100%;
        background: url("https://dcdn.heroeswm.ru/i/new_top/extra_bg_mid.png") repeat-x top left;
        background-size: 32px;
    }

    .time_online_radio_container {
        display: flex;
        flex-direction: row;
        flex-wrap: nowrap;
        align-items: center;
        margin-left: 10%;
        
    }
    
    #hwm_time, #hwm_online {
        color: #b12424;
    }

    .top_resource_container {
        background: url("https://dcdn.heroeswm.ru/i/new_top/rp_bg_mid.png");
        background-size: contain;
    }

    .new_header_menu {
        background: url("https://dcdn.heroeswm.ru/i/new_top/mm_dd_tile.jpg");
        min-height: 70px;
        padding: 0;
        width: 100%;
        display: flex;
        flex-direction: row;
        flex-wrap: nowrap;
        justify-content: space-between;
    }
    .common_menu_container {
        margin-top: 5px;
        display: flex;
        flex-direction: row;
        flex-wrap: nowrap;
        justify-content: center;
        align-items: center;
        overflow: hidden;
    }
    .timers_container {
        display: flex;
        flex-direction: row;
        flex-wrap: nowrap;
        justify-content: center;
        align-items: center;
        overflow: hidden;
    }
    .mm_item {
        margin: 0;
    }
    .mm_item + .mm_item {
        
        margin-left: 5px;
    }

    .left_dragon, .right_dragon {
    }
    .left_dragon {
        transform: scaleX(-1);
    }
    
    .middle_menus {
        display: flex;
        flex-direction: column;
        justify-content: center;
    }
    
    .menu_button_text {
        display: flex;
        justify-content: center;
        align-items: center;
        color: #fad49f;
        font-weight: bold;
    }
</style>
        `
    }

    function getDarkStyles() {
        let mainTextColor = `#d0d0d0`
        return `
        <style>
        body {
            background: #1f2023 !important;
        }
        td, .forum > td {
            color: ${mainTextColor} !important;
            background-image: none !important;
        }
        font {
            color: ${mainTextColor} !important;
            opacity: 0.65;
        }
        a, .forum > a {
            color: ${mainTextColor} !important;
            /*opacity: 0.87;*/
        }
        div {
            color: #121212;
        }
        .txt {
            color: ${mainTextColor};
            /*opacity: 0.87;*/
        }
        .pi {
            color: ${mainTextColor};
            /*opacity: 0.87;*/
        }
        .wblight, .wb2, .wb td{
            background-color: #2d2f34;
        }
        
        .wbwhite {
            background-color: #383b40;
        }
        table.table3, table.table3 th {
            background-color: #383b40;
        }
        .forum tr:not(.second) > td {
            background-color: #383b40 !important;
        }
        table.forum tr.message_footer td {
            background-color: #27292d !important;
        }
        
        .forum span, .second {
            background-color: #2d2f34 !important;
        }
        #home_2 {
            color: ${mainTextColor};
        }
        #hwm_for_zoom {
            background-color: #27292d !important;
        }
        #hwm_for_zoom * {
            color: ${mainTextColor};
        }
        .dark_seconds {
            color: #a50909;
        }
        * {
            border-color: #55565d !important;
        }
        table td.tlight {
            background-color: #2d2f34 !important;
            background-image: none;
        }
        table td.twhite {
            background-color: #383b40 !important;
            background-image: none;
        }
        #pa,#pd, #pp, #pk, #pl, #pm, #pi, #ap, #sc {
            color: ${mainTextColor} !important;
        }
        </style>
        `
    }
})(window);