// ==UserScript==
// @name hwm_change_fraction
// @namespace ужеЛежу
// @author ужеЛежу
// @description Change fraction/talent/build from any page in one click
// @version 4.0.10
// @encoding utf-8
// @homepage https://greasyfork.org/en/scripts/374617-hwm-change-fraction
// @include https://www.heroeswm.ru/*
// @include https://www.lordswm.com/*
// @include http://178.248.235.15/*
// @exclude /^https{0,1}:\/\/(www\.(heroeswm\.ru|lordswm\.com)|178\.248\.235\.15)\/(login|war|cgame|frames|chat|chatonline|ch_box|chat_line|ticker|chatpost)\.php*/
// @exclude https://www.heroeswm.ru/radio_files/*
// @exclude https://www.heroeswm.ru/ticker.html*
// @exclude https://www.lordswm.com/radio_files/*
// @exclude https://www.lordswm.com/ticker.html*
// @exclude http://178.248.235.15/radio_files/*
// @exclude http://178.248.235.15/ticker.html*
// @exclude */rightcol.php*
// @exclude */ch_box.php*
// @exclude */chat*
// @exclude */ticker.html*
// @exclude */frames*
// @exclude */brd.php*
// @grant GM_deleteValue
// @grant GM_getValue
// @grant GM_listValues
// @grant GM_setValue
// ==/UserScript==
// CheckT:
// исправление @exclude; небольшой рефакторинг; var charArrowDown; проверка наличия SpanFractions
// замена localStorage на GM_getValue/GM_setValue
// previous name: [hwm]_change_fraction
(function(){
var host = location.host;
var url_host = location.protocol+'//'+host;
var gm_prefix = "ctf#"; //префикс всех хранимых данных
if(isLoggedOff())
return;
var currentPlayerId = getPlayerId();
var loadingGif = " <img width=15 src='https://dcdn2.heroeswm.ru/i/loading.gif'>";
var crossSpan = "<span style='cursor:pointer;background:#d33;color:white;padding:0 4 2 4;border-radius:3px;box-shadow:2px 2px 3px black;'><b>x</b></span>";
var stateListOpen = 0;
var divListFractions = false;
var divListTalents = false;
var currentFractionId = 0;
var meFractionId = 0;
// vars for change fraction/build
var classId = 0;
var talentUrl = false;
var armyParams = false;
var artsId = -1;
var TYPE_FRACTION = 0;
var TYPE_TALENT = 1;
var TYPE_BUILD = 2;
if(convertOptions())
return;
var useType = gm_get['useType'];
if (!useType){
useType = TYPE_FRACTION;
gm_set['useType']=TYPE_FRACTION;
}
var colorBase = "#FFD871";
var backgroundBase = "#6B6C6A";
var buildArmy = -1;
var buildTalent = -1;
var buildArts = -1;
var savedBuildId = -1;
var fractions = createFractions();
var mobNames = createMobNames();
var talents = [];
var arts = ['<i>Снять всё</i>'];
var builds = [];
if(findSpanFractionsPlace()){
loadTalents();
initListFractions();
initListTalents();
}
return; // only functions below
function $(id) {
return document.getElementById(id);
}
function $$(val, begin, end) {
var id = val.indexOf(begin);
var temp = val.substr(id + begin.length);
return temp.substr(0, temp.indexOf(end));
}
function xy(obj) {
var x = 0;
var y = 0;
while (obj) {
x += obj.offsetLeft;
y += obj.offsetTop;
obj = obj.offsetParent;
}
return {x: x, y: y};
}
function createXMLHttpReq(){
var objXMLHttpReq;
if (window.XMLHttpRequest){
objXMLHttpReq = new XMLHttpRequest();
} else if (window.ActiveXObject) {
// IE
objXMLHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
} else {
alert('Can\'t create XMLHttpRequest!');
}
return objXMLHttpReq;
}
function send(method, url, params, afterSend) {
var xmlHttp = createXMLHttpReq();
xmlHttp.open(method, url, true);
if (method == "POST")
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttp.overrideMimeType('text/plain; charset=windows-1251');
xmlHttp.onreadystatechange = function(){afterSend(xmlHttp);};
xmlHttp.send(params);
}
function afterSend(xmlHttp) {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
if (classId > -1) {
send("POST", url_host + "/castle.php", "classid=" + classId, afterSend);
classId = -1;
} else if (talentUrl) {
send("GET", talentUrl, null, afterSend);
talentUrl = false;
} else if (armyParams) {
send("POST", url_host + "/army_apply.php", armyParams, afterSend);
armyParams = false;
} else if (artsId > -1) {
var artsUri;
if (artsId == 0)
artsUri = "all_off=100";
else
artsUri = "all_on=" + artsId;
send("GET", url_host + "/inventory.php?" + artsUri, null, afterSend);
artsId = -1;
} else {
location.href = url_host + "/home.php";
}
}
}
}
function editSpan(id) {
return "<span id=editBuild_" + id + " style='cursor:pointer;border:1px solid #888;border-radius:3px;box-shadow:2px 2px 3px black;padding:0 2 1 2;'><img style='vertical-align:middle;' width=12 src='https://dcdn.heroeswm.ru/i/2repair_ico.gif'></span>";
}
function findSpanFractionsPlace() {
var charArrowDown=String.fromCharCode(9660); //""
var divs = document.getElementsByTagName("div");
var m_tr;
var m_td = false;
for (var id_div in divs) {
if (divs[id_div].id == "breadcrumbs" && divs[id_div].innerHTML.indexOf(charArrowDown) > -1) {
m_tr = divs[id_div].parentNode.parentNode;
m_td = m_tr.insertCell(-1);
m_td.innerHTML = " | <span id=spanFractions></span>";
}
}
if (!m_td) {
var tables = document.getElementsByTagName("table");
for (var id_table in tables) {
var table = tables[id_table];
if (table.innerHTML && table.innerHTML.indexOf('height="6px"') > -1) {
table.innerHTML = "<tr><td><span id=spanFractions></span></td></tr>";
break;
}
}
}
var spanFractions = $('spanFractions');
if (!spanFractions || spanFractions == null) {
var centers = document.getElementsByTagName("center");
for (var id_center in centers) {
var center = centers[id_center].innerHTML;
if (center && center.indexOf("center>") == -1 && center.indexOf("<a ") > -1) {
centers[id_center].innerHTML = center + " | <span id=spanFractions></span>";
break;
}
}
}
spanFractions = $('spanFractions');
if (!spanFractions || spanFractions == null)
return false;
spanFractions.innerHTML = "<a class=pi href='castle.php'>Фракции <font style='font-size:8px;'>"+charArrowDown+"</font></a>";
spanFractions.addEventListener(
"mouseenter",
function () {
if (stateListOpen == 0) {
divListFractions.style.visibility = "visible";
stateListOpen = 1;
}
}
);
spanFractions.addEventListener(
"mouseleave",
function () {
stateListOpen = 2;
setTimeout(hiddenListFractions, 100);
}
);
return true;
}
function initListFractions() {
divListFractions = document.createElement('div');
document.body.appendChild(divListFractions);
divListFractions.style.left = xy(spanFractions).x + "px";
divListFractions.style.top = (xy(spanFractions).y + spanFractions.parentNode.clientHeight - 1) + "px";
divListFractions.style.position = "absolute";
divListFractions.style.background = backgroundBase;
divListFractions.style.visibility = "hidden";
divListFractions.style.border = "1px solid #5D413A";
divListFractions.style.zIndex = 20;
var innerInfo = "<table>";
for (var fraction_id in fractions) {
var fractionId = (fraction_id % 10) * 100 + Math.floor(fraction_id / 10);
// alert(fractionId + ":" + currentFractionId);
var addStyle = fractionId == currentFractionId ? "border:1px dashed #ddd9cd;font-weight:bold" : "";
innerInfo += "<tr style='color:" + colorBase + ";cursor:pointer'" +
" id=frac_" + fraction_id + ">" +
"<td style='background-color:#F5F3EA'><img src='https://dcdn.heroeswm.ru/i/f/r" + fractionId + ".png'></td>" +
"<td id=td_frac_" + fraction_id + " style='color:" + colorBase + ";" + addStyle + "'>" + fractions[fraction_id] + "</td></tr>";
}
// use talents/builds
innerInfo += "<tr><td colspan=2><table class=wb width=100%>" +
"<tr><td class=wblight rowspan=3 width=50% align=center>Использовать:</td>" +
"<td class=" + (useType == 0 ? "wblight" : "wbwhite") + "><input name=radio type=radio id=radio_0 " + (useType == 0 ? "checked=checked" : "") + "><label for=radio_0>Фракции</label></td></tr>" +
"<tr><td class=" + (useType == 1 ? "wblight" : "wbwhite") + "><input name=radio type=radio id=radio_1 " + (useType == 1 ? "checked=checked" : "") + "><label for=radio_1>Навыки</label></td></tr>" +
"<tr><td class=" + (useType == 2 ? "wblight" : "wbwhite") + "><input name=radio type=radio id=radio_2 " + (useType == 2 ? "checked=checked" : "") + "><label for=radio_2>Билды</label></td></tr>" +
"<tr><td class=wbwhite colspan=2 align=center><input id=buildManager type=submit value='Билд-менеджер' " + (useType != 2 ? "disabled" : "") + "></td></tr>" +
"</table></td></tr>";
innerInfo += "</table>";
divListFractions.innerHTML = innerInfo;
for (var radioId = 0; radioId < 3; radioId++) {
$('radio_' + radioId).onclick = function () {
useType = this.id.split('_')[1];
gm_set('useType', useType);
$('buildManager').disabled = useType != TYPE_BUILD;
$('radio_' + useType).parentNode.className = "wblight";
$('radio_' + (useType+1)%3).parentNode.className = "wbwhite";
$('radio_' + (useType+2)%3).parentNode.className = "wbwhite";
loadTalents();
initListTalents();
};
}
$('buildManager').onclick = function () {
buildArmy = -1;
buildTalent = -1;
buildArts = -1;
var divPopup = document.createElement('div');
divPopup.style.width = "100%";
divPopup.style.minHeight = "100%";
divPopup.style.position = "fixed";
divPopup.style.top = "0px";
divPopup.style.backgroundColor = "rgba(0,0,0,0.5)";
divPopup.style.zIndex = 22;
divPopup.addEventListener(
"mouseup",
function(e) {
var target = e.target || e.srcElement;
if (target == divPopup) {
document.body.removeChild(divPopup);
hiddenListFractions();
}
}
);
document.body.appendChild(divPopup);
var divBuildManager = document.createElement('div');
divBuildManager.align = "center";
divBuildManager.style.top = "0px";
divBuildManager.style.margin = "50px auto 0px auto";
divBuildManager.style.backgroundColor = backgroundBase;
divBuildManager.style.width = "620px";
divBuildManager.style.boxShadow = "10px 10px 10px #000";
divBuildManager.style.zIndex = 23;
divPopup.appendChild(divBuildManager);
if (currentFractionId > 0)
generateBuildContent(divBuildManager, divPopup, currentFractionId);
else {
var alertMessage = 'Невозможно определить текущую фракцию! Попробуйте создать навык, чтобы он отображался в "Быстрых ссылках"';
var pattern = /\/i\/f\/r(\d+)\.png/;
if (location.href == url_host + "/home.php") {
var match = document.body.innerHTML.match(pattern);
if (match) {
currentFractionId = match[1];
generateBuildContent(divBuildManager, divPopup, currentFractionId);
} else
alert(alertMessage);
} else {
send("GET", url_host + "/home.php", null,
function() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
var match = xmlHttp.responseText.match(pattern);
if (match) {
currentFractionId = match[1];
generateBuildContent(divBuildManager, divPopup, currentFractionId);
} else
alert(alertMessage);
}
}
}
);
}
}
};
for (fraction_id in fractions) {
$('frac_' + fraction_id).onclick = function () {
var val = this.id.split("_")[1];
var fraction = Math.floor(val / 10);
classId = val % 10;
$('td_frac_' + val).innerHTML += loadingGif;
send("POST", url_host + "/castle.php", "fract=" + fraction, afterSend);
};
}
divListFractions.addEventListener(
"mouseenter",
function () {
stateListOpen = 1;
}
);
divListFractions.addEventListener(
"mouseleave",
function (e) {
stateListOpen = 2;
if (!e) e = event;
var x = e.clientX;
var y = e.clientY;
if (x < xy(divListFractions).x ||
x >= xy(divListFractions).x + divListFractions.clientWidth ||
y < xy(divListFractions).y ||
y >= xy(divListFractions).y + divListFractions.clientHeight)
setTimeout(hiddenListFractions, 100);
}
);
}
function initFractionsListeners() {
for (var fractionId in fractions) {
$('frac_' + fractionId).addEventListener(
"mouseenter",
function () {
var val = this.id.split("_")[1];
var fractionId = (val % 10) * 100 + Math.floor(val / 10);
var t, innerInfo;
meFractionId = fractionId;
if (useType == TYPE_TALENT) {
if (talents[fractionId]) {
innerInfo = "<table width=100%>";
for (var talentId in talents[fractionId]) {
t = talent(fractionId, talentId);
if (t != -1) {
innerInfo += "<tr><td style='cursor:pointer;color:" + colorBase + "' " +
"id=talent_" + talentId + " title='" + t[0] + "'> " + t[1] + "</td></tr>";
}
}
divListTalents.innerHTML = innerInfo + "</table>";
divListTalents.style.visibility = "visible";
divListTalents.style.top = xy(this).y;
divListTalents.style.left = xy(this).x - divListTalents.clientWidth - 1;
// listeners
for (talentId in talents[fractionId]) {
if (!talents[fractionId][talentId])
continue;
$('talent_' + talentId).addEventListener(
"mouseenter",
function () {
this.style.background = "#757575";
this.style.color = "white";
}
);
$('talent_' + talentId).addEventListener(
"mouseleave",
function () {
this.style.background = backgroundBase;
this.style.color = colorBase;
}
);
$('talent_' + talentId).onclick = function () {
talentUrl = this.title;
var val = this.title.match(/prace=(\d+)&/)[1];
var fraction = val % 100;
classId = Math.floor(val / 100);
this.innerHTML += loadingGif;
send("POST", url_host + "/castle.php", "fract=" + fraction, afterSend);
};
}
} else {
divListTalents.style.visibility = "hidden";
}
} else if (useType == TYPE_BUILD) {
val = this.id.split("_")[1];
fractionId = (val % 10) * 100 + Math.floor(val / 10);
if (builds[fractionId]) {
innerInfo = "<table width=100%>";
for (var buildId in builds[fractionId]) {
var b = builds[fractionId][buildId].split('|');
var buildName = b[0];
t = talent(fractionId, b[2]);
var a = b[3] == -1 ? "<без артов>" : arts[b[3]];
t = t == -1 ? "<без навыка>" : t[1];
b = b[1] == -1 ? "<без армии>" : b[1];
var title = b + " | " + t + " | " + a;
innerInfo += "<tr><td style='cursor:pointer;color:" + colorBase + "' " +
"id=talent_" + buildId + " title='" + title + "'> " + buildName + "</td></tr>";
}
divListTalents.innerHTML = innerInfo + "</table>";
divListTalents.style.visibility = "visible";
divListTalents.style.top = xy(this).y;
divListTalents.style.left = xy(this).x - divListTalents.clientWidth - 1;
// listeners
for (buildId in builds[fractionId]) {
$('talent_' + buildId).addEventListener(
"mouseenter",
function () {
this.style.background = "#757575";
this.style.color = "white";
}
);
$('talent_' + buildId).addEventListener(
"mouseleave",
function () {
this.style.background = backgroundBase;
this.style.color = colorBase;
}
);
$('talent_' + buildId).onclick = function () {
var buildId = this.id.split("_")[1];
var b = builds[meFractionId][buildId].split('|');
talentUrl = talent(meFractionId, b[2])[0];
var fraction = meFractionId % 100;
classId = Math.floor(meFractionId / 100);
var a = b[1].split('+');
armyParams = "";
for (var i in a)
armyParams += "&countv" + (i*1 + 1) + "=" + a[i];
armyParams = armyParams.substr(1);
artsId = b[3];
this.innerHTML += loadingGif;
send("POST", url_host + "/castle.php", "fract=" + fraction, afterSend);
};
}
} else {
divListTalents.style.visibility = "hidden";
}
}
this.style.background = "#757575";
$('td_' + this.id).style.color = "white";
}
);
$('frac_' + fractionId).addEventListener(
"mouseleave",
function () {
this.style.background = backgroundBase;
$('td_' + this.id).style.color = colorBase;
}
);
}
}
function initListTalents() {
if (useType == TYPE_TALENT || useType == TYPE_BUILD) {
if (!divListTalents) {
divListTalents = document.createElement('div');
document.body.appendChild(divListTalents);
divListTalents.style.position = "absolute";
divListTalents.style.background = backgroundBase;
divListTalents.style.zIndex = 21;
divListTalents.style.border = "1px solid #5D413A";
divListTalents.style.visibility = "hidden";
divListTalents.style.width = "150";
divListTalents.addEventListener(
"mouseenter",
function () {
stateListOpen = 3;
}
);
divListTalents.addEventListener(
"mouseleave",
function (e) {
stateListOpen = 2;
if (!e) e = event;
var x = e.clientX;
var y = e.clientY;
if (x >= xy(divListFractions).x + divListFractions.clientWidth ||
y >= xy(divListFractions).y + divListFractions.clientHeight ||
x < xy(divListFractions).x)
hiddenListFractions();
}
);
}
if (!currentPlayerId) {
divListFractions.style.color = "red";
divListFractions.style.background = "white";
divListFractions.innerHTML = "Невозможно определить ID персонажа!<br>Перейдите на другую страницу!";
} else {
initFractionsListeners();
}
} else {
talents = [];
if (divListTalents)
divListTalents.style.visibility = "hidden";
initFractionsListeners();
}
}
function loadTalents() {
var skillwheels = document.getElementsByTagName("a");
var prace = 0;
var load = false;
for (var id_a in skillwheels) {
var href = skillwheels[id_a].href;
if (href && href.indexOf("skillwheel.php?setuserperk=") > -1) {
prace = href.split("prace=")[1];
prace = prace.substr(0, prace.indexOf('&'));
var buildid = href.split("buildid=")[1];
if (!talents[prace]) {
talents[prace] = [];
load = true;
}
if (load)
talents[prace][buildid] = href + "|" + skillwheels[id_a].innerHTML;
}
}
currentFractionId = prace;
if (prace > 0)
gm_set(currentPlayerId + '#race#' + prace, talents[prace]);
var keys = GM_listValues();
for (var localKey in keys) {
if (localKey.indexOf('cf#' + currentPlayerId + '#race#') == 0)
talents[localKey.split("#")[3]] = GM_getValue(localKey).split(",");
}
loadArts();
loadBuilds();
}
function loadArts() {
for (var i = 0; i < 11; i++) {
var art = gm_get(currentPlayerId + '#arts#' + i);
if (art)
arts[i] = art;
}
}
function loadBuilds() {
var keys = GM_listValues();
for (var localKey in keys) {
if (localKey.indexOf('cf#' + currentPlayerId + '#build#') == 0)
builds[localKey.split("#")[3]] = GM_getValue(localKey).split(",");
}
}
function saveBuild() {
if (!builds[currentFractionId])
builds[currentFractionId] = [];
var buildId = savedBuildId > -1 ? savedBuildId : builds[currentFractionId].length;
savedBuildId = -1;
builds[currentFractionId][buildId] =
$('buildName').value + '|' + buildArmy + '|' + buildTalent + '|' + buildArts;
gm_set(currentPlayerId + '#build#' + currentFractionId, builds[currentFractionId]);
fillBuilds(currentFractionId);
}
function deleteBuild(buildId) {
builds[currentFractionId].splice(buildId, 1);
if (builds[currentFractionId].length > 0)
gm_set(currentPlayerId + '#build#' + currentFractionId, builds[currentFractionId]);
else
gm_del(currentPlayerId + '#build#' + currentFractionId);
fillBuilds(currentFractionId);
}
function hiddenListFractions() {
if (stateListOpen == 2) {
divListFractions.style.visibility = "hidden";
if (divListTalents)
divListTalents.style.visibility = "hidden";
stateListOpen = 0;
}
}
function generateBuildContent(div, divPopup, fractionId) {
var contentAll = "<table class=wb width=670 cellpadding=0 cellspacing=0 style='height:100%;background:#FFF'>" +
"<tr class=wblight><td align=center style='padding:4;' colspan=2>" +
"<table width=100%><tr align=center>" +
"<td><b>Текущая фракция:</b> <img width=15 height=15 border=0 align=absmiddle src='https://dcdn.heroeswm.ru/i/r" + fractionId + ".gif'></td>" +
"<td width=25 id=crossClose>" + crossSpan + "</td>" +
"</tr></table></td></tr>";
// all builds
contentAll += "<tr><td style='padding:4;' rowspan=2 width=250 valign=top>" +
"<table class=wb style='height:100%' width=100% cellpadding=0 cellspacing=0 id=listBuilds>" +
"<tr><td class=wblight style='padding:4;height:5;' colspan=4><b>Сохранённые билды:</b></td></tr>" +
"<tr><td class=wbwhite style='padding:4;' valign=top>" +
"<span style='color:red'><b>Нет билдов!</b></span>" +
"</td></tr>" +
"</table>" +
"</td>";
// army
contentAll += "" +
"<td style='padding:4;'><table class=wb width=100% cellpadding=0 cellspacing=0>" +
"<tr><td class=wblight style='padding:4;' colspan=7><b>Наберите армию:</b></td></tr>" +
"<tr>";
var contentValues = "<tr align=center>";
for (var mobId in mobNames[fractionId]) {
contentAll += "<td class=wblight><img src='https://dcdn2.heroeswm.ru/i/mon_pic_png/2x" + mobNames[fractionId][mobId] + "ani.png' width=60 height=50 border=0></td>";
contentValues += "<td class=wbwhite style='padding:4;'><input type=text size=1 maxlength=3 style='border:1px solid #777' id=countArmy_" + mobId + "></td>";
}
contentAll += "</tr>" + contentValues + "</tr>";
contentAll += "</table></td></tr>";
// talents & inventory
contentAll += "<tr>" +
"<td style='padding:4;'><table class=wb width=100% cellpadding=0 cellspacing=0>" +
"<tr>" +
"<td class=wblight style='padding:4;'><b>Выберите навык:</b></td>" +
"<td class=wblight style='padding:4;'><b>Выберите комплект артов:</b></td>" +
"</tr>" +
"<tr><td class=wbwhite style='padding:4;'>";
if (talents[fractionId]) {
for (var talentId in talents[fractionId]) {
if (talents[fractionId][talentId]) {
var del = talents[fractionId][talentId].indexOf("|");
var skillHref = talents[fractionId][talentId].substr(0, del);
var skillName = talents[fractionId][talentId].substr(del + 1);
contentAll += "<input type=radio name=radioTalent id=radioTalent_" + talentId + " title='" +
skillName + "'><label for=radioTalent_" + talentId + ">" + skillName + "</label><br>";
}
}
} else {
contentAll += "<span><b style='color:red'>Нет навыков!</b></span>";
}
contentAll += "</td>" +
"<td class=wbwhite style='padding:4;'>" +
"<span id=setArts><b style='color:red'>Нет комплектов!</b></span>" +
"<br><input type=submit id=updateArts value='Обновить комплекты'>" +
"</td></tr>";
contentAll += "</table></td></tr>";
contentAll +=
"<tr align=center>" +
"<td style='padding:4;'>" +
"<table class=wb style='height:100%' width=100% cellpadding=0 cellspacing=0 style='background:#FFF'>" +
"<tr><td class=wblight style='padding:4;height:5;' colspan=4><b>Экспорт/импорт билдов:</b></td></tr>" +
"<tr align=center><td class=wbwhite><input type=submit id=exportBuilds value='Экспорт в гвд-блокнотъ ->'>" +
"<br><br><input type=submit id=importBuilds value='<- Импорт из гвд-блокнота'></td></tr>" +
"</table>" +
"</td>";
// build
contentAll +=
//"<tr align=center>" +
"<td style='padding:4;' colspan=1><table class=wb width=100% cellpadding=0 cellspacing=0 style='background:#FFF'>" +
"<tr class=wblight><td style='padding:4;' colspan=2><span id=buildCap style='color:red'><b>Билд:</b></span></td></tr>" +
"<tr class=wbwhite><td style='padding:4;' colspan=2 align=center><table width=80%>" +
"<tr><td style='padding:2;' width=25%>Имя:</td><td><input type=text maxlength=32 size=16 style='border:1px solid #777' id=buildName></td></tr>" +
"<tr><td style='padding:2;'>Армия:</td><td id=buildArmy><i>без армии</i></td></tr>" +
"<tr><td style='padding:2;'>Навык:</td><td id=buildTalent><i>без навыка</i></td></tr>" +
"<tr><td style='padding:2;'>Арты:</td><td id=buildArts><i>без артов</i></td></tr>" +
"</table></td></tr>" +
"<tr class=wbwhite align=center>" +
"<td style='padding:4;'width=50%><input type=submit id=saveBuild disabled value='Сохранить билд'></td>" +
"<td style='padding:4;'width=50%><input type=submit id=cancelBuild value='Очистить форму'></td>" +
"</table></td></tr>";
// end
contentAll += "</table>";
div.innerHTML = contentAll;
fillSetArts();
fillBuilds(fractionId);
// listeners
$('crossClose').onclick = function() {
document.body.removeChild(divPopup);
hiddenListFractions();
};
var radioTalents = document.getElementsByName('radioTalent');
for (var i in radioTalents) {
if (radioTalents[i].id) {
radioTalents[i].onclick = function() {
var talentId = this.id.split('_')[1];
$('buildTalent').innerHTML = "<b>" + this.title + "</b>";
buildTalent = talentId;
checkBuild();
}
}
}
for (var j = 0; j < 7; i++) {
$('countArmy_' + j).onkeypress = function(e) {
if (this.value == '0') this.value = '';
e = e || event;
if (e.ctrlKey || e.altKey || e.metaKey) return;
var chr = getChar(e);
if (chr == null) return;
if (chr < '0' || chr > '9') {
return false;
}
}
$('countArmy_' + i).onkeyup = function(e) {
generateBuildArmy();
$('buildArmy').innerHTML = "<b>" + buildArmy + "</b>";
checkBuild();
}
}
$('updateArts').onclick = function() {
$('setArts').innerHTML += loadingGif;
send("GET", url_host + "/inventory.php", null,
function() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
var text = xmlHttp.responseText.split("<b>1.</b>");
if (text.length > 1) {
arts = ["<i>Снять всё</i>"];
var s = text[1].split("?all_on=");
for (var i = 1; i < s.length; i++) {
var setId = s[i].split("&")[0];
var setName = s[i].match(/>(.*)<\/a>/)[1];
arts[setId] = setName;
gm_set(currentPlayerId + '#arts#' + setId, setName);
}
fillSetArts();
} else {
$('setArts').innerHTML = "<b style='color:red'>Недоступна страница<br> инвентаря, попробуйте<br> позже!</b>";
}
}
}
}
);
};
$('buildName').onkeyup = function() {
checkBuild();
};
$('saveBuild').onclick = function() {
saveBuild();
};
$('cancelBuild').onclick = function() {
clearForm();
};
$('exportBuilds').onclick = function() {
exportBuilds();
};
$('importBuilds').onclick = function() {
importBuilds();
};
}
function getChar(event) {
var which = event.which; // other
if (which == null) which = event.keyCode; // IE
if (which != 0) {
if (which < 32) return null;
return String.fromCharCode(which);
}
return null;
}
function generateBuildArmy() {
buildArmy = "";
for (var i = 0; i < 7; i++) {
var intValue = parseInt($('countArmy_' + i).value);
if (!intValue) intValue = 0;
buildArmy += intValue;
if (i < 6) buildArmy += '+';
}
}
function fillSetArts() {
var innerText = "";
if (arts.length == 0) return;
for (var i in arts) {
if (i > 0) innerText += "<br>";
innerText += "<input type=radio name=radioArts id=radioArts_" + i + ">" +
"<label for=radioArts_" + i + ">" + (i > 0 ? (i + ". ") : "") +
arts[i] + "</label>";
}
$('setArts').innerHTML = innerText;
// listeners
var radioArts = document.getElementsByName('radioArts');
for (var j in radioArts) {
if (radioArts[j].id) {
radioArts[j].onclick = function() {
var setId = this.id.split('_')[1];
$('buildArts').innerHTML = "<b>" + setId + ". " + arts[setId] + "</b>";
buildArts = setId;
checkBuild();
}
}
}
}
function fillBuilds(fractionId) {
var innerText = "<tr><td class=wblight style='padding:4;height:5;' colspan=4><b>Сохранённые билды:</b></td></tr>";
//alert(builds[fractionId] + ": " + builds[fractionId].length);
if (!builds[fractionId] || builds[fractionId].length == 0) {
innerText += "<tr><td class=wbwhite style='padding:4;' valign=top>" +
"<span style='color:red'><b>Нет билдов!</b></span>" +
"</td></tr>";
} else {
for (var buildId in builds[fractionId]) {
var b = builds[fractionId][buildId].split('|');
var buildName = b[0];
var t = talent(fractionId, b[2]);
var a = b[3] == -1 ? "<без артов>" : arts[b[3]];
t = t == -1 ? "<без навыка>" : t[1];
b = b[1] == -1 ? "<без армии>" : b[1];
var title = b + " | " + t + " | " + a;
innerText += "<tr class=wbwhite>" +
"<td width=10 style='padding:4;height:5;'>" + (buildId*1 + 1) + ".</td>" +
"<td title='" + title + "'><b>" + buildName + "</b></td>" +
"<td align=center width=25 title='Редактировать билд'>" + editSpan(buildId) + "</td>" +
"<td align=center width=25 title='Удалить билд' id=deleteBuild_" + buildId + ">" + crossSpan + "</td>" +
"</tr>";
}
innerText += "<tr class=wblight><td colspan=4> </td></tr>";
}
$('listBuilds').innerHTML = innerText;
// listeners
for (var i in builds[fractionId]) {
$('deleteBuild_' + i).onclick = function() {
var buildId = this.id.split('_')[1];
if (confirm("Вы действительно хотите удалить этот билд?"))
deleteBuild(buildId);
};
$('editBuild_' + i).onclick = function() {
var buildId = this.id.split('_')[1];
loadBuild(buildId);
}
}
}
function checkBuild() {
if ($('buildName').value != "") {
$('saveBuild').disabled = false;
$('buildCap').style.color = "green";
} else {
$('saveBuild').disabled = true;
$('buildCap').style.color = "red";
}
}
function talent(fractionId, talentId) {
var talent = talents[fractionId][talentId];
if (talent) {
var i = talent.indexOf("|");
return [talent.substr(0, i), talent.substr(i + 1)];
} else {
return -1;
}
}
function loadBuild(buildId) {
savedBuildId = buildId;
var fractionId = currentFractionId;
fillBuilds(fractionId);
var b = builds[fractionId][buildId].split('|');
var buildName = b[0];
var t = talent(fractionId, b[2]);
if (t == -1) {
buildTalent = -1;
t = "<i>без навыка</i>";
} else {
buildTalent = t[0].split("buildid=")[1];
$('radioTalent_' + buildTalent).checked = true;
t = "<b>" + t[1] + "</b>";
}
var a;
if (b[3] == -1) {
buildArts = -1;
a = "<i>без артов</i>";
} else {
buildArts = b[3];
$('radioArts_' + buildArts).checked = true;
a = "<b>" + arts[b[3]] + "</b>";
}
if (b[1] == -1) {
buildArmy = -1;
b = "<i>без армии</i>";
for (var i = 0; i < 7; i++)
$('countArmy_' + i).value = "";
} else {
buildArmy = b[1];
var army = b[1].split('+');
for (var j in army)
$('countArmy_' + j).value = army[i];
b = "<b>" + b[1] + "</b>";
}
$('editBuild_' + buildId).style.border = "1px solid #F00";
$('editBuild_' + buildId).style.background = "#FCC";
$('buildName').value = buildName;
$('buildArmy').innerHTML = b;
$('buildTalent').innerHTML = t;
$('buildArts').innerHTML = a;
checkBuild();
}
function clearForm() {
fillBuilds(currentFractionId);
$('radioArts_' + buildArts).checked = false;
$('radioTalent_' + buildTalent).checked = false;
savedBuildId = -1;
buildArmy = -1;
buildArts = -1;
buildTalent = -1;
for (var i = 0; i < 7; i++)
$('countArmy_' + i).value = "";
$('buildName').value = "";
$('buildArmy').innerHTML = "<i>без армии</i>";
$('buildTalent').innerHTML = "<i>без навыка</i>";
$('buildArts').innerHTML = "<i>без артов</i>";
checkBuild();
}
function exportBuilds() {
send("GET", url_host + "/sms.php?notebook=1", null,
function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
var maxLength = 2990;
var html = document.createElement('html');
html.innerHTML = xmlHttp.responseText;
var noteText = html.getElementsByTagName('textarea')[0].innerHTML;
var exportContent = "\n[exb]";
for (var fractionId in builds)
exportContent += fractionId + ";" + builds[fractionId] + "^";
exportContent += "[/exb]";
var endNoteText = noteText.split("[/exb]")[1] || "";
noteText = noteText.split("\n[exb]")[0] + endNoteText;
var dLength = maxLength - noteText.length - exportContent.length;
if (dLength < 0) {
alert("Ошибка! Не хватает " + -dLength + " символа(ов) для хранения в блокноте! (макс. = " + maxLength + ")");
} else {
if (confirm("Вы действительно хотите сохранить билды в гвд-блокнот?\n(данные в блокноте могут измениться)")) {
var content = urlEncode(noteText + exportContent);
send("POST", url_host + "/sms.php", "action=savenotebook&data=" + content,
function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
alert("Билды сохранены в блокнот!");
}
}
);
}
}
}
}
);
}
function importBuilds() {
if (confirm("Вы действительно хотите импортировать билды?\n(текущие билды могут измениться/удалиться)")) {
send("GET", url_host + "/sms.php?notebook=1", null,
function () {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
var html = document.createElement('html');
html.innerHTML = xmlHttp.responseText;
var noteText = html.getElementsByTagName('textarea')[0].innerHTML;
var importContent = $$(noteText, "\n[exb]", "[/exb]");
var blds = importContent.split("^");
var x = "";
for (var i = 0; i < blds.length - 1; i++) {
var c = blds[i].split(";");
builds[c[0]] = c[1].split(",");
gm_set(currentPlayerId + '#build#' + c[0], builds[c[0]]);
}
alert("Билды импортированы!");
fillBuilds(currentFractionId);
}
}
);
}
}
function urlEncode(s) {
var r = "";
for (var i = 0; i < s.length; i++) {
var c = s.charCodeAt(i);
if (c > 127) {
if (c > 1024) {
if (c == 1025)
c = 1016;
else if (c == 1105)
c = 1032;
r += "%" + (c - 848).toString(16);
}
} else {
if (c == 43)
r += "%2b";
else
r += s.charAt(i);
}
}
return r;
}
function convertOptions(){
if(!GM_load_bool_from_num( gm_prefix+"converted")){
var debug='';
GM_save_num_from_bool( gm_prefix+"converted", true);
for (var localKey in localStorage) {
if (localKey.indexOf('cf#') == 0)
debug += convert_option(localKey);
}
document.body.innerHTML = debug;
return true;
} else {
return false;
}
}
function convert_option(key){
var val = localStorage[key];
if(val)
gm_set(key.substring(3), val);
localStorage[key] = null;
delete localStorage[key];
return '['+key+':'+val+'] -> ['+gm_prefix+key.substring(3)+':'+val+']<br/>';
}
function isLoggedOff(){
return location.pathname == '/';
}
function getI(xpath,elem){return document.evaluate(xpath,(elem?elem:document),null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);}
function getPlayerId(){
var hunter_ref = getI("//a[contains(@href, 'pl_hunter_stat')]");
//min 2 для home; min 1 для остальных - если включены выпадающие вкладки
//min 1 для home; min 0 для остальных - если отключены выпадающие вкладки
if ( !hunter_ref || hunter_ref.snapshotLength == 0 || (hunter_ref.snapshotLength == 1 && location.pathname == '/home.php') ) {
//отключены вкладки или разлогин
var ids=/pl_id=(\d+)/.exec(document.cookie);
return ids ? ids[1] : 'unknown';
} else {
return hunter_ref.snapshotItem(0).href.split('?id=')[1];
}
}
function createMobNames(){
var mobNames = [];
mobNames[1] = ['conscript','marksman','swordman'/*squire*/,'impergriffin','inquisitor','paladin','archangel'];
mobNames[101] = ['brute','crossbowman'/*crossman*/,'vindicator','battlegriffon','zealot','champion','seraph2'];
mobNames[2] = ['sceletonarcher'/*skeletonarcher*/,'plaguezombie','spectre','vampirelord','archlich','wraith','spectraldragon'];
mobNames[102] = ['sceletonwar','rotzombie','poltergeist','vampireprince','masterlich','banshee','ghostdragon'];
mobNames[3] = ['mastergremlin','obsgargoly','steelgolem','archmage','djinn_sultan','rakshasa_raja','titan'];
mobNames[103] = ['saboteurgremlin', 'elgargoly','magneticgolem','battlemage','djinn_vizier','rakshasa_kshatra', 'stormtitan'];
mobNames[4] = ['sprite', 'bladedancer'/*wardancer*/,'hunterelf'/*masterhunter*/,'ddeld'/*druideld*/,'silverunicorn','ancienent','emeralddragon'];
mobNames[104] = ['dryad_'/*dryad*/,'winddancer'/*wdancer*/,'arcaneelf','ddhigh','pristineunicorn','savageent','crystaldragon'];
mobNames[5] = ['hobgoblin','hobwolfrider'/*wolfraider*/,'orcchief','ogremagi','thunderbird','cyclopking','abehemoth'/*ancientbehemoth*/];
mobNames[105] = ['goblinarcher','boarrider','orcrubak','ogrebrutal','firebird_'/*firebird*/,'cyclopod_'/*cyclopod*/,'dbehemoth'];
mobNames[205] = ['goblinmag','boarrider','orcshaman','ogremagi','darkbird','cyclopod_'/*cyclopod*/,'dbehemoth'];
mobNames[6] = ['assasin'/*assassin*/,'fury','minotaurguard_'/*minotaurguard*/,'grimrider','deephydra','matriarch','blackdragon'];
mobNames[106] = ['stalker','bloodsister','taskmaster','briskrider','foulhydra','mistress','reddragon'];
mobNames[7] = ['familiar','fdemon'/*hornedoverseer*/,'cerberus','succubusm'/*succubusmis*/,'stallion','pitlord_'/*pitlord*/,'archdevil'];
mobNames[107] = ['vermin','jdemon','firehound'/*hotdog*/,'seducer','hellstallion'/*hellkon*/,'pitspawn'/*pity*/,'archdemon'];
mobNames[8] = ['shieldguard','skirmesher','blackbearrider','berserker','runepatriarch','thunderlord','magmadragon'];
mobNames[9] = ['trapper','ncentaur','mauler','sdaughter','executioner','foulwyvern','untamedcyc'];
return mobNames;
}
function createFractions(){
var fractions = [];
fractions[10] = "Рыцарь";
fractions[11] = "Рыцарь света";
fractions[20] = "Некромант";
fractions[21] = "Некромант - повелитель смерти";
fractions[30] = "Маг";
fractions[31] = "Маг-разрушитель";
fractions[40] = "Эльф";
fractions[41] = "Эльф-заклинатель";
fractions[50] = "Варвар";
fractions[51] = "Варвар крови";
fractions[52] = "Варвар-шаман";
fractions[60] = "Темный эльф";
fractions[61] = "Темный эльф-укротитель";
fractions[70] = "Демон";
fractions[71] = "Демон тьмы";
fractions[80] = "Гном";
fractions[90] = "Степной варвар";
return fractions;
}
function initGm(){
if (!this.GM_getValue || (this.GM_getValue.toString && this.GM_getValue.toString().indexOf("not supported")>-1)) {
this.GM_getValue=function (key,def) {
return localStorage[key] || def;
};
this.GM_setValue=function (key,value) {
return localStorage[key]=value;
};
this.GM_deleteValue=function (key) {
return delete localStorage[key];
};
}
if (!this.GM_listValues || (this.GM_listValues.toString && this.GM_listValues.toString().indexOf("not supported")>-1)) {
this.GM_listValues=function () {
var keys=[];
for (var key in localStorage){
keys.push(key);
}
return keys;
}
}
}
// 1 -> true; otherwise false
function GM_load_bool_from_num(key){
var val = Number(GM_getValue(key, 0));
return isNaN(val) ? false : val==1;
}
// true -> 1; otherwise 0
function GM_save_num_from_bool(key, val){
GM_setValue(key, val ? 1 : 0);
}
function gm_get(key){
return GM_getValue(gm_prefix+key);
}
function gm_set(key, val){
return GM_setValue(gm_prefix+key, val);
}
function gm_del(key){
return GM_deleteValue(gm_prefix+key);
}
function gm_list(){
var keys = GM_listValues();
var filtered = [];
for ( var i = 0, len = keys.length; i < len; i++ ) {
var key = keys[i];
if(key.indexOf(gm_prefix) == 0)
filtered.push(key);
}
return filtered;
}
})();