HWM-UI-UX-MOD

try to take over the world!

As of 18.02.2021. See апошняя версія.

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-UI-UX-MOD
// @namespace    https://greasyfork.org/ru/scripts/421913-hwm-ui-ux-mod
// @version      0.5
// @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['mana_amount'] = getManaAmount()
        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 getManaAmount() {
        return $('mana_amount').textContent
    }

    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())
        let heartData = document.body.textContent.match(/top_line_draw_canvas_heart\((\d{1,3}), (\d{1,3}), (\d{1,3})\);/)
        unsafeWindow.top_line_draw_canvas_heart(heartData[1], heartData[2], heartData[3])
        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">${headerInfo.mana_amount}</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) {
        if (seconds < 0) {
            return "00:00"
        }
        // 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": false,
            "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);