hwmWidget

Виджет для главной страницы ГВД

目前為 2023-11-13 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        hwmWidget
// @include     /^https{0,1}:\/\/((www|qrator)\.heroeswm\.ru|178\.248\.235\.15)\/home\.php/
// @description Виджет для главной страницы ГВД
// @version     4.0
// @author      Tamozhnya1
// @namespace   Tamozhnya1
// @grant       GM.xmlHttpRequest
// @grant       unsafeWindow
// @grant       GM_log
// @grant       GM_setValue
// @grant       GM_getValue
// @grant       GM_addStyle
// @license     MIT
// ==/UserScript==
const LotType = { Purchase: 1, Auction: 2 };
var ElementsTypes = { "42": "abrasive", "43": "snake_poison", "46": "tiger_tusk", "44": "ice_crystal", "45": "moon_stone", "40": "fire_crystal", "37": "meteorit", "41": "witch_flower", "39": "wind_flower", "78": "fern_flower", "38": "badgrib" }
var ElementNames = ["abrasive", "snake_poison", "tiger_tusk", "ice_crystal", "moon_stone", "fire_crystal", "meteorit", "witch_flower", "wind_flower", "fern_flower", "badgrib"];
var ResourcesTypes = { "wood": { Type: "1", ImageName: "wood" }, "ore": { Type: "2", ImageName: "ore" }, "mercury": { Type: "3", ImageName: "mercury" }, "sulphur": { Type: "4", ImageName: "sulfur" }, "crystal": { Type: "5", ImageName: "crystals" }, "gem": { Type: "6", ImageName: "gems" } };
const locations = {
    1: [50,50,"Empire Capital","EmC","Столица Империи"],
    2: [51,50,"East River","EsR","Восточная Река"],
    3: [50,49,"Tiger Lake","TgL","Тигриное Озеро"],
    4: [51,49,"Rogues' Wood","RgW","Лес Разбойников"],
    5: [50,51,"Wolf Dale","WoD","Долина Волков"],
    6: [50,48,"Peaceful Camp","PcC","Мирный Лагерь"],
    7: [49,51,"Lizard Lowland","LzL","Равнина Ящеров"],
    8: [49,50,"Green Wood","GrW","Зеленый Лес"],
    9: [49,48,"Eagle Nest","EgN","Орлиное Гнездо"],
    10: [50,52,"Portal Ruins","PoR","Руины Портала"],
    11: [51,51,"Dragons' Caves","DrC","Пещеры Драконов"],
    12: [49,49,"Shining Spring","ShS","Сияющий Родник"],
    13: [48,49,"Sunny City","SnC","Солнечный Город"],
    14: [52,50,"Magma Mines","MgM","Магма Шахты"],
    15: [52,49,"Bear Mountain","BrM","Медвежья Гора"],
    16: [52,48,"Fairy Trees","FrT","Магический Лес"],
    17: [53,50,"Harbour City","HrC","Портовый Город"],
    18: [53,49,"Mythril Coast","MfC","Мифриловый Берег"],
    19: [51,52,"Great Wall","GtW","Великая Стена"],
    20: [51,53,"Titans' Valley","TiV","Равнина Титанов"],
    21: [52,53,"Fishing Village","FsV","Рыбачье село"],
    22: [52,54,"Kingdom Castle","KiC","Замок Королевства"],
    23: [48,48,"Ungovernable Steppe","UnS","Непокорная Степь"],
    24: [51,48,"Crystal Garden","CrG","Кристальный Сад"],
    25: [53,52,"East Island","EsI","Восточный Остров"],
    26: [49,52,"The Wilderness","ThW","Дикие земли"],
    27: [48,50,"Sublime Arbor","SbA","Великое Древо"]
};
const isEn = document.documentElement.lang == "en";
const Strings = { "ru": { BuyNow: "Купить сразу!" }, "en": { BuyNow: "Buy now!" } };
const LocalizedString = Strings[document.documentElement.lang];
GM_addStyle(`

.news-head {
  text-decoration:none;
  align-self: center;
  border-radius: 1.5rem;
  padding: 0.25rem .75rem;
}

.active {
  background: #eae8dd;
}

.active:hover {
  background: #eae8dd80;
}

.news-head__title {
  display: inline;
  font-size: 12px;
  font-weight: normal;
  cursor: pointer;
}

.news-head__switch {
  cursor: pointer;
  align-self: center;
  color: #5D413A40;
  margin-left:10px;
}

.news-head__settings {
  cursor: pointer;
  align-self: center;
  color: #5D413A40;
  margin-left:10px;
  width: 1.5%;
}

.mrgn-l{
  margin-left: 5px;
}

.flex {
  display: flex;
}

.div-style {
  margin: 0 auto 10px;
  padding: 15px 25px 20px;
  overflow: hidden;
  min-width: 400px;
  border-radius: 5px;
  border: 0 #adadad solid;
  background: url(../i/inv_im/corner_lt2.png) no-repeat top left, url(../i/inv_im/corner_rt2.png) no-repeat top right, url(../i/inv_im/corner_lb2.png) no-repeat bottom left, url(../i/inv_im/corner_rb2.png) no-repeat bottom right #f5f3ea;
  background-size: 14px;
  box-shadow: inset 0 0 0 1px #b19673, 0 2px 5px rgb(0 0 0 / 25%);
}

.res-style {
  display: none;
  justify-content: space-around;
  height: 40px;
  background-color: #eae8dd;
  border-radius: 5px;
  border: 0 #adadad solid;
  margin-top: 10px;
}

.modal {
  width: 100%;
  height: 100%;
  z-index: 1000;
  position: fixed;
  top:0;
  left:0;
  background: #00000050;
  display: none;
  align-items: center;
}

.modal-block {
  display: flex;
  width: 400px;
  height: 300px;
  z-index: 1200;
  margin: 0 auto;
  position: relative;
  border-radius: 5px;
  border: 0 #adadad solid;
  background: url(../i/inv_im/corner_lt2.png) no-repeat top left, url(../i/inv_im/corner_rt2.png) no-repeat top right, url(../i/inv_im/corner_lb2.png) no-repeat bottom left, url(../i/inv_im/corner_rb2.png) no-repeat bottom right #f5f3ea;
  background-size: 14px;
  box-shadow: inset 0 0 0 1px #b19673, 0 2px 5px rgb(0 0 0 / 25%);
  padding: 15px;
  align-items: flex-start;
  flex-direction: column;
  overflow: scroll;
}

.modal-block__head {
  display: flex;
  align-items: center;
}

.modal-block__text {
  margin-top: 20px;
  color: #6e6e6e;
}

.modal-block__btn {
  padding: 5px 15px;
  white-space: nowrap;
  position: relative;
  text-align: center;
  color: #592C08;
  background: url(../i/shop_images/art_btn_bg_gold.png) #DAB761;
  background-size: 100% 100%;
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
  border: 0 solid;
  border-radius: 5px;
  box-shadow: inset 0 0 0 1px #fce6b0, inset 0 0 0 2px #a78750, 0 0 0 1px rgb(0 0 0 / 13%);
  cursor: pointer;
  margin-left: 150px;
}

.modal-block__setting {
  display: flex;
  flex-wrap: wrap;
}

.modal-block__checkbox {
  display: flex;
  align-items: center;
  margin: 0 8px 8px 5px;
  padding: 0;
}

.clan-block {
  flex-direction: column;
}

.clan-style {
  display: inline-flex;
  background-color:#adadad40;
  padding: 3px 7px;
  margin-left: 7px;
  border: 0;
  border-radius: 4px;
  color: #592C08;
}

.res-style__elem {
  align-self: center;
  display: flex;
}

.text-title {
  text-align:left;
  padding-top: 6px;
}

@media screen and (min-width: 320px) and (max-width: 600px) {
  .div-style {
    width: auto;
  }
  
  .news-head__title {
    font-size: 10px;
  }
  
  .res-style {
    flex-wrap: wrap;
    height: auto;
    padding: 5px;
  }
  .res-style__elem {
    margin: 0 10px 10px 0;
    font-size: 12px;
  }
  .text-title {
    font-size: 12px;
  }
  .news-head__settings {
    width: 10%;
  }
  .modal-block {
    width: auto;
    height: 400px;
  }
}`);
_GM_init();
var topics = {};
topics["1"] = { title: "Новости", link: "https://daily.heroeswm.ru/news/" };
topics["2"] = { title: "Горячие новости", link: "http://daily.heroeswm.ru/hn.php" };
topics["3"] = { title: "Зеркало", link: "http://daily.heroeswm.ru/mrrr.php" };
let firstClan;
let idForum;
let idRow;
let idClan;
var divInner;
var divResusr;
const isNewPersonPage = document.querySelector("div#hwm_no_zoom") ? true : false;

main();
function main() {
    //const widgetContainer = isNewPersonPage ? document.querySelector("center > div") : document.querySelector("body > center > table:nth-child(2)");
    const widgetContainer = isNewPersonPage ? document.querySelector("body > center") : document.querySelector("body > center > table:nth-child(2) > tbody > tr > td > table > tbody > tr:nth-child(6) > td:nth-child(1)");
    if(widgetContainer) {
        const divOuter = addElement('div', widgetContainer, { class: "div-style" }, GM_getValue("top", false));
        divOuter.innerHTML = `
<div class="flex">
  <div id="widget" class="flex">
       <div id="prevDaily" class="news-head active" opened="1">
           <span>📰</span>
           <h2 id="prevDaily_t" class="news-head__title" title="Новости HWM Daily">Новости HWM Daily</h2>
       </div>
       <h2 id="prevForum" class="news-head news-head__title mrgn-l" opened="0" title="Последние темы форума">Последние темы форума</h2>
       <h2 id="prevClan" class="news-head news-head__title mrgn-l" opened="0" title="Клановая рассылка">Клановая рассылка</h2>
  </div>
  <span id="switcher" opened="1" class="news-head__switch"></span>
  <span id="hwm_settings" class="news-head__settings" title="Настройки"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="cog" class="svg-inline--fa fa-cog fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z"></path></svg></span>
</div>
<div class="modal" id="modal">
  <div class="modal-block">
      <div class="modal-block__head">
        <h3 class="modal-block__title">Настройки виджета</h3>
        <button id="modal-close" class="modal-block__btn">Закрыть</button>
      </div>
      <form>
        <p class="modal-block__text">Выбор форума</p>
        <div class="modal-block__setting">
          <div class="modal-block__checkbox"><input type="radio" id="forum1" name="forum" value="oif"><label for="forum1">ОиФ</label></div>
          <div class="modal-block__checkbox"><input type="radio" id="forum2" name="forum" value="vip"><label for="forum2">ВиП</label></div>
          <div class="modal-block__checkbox"><input type="radio" id="forum3" name="forum" value="trnmt"><label for="forum3">Турниры</label></div>
          <div class="modal-block__checkbox"><input type="radio" id="forum4" name="forum" value="iip"><label for="forum4">ИиП</label></div>
          <div class="modal-block__checkbox"><input type="radio" id="forum5" name="forum" value="bip"><label for="forum5">БиП</label></div>
          <div class="modal-block__checkbox"><input type="radio" id="forum6" name="forum" value="fvt"><label for="forum6">ФВТ</label></div>
          <div class="modal-block__checkbox"><input type="radio" id="forum7" name="forum" value="meeting"><label for="forum7">Встречи</label></div>
          <div class="modal-block__checkbox"><input type="radio" id="forum8" name="forum" value="oa"><label for="forum8">Обычные артефакты</label></div>
          <div class="modal-block__checkbox"><input type="radio" id="forum9" name="forum" value="rent"><label for="forum9">Аренда</label></div>
          <div class="modal-block__checkbox"><input type="radio" id="forum10" name="forum" value="ukio"><label for="forum10">УКиО</label></div>
          <div class="modal-block__checkbox"><input type="radio" id="forum11" name="forum" value="elemnts"><label for="forum11">ПЭСиП</label></div>
          <div class="modal-block__checkbox"><input type="radio" id="forum12" name="forum" value="pz-battle"><label for="forum12">ПЗ(Бои)</label></div>
          <div class="modal-block__checkbox"><input type="radio" id="forum13" name="forum" value="pz-finance"><label for="forum13">ПЗ(Финансы)</label></div>
          <div class="modal-block__checkbox"><input type="radio" id="forum14" name="forum" value="oitpf"><label for="forum14">ТП</label></div>
          <div class="modal-block__checkbox"><input type="radio" id="forum15" name="forum" value="ois"><label for="forum15">ОиС</label></div>
        </div>
      </form>
      <form>
        <p class="modal-block__text">Выбор клана</p>
        <div class="modal-block__setting clans-block">
        </div>
      </form>
  </div>
</div>`;
        divInner = addElement('div', divOuter, { innerHTML: `${getwheelimg()}&nbsp;&nbsp;Загрузка списка новостей...` });
        divResusr = addElement('div', divOuter, { class: "res-style", innerHTML: getwheelimg() });
        if(isNewPersonPage) {
            const anchorRect = document.querySelector("div#set_mobile_max_width").getBoundingClientRect();
            console.log(anchorRect.width)
            divOuter.style.width = `${anchorRect.width}px`;
        }
        const switcher = document.getElementById('switcher');
        switcher.addEventListener("click", function(event) {
            let d = 1 - Number(switcher.getAttribute("opened"));
            GM_setValue("hwmdsw", d);
            flick(d);
        }, false);
        flick(GM_getValue("hwmdsw", 1));
      
        const hwmSettings = document.getElementById('hwm_settings'); 
        hwmSettings.addEventListener("click", function(event) {
            document.querySelector("#modal").style.display = 'flex';
            document.querySelector("html").style.overflowY = 'hidden';
        }, false);
      
        const prevDaily = document.getElementById('prevDaily');
        prevDaily.addEventListener("click", function(event) { prevD(); }, false);
        const prevForum = document.getElementById('prevForum');
        prevForum.addEventListener("click", function(event) { prevF(); }, false);
        const prevClan = document.getElementById('prevClan');
        prevClan.addEventListener("click", function(event) { prevC(); }, false);

        const closeSettings = document.getElementById('modal-close');
        closeSettings.addEventListener("click", function(event) {
            document.querySelector("#modal").style.display = 'none';
            document.querySelector("html").style.overflowY = 'overlay';
            checkedForum();
            if(document.getElementById('prevForum').getAttribute("opened") == 1) doForum(idForum, idRow);
            checkedClans();
            if(document.getElementById('prevClan').getAttribute("opened") == 1) doClan(idClan);
        }, false);

        localForumId();
        localClanId();
    }
    parseClans();
}
function parseClans() {
    return new Promise(((resolve, reject) => {
        const URl = `https://www.heroeswm.ru/pl_clans.php`
        doGet(URl, doc => {
            const clans = doc.querySelectorAll("td > li");
            if(clans !== null) {
              let clan = '';
              for(var i = 0; i < clans.length; i++)
              {   
                  let clanInfo = doc.querySelector(`td > li:nth-child(${i+2})`).childNodes;
                  let clanId = clanInfo[0].data.replace(/[^+\d]/g, '');
                  let clanName = clanInfo[1].outerText;
                  clan += `<div class="modal-block__checkbox"><input type="radio" id="clan${i+1}" name="clan" value="${clanId}"><label for="clan${i+1}">#${clanId} ${clanName}</label></div>`;
              }
              document.querySelector(".clans-block").innerHTML = clan;
              firstClan = doc.querySelector(`td > li:nth-child(2)`).childNodes[0].data.replace(/[^+\d]/g, '');
            }
            resolve()
        })
    }))  
}
function localForumId() {
  if(localStorage.forumId == undefined) {
    idForum = 2;
    idRow = 6;
  } else {
    idForum = Number(localStorage.forumId);
    idRow = Number(localStorage.forumRow);
  }
}
function localClanId() {
  if(localStorage.clanId !== undefined) {
    idClan = Number(localStorage.clanId);
  }
}
function checkedClans() {
  let id;
  let clans = document.querySelectorAll("#modal > div > form:nth-child(3) > div > div > label");
  for(let i = 0; i < clans.length; i++) {
     id = document.querySelector(`#clan${i+1}`);
     let value = Number(id.value);
     if(id.checked == true) {
       idClan = value;
     } else {
       idClan = idClan;
     }
  }
}  
function checkedForum() {
  let id;
  for(let i = 0; i < 15; i++) {
     id = document.querySelector(`#forum${i+1}`);
     if(id.checked == true) {
       switch(i+1) {
          case 1:
            idForum = 2;
            idRow = 6;
            break
           
          case 2:
            idForum = 10;
            idRow = 8;
            break
           
          case 3:
            idForum = 24;
            idRow = 4;
            break
           
          case 4:
            idForum = 3;
            idRow = 5;
            break
           
          case 5:
            idForum = 12;
            idRow = 3;
            break
           
          case 6:
            idForum = 11;
            idRow = 4;
            break
           
          case 7:
            idForum = 27;
            idRow = 3;
            break
           
          case 8:
            idForum = 14;
            idRow = 4;
            break
           
          case 9:
            idForum = 21;
            idRow = 3;
            break
           
          case 10:
            idForum = 22;
            idRow = 3;
            break
           
          case 11:
            idForum = 23;
            idRow = 4;
            break
           
          case 12:
            idForum = 25;
            idRow = 4;
            break
           
          case 13:
            idForum = 13;
            idRow = 5;
            break
           
          case 14:
            idForum = 7;
            idRow = 5;
            break
           
          case 15:
            idForum = 8;
            idRow = 4;
            break
       }
     } else {
            idForum = idForum;
            idRow = idRow;
     }
  }
}  
async function flick(opened) {
    const switcher = document.getElementById('switcher');
    if (opened != 1) {
        switcher.innerHTML = '<img src="https://dcdn3.heroeswm.ru/i/inv_im/btn_expand.svg" style="-webkit-transform: rotate(90deg);transform: rotate(90deg);">';
        // <img src="https://dcdn3.heroeswm.ru/i/inv_im/btn_expand.svg" class="home_scroll_content_expand_sign inv_rotate90">
        divInner.style.display = "none";
        divResusr.style.display = "none";
        switcher.setAttribute("opened", "0");
    } else {
        const prevDaily = document.getElementById('prevDaily');
        const prevForum = document.getElementById('prevForum');
        if (Number(prevDaily.getAttribute("opened")) != 0) {
            do_req();
        } else if (Number(prevForum.getAttribute("opened")) != 0)  {
            doForum(idForum, idRow);
        } else {
            doClan(idClan);
        }
        // do_req();
        switcher.innerHTML = '<img src="https://dcdn3.heroeswm.ru/i/inv_im/btn_expand.svg" style="-webkit-transform: rotate(270deg);transform: rotate(270deg);">';
        divInner.style.display = "block";
        // divResusr.style.display = 'flex';
        divResusr.innerHTML = getwheelimg();
        await getResources();
        divResusr.style.display = 'flex'
        switcher.setAttribute("opened", "1");
    }
}
function prevD() {
    const prevDaily = document.getElementById('prevDaily');
    if (Number(prevDaily.getAttribute("opened")) != 0) {
        window.open("https://daily.heroeswm.ru/", "_blank");
    } else {
        const switcher = document.getElementById('switcher');
        if (Number(switcher.getAttribute("opened")) != 1) {
            prevDaily.disabled = true;
        } else {
            const prevForum = document.getElementById('prevForum');
            const prevClan = document.getElementById('prevClan');
            prevForum.style.background = "#eae8dd00";
            prevClan.style.background = "#eae8dd00";
            prevDaily.style.background = "#eae8dd";  
            divInner.style.display = "none";
            do_req();
          
            prevClan.setAttribute("opened", "0"); 
            prevForum.setAttribute("opened", "0");
            prevDaily.setAttribute("opened", "1");

            divInner.style.display = "block";
        }
    }
}
function prevF() {
    const prevForum = document.getElementById('prevForum');
    if (Number(prevForum.getAttribute("opened")) != 0) {
        window.open(`https://www.heroeswm.ru/forum_thread.php?id=${idForum}`, "_blank");
    } else  {
        const switcher = document.getElementById('switcher');
        if (Number(switcher.getAttribute("opened")) != 1) {
            prevForum.disabled = true;
        } else {
            const prevDaily = document.getElementById('prevDaily');
            const prevClan = document.getElementById('prevClan');
            prevDaily.style.background = "#eae8dd00";
            prevClan.style.background = "#eae8dd00"; 
            prevForum.style.background = "#eae8dd";

            divInner.style.display = "none";
            doForum(idForum, idRow);

            prevClan.setAttribute("opened", "0"); 
            prevDaily.setAttribute("opened", "0");      
            prevForum.setAttribute("opened", "1");
            // do_req();

            divInner.style.display = "block";
        }
    }
}
function prevC() {
    const prevClan = document.getElementById('prevClan');
    if (Number(prevClan.getAttribute("opened")) != 0) {
        window.open(`https://www.heroeswm.ru/sms_clans.php?clan_id=${idClan}`, "_blank");
    } else  {
        const switcher = document.getElementById('switcher');
        if (Number(switcher.getAttribute("opened")) != 1) {
            prevClan.disabled = true;
        } else {
            const prevDaily = document.getElementById('prevDaily');
            const prevForum = document.getElementById('prevForum');

            prevDaily.style.background = "#eae8dd00";
            prevClan.style.background = "#eae8dd"; 
            prevForum.style.background = "#eae8dd00";

            divInner.style.display = "none";
            // doClan(idClan);
            
            if(localStorage.clanId !== NaN) {
              doClan(idClan);
            } else {
              doClan(firstClan);
            }

            prevClan.setAttribute("opened", "1"); 
            prevDaily.setAttribute("opened", "0");      
            prevForum.setAttribute("opened", "0");
            // do_req();

            divInner.style.display = "block";
        }
    }
}
function _GM_init() {
    if (typeof GM_deleteValue == 'undefined') {
        GM_getValue = function(name, defaultValue) {
            var value = localStorage.getItem(name);
            if (!value) return defaultValue;
            var type = value[0];
            value = value.substring(1);
            switch (type) {
                case 'b':
                    return value == 'true';
                case 'n':
                    return Number(value);
                default:
                    return value;
            }
        }
        GM_registerMenuCommand = function(name, funk) {;
        }
        GM_setValue = function(name, value) {
            value = (typeof value)[0] + value;
            localStorage.setItem(name, value);
        }
    }
}
function trimming(string, l) {
    var s = string;
    if (string.length > l) {
        for (var i = l; i >= 0; i--)
            if (string.charAt(i) == ' ') s = string.substr(0, i) + '...';
        s = string.substr(0, l) + '...';
    }
    return s.replace(/&[^#]/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;");
}
function doGet(url, callback) {
    GM.xmlHttpRequest({
        method: "GET",
        url: url,
        overrideMimeType: "text/xml; charset=windows-1251",
        headers:
        {
           'User-agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1)',
           'Accept': 'text/xml,text/html',
           'Content-Type': 'text/plain; charset=windows-1251'
        },
        synchronous: false,
        onload: function (res) {
            callback(new DOMParser().parseFromString(res.responseText, "text/html"))
        }
    });
}
function getRequest(url) {
    return new Promise((resolve, reject) => {
        GM.xmlHttpRequest({ method: "GET", url: url, overrideMimeType: "text/html; charset=windows-1251",
            onload: function(response) { resolve((new DOMParser).parseFromString(response.responseText, "text/html")); },
            onerror: function(error) { reject(error); }
        });
    });
}
async function getElementLots() {
    const doc = await getRequest(`https://www.heroeswm.ru/auction.php?cat=elements&sort=0`);
    const firstLotRow = doc.querySelector("center > table:nth-child(2) > tbody > tr > td > table > tbody > tr:nth-child(2) > td:nth-child(2) > table > tbody > tr:nth-child(3)");
    let arts = [];
    let row = firstLotRow;
    while(row = row.nextElementSibling) {
        const art = parseLotRow(row);
        if(art) {
            arts.push(art);
        }
    }
    const grouppedArts = groupBy(arts.filter(x => x.LotType == LotType.Purchase), "ArtId");
    return grouppedArts;
}
function parseLotRow(row) {
    if(!row || row.nodeName != "TR") {
        return;
    }
    const goldImageElement = row.querySelector("img[src*='gold.png']");
    if(!goldImageElement) {
        return;
    }
    const lotPrice = parseFloat(goldImageElement.parentNode.nextElementSibling.innerText.replace(/,/g, ""));
    let artId;
    let lotAmount = 1;
    const lotAmountExec = new RegExp(`(\\d+) ${isEn ? "pcs." : "шт."}`).exec(row.innerHTML);
    //console.log(lotAmountExec);
    if(lotAmountExec) {
        lotAmount = parseInt(lotAmountExec[1]);
    }
    const lotType = row.innerHTML.includes(LocalizedString.BuyNow) ? LotType.Purchase : LotType.Auction;
    const artImageRefElement = row.querySelector("a[href*='art_info.php']");
    if(!artImageRefElement) {
        const elementsList = Object.values(ElementsTypes).join("|");
        const elementParse = (new RegExp(`gn_res/(${elementsList}).png`)).exec(row.innerHTML);
        if(elementParse) {
            artId = elementParse[1];
        }
        if(row.innerHTML.includes("house_cert")) {
            const locationsList = Object.values(locations).map(x => x[2]).join("|");
            const sertParse = (new RegExp(`<br>(${locationsList})&nbsp;<b>`)).exec(row.innerHTML);    
            if(sertParse) {
                artId = getSertIdByLocationName(sertParse[1]);
            }
        }
        const resourcesList = Object.values(ResourcesTypes).map(x => x.ImageName).join("|");
        const resourceParse = (new RegExp(`/(${resourcesList}).png`)).exec(row.innerHTML);
        if(resourceParse) {
            artId = "res_" + resourceParse[1];
        }
        if(row.innerHTML.includes("auc_dom")) {
            const locationsList = Object.values(locations).map(x => x[2]).join("|");
            const sertParse = (new RegExp(`<br>(${locationsList})&nbsp;<b>`)).exec(row.innerHTML);    
            if(sertParse) {
                artId = getHouseIdByLocationName(sertParse[1]);
            }
        }
        if(row.innerHTML.includes("obj_share_pic")) {
            const locationsList = Object.values(locations).map(x => x[2]).join("|");
            const sertParse = (new RegExp(`<br>(${locationsList})&nbsp;<b>`)).exec(row.innerHTML);    
            if(sertParse) {
                artId = getShaIdByLocationName(sertParse[1]);
            }
        }
    } else {
        artId = getUrlParamValue(artImageRefElement.href, "id");
        var artUid = getUrlParamValue(artImageRefElement.href, "uid");;
        const strengthData = row.innerText.match(/\d+\/\d+/);
        var restLotStrength = parseInt(strengthData[0].split("/")[0]);
        var lotStrength = parseInt(strengthData[0].split("/")[1]);
    }
    const lotRef = row.querySelector("a[href^='auction_lot_protocol.php']");
    const lotId = getUrlParamValue(lotRef.href, "id");
    
    const imgR = row.querySelector("td:nth-child(1) > table > tbody > tr > td:nth-child(1) > img");
    
    return { ArtUid: artUid, ArtId: artId, LotStrength: lotStrength, RestLotStrength: restLotStrength, LotPrice: lotPrice, LotType: lotType, LotAmount: lotAmount, LotId: lotId, ImageUrl: imgR.getAttribute('src'), Title: imgR.getAttribute('title') };
}
async function getResources() {
    const grouppedArts = await getElementLots();
    const elementsData = [];
    for(const elementName of ElementNames)
    {
        const arts = grouppedArts[elementName]
        if(arts.length == 0) {
            continue;
        }
        const art = arts[0];
        let price = art.LotPrice;
        let secondLotPrice = price;
        if(arts.length > 1) {
            secondLotPrice = arts[1].LotPrice;
        }
        elementsData.push({ ElementName: elementName,
            Price: price,
            ImageUrl: art.ImageUrl,
            Title: art.Title,
            Diffrence: secondLotPrice - price,
            AuctionUrl: `https://www.heroeswm.ru/auction.php?cat=elements&sort=0&art_type=${elementName}`,
            NewAuctionUrl: `https://www.heroeswm.ru/auction_new_lot.php?${elementName}=${(price - 1)}`
        }); 
    }
    //console.log(elementsData);
    let res = "";
    for(const elementData of elementsData)
    {                                    
        res += `
<div class='res-style__elem'>
<div style='align-self: center;'>
    <a class='hover-link' href='${elementData.NewAuctionUrl}' target='_blank'>
        <img src='${elementData.ImageUrl}' width='20' heigth='20' border='0'>
    </a>
</div>
<a class='hover-link' target='_. blank' style='text-decoration: none; align-self: center; margin-left: 5px; font-size: 9px;' href='${elementData.AuctionUrl}' title='Разница первого и второго лотов: ${elementData.Diffrence}'>${elementData.Price}</a>
<div style='${(elementData.Diffrence >= 150 ? 'display: inline-flex;background-color: #f33800;padding: 5px;margin-left: 5px;border: 0; border-radius: 4px; color: #fff;' : 'display: none;')}'>
    <span title='' style='font-size: 8px; font-weight: bold;'>${elementData.Diffrence}</span>
</div>
</div>`;
    }
    divResusr.innerHTML = res;
}
function doClan(id) {
    return new Promise(((resolve, reject) => {
        localStorage.clanId = id;
        const cURl = `https://www.heroeswm.ru/sms_clans.php?clan_id=${id}`
        doGet(cURl, doc => {
          
            let v = (doc.querySelector("body > center > table > tbody > tr > td > table > tbody > tr > td:nth-child(2) > table > tbody > tr:nth-child(2) > td > center > b > font") !== null) ? 1 : 0;
          
            var u = [doc.querySelector(`tr:nth-child(${3+v}) > td:nth-child(3) > a`),
                       doc.querySelector(`tr:nth-child(${4+v}) > td:nth-child(3) > a`),
                       doc.querySelector(`tr:nth-child(${5+v}) > td:nth-child(3) > a`),
                       doc.querySelector(`tr:nth-child(${6+v}) > td:nth-child(3) > a`),
                       doc.querySelector(`tr:nth-child(${7+v}) > td:nth-child(3) > a`)];
          
            var d = [doc.querySelector(`tr:nth-child(${3+v}) > td:nth-child(2)`),
                       doc.querySelector(`tr:nth-child(${4+v}) > td:nth-child(2)`),
                       doc.querySelector(`tr:nth-child(${5+v}) > td:nth-child(2)`),
                       doc.querySelector(`tr:nth-child(${6+v}) > td:nth-child(2)`),
                       doc.querySelector(`tr:nth-child(${7+v}) > td:nth-child(2)`)];
                    
            var clan = "";
            
            for(var i = 0; i < u.length; i++)
            {
                if(u[i] !== null) {
                    clan += "<div class = 'text-title'><a class = 'hover-link' style = 'text-decoration:none"
                    + (((Date.now() - Date.parse(d[i].innerHTML.replace(/<\/?[^>]+(>|$)/g, ''))) / (1000 * 60 * 60) - 4).toFixed(0) <= 1 ? ';font-weight: bold; color:red' : '')
                    + "' target='_blank' href='"
                    + u[i]
                    + "' title='"
                    + u[i].innerHTML.replace(/<\/?[^>]+(>|$)/g, '')
                    + (((Date.now() - Date.parse(d[i].innerHTML.replace(/<\/?[^>]+(>|$)/g, ''))) / (1000 * 60 * 60) - 4).toFixed(0) <= 6 ? "'>📣 " : "'>• ")
                    + u[i].innerHTML.replace(/<\/?[^>]+(>|$)/g, '')
                    + "</a><div class = 'clan-style'><span title = 'комментариев' style = 'font-size:9px'>"
                    + d[i].innerHTML.replace(/<\/?[^>]+(>|$)/g, '')
                    + "</span></div></div>";
                }
                if (u.indexOf(null) == 0) {
                    clan = "<div>Новостей нет</div>";
                }
            }
          
            divInner.innerHTML = "<div>" + clan + "</div>";
            resolve()
        })
    }))
}
function doForum(id, x) {
    return new Promise(((resolve, reject) => {
        localStorage.forumId = id;
        localStorage.forumRow = x;
        const fURl = `https://www.heroeswm.ru/forum_thread.php?id=${id}`
        doGet(fURl, doc => {
            var u = [doc.querySelector(`tr:nth-child(${x}) > td:nth-child(1) > a`),
                       doc.querySelector(`tr:nth-child(${x+1}) > td:nth-child(1) > a`),
                       doc.querySelector(`tr:nth-child(${x+2}) > td:nth-child(1) > a`),
                       doc.querySelector(`tr:nth-child(${x+3}) > td:nth-child(1) > a`),
                       doc.querySelector(`tr:nth-child(${x+4}) > td:nth-child(1) > a`)];
          
            var d = [doc.querySelector(`tr:nth-child(${x}) > td:nth-child(3)`),
                       doc.querySelector(`tr:nth-child(${x+1}) > td:nth-child(3)`),
                       doc.querySelector(`tr:nth-child(${x+2}) > td:nth-child(3)`),
                       doc.querySelector(`tr:nth-child(${x+3}) > td:nth-child(3)`),
                       doc.querySelector(`tr:nth-child(${x+4}) > td:nth-child(3)`)];
          
            var forum = "";
          
            for(var i = 0; i < u.length; i++)
            {               
                forum += "<div class = 'text-title'><a class = 'hover-link' style = 'text-decoration:none"
                + (d[i].innerHTML.replace(/<\/?[^>]+(>|$)/g, '') <= 10 ? ';font-weight: bold; color:#ff4d00' : '')
                + "' target='_blank' href='"
                + u[i]
                + "' title='"
                + u[i].innerHTML.replace(/<\/?[^>]+(>|$)/g, '')
                + (d[i].innerHTML.replace(/<\/?[^>]+(>|$)/g, '') <= 20 ? "'>🔥 " : "'>• ")
                + u[i].innerHTML.replace(/<\/?[^>]+(>|$)/g, '')
                + "</a><div style = 'display: inline-flex;background-color: #adadad40;padding: 3px 7px;margin-left: 7px;border: 0;border-radius: 4px;color: #592C08;'><span title = 'комментариев' style = 'font-size:9px'>"
                + d[i].innerHTML.replace(/<\/?[^>]+(>|$)/g, '')
                + "</span></div></div>";
            }
          
            divInner.innerHTML = "<div>" + forum + "</div>";
            resolve()
        })
    }))
}
function do_req() {
   GM.xmlHttpRequest(
   {
      method: "GET",
      url: "https://daily.heroeswm.ru/news4script.txt?" + Date.now(),
      headers:
      {
         'User-agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1)',
         'Accept': 'text/xml,text/html',
         'Content-Type': 'text/plain; charset=windows-1251'
      },
      synchronous: false,
      overrideMimeType: 'text/plain; charset=windows-1251',
      onload: function(response)
      {
         try
         {
            var sPat = /\/\/daily\.heroeswm\.ru\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*$/i;
            var nData = JSON.parse('[["' + response.responseText.replace(/"/g, "\\\"").replace(/\n/g, '"],["').replace(/;;/g, '","').replace(/'/g, "&#39;") + '"]]');
            var s = "";
            var new_last = '';
            var last = GM_getValue("last", "0|1");
            var last_ar = last.split('|');
            for(var i = 0; i < nData.length - 1; i++)
            {
               if((sPat.test(nData[i][1])) && (sPat.test(nData[i][3])) && (/^[1-3]$/.test(nData[i][0])))
               {
                  var max = 25;
                  if(last_ar.indexOf(nData[i][4]) == -1) max = max - 3;
                  s += "<div class = 'text-title'><a class = 'hover-link' style = 'text-decoration:none"
                  + (last_ar.indexOf(nData[i][4]) == -1 ? ';font-weight: bold; color:red' : '')
                  + "' target='_blank' href='"
                  + nData[i][3]
                  + "' title='"
                  + trimming(nData[i][2], 255)
                  + (last_ar.indexOf(nData[i][4]) == -1 ? "'>⚡ " : "'>• ")
                  + trimming(nData[i][2], 255)
                  + "</a><div style = 'display: inline-flex;background-color: #adadad40;padding: 3px 7px;margin-left: 7px;border: 0;border-radius: 4px;color: #592C08;'><span title = 'комментариев' style = 'font-size:9px'>"
                  + nData[i][5]
                    + "</span></div></div>";
                  new_last += nData[i][4] + "|";
               }
            }
            var css = '.hover-link:hover{ color: red }';
            var style = document.createElement('style');

            if (style.styleSheet) {
                 style.styleSheet.cssText = css;
            } else {
                 style.appendChild(document.createTextNode(css));
            }

            document.getElementsByTagName('head')[0].appendChild(style);
            GM_setValue("last", new_last);
         }
         catch(e)
         {
            s = "<div>Что-то не то... Не получается новости подгрузить...</div>";
         }
         finally
         {
            divInner.innerHTML = "<div>" + s + "</div>";
         }
      },
      onerror: function(response)
      {
         divInner.innerHTML = "<div>Что-то не то... Не получается новости подгрузить...</div>";
      }
   })
}
function GM_addStyle(css) {
    var head = document.getElementsByTagName('head')[0];
    if (!head)
      return;
    var style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = css;
    head.appendChild(style);
}
function addElement(type, parent, data, insertFirst = false) {
    let el = createElement(type, data);
    if(parent) {
        if(insertFirst) {
            parent.insertBefore(el, parent.firstChild);
        } else {
            parent.appendChild(el);
        }
    }
    return el;
}
function createElement(type, data) {
    let el = document.createElement(type);
    if(data) {
        for(let key in data) {
            if(key == "innerText" || key == "innerHTML") {
                el[key] = data[key];
            } else {
                el.setAttribute(key, data[key]);
            }
        }
    }
    return el;
}
function getwheelimg() { return '<img border="0" align="absmiddle" height="11" src="https://dcdn.heroeswm.ru/css/loading.gif">'; }
function getUrlParamValue(url, paramName) { return (new URLSearchParams(url.split("?")[1])).get(paramName); }
function groupBy(list, key) { return list.reduce(function(rv, item) { (rv[item[key]] = rv[item[key]] || []).push(item); return rv; }, {}); };
function getSertIdByLocationNumber(locationNumber) { return "sec_" + (locationNumber.toString()).padStart(2, "0"); }
function getSertIdByLocationName(locationName) { 
    const locationNumber = Object.keys(locations).find(x => locations[x][2] == locationName);
    return getSertIdByLocationNumber(locationNumber);
}
function getHouseIdByLocationNumber(locationNumber) { return "dom_" + (locationNumber.toString()).padStart(2, "0"); }
function getHouseIdByLocationName(locationName) { 
    const locationNumber = Object.keys(locations).find(x => locations[x][2] == locationName);
    return getHouseIdByLocationNumber(locationNumber);
}
function uchar(s) { switch (s[0]) {case "А": return "\u0410"; case "Б": return "\u0411"; case "В": return "\u0412"; case "Г": return "\u0413"; case "Д": return "\u0414"; case "Е": return "\u0415"; case "Ж": return "\u0416"; case "З": return "\u0417"; case "И": return "\u0418"; case "Й": return "\u0419"; case "К": return "\u041a"; case "Л": return "\u041b"; case "М": return "\u041c"; case "Н": return "\u041d"; case "О": return "\u041e"; case "П": return "\u041f"; case "Р": return "\u0420"; case "С": return "\u0421"; case "Т": return "\u0422"; case "У": return "\u0423"; case "Ф": return "\u0424"; case "Х": return "\u0425"; case "Ц": return "\u0426"; case "Ч": return "\u0427"; case "Ш": return "\u0428"; case "Щ": return "\u0429"; case "Ъ": return "\u042a"; case "Ы": return "\u042b"; case "Ь": return "\u042c"; case "Э": return "\u042d"; case "Ю": return "\u042e"; case "Я": return "\u042f"; case "а": return "\u0430"; case "б": return "\u0431"; case "в": return "\u0432"; case "г": return "\u0433"; case "д": return "\u0434"; case "е": return "\u0435"; case "ж": return "\u0436"; case "з": return "\u0437"; case "и": return "\u0438"; case "й": return "\u0439"; case "к": return "\u043a"; case "л": return "\u043b"; case "м": return "\u043c"; case "н": return "\u043d"; case "о": return "\u043e"; case "п": return "\u043f"; case "р": return "\u0440"; case "с": return "\u0441"; case "т": return "\u0442"; case "у": return "\u0443"; case "ф": return "\u0444"; case "х": return "\u0445"; case "ц": return "\u0446"; case "ч": return "\u0447"; case "ш": return "\u0448"; case "щ": return "\u0449"; case "ъ": return "\u044a"; case "ы": return "\u044b"; case "ь": return "\u044c"; case "э": return "\u044d"; case "ю": return "\u044e"; case "я": return "\u044f"; case "Ё": return "\u0401"; case "ё": return "\u0451"; default: return s[0];} }
function ustring(s) {
    s = String(s);
    var result = "";
    for (var i = 0; i < s.length; i++)
        result += uchar(s[i]);
    return result;
}