kiso

HWM_RepairAssistant.user.js

Apr 28th, 2022 (edited)
124
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 20.26 KB
  1. // ==UserScript==
  2. // @name         HWM_RepairAssistant
  3. // @namespace    Небылица
  4. // @version      1.1.1
  5. // @homepage     https://greasyfork.org/scripts/382911-hwm-repairassistant/code/HWM_RepairAssistant.user.js
  6. // @description  Помощник для ремонта через новый интерфейс
  7. // @author       Небылица
  8. // @include        https://www.heroeswm.ru/pl_transfers.php*
  9. // @include        https://www.heroeswm.ru/art_transfer.php*
  10. // @include        *178.248.235.15/pl_transfers.php*
  11. // @include        *178.248.235.15/art_transfer.php*
  12. // @grant        GM_setValue
  13. // @grant        GM_getValue
  14. // ==/UserScript==
  15.  
  16. (function() {
  17.     "use strict";
  18.  
  19.     // Вспомогательные функции
  20.     function validateNick(nick){ // Возвращает массив ["результат валидации (true/false)", "строка с тем, что не так (либо ник, если верен)"]
  21.         if (nick.length < 3 || nick.length > 18){
  22.             return [false, "Ник должен быть не длиннее 18 символов и не короче 3"];
  23.         }
  24.         if (nick.match(/^\d+$/)){
  25.             return [false, "Ник не может содержать только цифры"];
  26.         }
  27.         if (nick.match(/[^\W_\d]/) && nick.match(/[а-яА-ЯёЁ]/)){ // _ и цифры могут сочетаться с кириллицей
  28.             return [false, "Ник может быть либо целиком из русских букв, либо целиком из английских (смешивать нельзя)"];
  29.         }
  30.         if (!nick.match(/^[a-zA--яА-ЯёЁ\d\s_-]+$/)){
  31.             return [false, "Ник не должен содержать символов помимо русских или английских букв, цифр, знака подчёркивания, дефиса и пробела"];
  32.         }
  33.         return [true, nick];
  34.     }
  35.     function validatePrice(price){ // Возвращает цену в формате "2/3 цифры и знак %", либо false при невозможности обработки
  36.         if (price.match(/^\d{2,3}%$/)){return price;}
  37.         if (price.match(/^\d{2,3}$/)){return price + "%";}
  38.         return false;
  39.     }
  40.     function drawSmithsTable(smiths, smithsDiv){ // Принимает массив кузнецов и рабочий элемент, отрисовывает в него таблицу и вяжет события удаления
  41.         if (smiths.length > 0){
  42.             var smithsDivInnerHTML =
  43.                 "<style>" +
  44.                 ".RA_smithsTr:hover{background: #DCDCDC;}" +
  45.                 ".RA_smithsTdNick{font-weight: bold;}" +
  46.                 ".RA_smithsTdDelete{font-size: 11px;}" +
  47.                 "</style>";
  48.  
  49.             smithsDivInnerHTML += "<table style='text-align: center;'><tbody>";
  50.             maxI = smiths.length;
  51.             for (i=0;i<maxI;i++){
  52.                 smithsDivInnerHTML += "<tr class='RA_smithsTr' title='" + smiths[i][3] + "'>";
  53.                 smithsDivInnerHTML += "<td class='RA_smithsTdNick' width='119px'><a href='pl_info.php?nick="+ encodeCP1251(smiths[i][0]) + "' target='_blank'>" + smiths[i][0] + "</a></td>";
  54.                 smithsDivInnerHTML += "<td class='RA_smithsTdEfficiency' width='55px'>" + smiths[i][1] + "</td>";
  55.                 smithsDivInnerHTML += "<td class='RA_smithsTdPrice' width='55px'>" + smiths[i][2] + "</td>";
  56.                 smithsDivInnerHTML += "<td class='RA_smithsTdDelete' id='RA_smithsTdDeleteSmith" + i + "' width='16px' title='Удалить кузнеца'>x</td>";
  57.                 smithsDivInnerHTML += "</tr>";
  58.             }
  59.             smithsDivInnerHTML += "</tbody></table>";
  60.  
  61.             smithsDiv.innerHTML = smithsDivInnerHTML;
  62.             setStylesByMode();
  63.             setDeleteSmithEvents();
  64.             if (repairRadio){setFillSmithEvents();}
  65.         } else{
  66.             smithsDiv.innerHTML = "<center>Кузнецов пока нет</center>";
  67.         }
  68.     }
  69.     function setDeleteSmithEvents(){ // Вяжет события к кнопкам удаления
  70.         var deleteButtons = document.querySelectorAll("td.RA_smithsTdDelete");
  71.         if (deleteButtons.length > 0){
  72.             var maxI = deleteButtons.length;
  73.             for (i=0;i<maxI;i++){
  74.                 deleteButtons[i].onclick = function(event){
  75.                     smiths.splice(parseInt(event.target.getAttribute("id").replace("RA_smithsTdDeleteSmith", "")), 1);
  76.                     setSmiths(smiths);
  77.                     drawSmithsTable(smiths, document.getElementById("RA_smithsDiv"));
  78.                 }
  79.             }
  80.         } else{window.setTimeout(function(){setDeleteSmithEvents()}, 50);}
  81.     }
  82.     function setFillSmithEvents(){ // Вяжет события подстановки кузнецов
  83.         var smithsTds = document.querySelectorAll("td.RA_smithsTdNick, td.RA_smithsTdEfficiency, td.RA_smithsTdPrice");
  84.         if (smithsTds.length > 0){
  85.             var maxI = smithsTds.length;
  86.             for (i=0;i<maxI;i++){
  87.                 smithsTds[i].onclick = function(event){
  88.                     if (repairRadio.checked){
  89.                         var thisSmithTds = event.target.parentElement.childNodes,
  90.                             nickInput = document.querySelector("input[name='nick']"),
  91.                             finalPrice = Math.ceil(parseInt(baseGoldPrice)*priceToFloat(thisSmithTds[2].innerText));
  92.                         nickInput.value = thisSmithTds[0].innerText;
  93.  
  94.                         var a = document.createElement("a");
  95.                         a.href = "#";
  96.                         a.setAttribute("onclick", "set_price(" + finalPrice + ");");
  97.                         document.body.appendChild(a);
  98.                         a.click();
  99.                         setTimeout(function(){document.body.removeChild(a);}, 0);
  100.                     }
  101.                 }
  102.             }
  103.         } else{window.setTimeout(function(){setFillSmithEvents()}, 50);}
  104.     }
  105.     function clearNewSmith(){ // Очистка полей в newSmithDiv
  106.         newSmithNick.value = "";
  107.         newSmithEfficiency.value = "90%";
  108.         newSmithPrice.value = "100%";
  109.         newSmithNote.value = "";
  110.     }
  111.     function setSmiths(smiths){ // Принимает массив кузнецов, формирует и записывает в хранилище строку
  112.         var newSmithsString = "";
  113.         maxI = smiths.length;
  114.         for (i=0;i<maxI;i++){
  115.             newSmithsString += smiths[i].join(":");
  116.             if (i !== (smiths.length - 1)){newSmithsString += "|";}
  117.         }
  118.         GM_setValue("smiths" + plIdSubKey, newSmithsString);
  119.     }
  120.     function priceToFloat(price){ // Переводит цену из строки в число (100% --> 1)
  121.         return parseFloat(price.replace("%", "")/100);
  122.     }
  123.     function calculateRepairTime(baseGoldPrice, repairBeginningMomentOnServer){ // Принимает базовую цену и момент начала ремонта, возвращает массив ["время ремонта (A ч. B мин.)", "время окончания (xx:yy)", "объект времени окончания"]
  124.         var repairHoursFull = baseGoldPrice/4000,
  125.             repairHours = Math.trunc(repairHoursFull),
  126.             repairMinutes = Math.ceil(60*(repairHoursFull - Math.trunc(repairHoursFull))),
  127.             repairEndMomentOnServer = new Date(repairBeginningMomentOnServer.getTime() + Math.ceil(repairHoursFull*60*60*1000));
  128.         return [repairHours + " ч. " + repairMinutes + " мин.",
  129.                 addLeadingZero(repairEndMomentOnServer.getHours()) + ":" +
  130.                 addLeadingZero(repairEndMomentOnServer.getMinutes()),
  131.                 repairEndMomentOnServer];
  132.     }
  133.     function setStylesByMode(){ // Показ/скрытие строки с ценой арта и выставление стиля курсора на кузнецах в зависимости от режима
  134.         var repairMode = (repairRadio) ? repairRadio.checked : false,
  135.             artPriceTrDisplay = (repairMode) ? "none" : "table-row",
  136.             smithsTdsCursor = (repairMode) ? "pointer" : "auto";
  137.         artPriceTr.style.display = artPriceTrDisplay;
  138.  
  139.         var smithsTds = document.querySelectorAll("td.RA_smithsTdNick, td.RA_smithsTdEfficiency, td.RA_smithsTdPrice");
  140.         if (smithsTds.length > 0){
  141.             var maxI = smithsTds.length;
  142.             for (i=0;i<maxI;i++){
  143.                 smithsTds[i].style.cursor = smithsTdsCursor;
  144.             }
  145.         }
  146.     }
  147.     function getBaseGoldPrice(){ // Возвращает базовую цену ремонта
  148.         var baseGoldPriceMatch = document.documentElement.innerHTML.match(/repair_price\s=\s(\d+);/),
  149.             baseGoldPrice =
  150.             (baseGoldPriceMatch) ? baseGoldPriceMatch[1] :
  151.         document.getElementById("rep").childNodes[4].childNodes[0].childNodes[6].childNodes[3].innerText.replace(",", "");
  152.         return baseGoldPrice;
  153.     }
  154.     function encodeCP1251(text){ // Перекодирует русский текст так, чтобы при отправке запроса не выходили кракозябры
  155.         var result = "",
  156.             CP1251toUTF8 = {
  157.                 "А": "%C0",
  158.                 "Б": "%C1",
  159.                 "В": "%C2",
  160.                 "Г": "%C3",
  161.                 "Д": "%C4",
  162.                 "Е": "%C5",
  163.                 "Ж": "%C6",
  164.                 "З": "%C7",
  165.                 "И": "%C8",
  166.                 "Й": "%C9",
  167.                 "К": "%CA",
  168.                 "Л": "%CB",
  169.                 "М": "%CC",
  170.                 "Н": "%CD",
  171.                 "О": "%CE",
  172.                 "П": "%CF",
  173.  
  174.                 "Р": "%D0",
  175.                 "С": "%D1",
  176.                 "Т": "%D2",
  177.                 "У": "%D3",
  178.                 "Ф": "%D4",
  179.                 "Х": "%D5",
  180.                 "Ц": "%D6",
  181.                 "Ч": "%D7",
  182.                 "Ш": "%D8",
  183.                 "Щ": "%D9",
  184.                 "Ъ": "%DA",
  185.                 "Ы": "%DB",
  186.                 "Ь": "%DC",
  187.                 "Э": "%DD",
  188.                 "Ю": "%DE",
  189.                 "Я": "%DF",
  190.  
  191.                 "а": "%E0",
  192.                 "б": "%E1",
  193.                 "в": "%E2",
  194.                 "г": "%E3",
  195.                 "д": "%E4",
  196.                 "е": "%E5",
  197.                 "ж": "%E6",
  198.                 "з": "%E7",
  199.                 "и": "%E8",
  200.                 "й": "%E9",
  201.                 "к": "%EA",
  202.                 "л": "%EB",
  203.                 "м": "%EC",
  204.                 "н": "%ED",
  205.                 "о": "%EE",
  206.                 "п": "%EF",
  207.  
  208.                 "р": "%F0",
  209.                 "с": "%F1",
  210.                 "т": "%F2",
  211.                 "у": "%F3",
  212.                 "ф": "%F4",
  213.                 "х": "%F5",
  214.                 "ц": "%F6",
  215.                 "ч": "%F7",
  216.                 "ш": "%F8",
  217.                 "щ": "%F9",
  218.                 "ъ": "%FA",
  219.                 "ы": "%FB",
  220.                 "ь": "%FC",
  221.                 "э": "%FD",
  222.                 "ю": "%FE",
  223.                 "я": "%FF",
  224.  
  225.                 "Ё": "%A8",
  226.                 "ё": "%B8",
  227.  
  228.                 " ": "%20",
  229.                 "!": "%21",
  230.                 "(": "%28",
  231.                 ")": "%29",
  232.                 "*": "%2A",
  233.                 "+": "%2B",
  234.                 ",": "%2C",
  235.                 "-": "%2D",
  236.                 ".": "%2E",
  237.                 "/": "%2F"
  238.             };
  239.  
  240.         var i,
  241.             maxI = text.length;
  242.         for (i=0;i<maxI;i++){
  243.             if (CP1251toUTF8[text[i]] !== undefined){
  244.                 result += CP1251toUTF8[text[i]];
  245.             } else{
  246.                 result += text[i];
  247.             }
  248.         }
  249.  
  250.         return result;
  251.     }
  252.     function insertAfter(newNode, referenceNode){ // Вставка newNode после referenceNode
  253.         referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
  254.     }
  255.     function setupObserver(target, config, callback){ // Привязка к target observer'а с параметрами config и вызовом callback при срабатывании c передачей observer внутрь
  256.         var observer = new MutationObserver(function(mutations){
  257.             mutations.forEach(function(mutation){callback.apply(observer);});
  258.         });
  259.         observer.observe(target, config);
  260.     }
  261.     function addLeadingZero(string){ // Вставляет ведущий ноль в строку с элементом даты/времени, если в ней только 1 цифра
  262.         string = string.toString();
  263.         if (string.length === 1){string = "0" + string;}
  264.         return string;
  265.     }
  266.     //
  267.  
  268.     var i,
  269.         maxI,
  270.         currentMoment,
  271.         currentMomentOnServer,
  272.         repairTimeArr,
  273.         baseGoldPrice;
  274.     if (location.pathname.indexOf("art_transfer") !== -1){ // передача арта
  275.         // создаём дублированную кнопку
  276.         var artTableTrs = document.querySelector("table.wb[width='600'][cellpadding='4'][align='center']").childNodes[1].childNodes,
  277.             artPriceTr = artTableTrs[8],
  278.             artSendModeTr = artTableTrs[10],
  279.             artSendButtonTr2 = artTableTrs[12],
  280.             artSendButtonTr1 = artSendButtonTr2.cloneNode(true),
  281.  
  282.             repairRadio = document.querySelector("input[type='radio'][name='sendtype'][value='5']"),
  283.             noTransferRadio = document.querySelector("input[type='radio'][name='sendtype'][value='0']"),
  284.             ownershipRadio = document.querySelector("input[type='radio'][name='sendtype'][value='1']"),
  285.             rentRadio = document.querySelector("input[type='radio'][name='sendtype'][value='2']");
  286.  
  287.         artSendButtonTr1.children[1].innerHTML = " <input type='button' value='Передать' id='tr_button_clone'>";
  288.         artSendButtonTr1.style.display = "table-row";
  289.         artSendButtonTr2.style.display = "none";
  290.         insertAfter(artSendButtonTr1, artPriceTr);
  291.  
  292.         var tr_button = document.getElementById("tr_button"),
  293.             tr_button_clone = document.getElementById("tr_button_clone");
  294.         tr_button_clone.onclick = function(){tr_button.click();};
  295.         tr_button_clone.disabled = tr_button.disabled;
  296.         setupObserver(tr_button, {attributes : true, attributeFilter : ['disabled']}, function(){
  297.             tr_button_clone.disabled = tr_button.disabled;
  298.         });
  299.  
  300.         // получаем id текущего персонажа и кусок ключа по нему
  301.         var plId = document.querySelector("li > a[href^='pl_hunter_stat.php']").getAttribute("href").split("id=")[1],
  302.             plIdSubKey = "|#" + plId;
  303.  
  304.         // задаём дефолтный/получаем список кузнецов
  305.         if (GM_getValue("smiths" + plIdSubKey) === undefined){GM_setValue("smiths" + plIdSubKey, "");}
  306.         var smithsString = GM_getValue("smiths" + plIdSubKey),
  307.             smiths = (smithsString) ? smithsString.split("|") : [];
  308.         maxI = smiths.length;
  309.         for (i=0;i<maxI;i++){
  310.             smiths[i] = smiths[i].split(":");
  311.         }
  312.  
  313.         // создаём элемент под таблицу кузнецов
  314.         var containerDiv = document.createElement("div"),
  315.             smithsDiv = document.createElement("div"),
  316.             containerTd = document.querySelector("td.wbwhite[valign='top'][align='right']");
  317.  
  318.         containerDiv.setAttribute("id", "RA_containerDiv");
  319.         smithsDiv.setAttribute("id", "RA_smithsDiv");
  320.  
  321.         drawSmithsTable(smiths, smithsDiv);
  322.  
  323.         containerTd.innerHTML = "";
  324.         containerTd.appendChild(containerDiv);
  325.         containerDiv.appendChild(smithsDiv);
  326.         containerDiv.innerHTML += "<hr width='100%'>";
  327.         containerTd.nextSibling.nextSibling.setAttribute("valign", "top");
  328.  
  329.         // создаём элемент под панель добавления нового кузнеца
  330.         var newSmithDiv = document.createElement("div");
  331.         newSmithDiv.setAttribute("id", "RA_newSmithDiv");
  332.         newSmithDiv.innerHTML =
  333.             "<center><b>Добавить нового кузнеца</b><br>" +
  334.             "<table><tbody><tr>" +
  335.             "<td width='122px'>" +
  336.             "<input type='text' id='RA_newSmithNick' style='width: 120px; padding-left: 3px;' placeholder='Ник'>" +
  337.             "</td>" +
  338.             "<td width='55px'>" +
  339.             "<select id='RA_newSmithEfficiency' style='height: 21px;'>" +
  340.             "<option value='90%'>90%</option>" +
  341.             "<option value='80%'>80%</option>" +
  342.             "<option value='70%'>70%</option>" +
  343.             "<option value='60%'>60%</option>" +
  344.             "<option value='50%'>50%</option>" +
  345.             "<option value='40%'>40%</option>" +
  346.             "<option value='30%'>30%</option>" +
  347.             "<option value='20%'>20%</option>" +
  348.             "<option value='10%'>10%</option>" +
  349.             "</select></td>" +
  350.             "<td width='55px'>" +
  351.             "<input type='text' id='RA_newSmithPrice' style='width: 53px; padding-left: 3px;' placeholder='Цена' value='100%'>" +
  352.             "</td></tr>" +
  353.             "<tr><td colspan='3'><input type='text' id='RA_newSmithNote' style='width: 232px; padding-left: 3px;' placeholder='Примечание (опционально)'>" +
  354.             "</td></tr></tbody><table>" +
  355.             "<input type='button' id='RA_newSmithButton' value='Добавить'></center>";
  356.         containerDiv.appendChild(newSmithDiv);
  357.  
  358.         var newSmithNick = document.getElementById("RA_newSmithNick"),
  359.             newSmithEfficiency = document.getElementById("RA_newSmithEfficiency"),
  360.             newSmithPrice = document.getElementById("RA_newSmithPrice"),
  361.             newSmithNote = document.getElementById("RA_newSmithNote"),
  362.             newSmithButton = document.getElementById("RA_newSmithButton"),
  363.             defaultPrices = {
  364.                 "90%": "100%",
  365.                 "80%": "80%",
  366.                 "70%": "70%",
  367.                 "60%": "60%",
  368.                 "50%": "50%",
  369.                 "40%": "40%",
  370.                 "30%": "30%",
  371.                 "20%": "20%",
  372.                 "10%": "10%"
  373.             };
  374.  
  375.         // автоподстановка цены по эффективности
  376.         newSmithEfficiency.onchange = function(){
  377.             newSmithPrice.value = defaultPrices[newSmithEfficiency.value];
  378.         };
  379.  
  380.         // запись нового кузнеца
  381.         newSmithButton.onclick = function(){
  382.             var newSmithNickValue = validateNick(newSmithNick.value),
  383.                 newSmithPriceValue = validatePrice(newSmithPrice.value);
  384.             if (newSmithNickValue[0]){ // проверка ника
  385.                 if (newSmithPriceValue){ // проверка цены
  386.                     smiths.push([newSmithNickValue[1], newSmithEfficiency.value, newSmithPriceValue, newSmithNote.value]);
  387.  
  388.                     // сортировка массива кузнецов: по эффективности по убыванию, затем по цене по возрастанию
  389.                     smiths.sort(function(smith1, smith2){
  390.                         if (smith1[1] < smith2[1]){return 1;}
  391.                         if (smith1[1] > smith2[1]){return -1;}
  392.                         if (smith1[1] === smith2[1]){
  393.                             if (priceToFloat(smith1[2]) < priceToFloat(smith2[2])){return -1;}
  394.                             if (priceToFloat(smith1[2]) > priceToFloat(smith2[2])){return 1;}
  395.                             return 0;
  396.                         }
  397.                     });
  398.  
  399.                     // сохраняем кузнецов и перерисовывем таблицу
  400.                     setSmiths(smiths);
  401.                     drawSmithsTable(smiths, document.getElementById("RA_smithsDiv"));
  402.                     clearNewSmith();
  403.                 } else{
  404.                     window.alert("Цена должна представлять из себя 2 или 3 цифры с/без знака %");
  405.                 }
  406.             } else{ // если ник неверен, показываем, что не так
  407.                 alert(newSmithNickValue[1]);
  408.             }
  409.         };
  410.  
  411.         // если арт сломанный
  412.         if (repairRadio){
  413.             // вешаем скрытие/показ строки с ценой арта и выставление стиля курсора на кузнецах в зависимости от режима
  414.             repairRadio.addEventListener("click", function(){setStylesByMode();});
  415.             if (noTransferRadio){noTransferRadio.addEventListener("click", function(){setStylesByMode();});}
  416.             if (ownershipRadio){ownershipRadio.addEventListener("click", function(){setStylesByMode();});}
  417.             if (rentRadio){rentRadio.addEventListener("click", function(){setStylesByMode();});}
  418.  
  419.             repairRadio.click(); // автовыбираем режим ремонта
  420.  
  421.             // показываем время ремонта
  422.             var priceInput = document.getElementById("rep_price"),
  423.                 repairTimeSpan = document.createElement("span");
  424.             currentMoment = new Date();
  425.             currentMomentOnServer = new Date(Date.now() + currentMoment.getTimezoneOffset()*60000 + 10800000);
  426.             baseGoldPrice = getBaseGoldPrice();
  427.             repairTimeArr = calculateRepairTime(baseGoldPrice, currentMomentOnServer);
  428.  
  429.             repairTimeSpan.setAttribute("id", "RA_repairTimeSpan");
  430.             repairTimeSpan.style.marginLeft = "5px";
  431.             repairTimeSpan.innerHTML = "(" + repairTimeArr[0] + ", >=" + repairTimeArr[1] + ")";
  432.             insertAfter(repairTimeSpan, priceInput);
  433.  
  434.             // заменяем кнопку "+10%" на -1%
  435.             var addPrice10Button = document.querySelector("input[type='submit'][onclick*='add_price(10)']");
  436.             addPrice10Button.setAttribute("onclick", "add_price(-1); return false;");
  437.             addPrice10Button.value = "-1%";
  438.         }
  439.     } else{ // протокол передач
  440.         var protocolTd = document.querySelector("#set_mobile_max_width > div:nth-child(2) > div"),
  441.             repairsMatch = protocolTd.innerHTML.match(/\d{2}-\d{2}-\d{2}\s\d{2}:\d{2}:.+?\sза\sремонт:\s\d+\s\(\d+%\)(?:,\sдоп\.\sкомиссия:\s\d+)?/g),
  442.             repairBeginningTime,
  443.             repairBeginningTimeParts,
  444.             repairRealGoldPrice,
  445.             repairPercent,
  446.             oldSubstring,
  447.             newSubstring,
  448.             repairBeginningMomentOnServer;
  449.         currentMoment = new Date();
  450.         currentMomentOnServer = new Date(Date.now() + currentMoment.getTimezoneOffset()*60000 + 10800000);
  451.  
  452.         maxI = repairsMatch.length;
  453.         for (i=0;i<maxI;i++){
  454.             oldSubstring = repairsMatch[i];
  455.             repairBeginningTime = oldSubstring.match(/(\d{2}-\d{2}-\d{2}\s\d{2}:\d{2}):/)[1];
  456.             repairBeginningTimeParts = repairBeginningTime.split(/[\s-:]/);
  457.             repairRealGoldPrice = oldSubstring.match(/\sза\sремонт:\s(\d+)\s/)[1];
  458.             repairPercent = oldSubstring.match(/\sза\sремонт:\s\d+\s\((\d+)%\)/)[1];
  459.  
  460.             repairBeginningMomentOnServer = new Date("20" + repairBeginningTimeParts[2],
  461.                                                      (parseInt(repairBeginningTimeParts[1])-1),
  462.                                                      repairBeginningTimeParts[0],
  463.                                                      repairBeginningTimeParts[3],
  464.                                                      repairBeginningTimeParts[4]);
  465.             baseGoldPrice = Math.floor(repairRealGoldPrice/(repairPercent/100));
  466.             repairTimeArr = calculateRepairTime(baseGoldPrice, repairBeginningMomentOnServer);
  467.  
  468.             if (repairTimeArr[2] > currentMomentOnServer){
  469.                 newSubstring = oldSubstring + ". <i>В ремонте "+ repairTimeArr[0]+" <b>до " + repairTimeArr[1] + "</b></i>.";
  470.                 protocolTd.innerHTML = protocolTd.innerHTML.replace(oldSubstring, newSubstring);
  471.             }
  472.         }
  473.     }
  474. })();
RAW Paste Data Copied