// ==UserScript==
// @name KOC Throne Room Organizer with Statues and Pets
// @version 20140327b
// @namespace mmm
// @homepage http://userscripts.org/scripts/show/411452
// @delay 2000
// @priority -10
// @include *.kingdomsofcamelot.com/*main_src.php*
// @include *kabam.com/kingdoms-of-camelot/play*
// @resource jqcss http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css
// @icon https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_chair_normal_1.png
// @require https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @require https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js
// @grant unsafeWindow
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @grant GM_log
// @grant GM_registerMenuCommand
// @grant GM_getResourceText
// @grant GM_getResourceURL
// @description Organizes, upgrades and salvages KOC throne room items
// @contributionURL https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=FDW4NZ6PRMDMJ&lc=US&item_name=TR%20Organizer%20Donations&item_number=1001¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted
// @contributionAmount $3.00
// @screenshot http://s3.amazonaws.com/uso_ss/icon/132329/large.png?1346825647 http://s3.amazonaws.com/uso_ss/icon/132329/thumb.png?1346825647
// @screenshot http://s3.amazonaws.com/uso_ss/18392/large.png?1346825591 http://s3.amazonaws.com/uso_ss/18392/thumb.png?1346825591
// ==/UserScript==
//var xx= {level: 2}; alert(CM.ThronePanelController.calcRiskBarWidth("upgrade", xx, 0))
var Version = '20140326b_Goat';
var trPopUpTopClass = 'trPopTop';
var ResetAll = false;
var DEBUG_TRACE = false;
var maxTrLevel = 17;
/*
* Modifiedd from object.watch polyfill
*
* 2012-04-03
*
* By Eli Grey, http://eligrey.com
* Public Domain.
* NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
*/
//This version has been updated to allow more than one updater
function contentEval(source) {
// Check for function input.
if ('function' == typeof source) {
// Execute this function with no arguments, by adding parentheses.
// One set around the function, required for valid syntax, and a
// second empty set calls the surrounded function.
source = '(' + source + ')();'
}
// Create a script node holding this source code.
var script = document.createElement('script');
script.setAttribute("type", "application/javascript");
script.textContent = source;
// Insert the script node into the page, so it will run, and immediately
// remove it to clean up.
document.body.appendChild(script);
document.body.removeChild(script);
}
function addWatchFunctions() {
// object.watch
if (!Object.prototype.multiWatch) {
Object.defineProperty(Object.prototype, "multiWatch", {
enumerable: false,
configurable: true,
writable: false,
value: function (prop, watcher) {
var obj = this,
oldval = this[prop],
newval = oldval,
getter = function () {
return newval;
},
setter = function (val) {
oldval = newval;
for (var f=0; f < obj.watchers[prop].length; f++) {
obj.watchers[prop][f](prop, oldval, val);
}
newval = val;
return newval;
};
if (delete obj[prop]) { // can't watch constants
Object.defineProperty(this, prop, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});
if (!obj.watchers) obj.watchers = {};
if (!obj.watchers[prop]) obj.watchers[prop] = [];
// check for duplicates
for (var i=0; i < obj.watchers[prop].length; i++){
if(obj.watchers[prop][i] === watcher){
return;
}
}
//obj.watchers[prop].push( eval(watcher)); //add the new watcher in the watchers array
obj.watchers[prop].push(watcher);
}
}
});
}
// object.unwatch
if (!Object.prototype.multiUnwatch) {
Object.defineProperty(Object.prototype, "multiUnwatch", {
enumerable: false,
configurable: true,
writable: false,
value: function (prop, watcher) {
var obj = this;
// if a watcher is supplied, just remove it
if(arguments.length == 2) {
for(var i=0; i < obj.watchers[prop].length; i++){
var w = obj.watchers[prop][i];
if(w == watcher) {
obj.watchers[prop].splice(i, 1);
}
}
} else {
obj.watchers[prop] = [];
}
if (obj.watchers[prop].length == 0 )
{
delete obj.watchers[prop];
var val = this[prop];
delete this[prop]; // remove accessors
this[prop] = val;
}
}
});
}
}
//add the new functions to the main window
contentEval(addWatchFunctions);
//add the new functions to this script
addWatchFunctions();
var JSON;if(!JSON){JSON={};}(function(){"use strict";function f(n){return n<10?'0'+n:n;}if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+f(this.getUTCMonth()+1)+'-'+f(this.getUTCDate())+'T'+f(this.getUTCHours())+':'+f(this.getUTCMinutes())+':'+f(this.getUTCSeconds())+'Z':null;};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf();};}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);}if(typeof rep==='function'){value=rep.call(holder,key,value);}switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';}v=partial.length===0?'[]':gap?'[\n'+gap+partial.join(',\n'+gap)+'\n'+mind+']':'['+partial.join(',')+']';gap=mind;return v;}if(rep&&typeof rep==='object'){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==='string'){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;}}if(typeof JSON.stringify!=='function'){JSON.stringify=function(value,replacer,space){var i;gap='';indent='';if(typeof space==='number'){for(i=0;i<space;i+=1){indent+=' ';}}else if(typeof space==='string'){indent=space;}rep=replacer;if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||typeof replacer.length!=='number')){throw new Error('JSON.stringify');}return str('',{'':value});};}if(typeof JSON.parse!=='function'){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}}return reviver.call(holder,key,value);}text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);});}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;}throw new SyntaxError('JSON.parse');};}}());
var JSON2 = JSON;
var URL_CASTLE_BUT = "data:image/png;base64,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";
var URL_CASTLE_BUT_SEL = "data:image/png;base64,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";
var success_image = "data:image/png;base64,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";
var up_img ="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAaCAYAAACkVDyJAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AgRBjoxAQevPgAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAEWUlEQVRIx+2Vb2iVZRTAf+d53/tv2929m3d3a9NN55AMFG0RKhUF9aEEoX0I0rCS0HS0UkEpMJAUSxti/sn6VH0QpI/Wl0CyIhkhzbJ/rsScOXX/t7vt/nvf5/ThbrNlxjKDgg6c5zwHnvf83nOew3ng3y7xTd9M9Vu+++dgZVu/ntxHVny7puHLDgEo3/b9tGOYm8py65nW7KAe6H/f2wZAKDjtb2VagI3tDO5dDEBsy1ePusYceTAQCx9ntDtvWDm0ff7xW5rhJGxze4P1dXdtIhx+bFVc68rdJCqvlG8/Ww0wY2fHrStp2abTRb6vr5VFgw0mXsS+tkGZnXA0UeIstSo7AETM3weWtpwCwPP956IRpymSLKUrrdqdsgyM5plf6RIJytMzdv64qfelBhK7zt08sLT5C4bfuIvSllNLAg6vxqpipEMh9RUZyihXBjxxjdX6hIuItCZ2nVvW++JcKnaf/+vA6LNtDB+8m+iGtkqsfhSbUYxUxjXrqQjg+Up/yuNCb17qywzJYgcfjib3nK/s2TKHRGvn9IHRdSdJHV5CfF1bkbUcjZeGorHbq7U/h8h4X6sqmZzSl/Lp6M7RONPVsogzM+9zINnaGendXDt9YOqtZQDkle3RkLkv0VinPeqKg045p1YZSVv6hj0uDuTkzmqHSNA0+aprq/d0SsXezumXtHjtyRWO+s11S+ulN1gkonbqAVVQxVplcMzSM+wzmvV1QaVjRHg977KoZ2MtFfsu3hhY8tRnBbvm81rx7L76hdWRnni5qur1f6SFDLHg+4XSXh7yJeKq1sUdF5Fjyf2/FPc8P4vkwUvXA4tXf8LIO/dS8uSnAdQeSlaXzs7NrVbPyB9OI51Y1KJWyXlKX8rj6rAnc2Ki0ZDUoBy97d2r0t1cQ/LQld9nqBPrnnA4sDzWOEfHgkFBb1Bz1UkYqqhV0lnL1SGf/jFfFle6qshyO2p3AHRvqKLq8JUCsPiJE4y+dz9Fq08843t2/bx75tIfLcHaPxm2EyXV394njKQtXYMeIxmPpTUuGV+bKw9fbipMbnMtXnjlx4sckQ8al8yq6byjHuspiCAKNptHszlsOo/N5NFMDm8oTa5rABNywTWI62BcB1xDKOSSLAswOxHQtBeQH4b0zKjVpr71lT8ZgKLHj5fHI+6rax+oqnnk4XpFIRwQwi6EXAgHDCF3QmXShh0IOxBxhIgz7ruCAcaylpGMlRcWFuu8EXdBIuW8/NCRgSLZf+xn4yMtCnv7UnnO5gK0pwTHCGIERFBrwSr443dmFc37+GMZTMBBnEKGGAOOQZyCLYk4LCoP037Skhs2DI7qKrezNysVsWDu9IWRSx+e7k97KmCkEMQx1/auAWOuBXcM4rpgDSCFl0IFUQEVUOgfhYvpLDrT4PXYIhzjuF39WT+Tt292dKXfTuctgYAD45lhxlVMwR9XnXi5dWrXCjKlycw424mAJMBT9flf/vPyKztX7pN6V2XmAAAAAElFTkSuQmCC";
var up_glow="data:image/png;base64,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";
var down_img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAaCAYAAACkVDyJAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AgRBwUywRK+jwAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAEi0lEQVRIx+1WXWwUVRT+zrl3drfbdne73e2Wv1WQYDQxwd9UjIiJ0ScfJDEENGp8ofwIgcpviGI0Gk2AaFIEYvwBwyMPRsJTI1FDkYithRCUtkChS7vd0t1u9292Zo4P0xYLrVQTEk38kpk7dyZzvnO+79yZC/yP/zropV0dCFcb1Hohqzp6czAMBSgGMYM0A0wgViBNADNIsftc3bgG0/icePSeIrBSECawwXDyBGuAbD0z7FXRoGflYM7afiFZKFgCwBGAxB0BgBxAGBABREDj6f45dYLcVM1YGLsAWCn4MURbdTziFRvkeXR+YNa8WAV+Mw20ZQmKCcTkBnIc923bgThuIlK2YeeLYFaj1bkKQAlICaAIVRXAwrAXbSccmMOMdE5sAgD/8pZwwO85vPzx6HOxJffKvksgD4+mKYCYNpyiCadQhlM0IcUyrEwe5d7rYK8GaTV6MGAokFLw+xXitQaaHgrL7mNFumI7h+KzVeO4KL4V3y1URN8+3DBnVs/98+BYAhC5ypbKkNIYYRlSNGFlCjATQ2CvBjSDtAJrBWiG16tRV2Pg7oghBcug8xk5k3Nk6eCqWCcDQOXLx1E8/HS7KOw8dfKKObMvBVIkt205dr2jMfmZoBUjWMmoDygRUvTTQDlTEnvn4KpYZ/3+JBgAcl8vQeUrx5E/uOQzpfnT33/sQjg7AmZgSlbCqMcuKYjADFRVMGaGNKp8Gq29FnyKmvsbZxxx7XHAEyK4503FYvlo5vRF8pumTOhETOxKEI83FjGhwsuIBRXCfiVt/RYR5ChX8g4AqNvbh77G+huEuYNPoeq1HzDy1eIyiFcnE8OXPF0J0o7IFAWOVueSejShtlojFtByMSOULUkvCMuuvRqTuuZeJFfXj7swjpEvn3THz5/oEc3ruzsShWj6OhHR1JIyoBShtlphRlBJwSK6nLYtiDyffGN2LvrxFSTXzJpg+6TIHVj0jU2q+XJrt0TMvAjxJJISmAkhPyMaUKj0KjrTbzsieNOw0B7d04OB9XNu6bNbUL3yBADAILydLTnfp05fpihZYt9kKDGhqoJRG9CYU+ORXxI2CqZzRBEdSGyKy8CG+KSNfQuy+xehuvEk0vsb8sxYlh4uZTPnExT2QMYcJSL4PK6UC+o8OH3VoqGCfdVQWJtsihciu3qmXEmTIruvAYE1p5Dd29APpmczgzlIf5q8mkQAaEUIV2vcFTGke8hBMmdDAcuSm+b2Rz+6iFRT/O8RAsBw82MIrPsZw588crJsY2umL4OKUokUQYI+Qn2NFsth6k5ZEJGm1LZ7TkQ+6MLA5rn4i+U7PdRsbPeXHedQOORbGp0dRKW2EVWWtF+zaTAvX6R3Lng98n4nUtvn3/bjNC0M7V6YV4q2DGXNTiedx/qGkFxK2ZQasVuZZAcAiDi3/wFPhyy0oQ3pPQ8CAIKbf31BMx9+xgj6WpBLlhkrMu/c13JHtgc1WzrcBLac2cWLz+bD2869BQDh97qmHYP/CXH6wweavCFaG35RvwsAKJl3bhMU2nh24nzduX/3ru0PInfZcM1Vy/MAAAAASUVORK5CYII=";
var down_glow = "data:image/png;base64,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";
var gbtn_img = "data:image/png;base64,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";
var remove_img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABo6AAAaOgG4MgkwAAAAB3RJTUUH3AgSBikNXTI9xQAABK5JREFUaN7t2F2IXHcZx/HPMzM7m81usktC1JJELSSNWEEvOilSbNGLBuldfaFe9KZUrBdKLwIKCiJK9UpBqGClvQoFi60v6I2geOGF3dHYqqmGtKWGqmvK7izZNd3dmTmPF+fM7pZEyE52t6XMDw7nzGH+L9/ze57/GyONNNJII4000khvX7WHKDO7je3HdsLMlhU2kzuT+4I7cDMauJScxc9qPI1Oi3xLgLTRwlmix7HkU8GXY8y+xiRjB6hNlY0UK3QX6C2Xz8mTwWNBu8WVWZx8M0AGDbcZTx4oeLgx7pbpD7H/I3LiVpqHRH0vkfT/S/c1ufoSy7Ni8SyvL1gKztT4bosLNwITNwIxy2TwaMF9kzcZP/IFOdmisU+ooSv1hD76UiH0KJblystcekbMtWWD55OHTvLssDBxA2E1jh8U3D99WBz/HrWZsqNZyOgJBXpUILJPbNwzCzH/tLzwK8Z4AZ9ulffdAaly4vPJd6bfqXnihyIDqzL6pQPZIwYgxdUw68B7xMJP5Yu/FXiqxudaLA7y73rVGCa5exwveHhqxvjxr8pcwirRF4OOvgFikyvxRqDIvjxwmzj8H/75N59InsGPdtyRWSRfqdd889j9cvqkyF7pRG7qqGKTE90NkM3X5v+vdeSLvxbLS87X+ECrxN8ZRyryJr40fZTJI1gkeiJ75eikVpJaxEoF06xa6mOtcqhXxqeiBBqriYOH5ZXzTkin8MsdBUnujJp9+98jG12RndKN6Fedfx4vlaG2Pt1F1dIkprCngovKlRVcZmqxnE1XOL0bIJ8ZazCxH0tEV+Qq8fc6f66zltSvLqSLDhY2vUNkd/CYE0STXOWurfZrmNC6Y2ycZgqL0oqIPzX4+EN8+166a9dXUb3OxYucPi06HYiojMohcncYR95bq1FfQV/4IzrB+27hYx/dWmXnztFsrhsUZKMC2g1HGlEQS/gXXsPYpljZiorimqPoroDgUtF1U//f1OcGHxKXLzM3x9oWQmt+/iqYPjlMaA0zj/xivOaeYw25d60ccSOCo0c5dOhaX/n/tBwl9Pnzsttd78wFskPcvsW+DZMjP+8W7llZY2/VeGaKixfL5B1euUKsloj/2Grh2hAFflxguVyFZG7P7ixjUlyZkqvl70d3HASd5MnBxB1Vlg+z1ctBPL1b9G6TnaYo6AWP7yhItWjM4LHXWbpUrkoiy3dbgknV7PdhGXez1KezQPJIi4X2ToK0NkaIdnBmjpwvIdZhrted2Et+UsbdoluTr/xOFDwXPLGrW902x/FUlw+ewIGqrkHOXCt31gFvlh4Q8S66L8tz3xKrLNT5bKtcxu+OZjfut7f567Pkq+UaqagGgCwoqnt57ZHFMVk8qMifyO4ZxcKDirM1+Xvm23zxTTlF2XT48P6Cr+HeKRoHySlMTIraQRyWjgi3lgdDK3Wu/EF2fiM6f6FIz9X4xsCJre4Mt+U4aBPMTHIq+XqNE000J2RzhsY7hJlyxu4tsfqqWO1QdPWSR4InTlbzxrAQ235A1y4n2FMFp4O7sloADnKmypFXgu8Hj7c2FvVvnePS2SEdbRtppJFGGmmkkUZ62+p/v5QIkkqA6+0AAAAASUVORK5CYII=";
var remove_glow = "data:image/png;base64,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";
var upgradeData = {
active : false,
item : 0,
retryInterval : 30,
enhanceAction : false,
enhanceItem : 0,
enhanceMax : 5,
minStones : 100000,
switchToUpgrade : true,
salvageActive : false,
currentTab : null,
trWinIsOpen : false,
Opacity : 1.0,
anyCity : true,
uCityNum : 0,
sCityNum : 0,
repairAll : false,
trWinPos : {},
disableAnim : false,
upgradeH: '300px',
upgradeW: '700px',
salvageH: '300px',
salvageW: '710px',
organizeH: '500px',
organizeW: '770px',
optionH: '500px',
optionW: '700px',
logH: '500px',
logW: '710px',
activeTab: 1,
sortSelected: "none",
buffSelected: "both",
sortInactive: true,
newUpgradeState: 0,
whisperToMe: false,
safetyOn: false,
buffsOff: false,
safetyLimit: 50000,
multiUpgrade: false,
noMassSalvage: false,
salvageSafety: false,
numSafety: 40,
presetWidget: true,
removeTokens: false
};
var queueData = {
list : [],
oneItem : true,
doingRepairs : false,
index : 0,
dataConverted : false
};
var TRGlobalOptions = {
trUpdate : false
};
var presetData = {
items : [],
ids : ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R'],
desc : ['Preset A', 'Preset B', 'Preset C', 'Preset D', 'Preset E', 'Preset F', 'Preset G', 'Preset H', 'Preset I', 'Preset J',
'Preset K', 'Preset L', 'Preset M', 'Preset N', 'Preset O', 'Preset P', 'Preset Q', 'Preset R'],
num_presets: 10,
noTooltips : false,
usePreset : 0,
taggedItems: {}
};
var TABLE_SCALE =0.47;
var upgradeStats = {
upgradeSuccess: {0: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
1: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
2: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
3: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
4: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
5: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0} },
upgradeFailure: {0: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
1: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
2: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
3: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
4: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
5: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0} },
enhanceSuccess: {0: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
1: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
2: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
3: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
4: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
5: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0} },
enhanceFailure: {0: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
1: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
2: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
3: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
4: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
5: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0} }
};
var salvageData = {
salvageActive : false,
throneSaveNum : 40,
minQuality : 3,
ruleSet : [{"type":"any","faction":"any","conditions":[{"mustHave":"true","number":"2","effect":"Range","buffType":"e","slots":[true,true,true,true,true]}]},{"type":"any","faction":"any","conditions":[{"mustHave":"true","number":"2","effect":"Troop Training Speed","buffType":"e","slots":[true,true,true,true,true]}]},{"type":"banner","faction":"any","conditions":[{"mustHave":"true","number":"2","effect":"Siege Range","buffType":"e","slots":[true,true,true,true,true]}]}],
numSalvagedItems : 0,
numSalvagedItems2 : 0,
minStones : 200000,
minCity : false,
maxStones : 980000,
anyCity : true,
overflow : "order",
minMethod : "order",
numSalvaged : {0: 0, 1: 0, 2:0, 3:0, 4:0, 5:0, 6:0},
upgradeFirst : false,
upgradeFirstQual : 2,
upgradedToDelete : [],
upgradeManual : false
};
var presetPosition = null;
var guardPosition = null;
var n = new Date();
salvageData.since = n.valueOf();
var Seed = unsafeWindow.seed;
var Tabs = {};
var uW = unsafeWindow;
//var firefoxVersion = getFirefoxVersion();
var CM = unsafeWindow.cm;
var Cities = {};
var trStartupTimer = null;
var trDispTimer = null;
function trStartup (){
if (!unsafeWindow.cm)
return;
if (uW.trLoaded)
return;
var metc = getClientCoords(document.getElementById('main_engagement_tabs'));
if (metc.width==null || metc.width==0){
trStartupTimer = setTimeout (trStartup, 1000);
return;
}
uW.trLoaded = Version;
readUpgradeData();
if (upgradeData.uCityNum && upgradeData.uCityNum > Seed.cities.length -1 ) upgradeData.uCityNum = 0;
if (upgradeData.sCityNum && upgradeData.sCityNum > Seed.cities.length -1 ) upgradeData.sCityNum = 0;
readUpgradeStats();
readSalvageData();
readQueueData();
readPresetData();
logit ("Throne room organizer loaded");
installHandlerFunctions();
var styles = '.xtab {padding-right: 5px; border:none; background:none; white-space:nowrap;}\
.xtabBR {padding-right: 5px; border:none; background:none;}\
.greenBorder { margin-right: -100%; margin-bottom: -100%; height: 72%; width: 72%; padding: 4%; border: 3px solid cyan; background: transparent;}\
div.greenBorder2 {position: absolute; }\
.semi_transparent { zoom: 1; filter: alpha(opacity=60); opacity: 0.6;} \
.rot45 { transform: rotate(-45deg); -ms-transform: rotate(-45deg); -webkit-transform: rotate(-45deg); -o-transform: rotate(-45deg); -moz-transform: rotate(-45deg); -moz-transform-origin: 100% 100%; z-index: 10;}\
div.cardOverlay { font: cracked; font-size:3.5em; position: absolute; left: 0%; top: 50%; color: red; text-align: center; text-shadow: 2px 2px 4px #000;} \
body table.trMainTab tbody tr td {background: transparent;}\
table.trTabdef { height: 0px;}\
.trCardDisp { display: static;}\
table.trTabDef thead {background: transparent;}\
table.trPopMain tbody tr td,th {background: transparent;}\
table.trTabDef tbody tr td {background: transparent; height: 0px; }\
table.trTab tr td, th { border: 1px solid brown;}\
#tr_footer {height: 50px; background: url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/dialog_740_r3_c1.jpg") scroll no-repeat center bottom;}\
#tr_footer { background-size: cover; -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; }\
table.trTab tr td,th {border:none; background:none; padding: 0px}\
table.trTab#trDisplayTable tr th { border: 3px solid grey; font-size:1.2em; }\
table.trStatTab tr td { background-color: #ffffff; white-space:nowrap; padding:5px; border-bottom:solid black 1px;}\
table.trStatTab tr td:last-child { border-right:solid black 1px; }\
table.trStatTab tr:first-child th { border-top:solid black 1px; }\
table.trStatTab tr td.td0 { background-color: white; }\
table.trStatTab tr td.td1 { background-color: #eeeeee; }\
table.trStatTab tr td.td2 { background-color: white; }\
table.trStatTab tr th {border:solid black 1px; border-top: none; background-color: #357; color: white; white-space:nowrap; padding:5px}\
table.trStatTab tr:last-child td:first-child, table.trStatTab tr:last-child th:first-child { -moz-border-radius-bottomleft:10px; -webkit-border-bottom-left-radius:10px; border-bottom-left-radius:10px} \
table.trStatTab tr:last-child td:last-child, table.trStatTab tr:last-child th:last-child { -moz-border-radius-bottomright:10px; -webkit-border-bottom-right-radius:10px; border-bottom-right-radius:10px} \
table.trStatTab tr:first-child th:first-child { -moz-border-radius-topleft:10px; -webkit-border-top-left-radius:10px; border-top-left-radius:10px} \
table.trStatTab tr:first-child th:last-child { -moz-border-radius-topright:10px; -webkit-border-top-right-radius:10px; border-top-right-radius:10px} \
table.trTabLined tbody tr td {border-bottom:1px solid gray; padding: 2px 5px; }\
table.trOptions tr td,th {border:1px none none solid none; padding: 1px 3px; white-space:nowrap;}\
table.trSrchResults tr td,th {border:1px none none solid none; padding: 1px 3px; white-space:nowrap;}\
table.trTabSome tr td,th {border:none; background:none; padding: 1px 3px; white-space:nowrap;}\
table.trTabPad tr td,th { padding-left: 2px; background: none;}\
table.trTabPad2 tr td,th { padding-left: 20px; background: none;}\
.trDetLeft {padding:0 5px 0 0 !important; font-weight:bold; text-align:right}\
.trStat {border:1px solid; border-color:#000000; font-weight:bold; padding-top:2px; padding-bottom:2px; text-align:center; color:#ffffff ; background-color:#357; -moz-border-radius:5px;}\
.trentry {padding: 7px; white-space:nowrap;}\
button::-moz-focus-inner, input[type="submit"]::-moz-focus-inner { border: none; }\
button::-moz-focus-inner, input[type="button"]::-moz-focus-inner { border: none; }\
.castleBut {outline:0px; margin-left:0px; margin-right:0px; width:24px; height:26px; font-size:12px; font-weight:bold;}\
.castleBut:hover {background-image:url("'+ URL_CASTLE_BUT_SEL +'")}\
.castleButNon {background-image:url("'+ URL_CASTLE_BUT +'")}\
.castleButSel {background-image:url("'+ URL_CASTLE_BUT_SEL +'")}\
input.trDefButOn {cursor:pointer; border:1px solid #45d183; -moz-box-shadow:inset 0px 1px 5px #3aef8b; -moz-border-radius:5px;}\
input.trDefButOff {cursor:pointer; border:1px solid #f61646; -moz-box-shadow:inset 0px 1px 5px #f6375f; -moz-border-radius:5px;}\
table.trMainTab { empty-cells: show; }\
table.trMainTab tr td,th a {color:inherit }\
table.trMainTab tr td,th {height:60%; empty-cells:show; padding: 0px 0px 0px 0px; margin-top:5px; white-space:nowrap; border: 1px solid; border-style: none none solid none; -moz-border-radius:5px; }\
table.trMainTab tr td.spacer,th.space {padding: 0px 0px;}\
table.trMainTab tr th.sel,td.sel {font-weight:bold; font-size:13px; }\
table.trMainTab tr th.notSel,td.notSel {font-weight:bold; font-size:13px; }\
tr.trPopTop td,th { background-color:transparent; border:none; height: 21px; padding:0px;}\
.trPopMain { -moz-box-shadow:inset 0px 0px 10px #6a6a6a; -moz-border-radius-bottomright: 20px; -moz-border-radius-bottomleft: 20px;}\
.trPopup { border:3px ridge #666; opacity:'+upgradeData.Opacity+'; -moz-border-radius:25px; -moz-box-shadow: 1px 1px 5px #000000;}\
.trPopup { overflow-x: hide; overflow-y: hide; max-height: 900px; min-height: 400px; height: 500px; }\
#tr_top { background: url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/dialog_740_r2_c1.jpg") no-repeat transparent 0% 0%; }\
#tr_top { background-size: cover; -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; }\
/* this was needed because the css used a object id and not a class. reusing the ID caused display issues w/ the TR tooltips */ \
div.trCard {width: 200px;}\
div.trCard div.description>div{width:70px;height:70px; }\
div.trCard div.description div.briton.advisor{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_advisor_normal_1.png") top left no-repeat;}\
div.trCard div.description div.briton.banner{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_banner_normal_1.png") top left no-repeat;}\
div.trCard div.description div.briton.chair{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_chair_normal_1.png") top left no-repeat;}\
div.trCard div.description div.briton.table{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_table_normal_1.png") top left no-repeat;}\
div.trCard div.description div.briton.window{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_window_normal_1.png") top left no-repeat;}\
div.trCard div.description div.briton.trophy{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_trophy_normal_1_5.png") top left no-repeat;}\
div.trCard div.description div.briton.hero{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_hero_normal_1_5.png") top left no-repeat;}\
div.trCard div.description div.briton.statue{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_statue_normal_1_5.png") top left no-repeat;}\
div.trCard div.description div.briton.candelabrum{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_candelabrum_normal_1_5.png") top left no-repeat;}\
div.trCard div.description div.briton.pet{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_pet_normal_1_5.png") top left no-repeat;}\
div.trCard div.description div.druid.advisor{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/druid_advisor_normal_1.png") top left no-repeat;}\
div.trCard div.description div.druid.banner{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/druid_banner_normal_1.png") top left no-repeat;}\
div.trCard div.description div.druid.chair{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/druid_chair_normal_1.png") top left no-repeat;}\
div.trCard div.description div.druid.table{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/druid_table_normal_1.png") top left no-repeat;}\
div.trCard div.description div.druid.window{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/druid_window_normal_1.png") top left no-repeat;}\
div.trCard div.description div.druid.trophy{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/druid_trophy_normal_1_5.png") top left no-repeat;}\
div.trCard div.description div.druid.hero{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/druid_hero_normal_1_5.png") top left no-repeat;}\
div.trCard div.description div.druid.statue{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/druid_statue_normal_1_5.png") top left no-repeat;}\
div.trCard div.description div.druid.pet{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/druid_pet_normal_1_5.png") top left no-repeat;}\
div.trCard div.description div.druid.candelabrum{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/druid_candelabrum_normal_1_5.png") top left no-repeat;}\
div.trCard div.description div.fey.advisor{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/fey_advisor_normal_1.png") top left no-repeat;}\
div.trCard div.description div.fey.banner{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/fey_banner_normal_1.png") top left no-repeat;}\
div.trCard div.description div.fey.chair{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/fey_chair_normal_1.png") top left no-repeat;}\
div.trCard div.description div.fey.table{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/fey_table_normal_1.png") top left no-repeat;}\
div.trCard div.description div.fey.window{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/fey_window_normal_1.png") top left no-repeat;}\
div.trCard div.description div.fey.trophy{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/fey_trophy_normal_1_5.png") top left no-repeat;}\
div.trCard div.description div.fey.hero{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/fey_hero_normal_1_5.png") top left no-repeat;}\
div.trCard div.description div.fey.statue{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/fey_statue_normal_1_5.png") top left no-repeat;}\
div.trCard div.description div.fey.candelabrum{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/fey_candelabrum_normal_1_5.png") top left no-repeat;}\
div.trCard div.description div.fey.pet{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/fey_pet_normal_1_5.png") top left no-repeat;}\
div.trCard{font:bold 16px Georiga; overflow: hidden;}\
div.trCard>div{float:left;border:1px solid #a56631;margin:0px;padding:0px;width:200px; height: 300px;background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/modal/modal_med_bg_4.png") -200px 0 no-repeat;}\
div.trCard div.title{font:bold 16px Georgia;border-bottom:1px solid #703200;padding:4px 3px 5px 8px;background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/panel/modal/item_bg.png") -20px -100px no-repeat;}\
div.trCard div.title span.icon{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/modal/equip.png") top right no-repeat;display:block;height:20px;width:20px;top:12px;right:12px;position:absolute;}\
div.trCard .disabled{opacity:.5;}\ div.trCard ul{margin:0px;padding:0;list-style:none;}\
div.trCard li{padding:0px 0 0 0px;color:#3f2300;font-weight:bold;font-size:16px;}\
div.trCard div.description{overflow:hidden;border-bottom:1px solid #703200;padding:5px 0;}\
div.trCard div.description{overflow:hidden;border-bottom:1px solid #703200;}\
div.trCard div.description div.portrait{float:left;}\
div.trCard div.description div.portrait{border:3px solid #deaf69;margin-right:10px;}\
div.trCard div.description>ul{float:left;margin:3px 0 0 0;padding:0;}\
div.trCard div.description>ul li{padding:0;font-weight:bold;font-size:13px;text-transform:capitalize;}\
div.trRule {border:2px inset #c0c0c0; margin-right:10px; margin-left:10px; margin-bottom:2px; padding-left:5px; padding-bottom:5px} \
div.trRuleCreate {margin-right:10px; padding-right: 5px; margin-bottom:2px; padding-bottom:5px} \
div.trRule { background-color: #eeeeee; } \
div.blueBorder { border: 2px solid blue; } \
div.blueBorder2 { border: 10px solid blue; } \
div.yellowBorder { outline: 2px solid yellow; outline-offset:0px; }\
div.yellowBorder2 { outline: 10px solid yellow; outline-offset:0px; }\
#trhammer { background-image: url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/modal/sm_hammer.png"); background-repeat: no-repeat; background-color: transparent; display: inline-block; width: 28px; height: 32px; margin: 2px; vertical-align: middle;}\
div.trhammer { background-image: url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/modal/sm_hammer.png"); background-repeat: no-repeat; background-color: transparent; display: inline-block; width: 28px; height: 32px; margin: 2px; vertical-align: middle;}\
div.trbroken { background-image: url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/modal/sm_fail_overlay.png"); background-repeat: no-repeat; background-color: transparent; display: inline-block; width: 28px; height: 32px; margin: 2px; vertical-align: middle;}\
div.trsuccess { background-image: url('+ success_image +'); background-repeat: no-repeat; background-color: transparent; display: inline-block; width: 28px; height: 32px; margin: 2px; vertical-align: middle;}\
div.trup { display=inline; background-image: url('+ up_img +'); background-repeat: no-repeat; background-color: transparent; width: 28px; height: 24px; }\
div.trup:hover { display=inline; background-image: url('+ up_glow +'); background-repeat: no-repeat; background-color: transparent; width: 28px; height: 24px; }\
div.trremove { display=inline; background-image: url('+ remove_img +'); background-repeat: no-repeat; background-color: transparent; width: 50px; height: 50px; }\
div.trremove:hover { display=inline; background-image: url('+ remove_glow +'); background-repeat: no-repeat; background-color: transparent; width: 50px; height: 50px; }\
div.trdown { display=inline; background-image: url('+ down_img +'); background-repeat: no-repeat; background-color: transparent; width: 28px; height: 24px; }\
div.trdown:hover { display=inline; background-image: url('+ down_glow +'); background-repeat: no-repeat; background-color: transparent; width: 28px; height: 24px; }\
div.trgbtn { display=inline; background-image: url('+ gbtn_img +'); background-repeat: no-repeat; background-color: transparent; width: 32px; height: 32px; margin: 0px; }\
ul#MM_throneStatList li { float: left; width: 22px; height: 22px; text-align: center; color: white; }\
ul#MM_throneStatList li.active { background: transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/modal/set_active.png") top left no-repeat; } \
ul#MM_throneStatList li.selected { background: transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/modal/set_selected.png") top left no-repeat; }\
ul#MM_throneStatList li.locked { background: transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/modal/set_locked.png") top left no-repeat; text-indent: -999px; }\
ul#MM_throneStatList li.buy { background: transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/modal/set_buy.png") top left no-repeat; text-indent: -999px; }\
#trQueue th { text-align: center; }\
a.loadGPreset { border-radius:5px; border-style: solid; border-width: 3px; }\
div.indent25 {padding-left:25px}\
li.guardbutton { border: 4px inset Peru; display: inline; float: left; width: 31px; height: 33px; text-align: center; color: white; }\
li.guardbutton.active { border: 4px solid blue;}\
li.guardbutton:hover div.tt { visibility: visible;}\
li.guardbutton div.tt { visibility: hidden; border-radius: 5px 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;\
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);\
font-family: Calibri, Tahoma, Geneva, sans-serif; font-weight: normal;\
position: relative; left: -30px; top: 50px; \
margin-left: 0; width: 200px; background-color: white; color: black;\
background: #FFFFAA; border: 1px solid #FFAD33; padding: 0.8em 1em;}\
#preset_tt {margin-left: -999em; position: absolute;}\
#preset_tt.showit { border-radius: 5px 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;\
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);\
font-family: Calibri, Tahoma, Geneva, sans-serif; font-weight: normal;\
position: absolute; left: 400px; top: 100px; z-index: 99;\
margin-left: 0; width: 200px; background-color: white; color: black;\
background: #FFFFAA; border: 1px solid #FFAD33; padding: 0.8em 1em;}';
window.name = 'TR';
if (upgradeData.trWinPos==null || upgradeData.trWinPos.x==null || upgradeData.trWinPos.x=='' || isNaN(upgradeData.trWinPos.x)){
var c = getClientCoords (document.getElementById('main_engagement_tabs'));
upgradeData.trWinPos.x = 100;
upgradeData.trWinPos.y = 100;
saveUpgradeData();
}
var newCSS = GM_getResourceText ("jqcss");
GM_addStyle (newCSS);
GM_addStyle (styles);
// clear some styles
var styles2 = ".trDiag .ui-widget-content { font-size: 1.0em; background: none; border: none;}" +
".trDiag.ui-widget-content { font-size: 0.95em; background: none; border: none;}" +
".trDiag .ui-tabs .ui-tabs-nav li a { font-weight: bold; font-family: georgia,arial,sans-serif; color: white; font-size: 1.0em; background: url('https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/tab_unselected.png') no-repeat scroll 0% 0% transparent;}" +
".trDiag .ui-tabs .ui-tabs-nav li.ui-tabs-active a { background: url('https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/tab_selected.png') no-repeat scroll 0% 0% transparent;}" +
".trDiag .ui-widget-content a { color: white;}" +
".trDiag a.buttonDown20 span { color: white;}" +
".trDiag .ui-widget {font-size: 1.0em;}" +
".trDiag.ui-dialog .ui-dialog-title {margin: 0px; width: 100%;}" +
".trDiag .ui-widget-header {background: none; border: none;}" +
".trDiag .ui-state-deafault {background-color: none; }" +
".trDiag .ui-widget .ui-widget {font-size: 0.9em;}" +
".trDiag .ui-dialog-titlebar {text-shadow: 0px 1px 0px white; line-height: 24px; text-align: center; color: #5C3317; font: bold 1.3em Georiga;}" +
'.trDiag.ui-dialog .ui-dialog-titlebar-close { background-position: 0px 0px; background-image: url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/close_icon.png"); background-repeat: no-repeat; height: 20px; width: 20px; }' +
".trDiag.ui-dialog .ui-dialog-titlebar-close { width: 20px; height: 20px;}" +
".trDiag .ui-resizable-s { background: rgba(0,0,255,0.3);}" +
".trDiag .ui-tabs .ui-tabs-nav { position: relative; top: 10px; left: 15px;}" +
"table.trTable tbody tr td { background: none;}";
GM_addStyle(styles2);
var prefix = 'tr';
var topClass = 'trPopTop';
$("#mainbody").append(
"<div id='tr_dialog' class='trPopup tr_trPopup'>"
+ '<TABLE class=trTab cellspacing=0 width=100% height=100%>'
+ '<tbody><TR><TD colspan=2><div width=720px height=100% valign=top class="trPopMain '+ prefix +'_trPopMain" id="'+ prefix +'_main"></div></td></tr>'
+ '<tr><td colspan=2><div id=tr_footer></div></td>'
+ '</tr></tbody></table></div>');
$("#tr_dialog").css({
"overflow-y": "hidden",
"overflow-x": "hidden",
"padding": '0px'
});
var trPop = null;
var tStr= 'Throne Room Organizer';
$("#tr_dialog").dialog({
title: tStr,
//zIndex: 111111,
position: [ upgradeData.trWinPos.x, upgradeData.trWinPos.y],
draggable: true,
height: "auto",
maxHeight: 2000,
minHeight: 300,
width: "auto",
resizable: false,
autoOpen: upgradeData.trWinIsOpen,
dragStop: function( event, ui ) {
upgradeData.trWinPos.x = ui.position.left;
upgradeData.trWinPos.y = ui.position.top;
saveUpgradeData();
},
close: function( event, ui ) {
upgradeData.trWinIsOpen = false;
saveUpgradeData();
},
open: function( event, ui ) {
$("#tr_dialog").parent().css('z-index', 111111 );
if (trPop) trPop.focusMe();
}
});
$("#tr_dialog").css('max-height', '2000px');
$("#tr_dialog").parent().attr( {id: 'tr_top', padding: '0px'});
mainPop = $("#tr_top")[0];
$("div#tr_bar").css( {background: 'none', border: 'none'} );
$("#tr_top").addClass('trDiag');
var mainDiv = $("#tr_top")[0];
trPop = new trPopup('tr');
// block the copy/paste stuff added by sharethis
var a = document.getElementsByTagName("body")[0];
a.oncopy = function () { return true;}
setCities();
CM.cheatDetector.detect = foo;
$("#tr_main").html(
'<div>\
<ul>\
<li><a href="#tabs-upgrade">Upgrade</a></li>\
<li><a href="#tabs-salvage">Salvage</a></li>\
<li><a href="#tabs-organize">Organize</a></li>\
<li><a href="#tabs-estats">Enhance Stats</a></li>\
<li><a href="#tabs-ustats">Upgrade Stats</a></li>\
<li><a href="#tabs-options">Options</a></li>\
<li><a href="#tabs-caps">Caps</a></li>\
<li><a href="#tabs-log">Log</a></li>\
</ul>\
<div id="tabs-upgrade"> Options tab </div>\
<div id="tabs-salvage"> Salvage tab </div>\
<div id="tabs-organize"> Organize tab </div>\
<div id="tabs-estats"> EStats tab </div>\
<div id="tabs-ustats"> UStats tab </div>\
<div id="tabs-options"> Options tab </div>\
<div id="tabs-caps"> Caps tab </div>\
<div id="tabs-log"> Log tab </div>\
</div>');
$("#tr_main").tabs({
heightStyle: "content",
active: upgradeData.activeTab,
beforeActivate: function( event, ui ) {
if (ui.oldPanel && ui.oldPanel[0]) {
tab = findTab(ui.oldPanel[0]);
if (tab) {
Tabs[tab].hide();
}
}
if (ui.newPanel && ui.newPanel[0]) {
var tab = findTab(ui.newPanel[0]);
if (tab) Tabs[tab].show();
}
}
});
// set the width of all main tab divs
/*
$("#tr_main>div").css({
"width": "auto",
"padding": "0px"
});
*/
window.addEventListener('unload', onUnload, false);
Tabs.options.init($("#tabs-options")[0]);
Tabs.trActionLog.init($("#tabs-log")[0]);
Tabs.upgrader.init($("#tabs-upgrade")[0]);
Tabs.throneSalvage.init($("#tabs-salvage")[0]);
Tabs.organizer.init($("#tabs-organize")[0]);
Tabs.ustats.init($("#tabs-ustats")[0]);
Tabs.estats.init($("#tabs-estats")[0]);
Tabs.caps.init($("#tabs-caps")[0]);
$( "#tr_main" ).tabs( "refresh" );
AddMainTabLink('TR Organizer', trHideShow, trMainTab);
attachTab();
// set the labels on the new salvage tab
/*
$("a.throne").click( function() {
Tabs.throneSalvage.updateTRTab();
Tabs.upgrader.updateTRTab();
//Tabs.upgrader.updateTRSelect();
$("ul#throneInventoryList > li > div").removeClass('blueBorder');
$("ul#throneInventoryList > li > div").removeClass('yellowBorder');
$("div#throneMainContainer div#heroContainer").css('left', '450px');
for (ii in queueData.list) {
var list_item = queueData.list[ii];
if (!list_item) continue;
if (list_item.status != "complete") {
var id = list_item.item;
if (list_item.action == "upgrade") $("div#throneInventoryItem" + id).addClass('blueBorder');
if (list_item.action == "enhance") $("div#throneInventoryItem" + id).addClass('yellowBorder');
}
}
for (ii in presetData.taggedItems) {
$("div#throneInventoryItem" + ii).prepend("<div class='greenBorder'></div>");
}
$("ul#throneInventoryList").css('height', '520px');
$("div#throneInventoryContainer").css('height', '520px');
// update the other presets buttons when clicked
$('ul#throneStatList li.active, ul#throneStatList li.selected').click(
function () {
var s = $(this).attr('id').split('throneInventoryPreset')[1];
setPresetWidget(+s);
});
});
*/
// create a preset list on the main display. Wait 2 seconds for the chat-on-right to fire first.
if (upgradeData.presetWidget) setTimeout(buildPresetWidget,2000);
// set the color on the tab button
setUpgradeColor();
trDispTimer = setInterval(updateTimerDisp , 1000);
}
var foo = function() {
};
function setUpgradeColor() {
if (upgradeData.newUpgradeState == 0)
$("#trtab>span").css('color', '#FFFF66');
else if (upgradeData.newUpgradeState == 1)
$("#trtab>span").css('color', 'cyan');
else if (upgradeData.newUpgradeState == 2)
$("#trtab>span").css('color', 'red');
}
var presetTimer = null;
var presetFailures = 0;
//callback handler when a preset button is presed
function processPresetClick(btn) {
// if there is a timer still running, kill it
clearTimeout(presetTimer);
// don't do anything if already the right preset
if (btn == Seed.throne.activeSlot) {
// redarw everything
setPresetWidget(btn);
unsafeWindow.cm.ThroneView.renderThrone();
unsafeWindow.cm.ThroneView.renderStats();
Tabs.organizer.show();
//return;
}
// send message
unsafeWindow.AjaxCall.gPostRequest(
"ajax/_dispatch53.php",
{
ctrl: "throneRoom\\ThroneRoomServiceAjax",
action: "setPreset",
presetId: btn
},
function (v) {
if (v.ok === true)
{
presetFailures = 0;
// success
var H = Seed.throne.slotEquip[btn];
Seed.throne.activeSlot = btn;
// set the right items as equiped
$.each(unsafeWindow.kocThroneItems, function (I, J) {
C = $.inArray(J.id, H) > -1;
if (C) {
J.isEquipped = true;
} else {
J.isEquipped = false;
}
});
// update the buttons
setPresetWidget(btn);
unsafeWindow.cm.ThroneView.renderThrone();
unsafeWindow.cm.ThroneView.renderStats();
// redraw the organizer tab
Tabs.organizer.show();
}
else
{
presetFailures++;
logit("Preset change failed. Error code: " + v.error_code);
// try again in 2 seconds
if (presetFailures <=10) {
presetTimer = setTimeout( function () {processPresetClick(btn)}, 2000);
}
else
{
// after 10 failures, give up
presetFailures = 0;
}
}
}
);
}
//handler when a guardian button is presed
function processGuardianClick(type) {
// callback. only called when successful
var cb = function(h)
{
// set the outline and turn the background gray
var btn = "li.guardbutton." + type;
$("li.guardbutton").removeClass('active');
$(btn).css('background-color', 'darkgray');
$(btn).addClass('active');
// after lockout time is complete, redraw the control
var timeLeft = h.finishTime - unixTime();
setTimeout( function ()
{
h.summonFinishCallback(type, unsafeWindow.cm.guardianSummonModel.getSummonGuardian());
$(btn).css('background-color', 'white');
drawGuardWidget();
}, (timeLeft + 1.0)* 1000);
};
// change guardian
unsafeWindow.cm.guardianSummonModel.summon(type, cb)
}
//update the preset list buttons
function setPresetWidget(slot) {
var x = ($("#MM_throneStatList .selected, #throneStatList .selected"));
x.removeClass('selected');
x.addClass('active');
x.bind("mouseenter", function (I) {
unsafeWindow.cm.ThroneView.boostsTooltip(this, I, I.target.id)
});
x.bind("mouseleave", function (I) {
unsafeWindow.removeTooltip()
});
var s = $("#MM_throneInventoryPreset" + slot + ", #throneInventoryPreset" + slot);
s.removeClass('active');
s.addClass('selected')
s.unbind("mouseenter").unbind("mouseleave");
$("a.loadGPreset").css('border-color', 'transparent');
$("#trPresetNum" + slot ).css('border-color', 'green');
document.getElementById ('PresetList').value = slot;
Tabs.organizer.selectPreset(slot);
}
//create a preset list on the main display
function buildPresetWidget() {
var E = [];
var J = Seed.throne.activeSlot;
var F = Seed.throne.slotNum;
for (var G = 0; G < 16; ++G) {
var H = G + 1;
var I = $("<li/>");
if (H === J) {
I.attr("id", "MM_throneInventoryPreset" + H);
I.addClass("selected");
I.html(H);
I.bind("click", {
idx: G
}, function (K) {
var L = K.data.idx + 1;
processPresetClick(L);
});
} else {
if (H === (F + 1)) {
I.attr("id", "MM_throneInventoryPreset" + H);
I.addClass("buy");
I.bind("click", function () {
unsafeWindow.cm.ContextualMenuThrone.renderMenu(this, null);
})
} else {
if (H <= F) {
I.attr("id", "MM_throneInventoryPreset" + H);
I.addClass("active");
I.html(H);
I.bind("click", {
idx: G
}, function (K) {
var L = K.data.idx + 1;
processPresetClick(L);
});
I.bind("mouseenter", function (K) {
unsafeWindow.cm.ThroneView.boostsTooltip(this, K, K.target.id)
});
I.bind("mouseleave", function (K) {
unsafeWindow.removeTooltip()
})
} else {
I.attr("id", "MM_throneInventoryPreset" + H);
I.addClass("locked");
}
}
}
E.push(I)
}
var C = $("<ul/>", {
id: "MM_throneStatList",
addClass: "presetList",
style: "width: 178px; padding: 0px; margin: 0px; list-style: none; overflow: hiddden; float: left; border: 5px outset Peru; position: absolute; background: white;"
});
$.each(E, function (K, L) {
C.append(L)
});
var aa = $("<div id='tr_presetBox'/>");
aa.append(C);
aa.css({
"height": "55px",
"width": "190px",
"overflow": "visible",
"position": "absolute",
"z-index": "100000"
})
$("#kocContainer").append(aa);
// make a selector box for picking a guardian
var C2 = $("<ul/>", {
id: "t_throneGuardList",
addClass: "presetList",
style: "padding: 0px; margin: 0px; list-style: none; overflow: visible; float: left; border: 4px outset Peru;"
});
var guardTypes = ["wood", "ore", "food", "stone"];
var offsets = [" 77% 47% ", " 77% 73% ", " 77% 60% "," 77% 85% "]; // default to highest level. TODO: set the icon based on the current level
for (g =0; g < 4; g++)
{
var type = guardTypes[g];
var bb = $("<li/>").html('<div/>').css(
{
'padding': '0px',
'background': 'url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/guardian_change_spritemap102.png") no-repeat scroll ' + offsets[g] + ' white',
'background-size': '350px'
});
bb.addClass("guardbutton").addClass(type);
bb.append("<div class='tt'>" + unsafeWindow.g_js_strings.guardian["tooltipSummon_" + type] + "</div>");
bb.bind("click", {
gt: type
}, function (K) {
processGuardianClick(K.data.gt);
});
C2.append(bb);
}
aa = $("<div id='tr_guardBox'/>");
aa.append(C2);
aa.css({"height": "48px",
"width": "164px",
"position": "absolute",
"overflow": "visible",
"z-index": "100000"}
);
$("#kocContainer").append(aa);
// move the chat box down
var p = $("div.mod_comm").css('top');
p = +p.split('px')[0] + 70;
$("div.mod_comm").css('top', p + "px");
var CHAT_BG_IMAGE = "data:image/gif;base64,R0lGODlhagHQAvcAAP%2F%2F5v%2F%2F1v%2F33v%2F31vf35v%2F3zvf33v%2F3xff31vf3zv%2Fv3u%2F33v%2Fv1v%2Fvzvfv1vfvzvfvxffvvffmzu%2Fmvebmvffere%2Feve%2Fete%2Fere%2Fepebevebeteberd7evd7ete%2FWpebWtd7Wtd7Wrd7WpdbWrd7Ord7OpdbOrdbOpdbFpc7FtdbFnM7FnMXFrc7FlM69rc69nM69lM69jMW9nMW9lMW9jL29nL29lM61jMW1nMW1lMW1jL21nMW1hL21lL21jMWtlLW1lL2tnL2tlL2thL2te7WthL2le72lc7WlhL2la7Wle7Wlc7Wla62le62lc7Wce7Wcc62chLWca6WcjK2cc6WchK2ca62cY6Wcc6Wca6WUhK2Ua6WUa6WUY5yUY5yMa5yMY5yMWpSMa5SMY5SMWoyMY5SEa5SEY4SEe4yEY4yEWoyEUpx7Uox7Wox7UoR7WoR7UoRzUntzY4RzSntzUntzSnNzSntrSmtrY3NrSmtjOhlrzmNaSjpjhBljxRljvRljtRlarRlapRlSnBlSlBlKjBlKhBlKexlCexlCcxlCa0o6CCE6Uhk6Yxk6WkopAEIpADopABAxQjEpEDEpCCEpMRkpMTohADEhACkhCDEZACkZACEZCCEZACEQABkQABkIABAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAagHQAgAI%2FgB1NGgAB02XJUaWKFziZEmShRAVOplIcSIUKA4fLsG4EUqVj1kqNpQosmJEJ1VGSvx4saXLlwxLTvxYReFHmSgnkqRJkabPn0CrvGypE2fFlEZLCl3I8SJEKCirZJmKNGlJIxRJjoza0CREq0eVBq0KNqdIpFo7ehQ61OVYLTSnZoGbUUoSJ0yeNJlR4EGdOGsCC37jRvAaN4gDI37DuDHjOI3dOHYcR46cyZgzI94cmfMby6BBZ34Tp7Tp0ocZFx79GPNp03LsjLZcGjRk1ZJZE278%2Bvbj3qZVH0482rQdO8DjbEZ8OnHwNaU9q9ZNOvnpzryTvzEcuLRr4MWt%2Fgev%2FpoOHdPm0zOWszkOm%2Fc3HjxY42QGChQmRNw%2FQaL%2FiRP7%2FYeCCAT%2BR6B%2B9yUYoIAKmuCgCSVEWMKDD5aAH4UOXkghCvz15yEJCoYoIgoT3gehCSRieKKEEkIogoQj3pcChx7%2Bx99%2FH%2F7H4o4RoohCCjNyaOOCAIb4YX8xJriCggDqGGGRIloo4oYaVgjjiBnGmGWSCdqIoopbhljhg1yWaeYKQJZwwoEjjHBDAgmoYcQGfRVg550DFJCnnQP0ead88tkJ56AJCEoonAUMpOiddiraAKOQRsrooZQOmqiji17qqKaLYurpp54WUGilk3IKaqiMNuAnpIiuKiqi%2F68W2uhAktYKKa13nqorpolemmukj9p6a6278kqqsH8%2B8CcEyhZwwAGMPgCBnQI1sIYRIDQAQbGbcmqqow%2BAGm64npKL6bjncituA%2BiiO1C77MYL77i5BtuXueqCqum37ALq77%2F%2B5vvuv%2F0GPLDBBhfbLr6KAkxwwacCKnC6706M67f1OhtBBBAcwOwADjgwA7tygJGEDjrkoPLKKvuwsg8w5wCzD0MMMXMOKKO8MhApsywzD0AHLfTQQc88NMxBDwHE0kwD4fPLM0dtdNRAU0200DPXXDPNWnettNc8s8yz1DPPYHYOVZNt9NE%2B6KB0z27rvDLKRa9dddBo86C21f5D5%2B3D1XjnMMPKgO8NeN12H6643joA0TXPTXstueQ%2FDPFDD5gXofkPlQuRgwQSwOGGGmecAcbpqIOxhRVWSCEF663DLrsVW9Re%2B%2By45667FVTsrvvrwPsu%2FPC2F7867Lfvfjztt9vOfPLD0%2F588dFXb73yy%2Bee%2FfXcd8%2B98eCHD%2F4ZcMxRRx1zwHHGEkQwQQcj8O%2FRRx8vMOBAHX2Iov%2F%2B%2FPfv%2F%2F8ADKAAB0jAAhrwgAhMoAIXyMAGOvCBEIygAxmhhyUUgQ3wy%2BALDKCAOeRPgiAMoQhHSMISmvCEKEzh%2Fxixhh6IIYOMaIEBDOBBFdrwhjjMoQ53yEMJsrAK7%2F6DXwsIQIAa9vCISEyiEpfIRAMyogtV2AP8XkBEIzbxiljMoha3%2BMA9ZGENU1RABz%2FIxTKa8YxoZCIZjBDGMYLijXCMoxznSMc62vGOeMyjHvfIxz768Y%2BADKQgB0nIQhrykG%2FcQxQZ8QIxehCRkIykJCdJyUpa8pKYzCQoGMGFNjByho%2FUpChHScpSmvKUqBRkF7gQQ0f2IZWwjKUsZ0nLWuIxCzuIIQdDacte%2BvKXwAwmIHGpSzcK85jITKYyY0nMFrhymdCMpjSnWchmPpOa2MymNrNpTWNu85vgDGcvs9CDVnpTnOhMpzozmQUimNODnYinPOdJz3ra8574zP%2BnPvfJz376858ADahAB0rQghr0oAhNqDzJ%2Bc4%2BKPShEI2oRCdK0Ypa9KIYjWc34ZnRjnr0oyANqUhHStCNOpSkKE2pSlfK0pbmk6HOHKNLZ0rTmtr0piUtZyNlitOe%2BvSnQE0pQ3fK0aAa9ahITWpBh%2BpKpTr1qVCFKlN5GtWqWvWqM4UpKE%2BK1a569asZbacuachVsJr1rGgtqTtlSFZNuPWtcI2rXOdK17ra9a54zate98rXvvr1r4ANrGAHS9jCGvatYmWrBw%2FL2MY69rGQjaxkJ0vZyro1C0Uo5mIty9nOevazoA2taAOLWc32YbSoTa1qV8va1t61CkdoqGv%2BZ0vb2tr2toGFrWxxy9ve%2Bva3qdUtUU8L3OIa97jIHaxwXZnc5jr3uc9d7hihS93qWre20t3sdbfL3e5aVrcx9SAlxkve8pr3vOhNr3rXy972uve98I2vfOdL3%2Fra9774za9%2B90veKhQBEuHVA38HTOACG%2FjACE6wghfM4PFC4QgAdqSAG0zhClv4whjOsIbt%2B%2BAIj3HDIA6xiEdM4hKztwpIgIQKXNmISbj4xTCOsYxnTOMa2%2FjGOM6xjnfM4x77%2BMdADrKQh0zkIhf5EpagxBVSTNQ88OHJUI6ylKdM5Spb%2BcpYzrKWt8zlLnv5y2AOs5jHTOYym%2FnMUH5Cilv%2BsIAF5CEPf4iznOdM5zrb%2Bc54zrOe98znPvv5z4AOtKAHTehCG%2FrQiE60nO0CCRsgwM1%2BAISkJ03pSlv60pjOtKY3zelOe%2FrToA61qEdN6lKb%2BtSoTrWqJ22FJEBiBgPoYKRXTeta2%2FrWuM61rnfN614DwgpLgAQMBCDrQBj72MhOtrKXzexmO%2FvZ0I62tKdN7Wpb%2B9rYzra2t83tbnv72A2BxE7T4AdBmPvc6E63utfN7na7%2B93wjre8503vetv73vjOt773ze9%2B%2B%2FvcRoiCh8n974Ib%2FOAIT7jCF87whjvc3EaA8LjzMIiKW%2FziGM%2B4xjfO8Y57%2FOMgD7nIR07%2F8pKb%2FOQoT7nKV87ylls8CRIXYxryQIia2%2FzmOM%2B5znfO8577%2FOdAD7rQh070ohv96EhPutKXzvSm2zzi4pY5zZ1O9apb%2FepYz7rWt871rhPCCEyWeiHGTvaym%2F3saE%2B72tfO9ra7%2Fe1wj7vc5073utv97njPu973TnawR10BMzeE4AdP%2BMIb%2FvCIT7ziF8%2F4xjv%2B8ZCPvOQnT%2FnKW%2F7ymM%2B85gcP9Q12MA%2BbD73oR0%2F60pv%2B9KhPveoFnxAAgzIPh4i97GdP%2B9rb%2Fva4z73ud8%2F73vv%2B98APvvCHT%2FziG%2F%2F4yE%2B%2B7I3ABNfTMA%2BIiL70p0%2F96lv%2F%2BtjPvva3z%2F3u%2Fnv%2F%2B%2BAPv%2FjHT%2F7ym%2F%2F86E%2B%2F9Jn%2F9znkIRHwj7%2F850%2F%2F%2Btv%2F%2FvjPv%2F73z%2F%2F%2B%2B%2F%2F%2FABiAAjiABFiABniACBh%2FftdICOB%2BivCAEBiBEjiBFFiBFniBGJiBGriBHNiBHviBIBiCIjiCJFiCJniCEAhzABYy7rcILviCMBiDMjiDNFiDNniDOJiDOriDPNiDPviDQBiEQjiERFiERviCKtgCDtCAeXCETviEUBiFUjiFVFiFVniFLpgEUKBibeZ%2BjvCFYBiGYjiGZFiGZniGaJiGariGbNiGbviGcBiHcjiHdFiHdniHYPgDUBAJKvB6j%2FCHgBiIgjiIhFiIhniIiJiI%2F4q4iIzYiI74iJAYiZI4iZRYiZZ4iYAoBcHGAyEDB1SgAgAQiqI4iqRYiqZ4iqiYiqq4iqzYiq74irAYi7I4i7RYi7Z4i7iIix1gA1kQASk2AwLQAHjQBSeQi8Z4jMiYjMq4jMzYjM74jKi4i13wASmWAwMgjGggAtC4jdzYjd74jeAYjrlIAjfgBRmgBJDgA9qCB2WgjeL4jvAYj%2FI4j%2FTIiiJQA1iQAVMACT8gLXZABu5YjwI5kARZkAZJixsQA1dQAQLnAwnwAHZQBiNwkBRZkRZ5kfOYkAspcDdQABAQkROJkSI5kiRZkre4ATRwBR8gcDXgkSBpkjAZkzI5k%2F%2F3yAUfsI80wAASgAfZOJM%2B%2BZNAWZAj0ANecJOvNgA72ZNBuZRM2ZTcOJRFuY868AAMwJMo4JRYmZVaeYscIAMqmWJTWZVkcJVbWZZmeZameAEKuZKQMJXCOJZoGZdyqZVqqZINuS14AJdzuZd86ZMXgAM2KXA7gJdlQJZ9eZiIiZEbsAM2mWKD%2BZaGmZiSOZkCuZhXgAGOuS3%2FGJmU2ZmeCY4b4JUVkJkNsJmfeZqouY0XIJoC9wN98Y8BmZqyOZu5CAIxEJjp%2BJpKSZu82ZuxaJt2mZsPgAdrEJu%2BeZzIaYq2iZs%2B0BfEaZzJGZ3IqZFs2ZzDWZzSmZ3JqZEY0JD%2Fzomd2hmevAmc3RkJ1mkHagCd4rmenUmeU2Ce8mEHu8me9EmZ7mme7FIHYxAC9dmfk8kBMeAF5amOfrGf%2Fnmgh9mVRRkF%2BFmg%2FImgECqXobmgkfAD%2BUkGDxqhGlqWCrqSFXqhGbqhIuqUAEqhBKqfITqiKgqUtimgDHqiBrqiMvqTLZoBL5qfMTqjOgqTCUmhNCAfepCjOzqkIjmhHvqjDxCkKUqkTHqQG1ADPgqkQtqkVEqQTxqlSTqlVbqlGQmlRxoueKClXDqm4nil1BgJPyqMYkqmbNqNZsoEaAqma9qmdOqMZsqgaaqkdbqn3Gik7%2BkD8lEHGMqnhGqnNaCS%2F3AKqH7RjoXaqMr4pJeZqIHKqI5aqbm4mpEKn4uqnpbaqa%2BIqQM6qZzqqaSqiqD6oqJaqqrqihdwqB6qqHVAqas6q6jYqpkKq7JKq7o6ipCKmXGapAC5q8IqipD6AXCKpHoQrMMqrMV6rECqrMuqq72KBL%2Bal6MarZ36pFXgq0iKB19wrdhaqdNard8arrRqmRjgrMJYrua6qugKpyOzruDaroTKATuAqJFQLYLqAfSqqnV5k%2Fk6ELHKr%2F1KqnWZrgHbAPtasAarkAirr2RAsAxrqdwJpxArsRPrqKGZqRebsZYKqhYrsBHrsZW6mlpgrAm7sCTbqKtZlCFbmuy6sv%2BEOgEKmQEvawcxK7N7SrOXSa3Vogc5q7N0agEOC5bycQfQKrRDW7Rt%2BazzqrRMSrQ927TASgJQW6dS66tTWbVXS6c8251Um6xP27U6%2BrUNKaVWS7ZkSp4phqxzqrZDSp4Cl6ZhuqRwy6Ry%2B6t6erdbmrdua7d8u6PciafSsreB26SDG6cQYLiHS6TcSa0zIKWA27gr%2Brjm6ZxqMLmUO6IJ2ZiXO5yZu7mOe5u%2Bap14ELqiK7gxoAUIa7qom7ozapusm6jscrqaC7sQ2qKtW7uvi7sq2qMoS6C267syCry0C7q3S7z9abyaKqjJq7z0Camj2ZYgCr2ce6ijGbB%2BMaj%2F1ruh4yoQftG73Yug38su6Pm846ud5QuR4pu%2B%2FWmrZwq%2BddC%2B7kuftqq11Vu%2FB2oBh4qZ1Mu%2B6Ku%2F0xkDWOC%2F4Hu%2BAuyfPWrA5ku%2FCay%2BAUqN%2F4vADxy9AcrAAFzBFlzAYLmODqzB26mQ0ysQEDC8ICyeGjnC67gGAXzCqZmQHBy23OvC2QnD3PqsLUzDn2nDbRsujKvDAxzDefq2QCybC9zDDfDDRdybwEutQ5zDSyyZTay3MxzFTHzBPQysUGzFh5nCEAarVczFsjkB9zi1YLzFYjyXE8AB%2FUutZ5zGvLmxpRuoYQzHp3mwbkzHaGzHaInHzVvHfNyZfvzGgYya%2F3Kcx9u7x4W8lZYbuUmKBsW4yJ%2FJtvkqpSUgyZNctNVKxJg8l8CZAZAruZ3cnjUbylmqyKPMlJ%2FsxOFiB5ycyme5ynFammCAyrDMogQMyrPsyrZ8yz5pm%2FnIysJYy76MmBqZAU0QCY6sxMUcl5%2BczMsMyM0cy7mczG47ttPclC36AdYspdiczUsJAl4KzU4Lzp4cwaycpd9szjQawd08zL3MziIpuyi7tc4rz2gpzldgs9p7z%2Fhslvp8pCIbz%2F9ckeIcmGiavwWtlQHtxAq90FhJyfJrBgQN0QWZuDSQnxRt0VkJAl5ZnjTQF3Ww0RztlPpcno7MyyVt0hHMoCn9yv8rTZK669LxCdMxPc%2BkS9MQadM3fZHLidI1XdE9HY%2FbbMrMPNQmOcXLzNNI7aTorMyi3NQzCcM2qrdMLdVWGsHOOpxXjdUCuc3kPJzE7NUwCdZQLdZCTdbdaNaRC89qbZJmTbdj%2FdYjuc3vKddpTdfPaNezXLd6XdcBqo%2Bfi6J%2FjdPm%2BKci3dWFHY4g4AKHPdiKvdjfuAErkI%2BI7aCSbZGUbdmf%2B495ndnISNn7fNevKc2gTY%2BiLdjN%2BZGmfdrymNqJWtqf7dq4uAEscKv%2B%2BMG0DY8aoMnn2dq7LY4akJKlm9izHdy0ONw9C9nHjdyyqAH9G9uJ7Nz1CN24Pd3UPY%2F%2Fyl3cmJ3d8tjby92cDSAHY6AB3i2PX%2BvGieLX5w2PNLut6p3Ekd3eufjecyzfzU3fqmjfeYzf%2Bi2O%2FA2f%2Fv3f4Njb8C3gR03gzjjc2xrbA67g3bjdDs7eEM6Nyo2yIY3dFb6Ntm2OxyrSwL3hx6gBLCCg8GrcIr6NJG7iaAri%2BZ3iALDiCJvh%2FgzjzagBMODhv1rjNr6MOK7jNB7iPV6LP87PND7fQ66KRe7EiY2xST7iKWnkKP7kyajcUr7TL57iF%2F7hrJ3lIq4BOoCvId3lVF7lYQ6wGa7SZQ7lKkna3b3muWjl76kDTQ7nxsjgGDDnIrvOdo6KFZuwsNnntU0D%2F6yLqhCZq4I%2Bi4m7tYGe6LXYqwyaA%2BYr5I7u5%2FeKsCMDkSNb6Yp%2B6ccqsk7O6ax6qPwMsXwu6gBgAV7pofK76aj%2BqQ4rcK0e6q9uqrFOvQrr6rXOinLMoLO%2B6664sVWNpCoL7KuolgiNpDh76qJOtDa51XcQtMZ%2BijyL4a0s7dNeiuldyVqc7aqYtT7LLneA5IkO7pEg6afs7alo7pK%2BuJQO7H%2Fe7smatupuitQZsu5O7%2FVOiouuLfO%2B7%2FYe69r77wDP7wIv6Q0w7vpe8ACQtyRM8Awfig5fuO%2B%2B6xPv7l6%2B4f2O8RFPrJpMwp7d8aFouSCv296et6ttByws8g2%2Flv%2Fqjbwsn7ium%2FEVLvOYS%2FMQ3rkDevMxf5uvqps4r%2BBG%2BqKyHfMyIKAvz%2BMMH5oczNws35ULmWKE3PHTmo7%2BiAZBT%2BBPGsxWX8Imn%2B1bD8q5%2BZFYH%2FP4qMvnWfYiP67WqfQFb7m%2FnfX%2F%2FbhdL59yr98JybpSLx88eff0fcRW%2F8h%2B396Ar6h6oPZUj8WBf%2FiDf94pvPeC3%2FNRv%2FiIH%2FE6n8WM3%2FNcANJ9kflrT7pSbycJru6Xn5sFMPreXviJgvpg%2F9TWmayN792de6YZ7vkdj8eQMOZ9L%2FkYAGFjHvIdv8arHvrbuwEiL%2FxmHNRP75W6TOzkLugc4AL7jMhqTvXSP8f%2BWB7z18%2Fk2f%2F5y92tz9%2FncF%2B4lb%2F0mvyji4sGl%2Bz92M%2F60265f8v7Rh3%2Bdg7%2Fchr72Q2ctN%2FKcx3x%2Bg8QTCL5eNDADpgQABQuZNjQ4UOIESVOpFjR4kWMGTVu5NjR40eQIUNuiHEFg0AaDx7gGZNQ5EuYMWXOpFnT5k2cEEmaRBJphko9LXMOJVrU6FGkSUXuPOnzAQQ9alwqpVrV6lWsWSmCiKHlg0CCD4JO1VrW7Fm0aTly9fI1UsqVZMiqpVvX7l2qIGi0FTijgFi5eAUPJlw4pN62Pf0CnmvY8WPIhdl%2B6AnXjtDImTVvPssVS4YpA1VebszZ9GnUNtmCFv3%2BgHRq2LFlg0ScAWXBOphn7%2Bbd2yGIHV5sv8Wt2%2Fdx5KmBf65cvHRy6NEly2BOvEHu59K1b08LgjqG5g%2BwcydfHq33z02Iizdu3v17pOhZ%2F2SfHf59%2FDHlh6Y%2FPv9%2FAGGSTz368EAoQAQTXCuGz%2FhTyUD7FJRwQgBWc3Cl9ijUcMLJLmQpwg1DvK9Dp8TKUEQU8SNJuAvHSvHF%2F0j6TIn1giIBRhzhm4xGuGzM8cfydizRRSCLlM7CEj80csnkJiPwwROZlFK5GNpSz7Iop9RyMxLDem1LME9DMiz%2FwjQzszH%2FKvNMNg1Ls74245SsStbIzFJOPM0CYYUGW1szT0D%2Fz9qAzzoTgDNQRM3SYIUrWLvB0D8TlZSqRRsNzQdI75x005yYAms0TTkVlSamesIUAjvQAHFUVl%2FSoCTwInkU1cBatdWmV0361LVQb%2FV1Iw1oaDS8L381NqRgG72N11WPdVaiYLUYzsten7XWoWinBbXZa7sFIFtTcTvQW3KhFTaDygq4btxy222IAliXLdZdeieId7156W3XXl1by1ffcoVtilpuAb412YG3NdjdZIfDsuCFWW2YCUkIjrjcbCl%2B%2BGJyX5UWJXUj5fhYj9H1KeQxQBi5Ww1g%2BPgtNatdmdOWX4ZL5JkPdtlhlXDOuVWPP7gyZoh%2FDjRat2gg2miS%2FmnwCuRDmfZ1YpijltpWhJeto9arbd2ghn5TorXortvcYIewn7KD67JH%2FdqkKNbbmuy2zXwbg7hvlrlus2moAu%2BKC5Jjb77PJOnvuAm6ju3CJT0cbz%2FVEKFxTrmCeyAIXCNjcson1QvuwHnlvPNEP4c8pesIJ31K0%2FN2bvXSBXadWdgRvXv2f2s3G%2BzTQd1Ad0DP7jcsPBgHnk3hYw1Lj82Px3MDGrhQ%2FsHmnY8z1%2Bmttt5M7MOrowsPtm%2Bz%2B6q%2FD1%2F8M8lXWnv0tWyZp6qLH739Ld9vav2o5qd%2FSg1Y0LViNanhfPtzHwu0cL%2B%2F4EEqBKyfAREoljXQjYET6t8B%2FqGWvwnyz4HLwmAGmUQSCxKHAfLz4AerdL8HjHAM%2BithjjyGQhWysIUw6t%2F%2FlNaAoMhwhimqIQZCc0Mi7dCFLmuKXxqgJCEOUTi3OaLqkvifV7Xlh0Bx4hPxE8UPTNFEErTie7CoRQh18UVR9OF6wihGFLXMC2WkQQNoh0YRRZE1bXwjHDf0RXxV0Y7kwaMOFLZHDckxNH7EEBcBKZ0X%2FtCNxTPkIaFjvx%2F%2BRQ%2BqciQFiRhJsVCykgoq2RQksT47LHCTCULS%2BuogylEGqJRqMl4qR9SVpPWsla58DwhjyT5aerEkPHsAHPSYS97k6pa%2BbCQwY2OBXS6LmMbEDzLT%2FsYAXw6Qme5xZqxSAs0x%2FG6a76lmeJa5TWrCypu%2FBCdq1KeSb5aTj%2BJcDxzYpc7tvLA5DXBnMeGJpr1YswENcEMXtHlP7dSmJzpwYz0Bup3JoKQBEIgDOQ8amRVl0ScLbeiNHhqdFc3HjRW9KEbpNEh1NdSeHSUMkgjaSzBIk6S9QVIOGPCAhqp0pbvJaGhcisuZxqamJfJZTlGzAf8NZwb77KlPTQNUZUkiB0R1qFHvUsGvKJWpI3WqWqCq0NRRtapoqZlbTlqHd27VnC6L6lfBJ9bYXFUSOghZFjSAVtj0MFwFgIMRKADX1MhTVgkogBuMgNe8wpJifinAGn4A%2F1hzClYShDUsYk8TNI09oABqOKxjOWO%2FKGBCaZOtrGU1g1lMDJWznt0MZhfbgNGSNjP2G%2BwABkBZ1a42Bn9DwmJdC9vYQuZVfzvCWhvAANzm1jHY6y1BgNtZ4RaGuIFrQHCTW1JYFbcgavDBc90UXeZS17pzOqB0m1vd7Q4mBF0BzyehpNXw3oRqFkvvU88VLoM0tb05oRpckDhfujQsPPfFb1r06y%2F59rcmyaKMaNaFXgHDJFcmA2WAEyyTc9bxwWaJAROyl7sJW4VfCZNwhrGy4XB12MNWIR97R4wV7MnLwSf%2BCPa0iGEWH8XFeURwjDWy4L4szcZVqZnJZjAA9v6obMeU2hnUijpk9cJAWXJbMZIxAlm5zdLJOIGyKaU8ZVw5LWk6xnJR%2FmvKJnd5IvVFWY3FDJGsle%2FKZ46JBnSwZKWNjc1DcTOc1bbmOYvkcxm4Us%2FCnOeG7NmTYDYzoBXiYgA2YHCFNrTlMKAeH6hLDng2tEcc3WfxVK%2FSM5mxlzS9af0IzJMmBrWARG2dI5f6xueKZFZVrZ8385nGr1Ywq2dNa5EgbIrxZTSg68xhRuJazzTAQvaCLWzaCCxctNIhsp98Lzv1Os8pto4cwursG%2B9SMWXGtkcWvG0Rd%2Fsi9lMM9aQ9Z9ZGggdADuW52VzBk0hi3eJBpbgzAm%2BK6f%2BA3fW297g3ONGV8LvfFcH3kCQ38Hv%2Fmz5RKQHCn71GJvLX4WOmU2QLAOOJN0QDLrCgeZvo7jMXHHUSzzia%2F31DkpccW0TMMQ7%2FvOmaFVFdQVQ5mqt0S5rXHFs312LOdc4QPNIgc3q49s8PfcIpourllQ76QjFec0G%2BxelLN3TQ1UZ1X%2FM8En5UOsjF3MenpNzondy6G5nn9S73WJGMMfpDYo5JBaIdy1w54KD%2F0u62%2F6Yrc7y7wNtOd4laWe5TrjIrB%2B9kYS5r0XnXeEluKVLGAz2Z64F85I%2B%2B5KHScwxvtfy32DnUXo5Bpm0nH%2Bhj2nnPw48%2Blbd8hFkf%2BQhHE%2FX%2Bem0jPVM6e%2FJWZp%2FuHL3REaPPB%2FTz8EgOwV4cVtAuDH%2FIiEkaRVeI%2Boj2xfkWtfxOTT8G6kd%2BRWzcaNF9%2F9Gyw9T7P1%2BNQmGK9TwjqT%2Fon7Mty%2B3qzu%2FENh5PdcaROn9C1n%2FiSC3wV9nPZv7TPfEYP52zpXxzI7BSvh3bACUrKwQkQKjzn%2F5DwCzovZ8jt7KjpyS4q87DQIIqLOSCvQYcLNRqLNy7gqiCgX0ywQ4cwdNKrRZEwSnAhA90LtiDlRkULRtkvBSzrdcaAtRLPcoIrdsCwhMsrx8DLiPsQHGyLSUMwuXKAQf4riB0tN7igekCr86zwuzSQsvjQsXRLtT%2FA0OVEMMtzD0DM8MvJKKB2ic1FEGesC1%2BCkEeVDIkBDI4oMO8AwE7rK0f6yU9%2FLsm%2FMM8DMLxOqDaWh83CMTvsyE3ekPG24kPyCw6gsS8sxfE0ay%2FsMS2u4DZwoAl%2BKRH9MLIE4EeaItQrERSZDxTbIvMqsEgCMLbwQQfQC01iEXU44DgmERatEVG%2FLkNkAG40SzJKkTUu4AaWKMoMK8BMMb4%2B7yCcMbqc7wlcAp6wsVnRMFQpA84wMbqkwGvWMafuEZZrIEDyqyfaEZv1D5zvAB0fAB1lEVYoUR43MG8E4EY4AJeTInX%2BkWdczTXGQC%2FksfLQZ2BHMN8xBtiFMi%2F%2F0JIfQxINWjIM3zIhbTHtsNHiuRHizQ6jNxHN%2FTHmsNIDDgCqXuAjfw5DkjIuCGkk9S5lJSeVyxDkFS5l1RIlpzJkqvJmDTJdWQ8naTBMuzJvHtJXjwpTuTIZNzHv3CDJfzCpJxBRWzKyAOBp%2FykpZRKxvMOKbLK4MNJ%2B%2BM5rlxEedxKRfTK%2FeM5TezKscyitBRL6EPLG3LLM4Q4WlQJufxCGeCLulRL1BOBpGQCWlxKs3Q4fEwMTZzDKrw5wIxLrNzDE1pMdWHKxFwjJDhMyXxL4UjEqwxCXRSDD1iCwETMXNwBzwTNSJtDzrM8ESDNzwzNuyxF1jyCwOTLzltNz%2F%2FsrbIMQlO8zbYcTIQzgR64TasUzc4zgSJggw%2FAzcj0zYEzzjf4ACJgrtdkvBVggufsgdCZzrxjFDr4ABwYTu00ugngTu%2B0yr5iTnsbzyugAxP4zs0Kz58bTyxgz%2B9UHPjUOXvxAjxoz7okzsizlzDYA%2F6sRRA8xhUQAwHFgUw4qfusOQuQgTIQ0BhY0BVET3GzANLczxjoTxb8T9IUUBnoxeay0G6zFwRtTwqFwcjzxBPFARr0ReiTgRMlgkwgrKP8x%2BBkzyjYBBV8ADQgUWy7ACJgAzEwATTgBKF7AMNKzT1EgSVggyX4ADz4BKGjwi80gTBYgxUoAUag0gIoADT%2F8AEmFU8Q0IEw%2BIEUAANK%2BIQfgAAIIIMf4EDfmAA6nYCFkFOlsFOQwFOLqFM0G1OGoAAK8NNA1QA%2BfQhBTVRFTdQJGFRH1QANaFRJHdQ6pVMLoABIrdRK1QALsFM6hVRQBdVP5VRStQBOtQBUTVUL2IANUFVVnYBVvQBX7dRU%2FR0LAIENAAEQmAANKNMu0IESAIMuDYU4WwMjQIEQCIENSNZk1VVdDQERiFYRSFZpZdZoBQForVYR8ABu9QBWZVVmZVUPCIFxZVZzzVVsNVdqldZrRddv3QB2lVYTmFcUMAER4AARGIFoJddu7dZ1jdYSiFd2RQGCZdcSKIETSNgT%2FwhYaT1YEyBYFDhYhEXYhD3YhIVYjI3YEkCBFOhYjyXYj%2BXYFMDYjgVZjz3ZkBXZEzDZjIXYlDVZFkBZj2UBmk0BmqVZkGWBnG1ZnkWBFViBjP1ZoR3ZkSXYFWCBo%2F3ZjhVapm1ap3Xam41apG3am12BGNiBGtiBHTjaGXCCJAABH2CEURgFYj2AwjICGmCBGVBbGqCBGYABuIWBGJjbuW1bu73ZGUhbFoABqbVbv50BwM1btw1cwSXcuIUBv01cxU3cGsharM3aHugBIpjcHtDayn1cv%2FUBzfWBHfgBzyUCz%2FVcrd2BySUCIzAC0C3d0j1dI%2FjcH1DdJYhd1k0C1P9VXda9XdpFXSOIXd693SXI3dPlXd6lXeEt3iW4Xd8V3t29XSdoXuSd3SQwXuXd3eMN3ue93uuN3SLY3uKNXtml3iUogvAN3u%2BV3uIVX%2FE93iIwgvU13fXdXvgVXid4Ai3ogi8Igy5Ygh8Agx9omT4IhU8YBVEQugDwq%2BbNAgRO4CyogirIAi3QAgZ%2B4C54YC1QYASm4ApG4Al%2BYAvuYA%2F%2BYAZWYAzuAhIm4REmYS%2FQAi8IAzEQgzB4YS%2BI4RKeYfv9Ahv%2BAjLIYR0mgxfu4TAggzIoAx8eYiJ%2B4RwO4iDeYSLO4R5mYiPeYR5u4ij%2B4SLugiLGXxrO4hKuXy3eYAxTzuAvpuAJXmAHDmEEroLmfYInaF42doIqUOM1ZmM4nmMGZmMGvuM7hmM3ZmA1xmM%2F5uM5juM1ll8n4F04jmArLoM1YIMyWGMYGIAf6NKxFQVRCAgAOw%3D%3D";
$("div.mod_comm").css('background', 'url(' + CHAT_BG_IMAGE + ')');
$("#tr_presetBox").draggable({stop: function( event, ui ) {
presetPosition = $("#tr_presetBox").position();
savePresetPosition();
} });
$("#tr_guardBox").draggable({stop: function( event, ui ) {
guardPosition = $("#tr_guardBox").position();
saveGuardPosition();
} });
readGuardPosition();
if (!guardPosition)
resetGuardWidget();
else
{
$('#tr_guardBox').css({
"left": guardPosition.left + "px",
"top": guardPosition.top + "px"});
}
readPresetPosition();
if (!presetPosition)
resetPresetWidget();
else
{
$('#tr_presetBox').css({
"left": presetPosition.left + "px",
"top": presetPosition.top + "px"});
}
drawGuardWidget();
// hook into citysel_click();
var cityselMod = new CalterUwFunc("citysel_click",[['cm.PrestigeCityView.render()','cm.PrestigeCityView.render();tr_cityChanged();']]);
unsafeWindow.tr_cityChanged = drawGuardWidget;
cityselMod.setEnable(true);
$('#tr_presetBox').bind('mousedown', function(e) {
if (e.which == 3) {
resetPresetWidget();
return false;
}
});
$('#tr_guardBox').bind('mousedown', function(e) {
if (e.which == 3) {
resetGuardWidget();
return false;
}
});
}
function drawGuardWidget() {
// color the outline based on the current city
$("li.guardbutton").removeClass("active");
var cityId = unsafeWindow.currentcityid;
var y_offset = {
wood: " 47% ",
ore: " 72.5% ",
food: " 59.5% ",
stone: " 85% "
};
var x_offset = {
plate: 20,
junior: 134,
teenager: 248,
adult: 362,
adult2: 476,
adult3: 590
};
var x_by_level = {
0: x_offset.plate,
1: x_offset.junior,
2: x_offset.junior,
3: x_offset.junior,
4: x_offset.teenager,
5: x_offset.teenager,
6: x_offset.adult,
7: x_offset.adult,
8: x_offset.adult,
9: x_offset.adult,
10: x_offset.adult2,
11: x_offset.adult3,
12: x_offset.adult3,
13: x_offset.adult3,
14: x_offset.adult3,
15: x_offset.adult3
};
for (c in unsafeWindow.seed.guardian)
{
if (unsafeWindow.seed.guardian[c].cityId == cityId)
{
var type = unsafeWindow.seed.guardian[c].type;
$("li.guardbutton." + type).addClass("active");
for (t in y_offset)
{
var level = unsafeWindow.seed.guardian[c].cityGuardianLevels[t];
level = level ? level : 0;
var bg_offset = x_by_level[level]/776*100 + "% " + y_offset[t];
$("li.guardbutton." + t).css('background-position', bg_offset);
if (level)
$("li.guardbutton." + t).css('background-color', 'white');
else
$("li.guardbutton." + t).css('background-color', 'darkgray');
}
}
}
}
function resetGuardWidget() {
$("#tr_guardBox").position( {
my: "right bottom",
at: "right top-6",
of: "div.mod_comm",
collision: "fit"
});
delete guardPosition;
guardPosition = null;
saveGuardPosition();
}
function resetPresetWidget() {
$("#tr_presetBox").position( {
my: "left bottom",
at: "left+3 top",
of: "div.mod_comm",
collision: "fit"
});
delete presetPosition;
presetPosition = null;
savePresetPosition();
}
function updateTimerDisp () {
var t = Tabs.upgrader;
var timeUntilDone = 0;
if (t.repairEnd != 0)
{
timeUntilDone = t.repairEnd - unixTime();
}
if (timeUntilDone > 0)
{
$(document.querySelector('#trtimerdisp')).html("<span id='trhammer'></span> " + rectime(timeUntilDone))
.css('text-align', 'left')
.css('width', '100px');
}
else
{
$(document.querySelector('#trtimerdisp')).html("<span id='trhammer'></span> Done").css('width', '100px');
}
}
function rectime(secs) {
var min = Math.floor((secs)/60);
var sec = Math.ceil(secs - (min * 60));
if (sec < 10) {sec = "0" + sec;}
return min + ':' + sec;
}
var withAnim = null;
if (unsafeWindow.cm && unsafeWindow.cm.ThronePanelView) withAnim = unsafeWindow.cm.ThronePanelView.statusAnim;
function noAnim(result) {
if (result == "success")
{
var item_name = $("#thronePanelName").html();
var attempt_type = $("div.thronePanelContainer").find("li.selected").html();
var msg = "Manual ";
if (attempt_type)
msg += attempt_type;
else
msg += "upgrade/enhance";
msg += " successful.";
if (item_name) msg += " Item: " + item_name;
trSuccessLog(msg);
if (withAnim) withAnim(result);
}
$("div.thronePanelItemContainer").append("<div>" + result + "</div>");
}
function disableAnimation(disable) {
if (disable) {
// override the success failure animations
CM.ThronePanelView.statusAnim = noAnim;
} else {
if (withAnim) CM.ThronePanelView.statusAnim = withAnim;
}
}
function installHandlerFunctions() {
var oldR = unsafeWindow.cm.ThroneView.renderInventory;
var oldOpen = unsafeWindow.cm.ThroneView.openThrone;
var ri2 = function(l) {
oldR(l);
$("ul#throneInventoryList > li > div").removeClass('blueBorder');
$("ul#throneInventoryList > li > div").removeClass('yellowBorder');
for (ii in queueData.list) {
var list_item = queueData.list[ii];
if (!list_item) continue;
if (list_item.status != "complete") {
var id = list_item.item;
if (list_item.action == "upgrade") $("div#throneInventoryItem" + id).addClass('blueBorder');
if (list_item.action == "enhance") $("div#throneInventoryItem" + id).addClass('yellowBorder');
}
}
for (ii in presetData.taggedItems) {
$("div#throneInventoryItem" + ii).prepend("<div class='greenBorder'></div>");
}
$('div[id^="throneInventoryItem"]').bind("contextmenu",function(e){
e.preventDefault();
var theId = $(this).attr("id").split("throneInventoryItem")[1];
unsafeWindow.cm.ContextualMenuThrone.renderMenu( $(this), unsafeWindow.kocThroneItems[theId]);
return false;
});
};
var open2 = function(F) {
oldOpen(F);
$('div[id^="throneInventoryItem"]').bind("contextmenu",function(e){
e.preventDefault();
var theId = $(this).attr("id").split("throneInventoryItem")[1];
unsafeWindow.cm.ContextualMenuThrone.renderMenu( $(this), unsafeWindow.kocThroneItems[theId]);
return false;
});
// allow TR items to be dragged around
$("#advisorContainer").draggable();
$("#heroContainer").draggable();
$("#chairContainer").draggable();
$("#candelabrumContainer").draggable();
$("#tableContainer").draggable();
$("#windowContainer").draggable();
$("#bannerContainer").draggable();
$("#trophyContainer").draggable();
$("#statueContainer").draggable();
$("#petContainer").draggable();
Tabs.throneSalvage.updateTRTab();
Tabs.upgrader.updateTRTab();
//Tabs.upgrader.updateTRSelect();
$("ul#throneInventoryList > li > div").removeClass('blueBorder');
$("ul#throneInventoryList > li > div").removeClass('yellowBorder');
//$("div#throneMainContainer div#heroContainer").css('left', '450px');
//$("div#throneMainContainer div#advisorContainer").css('left', '550px');
//$("div#throneMainContainer div#advisorContainer").css('top', '220px');
//$("div#throneMainContainer div#petContainer").css('left', '445px');
//$("div#throneMainContainer div#petContainer").css('top', '345px');
for (ii in queueData.list) {
var list_item = queueData.list[ii];
if (!list_item) continue;
if (list_item.status != "complete") {
var id = list_item.item;
if (list_item.action == "upgrade") $("div#throneInventoryItem" + id).addClass('blueBorder');
if (list_item.action == "enhance") $("div#throneInventoryItem" + id).addClass('yellowBorder');
}
}
for (ii in presetData.taggedItems) {
$("div#throneInventoryItem" + ii).prepend("<div class='greenBorder'></div>");
}
$("ul#throneInventoryList").css('height', '520px');
$("div#throneInventoryContainer").css('height', '520px');
// update the other presets buttons when clicked
$('ul#throneStatList li.active, ul#throneStatList li.selected').click(
function () {
var s = $(this).attr('id').split('throneInventoryPreset')[1];
setPresetWidget(+s);
});
};
unsafeWindow.cm.ThroneView.renderInventory = ri2;
unsafeWindow.cm.ThroneView.openThrone = open2;
// intercept the render menu call for our own uses
// save the location of the old funtion
var oldF = unsafeWindow.cm.ContextualMenuThrone.renderMenu;
var renderMenu2 = function (l, j) {
// call the old one
oldF(l,j);
if (j != null)
{
// create a button to "tag" an item
var btn3 = document.createElement('a');
if ( !presetData.taggedItems[j.id])
{
$(btn3).addClass("buttonv2 h20 brown")
.html("Tag Item")
.css('color', 'white')
.bind("click", function () {
Tabs.organizer.addTagItem(j.id);
$("#contextMenu").remove();})
;
} else {
$(btn3).addClass("buttonv2 h20 brown")
.html("Remove Tag")
.css('color', 'white')
.bind("click", function () {
Tabs.organizer.removeTagItem(j.id);
$("#contextMenu").remove();});
}
$("#contextMenu div.title").after(btn3);
// create a button to set the item to auto-enhance
if (j.quality < 5) {
var btn2 = document.createElement('a');
$(btn2).addClass("buttonv2 h20 green")
.html("Auto Enhance")
.css('color', 'yellow')
.bind("click", function () {
Tabs.upgrader.addEnhanceItem(j.id);
Tabs.upgrader.repaint();
$("#contextMenu").remove();});
$("#contextMenu div.title").after(btn2);
}
// create a button to set the item to auto-update
var btn = document.createElement('a');
$(btn).addClass("buttonv2 h20 green")
.html("Auto Upgrade")
.css('color', 'blue')
.bind("click", function () {
Tabs.upgrader.addUpgradeItem(j.id);
Tabs.upgrader.repaint();
$("#contextMenu").remove();});
$("#contextMenu div.title").after(btn);
// create a button to set the item to auto-update/enhance
if (upgradeData.multiUpgrade)
{
btn = document.createElement('a');
$(btn).addClass("buttonv2 h20 green")
.html("Auto Upgrade/Enhance")
.css('color', 'black')
.bind("click", function () {
Tabs.upgrader.addBothItem(j.id);
Tabs.upgrader.repaint();
$("#contextMenu").remove();});
$("#contextMenu div.title").after(btn);
}
// create a button to copy the stats
btn = document.createElement('a');
$(btn).addClass("buttonv2 h20 blue")
.html("Copy Stats")
.css('color', 'white')
.bind("click", function () {
var cText = $("div#trCardItem" + j.id).find("div.trCard").text();
if (cText) {
window.prompt ("Copy to clipboard: Ctrl+C", cText);
}
$("#contextMenu").remove();
});
$("#contextMenu div.title").after(btn);
// create a button to post the stats
btn = document.createElement('a');
$(btn).addClass("buttonv2 h20 blue")
.html("Post Stats to Chat")
.css('color', 'white')
.bind("click", function () {
var cText = $("div#trCardItem" + j.id).find("div.trCard").text();
if (cText) {
cText = cText.replace("Type", "||Type").replace("Quality","||Quality").replace("Level","||Level")
cText = cText.replace("Might","||Might").replace(/ /g, "||").replace(/\|\|\|\|/g, "||").replace(/\|\|\s*$/, "");
cText = ":::. |" + cText;
var table = cText.split("||");
for (row=1; row<=5; row++) {
table[table.length-6+row] = "Row " + row + ": " + table[table.length-6+row];
}
cText = table.join("||");
sendChat(cText);
}
$("#contextMenu").remove();
});
$("#contextMenu div.title").after(btn);
$(".buttonv2.red").click(function() { $(".mediumModal").css('z-index', 120000);});
if (!j.isBroken) {
// no salvage on first x items
if (upgradeData.salvageSafety) {
var keys =unsafeWindow.Object.keys(unsafeWindow.kocThroneItems);
var v = "" + j.id;
if ( keys.indexOf(v) < upgradeData.numSafety && keys.indexOf(v) > -1) {
$("#contextMenu a:nth-last-child(2)").remove();
}
}
if (upgradeData.noMassSalvage)
{
$("#contextMenu a").last().remove();
}
}
}
};
// hook up our new function
unsafeWindow.cm.ContextualMenuThrone.renderMenu = renderMenu2;
// add some new functionality here ...
var F2 = CM.ThronePanelView.renderPanel;
var renderPanel2 = function(v1, v2) {
F2(v1,v2);
// save off this data ...
Tabs.organizer.panelId = v2.id;
Tabs.organizer.panelType = v1;
Tabs.organizer.panelNextLevel = 2;
// register some callbacks when the buttons are pushed
addPanelCb();
var addClickAction = function ()
{
// add an action to the buttons to switch between upgrade/enhance
var pc = document.querySelector('#thronePanelContainer');
$(pc).children("div.navigation li").click( function (){
// clear the pulldown
unselectToken();
// buttons have been recreated. install action again
addClickAction();
});
}
var checkAstoneLevel = function () {
// check limit
var stones = parseInt(Seed.resources["city" + unsafeWindow.currentcityid]["rec5"][0]);
if (stones < upgradeData.safetyLimit) {
disableUpgradeButton();
}
if ( isNaN(stones)) {
disableUpgradeButton();
}
}
var disableUpgradeButton = function () {
// disable the button
$(document.querySelector('#thronePanelItemRequirementsContainer')).children("a.gemButtonv2").unbind("click");
// change the appearance
var container = document.querySelector('#thronePanelItemRequirementsContainer');
$(container).children("a.gemButtonv2").removeClass('green');
$(container).children("a.gemButtonv2").addClass('gray');
$(container).children("a.gemButtonv2").html("Low A-Stone")
}
var addClickAction2 = function ()
{
// add an action to the buttons to switch between upgrade/enhance
$(document.querySelector('#thronePanelContainer')).children("div.navigation li").click( function (){
// check every time the panel is switched
checkAstoneLevel();
// buttons have been recreated. install action again
addClickAction2();
});
}
if (upgradeData.removeTokens) {
// remove options for tokens
var removeItems = [unsafeWindow.ksoItems[20006].name, // lucky token
unsafeWindow.ksoItems[20007].name, // common master
unsafeWindow.ksoItems[20008].name, // uncommon
unsafeWindow.ksoItems[20009].name, // rare
unsafeWindow.ksoItems[20010].name, // epic
unsafeWindow.ksoItems[20011].name, // wondrous
unsafeWindow.ksoItems[20012].name, // +3 master
unsafeWindow.ksoItems[20013].name, // +5 master
unsafeWindow.ksoItems[20014].name, // +7
unsafeWindow.ksoItems[20015].name, // +9
unsafeWindow.ksoItems[20016].name, // +10
unsafeWindow.ksoItems[20017].name, // +11
unsafeWindow.ksoItems[20018].name, // +12
unsafeWindow.ksoItems[20019].name // super lucky token
];
$(document.querySelector("#buffDropDown")).children("option").each( function() {
if ($.inArray($(this).text(), removeItems) > -1) $(this).remove();
});
}
if (upgradeData.safetyOn)
{
// remove the gem option
var sel = document.getElementById("costDropDown");
sel.remove(1);
// enforce a lower limit on a-stone. Disable button if too low.
// see if we have enough a-stone
checkAstoneLevel();
$(document.querySelector("#thronePanelItemRequirementsContainer")).children( "a.gemButtonv2").click ( function (){
// every time the button is pushed, check the levels
checkAstoneLevel();
});
addClickAction2();
}
function unselectToken() {
// if the user manually selected a buff, leave it alone
if (!buffChanged) {
// set the pull down to nothing when first displayed
$(document.querySelector("#buffDropDown")).val(0);
// set the pull down to nothing when first displayed
$(document.querySelector("#costDropDown")).val(0);
// remove the icon ....
$(document.querySelector("#thronePanelBuffIcon")).removeClass().addClass('icon').addClass('i0');
$(document.querySelector("#thronePanelBuffPrice")).children("span.items").html('');
// install an action to track when a buff is selected
$(document.querySelector("#buffDropDown")).change( function () {
buffChanged = true;
});
// install an action to track when a buff is selected
$(document.querySelector("#costDropDown")).change( function () {
buffChanged = true;
});
// reset once the dialog is closed
$(".throneContainer").children("div.close").click( function () {
buffChanged = false;
});
}
}
// force the buff item selection to be empty
if (upgradeData.buffsOff)
{
// deselect the token
unselectToken();
// add a clck action to set it back to nothing when switching between upgrade/enhance
addClickAction();
}
};
// hook up to the new function
CM.ThronePanelView.renderPanel = renderPanel2;
// override the salvageItem function to allow upgrade to +1 first
var salItemOrig = CM.ThroneController.salvageItem;
var salItemNew = function (item) {
if ( salvageData.upgradeManual )
{
if (item && item.quality <= salvageData.upgradeFirstQual && item.level==0 )
{
var status = Tabs.throneSalvage.deleting;
Tabs.throneSalvage.deleting = true;
Tabs.upgrader.doUpgrade(item.id,true);
Tabs.throneSalvage.deleting = status;
}
}
salItemOrig(item);
};
CM.ThroneController.salvageItem = salItemNew;
// watch the active slot so the TRO keeps up with changes
// This uses Object.watch() which is only defined on Gecko
try {
function updateThrone () {
unsafeWindow.cm.ThroneView.renderThrone();
unsafeWindow.cm.ThroneView.renderStats();
Tabs.organizer.show();
};
// This function watchs the TR active slot.
function slotWatcher(id, oldval, newval) {
try {
setPresetWidget(newval);
setTimeout(updateThrone, 200);
} catch (e) {
logit("error in slot watcher" + e.toString());
};
return newval;
};
// If the preset is changed, update the displays
Seed.throne.multiWatch("activeSlot", slotWatcher);
// some of the seed updates replace the seed.throne value. when this happens reinstall the watcher
Seed.multiWatch("throne", function (id, oldval, newval) {
// register with the seed so we know when the throne object is replaced
try {
// add a new watcher / remove the old one
//
if (oldval.multiUnwatch) oldval.multiUnwatch("activeSlot", slotWatcher);
// if another script create this object, the prototypes won't be defined. If so, add them now
if (!newval.multiWatch) {
newval.multiWatch = Object.prototype.multiWatch;
newval.multiUnwatch = Object.prototype.multiUnwatch;
}
newval.multiWatch("activeSlot", slotWatcher);
} catch (e) { logit("error in multiwatch handler: " + e.toString());}
return newval;
});
} catch (e) {}
}
var buffChanged = false;
function addPanelCb() {
// these elements get rebuilt after every click so they have to reinstall
// themselves ...
$("ul.tabsv2 > li:contains('enhance')").click( function() {Tabs.organizer.panelType = "enhance"; Tabs.organizer.panelNextLevel = 2; addPanelCb();});
$("ul.tabsv2 > li:contains('upgrade')").click( function() {Tabs.organizer.panelType = "upgrade"; Tabs.organizer.panelNextLevel = 2; addPanelCb();});
}
function onUnload (){
upgradeData.activeTab = $( "#tr_main" ).tabs( "option", "active");
upgradeData.sortSelected = $("#trSortList").val();
upgradeData.buffSelected = $("#trSortType").val();
upgradeData.sortInactive = ($("#trSortInactive").attr('checked') == 'checked');
if (!ResetAll) saveUpgradeData();
}
function trMainTab (me){ // right-click on main button resets window
if (me.button == 2){
$( "#tr_dialog" ).dialog( "option", "position",
{my: "left top",
at: "left+15 bottom+5",
of: "#main_engagement_tabs"});
}
}
function attachTab() {
unsafeWindow.hideShow = trHideShow;
unsafeWindow.execSalvage = Tabs.throneSalvage.togglePower;
unsafeWindow.execUpgrade = Tabs.upgrader.togglePower;
unsafeWindow.clickNext = Tabs.organizer.showNext;
var str = unsafeWindow.cm.FETemplates.Throne.mainThrone.replace(
'<li id="throneStatTab" class="inactive"> Stats </li>',
'<li id="throneStatTab" class="inactive"> Stats </li><li id="throneTest" class="inactive" onclick="hideShow()"> Controls </li><li id="trexecupgrade" class="inactive" onclick="execUpgrade()">Upgrade</li><li id="trexecsalvage" class="inactive" onclick="execSalvage()">Salvage</li><li id="trtimerdisp" class="inactive">Timer</li>');
str = str.replace( '<div id="thronePanelContainer">', '<div id="thronePanelContainer" style="z-index: 101">');
unsafeWindow.cm.FETemplates.Throne.mainThrone = str;
unsafeWindow.cm.FETemplates.Throne.throneInfo = unsafeWindow.cm.FETemplates.Throne.throneInfo.replace (
'<div id="throneInfoContainer">',
'<div id="throneInfoContainer" style="z-index: 100;">');
unsafeWindow.cm.FETemplates.Throne.mainThrone = unsafeWindow.cm.FETemplates.Throne.mainThrone.replace (
'<div id="throneInfoContainer">',
'<div id="throneInfoContainer" style="z-index: 100;">');
unsafeWindow.cm.FETemplates.Throne.thronePanel = unsafeWindow.cm.FETemplates.Throne.thronePanel.replace(
'<div class="thronePanelContainer">',
'<div class="thronePanelContainer" style="z-index: 101;">');
unsafeWindow.cm.FETemplates.Throne.thronePanel = unsafeWindow.cm.FETemplates.Throne.thronePanel.replace(
'<div id="nextStatContainer" class="nextStat">',
'<div id="nextStatContainer" class="nextStat" onclick="clickNext()">');
unsafeWindow.cm.FETemplates.Throne.mainThrone = unsafeWindow.cm.FETemplates.Throne.mainThrone.replace(
'<ul id="throneStatDisplay"></ul>', '<div style="width: 70%; margin-left: auto; margin-right: auto;"><input type="button" value="Post to Chat" onclick="postTR()"></input></div><ul id="throneStatDisplay"></ul>');
GM_addStyle( "div#throneMainContainer div#throneInfoContainer div.infoContainer div.statContainer div.stats > ul {height: 345px }");
function postTR() {
var cText = $(document.querySelector("#throneStatDisplay")).html();
cText = cText.replace(/\<\/li\>/g, "||").replace(/\<li.*?\>/g,"").replace(/\|\|\s*$/, "");
var title = $(document.querySelector("div.primarytitlebar span.title")).text();
cText = ":::. |" +title + "|| "+ cText;
sendChat(cText);
}
unsafeWindow.postTR = postTR;
}
function trHideShow (){
if ($(document.querySelector("#tr_dialog")).dialog("isOpen")){
$(document.querySelector("#tr_dialog")).dialog("close");
upgradeData.trWinIsOpen = false;
} else {
$(document.querySelector("#tr_dialog")).dialog("open");
upgradeData.trWinIsOpen = true;
// clear the color
upgradeData.newUpgradeState = 0;
setUpgradeColor();
}
saveUpgradeData();
}
//Simple method, as if it were typed in thru DOM
function sendChat (msg){
$(document.querySelector("#mod_comm_input")).val(msg);
uW.Chat.sendChat ();
}
function AddMainTabLink(text, eventListener, mouseListener) {
var label = "Throne Room";
var a=document.createElement('a');
a.className='button20';
a.innerHTML='<span style="color: #ff6">'+ label +'</span>';
a.id = 'trtab';
a.className='tab';
var tabs=document.getElementById('main_engagement_tabs');
if(!tabs) {
tabs=document.getElementById('topnav_msg');
if (tabs)
tabs=tabs.parentNode;
}
if (tabs) {
var e = tabs.parentNode;
var gmTabs = null;
for (var i=0; i<e.childNodes.length; i++){
var ee = e.childNodes[i];
if (ee.tagName && ee.tagName=='DIV' && ee.className=='tabs_engagement' && ee.id!='main_engagement_tabs'){
gmTabs = ee;
break;
}
}
if (gmTabs == null){
gmTabs = document.createElement('div');
gmTabs.className='tabs_engagement';
// gmTabs.style.background='#ca5';
tabs.parentNode.insertBefore (gmTabs, tabs);
gmTabs.style.whiteSpace='nowrap';
gmTabs.style.width='735px';
gmTabs.lang = 'en_PT';
}
if (gmTabs.firstChild)
gmTabs.insertBefore (a, gmTabs.firstChild);
else
gmTabs.appendChild(a);
a.addEventListener('click',eventListener, false);
if (mouseListener != null)
a.addEventListener('mousedown',mouseListener, true);
return a;
}
return null;
}
function getClientCoords(e){
if (e==null)
return {x:null, y:null, width:null, height:null};
var x=0, y=0;
ret = {x:0, y:0, width:e.clientWidth, height:e.clientHeight};
while (e.offsetParent != null){
ret.x += e.offsetLeft;
ret.y += e.offsetTop;
e = e.offsetParent;
}
return ret;
}
//emulate protoype's Ajax.Request ...
function AjaxRequest (url, opts){
var headers = {
'X-Requested-With': 'XMLHttpRequest',
'X-Prototype-Version': '1.6.1',
'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
};
var ajax = null;
if (window.XMLHttpRequest)
ajax=new XMLHttpRequest();
else
ajax=new ActiveXObject("Microsoft.XMLHTTP");
if (opts.method==null || opts.method=='')
method = 'GET';
else
method = opts.method.toUpperCase();
if (method == 'POST'){
headers['Content-type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
} else if (method == 'GET'){
addUrlArgs (url, opts.parameters);
}
ajax.onreadystatechange = function(){
// ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; states 0-4
if (ajax.readyState==4) {
if (ajax.status >= 200 && ajax.status < 305)
if (opts.onSuccess) opts.onSuccess(ajax);
else
if (opts.onFailure) opts.onFailure(ajax);
} else {
if (opts.onChange) opts.onChange (ajax);
}
}
ajax.open(method, url, true); // always async!
for (var k in headers)
ajax.setRequestHeader (k, headers[k]);
if (matTypeof(opts.requestHeaders)=='object')
for (var k in opts.requestHeaders)
ajax.setRequestHeader (k, opts.requestHeaders[k]);
if (method == 'POST'){
var a = [];
for (k in opts.parameters){
if(matTypeof(opts.parameters[k]) == 'object')
for(var h in opts.parameters[k])
a.push (k+'['+h+'] ='+ opts.parameters[k][h] );
else
a.push (k +'='+ opts.parameters[k] );
}
ajax.send (a.join ('&'));
} else {
ajax.send();
}
}
function MyAjaxRequest (url, o, noRetryX){
if (DEBUG_TRACE) logit (" 0 myAjaxRequest: "+ url +"\n" + inspect (o, 2, 1));
var opts = unsafeWindow.Object.clone(o);
var wasSuccess = o.onSuccess;
var wasFailure = o.onFailure;
var retry = 0;
var delay = 10;
var noRetry = noRetry===true?true:false;
opts.onSuccess = mySuccess;
opts.onFailure = myFailure;
new AjaxRequest(url, opts);
return;
function myRetry(){
++retry;
new AjaxRequest(url, opts);
delay = delay * 2.25;
}
function myFailure(){
var o = {};
o.ok = false;
o.errorMsg = "AJAX Communication Failure";
wasFailure (o);
}
function mySuccess (msg){
var rslt = eval("(" + msg.responseText + ")");
if (!rslt)
{
logit("Message error: " + inspect(msg,3,1));
return;
}
var x;
if (window.EmulateAjaxError){
rslt.ok = false;
rslt.error_code=8;
}
if (rslt.ok){
if (rslt.updateSeed)
unsafeWindow.update_seed(rslt.updateSeed);
wasSuccess (rslt);
return;
}
rslt.errorMsg = unsafeWindow.printLocalError((rslt.error_code || null), (rslt.msg || null), (rslt.feedback || null));
// if ( (x = rslt.errorMsg.indexOf ('<br><br>')) > 0)
// rslt.errorMsg = rslt.errorMsg.substr (0, x-1);
if (!noRetry && (rslt.error_code==0 || rslt.error_code==8 || rslt.error_code==1 || rslt.error_code==3)){
dialogRetry (inspect(rslt.errorMsg), delay, function(){myRetry()}, function(){wasSuccess (rslt)}, rslt.error_code);
} else {
wasSuccess (rslt);
}
}
}
//example: https://www150.kingdomsofcamelot.com
var myServerId = null;
function getServerId() {
if (myServerId == null){
var m=/^[a-zA-Z]+([0-9]+)\./.exec(document.location.hostname);
if (m)
myServerId = m[1];
else
myServerId = '??';
}
return myServerId;
}
function logit (msg){
var now = new Date();
GM_log (getServerId() +' @ '+ now.toTimeString().substring (0,8) +'.' + now.getMilliseconds() +': '+ msg);
}
function saveUpgradeData (){
var serverID = getServerId();
setTimeout (function (){GM_setValue ('UpgradeDataMM2_'+serverID, JSON2.stringify(upgradeData));}, 0);
}
function savePresetData (){
var serverID = getServerId();
setTimeout (function (){GM_setValue ('PresetDataMM2_'+serverID, JSON2.stringify(presetData));}, 0);
}
function saveQueueData (){
var serverID = getServerId();
setTimeout (function (){GM_setValue ('QData_'+serverID, JSON2.stringify(queueData));}, 0);
}
function saveSalvageData (){
var serverID = getServerId();
setTimeout (function (){GM_setValue ('SalvageDataMM2_'+serverID, JSON2.stringify(salvageData));}, 0);
}
function saveUpgradeStats (){
var serverID = getServerId();
setTimeout (function (){GM_setValue ('UpgradeStats_'+serverID, JSON2.stringify(upgradeStats));}, 0);
}
function savePresetPosition (){
var serverID = getServerId();
setTimeout (function (){ GM_setValue ('PresetPosition_'+serverID, JSON2.stringify(presetPosition));}, 0);
}
function saveGuardPosition (){
var serverID = getServerId();
setTimeout (function (){ GM_setValue ('GuardPosition_'+serverID, JSON2.stringify(guardPosition));}, 0);
}
function readPresetPosition () {
var serverID = getServerId();
s = GM_getValue ('PresetPosition_'+serverID);
if (s != null){
presetPosition = JSON2.parse (s);
}
}
function readGuardPosition () {
var serverID = getServerId();
s = GM_getValue ('GuardPosition_'+serverID);
if (s != null){
guardPosition = JSON2.parse (s);
}
}
function readTRGlobalOptions (){
TRGlobalOptions = JSON2.parse (GM_getValue ('TROptions_??', '{}'));
}
function readUpgradeData (){
var serverID = getServerId();
s = GM_getValue ('UpgradeDataMM2_'+serverID);
if (s != null){
opts = JSON2.parse (s);
for (k in opts){
if (matTypeof(opts[k]) == 'object')
for (kk in opts[k])
upgradeData[k][kk] = opts[k][kk];
else
upgradeData[k] = opts[k];
}
}
}
function readPresetData (){
var serverID = getServerId();
s = GM_getValue ('PresetDataMM2_'+serverID);
if (s != null){
opts = JSON2.parse (s);
for (k in opts){
if (matTypeof(opts[k]) == 'object')
for (kk in opts[k])
presetData[k][kk] = opts[k][kk];
else
presetData[k] = opts[k];
}
}
}
function readQueueData (){
var serverID = getServerId();
s = GM_getValue ('QData_'+serverID);
if (s != null){
opts = JSON2.parse (s);
for (k in opts){
if (matTypeof(opts[k]) == 'object')
for (kk in opts[k])
queueData[k][kk] = opts[k][kk];
else
queueData[k] = opts[k];
}
}
}
function readSalvageData (){
var serverID = getServerId();
s = GM_getValue ('SalvageDataMM2_'+serverID);
if (s != null){
opts = JSON2.parse (s);
for (k in opts){
if (matTypeof(opts[k]) == 'object')
for (kk in opts[k])
salvageData[k][kk] = opts[k][kk];
else
salvageData[k] = opts[k];
}
}
// recreate the objects w/ functions
for (k in salvageData.ruleSet)
{
var r = salvageData.ruleSet[k];
var rule = new Rule(r.type, r.faction, r.conditions);
for (j in rule.conditions)
{
rule.conditions[j].checkCondition = checkCondition;
}
salvageData.ruleSet[k] = rule;
}
}
function readUpgradeStats (){
var serverID = getServerId();
s = GM_getValue ('UpgradeStats_'+serverID);
if (s != null){
opts = JSON2.parse (s);
for (k in opts){
if (matTypeof(opts[k]) == 'object')
for (kk in opts[k])
upgradeStats[k][kk] = opts[k][kk];
else
upgradeStats[k] = opts[k];
}
}
}
function loadSalvageData (domainId){
s = GM_getValue ('SalvageDataMM2_'+ domainId);
if (s==null) {
alert("Unable to find data from domain: " + domainId);
return;
}
if (s != null){
opts = JSON2.parse (s);
for (k in opts){
if (matTypeof(opts[k]) == 'object')
for (kk in opts[k])
salvageData[k][kk] = opts[k][kk];
else
salvageData[k] = opts[k];
}
}
// recreate the objects w/ functions
for (k in salvageData.ruleSet)
{
var r = salvageData.ruleSet[k];
var rule = new Rule(r.type, r.faction, r.conditions);
for (j in rule.conditions)
{
rule.conditions[j].checkCondition = checkCondition;
}
salvageData.ruleSet[k] = rule;
}
// turn off
salvageData.salvageActive = false;
clearInterval(Tabs.throneSalvage.sTimer);
clearInterval(Tabs.throneSalvage.delTimer);
Tabs.throneSalvage.deleting = false;
saveSalvageData();
alert('Salvage settings loaded from domain ' + domainId);
Tabs.throneSalvage.init(Tabs.throneSalvage.myDiv);
}
function inspect(obj, maxLevels, level, doFunctions){
var str = '', type, msg;
if(level == null) level = 0;
if(maxLevels == null) maxLevels = 1;
if(maxLevels < 1)
return 'Inspect Error: Levels number must be > 0';
if(obj == null)
return 'ERROR: Object is NULL\n';
var indent = '';
for (var i=0; i<level; i++)
indent += ' ';
for(property in obj) {
try {
type = matTypeof(obj[property]);
if (doFunctions==true && (type == 'function')){
str += indent + '(' + type + ') ' + property + "[FUNCTION]\n";
} else if (type != 'function') {
str += indent + '(' + type + ') ' + property + ( (obj[property]==null)?(': null'):('')) +' = '+ obj[property] +"\n";
}
if((type=='object' || type=='array') && (obj[property] != null) && (level+1 < maxLevels))
str += inspect(obj[property], maxLevels, level+1, doFunctions); // recurse
}
catch(err) {
// Is there some properties in obj we can't access? Print it red.
if(typeof(err) == 'string') msg = err;
else if(err.message) msg = err.message;
else if(err.description) msg = err.description;
else msg = 'Unknown';
str += '(Error) ' + property + ': ' + msg +"\n";
}
}
str += "\n";
return str;
}
function matTypeof (v){
if (typeof (v) == 'object'){
if (!v)
return 'null';
// else if (unsafeWindow.Object.prototype.toString.apply(v) === '[object
// Array]')
else if (v.constructor.toString().indexOf("Array")>=0 && typeof(v.splice)=='function')
return 'array';
else return 'object';
}
return typeof (v);
}
function unixTime (){
return parseInt (new Date().getTime() / 1000) + unsafeWindow.g_timeoff;
}
/** ***************** Throne Savlager ********************* */
Tabs.throneSalvage = {
tabOrder : 200,
tabLabel : 'Salvage',
tabDisabled : false,
myDiv : null,
timer : null,
city : null,
cityNum : 0,
delItems : [],
rowNum : 0,
sTimer : null,
delTimer : null,
upgradeProfit: true,
//salvageFailList: {},
//maxFailures: 2,
init : function (div) {
var t = Tabs.throneSalvage;
t.myDiv = div;
var m = '<Div><DIV id=trSalvage class=trStat>AUTOMATED SALVAGE</div>';
m += "<div id='trInfoArea'>";
m += '</div>';
m += '<TABLE class="trTabDef trTable" id=trupgrader width =100% height=0% class=trTab style="padding-left: 20px;">';
m += '<tr><th width=20%/><th width=30%/><th width=40%/><th/></tr>';
if (salvageData.salvageActive == false) {
m += '<tr><TD><div><INPUT id=trSalvagerPower type=button value="Salvager = OFF"/></div></td>';
} else {
m += '<tr><TD><div><INPUT id=trSalvagerPower type=button value="Salvager = ON"/></div></td>';
}
m += '<td colspan=3><b> City to put aetherstones: </b><div style="display: inline;" id=trSalvageCity /></td>';
m += '<tr><td><td/><tdtyle="text-align: center;"></td>';
m += '</tr></table>';
m += '<table class="trTabPad trTable"><hr/>';
m += '<tr><td width=35%><div> Keep all: <select id="trSalvageQuality">';
m += '<option value="1">Common</option>';
m += '<option value="2">Uncommon</option>';
m += '<option value="3">Rare</option>';
m += '<option value="4">Epic</option>';
m += '<option value="5">Wondrous</option>';
m += '</select> and higher</div></td>';
m += '<td colspan=2 width=24%>Keep the first <INPUT id=trSaveNum type=text size=3 maxlength=3 value="' + salvageData.throneSaveNum+ '"/> items</td>';
m += "</tr></table><hr/>";
m += "<div id='trRulesCreate' class='trRuleCreate'>";
// rules definition
m += '<TABLE class="trTabDef trTable" width=100% class=trTabPad style="padding-left: 10px;">';
m += '<tr><td> <b>Define the TR items to keep: </b> </td>';
m += '<td alight="left"><div><span>Faction: <select id="trFactionType">';
m += ' <option value="any">Any</option>';
m += ' <option value="fey">Fey</option>';
m += ' <option value="briton">Briton</option>';
m += ' <option value="druid">Druid</option>';
m += '</select></span></div></td>';
m += '<td alight="left"><div><span>Card type: <select id="trCardType">';
m += ' <option value="any">Any</option>';
m += ' <option value="chair">Chair</option>';
m += ' <option value="table">Table</option>';
m += ' <option value="window">Window</option>';
m += ' <option value="banner">Banner</option>';
m += ' <option value="advisor">Advisor</option>';
m += ' <option value="trophy">Trophy</option>';
m += ' <option value="candelabrum">Candelabrum</option>';
m += ' <option value="hero">Hero</option>';
m += ' <option value="statue">Statue</option>';
m += ' <option value="pet">Pet</option>';
m += '</select></span></div></td>';
m += '<td align="right"><INPUT id=trAddRule type=button value="Create Rule"/></td>';
m += '</tr></table>';
m += '<TABLE class="trTabPad trTable" width=100% id="trConditionTable" style="padding-left: 5px;">';
m += '<tr><td align=left colspan=1><INPUT id=trAddRow type=button value="Add Row"/></td>';
m += '<td></td><td></td><td></td><td></td><td></td></tr>';
m += '</table>';
m += '</div><hr/>';
m += '<div id="trSalvStatus" style="text-align: center;" >Loading ... </div>';
m += '<div id="trNumSalv" style="text-align: center;"></div>';
m += '<hr/>';
m += '<div class=trRulePane>';
m += '<div align=center> <b> Salvager will keep items matching any of these rules </b></div>';
m += '<div id=trRuleScroll style="position: static; width: 710px; height: 300px; overflow-x: hidden; overflow-y: auto;" >';
m += "<div id='trRuleDisplay' >";
m += '</div></div></div>';
t.myDiv.innerHTML = m;
Tabs.throneSalvage.displayNumberSalvaged();
document.getElementById('trSalvagerPower').addEventListener('click', function(){t.togglePower(this);} , false);
new CdispCityPicker ('trcitysel', document.getElementById('trSalvageCity'), true, t.e_CityButton, upgradeData.sCityNum);
t.createRow();
t.buildRuleDisplay();
document.getElementById('trSaveNum').addEventListener('change', function(){
salvageData.throneSaveNum = parseInt(document.getElementById('trSaveNum').value);
if (salvageData.throneSaveNum < 0) salvageData.throneSaveNum = 0;
saveSalvageData();
}, false);
document.getElementById ('trSalvageQuality').addEventListener ('click', function() {t.setSalvageLevel(this.value);}, false);
document.getElementById ('trSalvageQuality').value = salvageData.minQuality;
document.getElementById ('trAddRow').addEventListener ('click', function() {t.createRow();}, false);
document.getElementById ('trAddRule').addEventListener ('click', function() {t.createRule();}, false);
$(document.querySelector("#trRuleScroll")).resizable({
minWidth: 720,
maxWidth: 1000,
minHeight: 180,
maxHeight: 700,
stop: function(event, ui) {
upgradeData.salvageH = ui.size.height + 'px';
upgradeData.salvageW = ui.size.width + 'px';
saveUpgradeData();
}
});
$(document.querySelector("#trRuleScroll")).css('height', upgradeData.salvageH).css('width', upgradeData.salvageW);
if (salvageData.upgradedToDelete.length > 0)
{
// some items were left over that need to be deleted
logit("Found " + salvageData.upgradedToDelete.length + " upgraded items that need to be deleted.");
for (k=0; k< salvageData.upgradedToDelete.length; k++)
{
var id = salvageData.upgradedToDelete[k];
// if the item is not longer in the inventory, remove the id
if (!unsafeWindow.kocThroneItems[id] ) {
logit("Removing item " + id +" from salvage list.");
salvageData.upgradedToDelete.splice(k,1); // Remove item from array
saveSalvageData();
k--;
}
}
// resume deleting things
if (salvageData.salvageActive)
{
t.delItems = salvageData.upgradedToDelete;
t.deleting = true;
t.upgradeAndDelete();
}
else
{
// if the salvager is powered off, clear the list
salvageData.upgradedToDelete = [];
saveSalvageData();
}
}
// this check makes sure upgrading before deleting is still profitable
t.upgradeProfit = (5*CM.WorldSettings.getSettingAsNumber("AETHERSTONE_SALVAGE_MULTIPLIER", 500) > CM.thronestats.upgrade[1]["Stones"]);
t.start();
},
tripOdometer : function() {
salvageData.numSalvagedItems2 = 0;
var now = new Date();
salvageData.since = now.valueOf();
saveSalvageData();
Tabs.throneSalvage.init(Tabs.throneSalvage.myDiv);
},
displayNumberSalvaged : function () {
var since = "";
var rate = "";
var now = new Date();
if (!salvageData.since) salvageData.since = now.valueOf();
var sinceD = new Date(salvageData.since);
since = sinceD.toDateString().substring(3,10) + " " + sinceD.toLocaleTimeString();
var duration = now.valueOf() - salvageData.since +1;
duration = duration / 1000.0;
rate = " (" + addCommas(Math.round(salvageData.numSalvagedItems2 / duration * 86400)) + " per day)";
$(document.querySelector("#trNumSalv")).html('<div style="text-align: center;"> '+ addCommas(salvageData.numSalvagedItems) + " items salvaged"
+ ', ' + addCommas(salvageData.numSalvagedItems2) + ' items since ' + since + rate +
' <input id="tripOdo" type=button value="Reset" /> </div>');
$(document.querySelector("#tripOdo")).click( function () {
Tabs.throneSalvage.tripOdometer();
});
},
createRow : function()
{
var t = Tabs.throneSalvage;
var table = document.getElementById('trConditionTable');
var rowCount = table.rows.length;
var row = table.insertRow(rowCount-1);
var rowId = "r" + t.rowNum;
t.rowNum++;
row.id = rowId;
var h = "<td> <select id='" + rowId + "sel1'> <option value='true'> </option> <option value='false'>NOT</option></select></td>";
h += "<td> <select id='" + rowId + "sel2'>";
h += " <option value='1'>1x</option>";
h += " <option value='2'>2x</option>";
h += " <option value='3'>3x</option>";
h += " <option value='4'>4x</option>";
h += " <option value='5'>5x</option>";
h += "</select></td>";
h += "<td> <select id='" + rowId + "sel3'>";
h += "</select></td>";
h += "<td> <select id='" + rowId + "sel4'>";
h += " <option value='e'>Either</option>";
h += " <option value='b'>Buff</option>";
h += " <option value='d'>Debuff</option>";
h += "</select></td>";
h += "<td> Slots: ";
h += " <input type=checkbox value='1' checked=true id='" + rowId + "slot1'/>1";
h += " <input type=checkbox value='2' checked=true id='" + rowId + "slot2'/>2";
h += " <input type=checkbox value='3' checked=true id='" + rowId + "slot3'/>3";
h += " <input type=checkbox value='4' checked=true id='" + rowId + "slot4'/>4";
h += " <input type=checkbox value='5' checked=true id='" + rowId + "slot5'/>5";
h += "</td>";
row.innerHTML = h;
var effects = [];
for (e in CM.thronestats.effects)
{
var effectName = CM.thronestats.effects[e][1].split(" Debuff")[0];
if (effects.indexOf(effectName) < 0) effects.push(effectName);
}
var select = document.getElementById(rowId + "sel3");
for(index in effects) {
select.options.add(new Option(effects[index], effects[index]));
}
// add in options for troops specific effects
select.options.add(new Option("Any Infantry","Infantry"));
select.options.add(new Option("Any Ranged","Ranged"));
select.options.add(new Option("Any Horsed","Horsed"));
select.options.add(new Option("Any Siege","Siege"));
var c = row.insertCell(5);
var btn = $("<input type=button value='X'/>");
$(btn).click( function () { t.removeRow(row);});
$(c).append( btn );
t.setFullness();
},
setSalvageLevel : function(level)
{
salvageData.minQuality = level;
saveSalvageData();
},
pickCity : function () {
var t = Tabs.throneSalvage;
var ind = -1;
var lowest = 9999999;
if (salvageData.minCity)
{
for (i= 0; i < Seed.cities.length; i++)
{
// put in the lowest city with stones below min
if ( parseInt(Seed.resources["city" + Seed.cities[i][0]]["rec5"][0]) <= salvageData.minStones)
{
if (salvageData.minMethod == "lowest")
{
if ( parseInt(Seed.resources["city" + Seed.cities[i][0]]["rec5"][0]) < lowest )
{
ind = i;
lowest = +Seed.resources["city" + Seed.cities[ind][0]]["rec5"][0];
}
}
else
{
return i;
}
}
}
}
//return ind;
//put in Primary City
var cid = upgradeData.sCityNum;
if ( parseInt(Seed.resources["city" + Seed.cities[cid][0]]["rec5"][0]) <= salvageData.maxStones) return cid;
if (salvageData.anyCity)
{
for (i= 0; i < Seed.cities.length; i++)
{
if (salvageData.overflow == "lowest")
{
// put in the city w/ the lowest number of a-stone
if ( parseInt(Seed.resources["city" + Seed.cities[i][0]]["rec5"][0]) < lowest )
{
ind = i;
lowest = +Seed.resources["city" + Seed.cities[ind][0]]["rec5"][0];
}
}
else
{
// put in the first city with low stones
if ( parseInt(Seed.resources["city" + Seed.cities[i][0]]["rec5"][0]) <= salvageData.maxStones) {
return i;
}
}
}
}
return ind;
},
createRule : function()
{
var t = Tabs.throneSalvage;
t.readRows();
t.buildRuleDisplay();
},
buildRuleDisplay : function ()
{
var t = Tabs.throneSalvage;
var rd = document.getElementById('trRuleDisplay');
var m = '<TABLE width=100% class="trTabPad trTable">';
for (i =0; i < salvageData.ruleSet.length; i++)
{
var rule = salvageData.ruleSet[i];
m += '<tr>';
m += "<td width=90%><div class='trRule'>";
m += " Type: " + rule.type;
m += " Faction: " + rule.faction;
for (ii = 0; ii < rule.conditions.length; ii++)
{
var condition = rule.conditions[ii];
if (ii ==0 )
m += "<br> Item";
else
m += "<br> <u>and</u>";
if (condition.mustHave != "false")
m += " must have ";
else
m += " must NOT have ";
m += condition.number + "x ";
m += condition.effect + " ";
if (condition.buffType == "b")
m += "buff ";
else if (condition.buffType == "d")
m += "debuff ";
else
m += "buff or debuff ";
m += " in slot(s): ";
for (j = 0; j < condition.slots.length; j++)
{
if (condition.slots[j] ) m += (j+1) + " ";
}
}
m += "</div></td>";
m += "<td width=20%><INPUT id=trDelRule" + i + " type=button value='Delete Rule' /></td>";
m += '</tr>';
}
rd.innerHTML = m;
for (var j=0; j < salvageData.ruleSet.length; j++)
{
document.getElementById('trDelRule' +j).v1 = j;
document.getElementById('trDelRule' +j).addEventListener ('click', function() { t.deleteRule(this.v1);}, false);
}
},
updateTRTab : function() {
$(document.querySelector("#trexecsalvage")).html("Salvage " + (salvageData.salvageActive ? "ON" : "OFF"));
},
togglePower: function(obj){
var t = Tabs.throneSalvage;
if (salvageData.salvageActive == true) {
var btn = document.getElementById('trSalvagerPower');
salvageData.salvageActive = false;
btn.value = "Salvager = OFF";
clearInterval(t.sTimer);
clearInterval(t.delTimer);
t.delItems = [];
salvageData.upgradedToDelete = [];
t.deleting = false;
} else {
salvageData.salvageActive = true;
var btn = document.getElementById('trSalvagerPower');
btn.value = "Salvager = ON";
t.doSalvage();
t.start();
}
saveSalvageData();
t.updateTRTab();
},
// delete a rule from the ruleset
deleteRule : function(i)
{
var t = Tabs.throneSalvage;
salvageData.ruleSet.splice(i,1);
saveSalvageData();
t.buildRuleDisplay();
},
readRows : function()
{
var t = Tabs.throneSalvage;
var table = document.getElementById('trConditionTable');
var rowCount = table.rows.length;
var cType = document.getElementById('trCardType').value;
var faction = document.getElementById('trFactionType').value;
var conditions = [];
for (i=0; i < table.rows.length; i++)
{
var row = table.rows[i];
if (row.id)
{
var s1 = document.getElementById(row.id + "sel1");
var s2 = document.getElementById(row.id + "sel2");
var s3 = document.getElementById(row.id + "sel3");
var s4 = document.getElementById(row.id + "sel4");
var slots = [];
for (j =1; j <= 5; j++)
{
var ch = document.getElementById(row.id + "slot" + j);
slots.push(ch.checked);
}
var c = new Condition(s1.value, s2.value, s3.value, s4.value, slots );
conditions.push(c);
}
}
var rule1 = new Rule(cType, faction, conditions);
t.addRule(rule1);
},
removeRow : function(row)
{
var table = document.getElementById('trConditionTable');
for (i=0; i < table.rows.length ; i++ )
{
if (table.rows[i] == row)
{
table.deleteRow(i);
break;
}
}
},
// add a new rule
addRule : function(rule)
{
salvageData.ruleSet.push(rule);
saveSalvageData();
},
// callback for when salvage city is changed
e_CityButton : function (city, x, y){
var t = Tabs.throneSalvage;
upgradeData.sCityNum = city.idx;
saveUpgradeData();
},
start : function(){
var t = Tabs.throneSalvage;
if(salvageData.salvageActive) {
t.sTimer = setInterval(t.doSalvage, 1*60*1000);
}
},
// do the actual discard of TR items
doSalvage : function() {
var t = Tabs.throneSalvage;
t.setFullness();
if(!salvageData.salvageActive) {
t.deleting = false;
return;
}
if (t.deleting == true) {
logit("Deleting not complete");
return;
}
t.deleting = true;
t.setStatus('Salvaging items');
t.delItems = t.buildList(false);
// go through the list and remove items that have failed too many times
//logit("Del List 1: " + inspect(t.delItems,3,1));
// future
//for (ii =0; ii < t.delItems.length; ii++) {
//var id = t.delItems[ii];
//if ( t.salvageFailList[id] && t.salvageFailList[id] >= t.maxFailures)
// {
// logit("Maximum failures reached for item: " + id);
// t.delItems.splice(ii,1); // Remove item from array
// ii--; // back up the index
// }
//}
//logit("Del List 2: " + inspect(t.delItems,3,1));
if (t.delItems.length > 0) {
// upgrade items from +0 to +1 first
t.upgradeAndDelete();
} else {
// give enough time for the last delete to finish
setTimeout( function () {
t.deleting = false;
t.setStatus('No items to salvage. Waiting for next cycle.');
}, 3000);
}
t.setFullness();
},
setFullness : function () {
// change the color on the throne button when full
var num_items = unsafeWindow.Object.keys(unsafeWindow.kocThroneItems).length;
if (num_items > 110)
$("a.buttonv2.throne").css('color', 'red');
else
$("a.buttonv2.throne").css('color', 'black');
},
// Create the list of items to delete.
// If 'test' is set to true, then broken/equipted items are included.
buildList : function(test){
var t = Tabs.throneSalvage;
var throneSaveNum = salvageData.throneSaveNum;
var countItem = 0;
var retList = [];
for (k in unsafeWindow.kocThroneItems) {
var throne_item = unsafeWindow.kocThroneItems[k];
countItem++;
// ignore these things
if (throne_item.level !=0) continue;
// in test mode, include these items
// These items are at risk if they are repaired or unequiped.
if (test != true)
{
if (throne_item.isEquipped) continue;
if (throne_item.isBroken) continue;
}
// keep the first X items
if ( countItem <= throneSaveNum) continue;
// keep things w/ at least minQuality
if (throne_item.quality >= salvageData.minQuality) continue;
// check the rules
if (t.applyRules(throne_item.id)) continue;
// passes all tests
retList.push(throne_item.id);
}
return retList;
},
// put out a status message on the trSavlStatus div
setStatus : function(msg) {
document.getElementById('trSalvStatus').innerHTML = msg;
},
// returns true if the item should be saved and not salvaged
applyRules : function(id) {
var t = Tabs.throneSalvage;
for (r in salvageData.ruleSet)
{
var rule = salvageData.ruleSet[r];
if ( rule.applyRule(id)) return true;
}
return false;
},
// update items to +1 before deleting
upgradeAndDelete : function () {
//logit("upgradeAndDelete");
var t = Tabs.throneSalvage;
if(!salvageData.salvageActive || t.delItems.length == 0) {
t.deleting = false;
return;
}
var id = +t.delItems[0];
// since simple +0 can be upgrade w/ near 100% success for 1500 a-stone and then salvaged for 2150
// upgrade all these items 1 level
if (salvageData.upgradeFirst && t.upgradeProfit)
{
var item = unsafeWindow.kocThroneItems[id];
if (item) {
if ( item.quality <= salvageData.upgradeFirstQual && item.level==0
&& ( salvageData.upgradedToDelete.indexOf(id) < 0 ) )
{
salvageData.upgradedToDelete.push(id);
saveSalvageData();
Tabs.upgrader.doUpgrade(+id,true);
}
}
else
{
logit("item not found.");
}
}
// delete the item
t.delTimer = setTimeout( function () {t.doDelete(id)}, 4000);
},
removeItem : function (id, cityId, numStones) {
var item = unsafeWindow.kocThroneItems[id];
if (!item) return;
var c = +(Seed.resources["city" + cityId]["rec5"][0]);
var b = Seed.throne.slotEquip;
Seed.resources["city" + cityId]["rec5"][0] = c + numStones;
jQuery.each(b, function (g, h) {
a = jQuery.inArray(id, h);
if (a > -1) {
h.splice(a, 1)
}
});
delete unsafeWindow.kocThroneItems[id];
CM.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
},
doDelete : function(id) {
var t = Tabs.throneSalvage;
if(!salvageData.salvageActive || !t.deleting) {
t.deleting = false;
return;
}
//logit("deleting item: " + id);
var item = unsafeWindow.kocThroneItems[id];
if (item) t.setStatus('Salvaging ' + item.name);
var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams);
var num_city = t.pickCity();
if ( num_city < 0)
{
num_city = +upgradeData.sCityNum;
logit(" cities full");
t.setStatus("All cities are (nearly) full of aetherstone");
}
params.ctrl = 'throneRoom\\ThroneRoomServiceAjax';
params.action = 'salvage';
params.itemId = id;
params.cityId = Seed.cities[num_city][0];
new AjaxRequest(unsafeWindow.g_ajaxpath + "ajax/_dispatch53.php" + unsafeWindow.g_ajaxsuffix, {
method: "post",
parameters: params,
loading: true,
onSuccess: function (transport) {
try {
var rslt = eval("(" + transport.responseText + ")");
//logit("Salvage: " + inspect(rslt,3,1));
var throne_item = unsafeWindow.kocThroneItems[id];
if(rslt.ok) {
if (throne_item) trSalvageLog('Deleted Throne room item '+ throne_item.name);
salvageData.numSalvagedItems++;
salvageData.numSalvagedItems2++;
saveSalvageData();
if (throne_item) {
salvageData.numSalvaged[throne_item.quality]++;
saveSalvageData();
Tabs.throneSalvage.removeItem(id , Seed.cities[num_city][0], rslt.aetherstones);
}
Tabs.throneSalvage.displayNumberSalvaged();
var sidx = salvageData.upgradedToDelete.indexOf(id);
if (sidx >=0)
{
salvageData.upgradedToDelete.splice(sidx,1); // Remove item from array
saveSalvageData();
}
}
else
{
logit("rslt: " + inspect(rslt,3,1));
if (throne_item) Tabs.throneSalvage.setStatus('Unable to salvage item ' + throne_item.name);
// store off the object id and record the number of failures. If it fails too many times, skip it next time.
//if ( !t.salvageFailList[id] )
// t.salvageFailList[id] = 1;
//else
// t.salvageFailList[id]++;
//logit("Salvage failed. Current number of failures of item " + id +" is " + t.salvageFailList[id]);
unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
}
var idx = t.delItems.indexOf(id);
if (idx >=0)
{
t.delItems.splice(idx,1);
// Remove item from array regardless
// of success. Catch on next refresh
}
if (t.delItems.length > 0) { // Check if the array is empty
t.upgradeAndDelete();
} else {
//logit("deletes done");
t.deleting = false;
t.setStatus('Salvaging complete. Waiting for next cycle.');
return;
}
} catch (e) {
logit("Delete exception: " + inspect(e,3,1));
t.deleting = false;
}
},
onFailure: function () {
logit("failure case");
t.delIems = [];
t.deleting = false;
if (unsafeWindow.kocThroneItems[id] )
logit("salvage failed for item " + unsafeWindow.kocThroneItems[id].name );
unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
return;
}
});
},
show: function(){
},
hide: function(){
}
}
//class definition for upgrade queue items
function QueueItem()
{
this.item = 0;
this.action = "upgrade";
this.level = 1;
this.status = "not started";
this.triesTotal = 0;
this.triesThis = 0;
this.triesLast = 0;
this.lastUpgrade = "none";
this.upgrades = [];
}
//class definition for rules and conditions
function Rule(type, faction, conditions) {
this.type = type;
this.faction = faction;
if (conditions)
this.conditions = conditions;
else
this.conditions = [];
this.addCondition = addCondition;
this.applyRule = applyRule;
}
function cloneRule( rule) {
this.type = rule.type;
this.faction = rule.faction;
this.conditions = [];
if (rule.conditions) this.conditions = rule.conditions;
this.addCondition = addCondition;
this.applyRule = applyRule;
}
function addCondition(c) {
this.conditions.push(c);
}
function applyRule(id) {
var throne_item = unsafeWindow.kocThroneItems[id];
if (this.type != "any" && (this.type != throne_item.type)) return false;
if (this.faction != "any" && (this.faction != throne_item.faction)) return false;
for (r in this.conditions)
{
if (!this.conditions[r].checkCondition(id)) return false;
}
return true;
}
function Condition(mustHave, number, effect, buffType, slots ) {
this.mustHave = mustHave;
this.number = number;
this.effect = effect;
this.buffType = buffType;
this.slots = slots;
this.checkCondition = checkCondition;
}
function checkCondition(id) {
var numberFound = 0;
var effectsFound = false;
// get card
var throne_item = unsafeWindow.kocThroneItems[id];
if (!throne_item) return false;
// for loop for stat
// count up occurances
for (i in throne_item.effects)
{
var card_effect = CM.thronestats.effects[throne_item.effects[i].id][1];
var slotid = i.split("slot")[1];
if (!this.slots[slotid-1])
{
continue;
}
var eff = this.effect + " ";
if (card_effect.indexOf(" Debuff") < 0) card_effect += " ";
if (!card_effect.startsWith(eff)) continue;
// special rule for Chance to Find Items
if ( (card_effect == "Chance to Find Items ") && (card_effect != eff ) ) continue;
// If we do not care about buff/debuff then we are done
if (this.buffType == "e") {
numberFound++;
} else {
// Does the description end with a Debuff
if (card_effect.endsWith(" Debuff")) {
// Are we looking for a debuff
if (this.buffType == "d")
{
numberFound++;
}
} else {
if (this.buffType == "b")
{
numberFound++;
}
}
}
}
if ( numberFound >= this.number)
{
effectsFound = true;
}
if (this.mustHave != "false")
return effectsFound;
else
return (!effectsFound);
}
/** **************** Throne organizer ********************* */
Tabs.organizer = {
tabOrder: 300,
tabLabel: 'Organize',
tabDisabled : false,
myDiv : null,
itemLists : [],
itemTypes : { chair: 0, table: 1, window: 2, banner: 3, advisor: 4, trophy: 5, candelabrum: 6, hero: 7, statue: 8, pet: 9},
selectedItems : [],
panelId: -1,
panelType: "upgrade",
panelNextLevel : 2,
sortEffect: "none",
sortType: "both",
factions: ['briton', 'fey', 'druid'],
switchingPresets : false,
init : function (div){
var t = Tabs.organizer;
// setup the lists for tables, chairs, etc.
t.fillLists();
t.myDiv = div;
// setup the tab
var m = '<Div><DIV id=trOrganizer class=trStat>ORGANIZER</div>';
var effects = [];
for (e in CM.thronestats.effects)
{
var effectName = CM.thronestats.effects[e][1].split(" Debuff")[0];
if (effects.indexOf(effectName) < 0) effects.push(effectName);
}
// header stuff
// preset selector
m += '<TABLE width=100% class="trTabPad2 trTable">';
m += '<tr width=100% align=center><td width=15%/><td width=30%/><td/></tr>';
m += '<tr><td><div><span>View preset: </td><td><select id="PresetList">';
m += '<option value="0">--Presets--</option>';
for (k= 1; k <= Seed.throne.slotNum; k++)
{
m += '<option value="'+k+'"> Preset: '+ k +'</option>';
}
for (k= 0; k < presetData.num_presets; k++)
{
if (presetData.ids[k])
m += '<option value="local'+k+'"> Local: '+ presetData.ids[k] +'</option>';
else
m += '<option value="local'+k+'"> Local: '+ String.fromCharCode(65 + k) +'</option>';
}
m += '</select></span></div></td>';
m += '<td><INPUT id=testSalvage type=button value=" Test Salvage "/></td><td><INPUT id=clearTags type=button value=" Clear Tags "/></td><td id=trDelResults></td>';
m += '</tr>';
m+= '<tr width=100% ><td colspan=1><span style="width: 130px; float: left; margin-top: 4px; margin-right: 4px;"> Switch to preset: </span>';
m+= '</td><td colspan=3 width=450px>';
for (a=1; a <= Seed.throne.slotNum; a++)
{
m += '<a style="font-family: serif; width: 25px;" class="button20 loadGPreset" id=trPresetNum'+ a + ' > <span> ' + a + ' </span></a>';
}
m += '</td></tr>';
if (presetData.num_presets > 0) {
m += '<div id="preset_tt"> <b>: </b> </div></a>';
m+= '<tr width=100%><td colspan=1><span style="width: 130px; float: left; margin-top: 4px; margin-right: 4px;"> Local preset: </span>';
m+= '</td><td colspan=3>';
m += '<select id="trLocalPresetList" style="float: left;">';
m += '<option value="-1">--Preset--</option>';
for (a=0; a< presetData.num_presets; a++)
{
m += '<option value="' + a + '">'+ presetData.ids[a] + '</option>';
}
m += '</select>';
m += '<a style=" font-family: serif; margin-left: 10px;" class="button20" id=trLoad><span>Load</span></a>';
m += '<a style=" font-family: serif; margin-left: 5px;" class="buttonDown20" id=trSave><span>Save</span></a>';
m += '<span style="float: left; margin-top: 4px; margin-right: 4px; margin-left: 10px;">';
if (presetData.num_presets > 0)
{
m += "Switch to slot <INPUT id=trPresetNumber type=text size=2 maxlength=2 value='" + parseInt(presetData.usePreset) + "' </input> when loading";
}
m += "</span></td></tr>" ;
}
m += '<tr align=center><td colspan=4><div id=trSwitchStatus></div></td></tr>';
m += '<tr><td colspan=4><hr/></td></tr>';
m +='<tr id=factionFilterRow><td colspan=4 align=center> Factions: ';
for (f in t.factions) {
var faction = t.factions[f];
m += '<INPUT id=trFaction'+faction + ' type=checkbox CHECKED >' + faction.capitalize() + '</input> ';
}
m +='</td></tr>';
m +='<tr id=levelFilterRow><td colspan=4 align=center> Levels: ';
for (level = 0; level <= maxTrLevel; level++)
{
m += '<INPUT id=trLevel'+level + ' type=checkbox CHECKED >' + level + '</input> ';
}
m += '</td></tr>';
m += '<tr align=center><td colspan=2><div><span>Sort: <select id="trSortList">';
m += '<option value="none">--Effect--</option>';
for (k in effects)
{
m += '<option value="' + effects[k] + '">'+ effects[k] +'</option>';
}
m += '</select></span></div></td>';
m += "<td> <select id='trSortType'>";
m += " <option value='both'>Either</option>";
m += " <option value='buff'>Buff</option>";
m += " <option value='debuff'>Debuff</option>";
m += "</select></td>";
m += '<td><INPUT id=trSortInactive type=checkbox '+ ( upgradeData.sortInactive ?' CHECKED':'') +'/> Include Inactive</td></tr>';
m += '<tr><td colspan=4><hr/></td></tr>';
m +='</table>';
m += "<div id='trScrollDiv' style='position: static; width: " + upgradeData.organizeW + "; height: " + upgradeData.organizeH + "; overflow-x: auto; overflow-y: auto;'>";
var ii = Math.max(t.itemLists['chair'].length, t.itemLists['table'].length, t.itemLists['window'].length, t.itemLists['banner'].length, t.itemLists['advisor'].length, t.itemLists['trophy'].length, t.itemLists['candelabrum'].length, t.itemLists['hero'].length, t.itemLists['statue'].length, t.itemLists['pet'].length );
m += "<div id='trTableDiv' style='width: 100%;'>";
m += '<TABLE id=trDisplayTable width=100% height=0% class=trTab>';
m += "<tr align=center valign=top><th width=10%>Chairs</th><th width=10%>Tables</th><th width=10%>Windows</th><th width=10%>Banners</th><th width=10%>Advisors</th><th width=10%>Throphies</th><th width=10%>Candelabra</th><th width=10%>Heroes</th><th width=10%>Statues</th><th width=10%>Pets</th></tr>";
m += '</table></div>';
m += '</div>';
m += '</div>';
t.myDiv.innerHTML = m;
t.paintTable();
$(document.querySelector("#trScrollDiv")).resizable({
minWidth: 710,
maxWidth: 900,
minHeight: 180,
/*maxHeight: 560,*/
maxHeight: 1000,
stop: function(event, ui) {
upgradeData.organizeH = ui.size.height + 'px';
upgradeData.organizeW = ui.size.width + 'px';
saveUpgradeData();
}
});
$("#PresetList").click( function() {t.selectPreset( $(this).val());});
$("#testSalvage").click(function() {t.testSalvage();});
$("#clearTags").click(function() {t.clearTags();});
// default to highlight the active preset
document.getElementById ('PresetList').value = Seed.throne.activeSlot;
t.selectPreset(Seed.throne.activeSlot);
$("a.loadGPreset").css('border-color', 'transparent');
$(document.querySelector("#trPresetNum" + Seed.throne.activeSlot)).css('border-color', 'green')
$(document.querySelector("#trSortList")).change( function () {
t.sortEffect = $(this).val();
t.show();
});
$(document.querySelector("#trLocalPresetList")).children("option").hover(
function (e) {
var target = $(e.target);
var id = target.val();
if (id >= 0 ) {
$("#preset_tt").html('<b>' + presetData.ids[id] +':</b> ' + presetData.desc[id]);
$("#preset_tt").addClass('showit');
}
},
function () {
$(document.querySelector("#preset_tt")).removeClass('showit');
}
);
$("#trSortType").change( function() {
t.sortType = $(this).val();
t.show();
});
$("#trSortInactive").change( function() {
t.show();
});
$("#trPresetNumber").change( function() {
presetData.usePreset = $('#trPresetNumber').val();
savePresetData();
});
$(".loadGPreset").click( function () {
var id= $(this).attr('id');
processPresetClick(+id.split("trPresetNum")[1]);
});
$(".loadPreset").click( function () {
var id= $(this).attr('id');
Tabs.organizer.loadLocalPreset(+id.split("trLoad")[1]);
});
$("#trLoad").click( function () {
var preset = $('#trLocalPresetList').val();
if ( preset >= 0) Tabs.organizer.loadLocalPreset(preset);
});
$("#trSave").click( function () {
var preset = $('#trLocalPresetList').val();
if ( preset >= 0) Tabs.organizer.saveLocalPreset(preset);
});
$("#factionFilterRow input").change( function() {
t.show();
});
$("#levelFilterRow input").change( function() {
t.show();
});
$("#trSortList").val(upgradeData.sortSelected);
$("#trSortType").val(upgradeData.buffSelected);
t.sortEffect = upgradeData.sortSelected;
t.sortType = upgradeData.buffSelected;
t.show();
},
setSwitchStatus : function(s) {
$("#trSwitchStatus").html(s);
},
loadLocalPreset : function (id) {
var t = Tabs.organizer;
if (t.switchingPresets)
{
t.setSwitchStatus("Local preset switch still in prgres ....");
return;
}
var items = presetData.items[id];
if (!items || items.length==0)
{
t.setSwitchStatus("Local preset is empty");
return;
}
var c = 0;
t.switchingPresets = true;
var slot = parseInt(presetData.usePreset);
if (!slot ) slot = parseInt(Seed.throne.activeSlot);
// make sure it is in the valid range
if (slot < 1 || slot > Seed.throne.slotNum) slot = parseInt(Seed.throne.activeSlot);
// grab the list of items equipped in the slot about to be switched to
var ei = Seed.throne.slotEquip[slot];
// see if we are already on the correct slot
if (slot != Seed.throne.activeSlot) {
// switch to the correct preset
t.setSwitchStatus("Switching to slot " + slot);
processPresetClick(slot);
c++;
} else {
t.setSwitchStatus("Already in correct slot.");
}
var delay = 7;
for (i in items)
{
if (!items[i]) continue;
// only equip the items not already equipped
if (ei.indexOf(items[i]) < 0)
{
var I = unsafeWindow.kocThroneItems[+items[i]];
if (!I) {
t.setSwitchStatus("Throne room item " + items[i] + " not found");
continue;
}
var f = function (I2, s) {
return function () {
Tabs.organizer.equipItem(I2, s);
Tabs.organizer.setSwitchStatus("Equipping " + I2.name);
};
}
setTimeout (f(I, slot), c*delay*1000); // have to wait at least 5 seconds between switches
c++;
}
else
{
var I = unsafeWindow.kocThroneItems[+items[i]];
//t.setSwitchStatus("Item " + I.name + " is already equipped");
}
}
setTimeout ( function () {
Tabs.organizer.show();
t.switchingPresets = false;
t.setSwitchStatus("Local preset "+ presetData.ids[id] + " loaded.")
}, c* delay*1000 + 1000);
},
saveLocalPreset : function (id) {
var equipedItems = {};
var ei = Seed.throne.slotEquip[Seed.throne.activeSlot];
// convert array to an object
for (j=0; j < ei.length; j++) {
equipedItems[j] = ei[j];
}
presetData.items[id] = equipedItems;
savePresetData();
Tabs.organizer.setSwitchStatus("Local preset " + presetData.ids[id] + " saved.");
},
addTagItem : function (itemId) {
presetData.taggedItems[itemId] = true;
$("#throneInventoryItem" + itemId).prepend("<div class='greenBorder'></div>");
$("div#trCardItem" + itemId).find("div.trCard").append("<div class='greenBorder2' style='border: 8px solid cyan; background: none; width: 184px; height: 288px;'></div>");
savePresetData();
},
removeTagItem : function (itemId) {
if (presetData.taggedItems[itemId])
{
delete presetData.taggedItems[itemId];
$("#throneInventoryItem" + itemId).children(".greenBorder").remove();
$("#trCardItem" + itemId + " div.greenBorder2").remove();
savePresetData();
}
},
// clear all tagged items
clearTags : function() {
var t = Tabs.organizer;
for (k in unsafeWindow.kocThroneItems) {
var throne_item = unsafeWindow.kocThroneItems[k];
t.removeTagItem(throne_item.id);
}
},
equipItem : function ( I, preset) {
if (!I) return;
unsafeWindow.AjaxCall.gPostRequest("ajax/_dispatch53.php", {
ctrl: "throneRoom\\ThroneRoomServiceAjax",
action: "equipItem",
itemId: I.id,
presetId: preset
}, function (u) {
//logit("result: "+ inspect(u,3,1));
if (u.ok === true) {
unsafeWindow.cm.ThroneView.clickItemEquip(I);
Tabs.organizer.show();
} else {
if (I && I.name) {
Tabs.organizer.setSwitchStatus("Unable to equip item " + I.name);
} else {
Tabs.organizer.setSwitchStatus("Unable to equip item");
}
logit("Unable to equip item.");
cm.ModalManager.alert({
button_text: unsafeWindow.g_js_strings.commonstr.ok,
text: u.msg,
"class": "craftFailure",
exe: function () {
unsafeWindow.Modal.hideModalAll();
unsafeWindow.cm.ModalManager.close()
}
})
}
}, function (u) {
logit("equip error");
logit("e:" + inspect(u,3,1));
})
},
showNext : function () {
var t = Tabs.organizer;
if (t.panelId < 0) return;
var X = unsafeWindow.kocThroneItems[t.panelId];
var V = "next";
var P = t.panelType;
var level = X.level || 0;
var quality = X.quality || 0;
var bump = t.panelNextLevel;
if (P == "enhance")
{
if ( (quality + bump ) > 5)
{
bump = 5 - quality;
}
}
else if ( (level + bump) > maxTrLevel)
{
bump = maxTrLevel - level;
}
var R = [],
Q, Y, S, U, N = {},
T, W;
if (V == "next") {
if (P == "enhance") {
quality += bump;
$("#nextStatContainer span").html('<span> ' + X.createPrefix() + ' </span>');
} else {
if (P == "upgrade") {
level += bump;
$("#nextStatContainer span").html('<span> Level ' + level + ' </span>');
}
}
}
$.each(X.effects, function (Z, aa) {
Q = +(Z.split("slot")[1]);
Y = CM.thronestats.effects[aa.id];
S = CM.thronestats.tiers[aa.id][aa.tier];
if (!S) CM.thronestats.tiers[aa.id][aa.tier-1]
var base = S.base || 0;
var growth = S.growth || 0;
U = +(base) + ((level * level + level) * +(growth) / 2);
var wholeNumber = false;
if ( Math.round(U) == U) wholeNumber = true;
if (wholeNumber)
U = U.toFixed(0);
else
U= U.toFixed(2);
if (Q % 2 == 0) {
T = "even"
} else {
T = "odd"
}
if (Q <= quality) {
if (U > 1) {
R.push("<li class='" + T + "'>" + Y[1] + " +" + U + "%</li>")
} else {
R.push("<li class='" + T + "'>" + Y[1] + " " + U + "%</li>")
}
} else {
R.push("<li class='disabled " + T + "'>" + Y[1] + " + " + U + "%</li>")
}
});
if (V == "next") {
if (P == "enhance") {
quality -= bump
} else {
if (P == "upgrade") {
level -= bump;
}
}
}
if (V === "next") {
if (CM.ThronePanelController.isLastLevel(X, P)) {
W = $("<div/>").addClass("lock").attr("id", "lockedStatIcon");
$("#nextStatContainer").append(W)
} else {
$("#lockedStatIcon").remove()
}
}
t.panelNextLevel++;
$("#thronePanelStat2").html(R.join(""));
$("#thronePanelStat2 li").unbind("mouseenter").bind("mouseenter", function (Z) {
unsafeWindow.Tooltip.show(Z, $(this).html(), [-180, 5])
})
},
// highlight the items the salvager will target
testSalvage : function() {
var t = Tabs.organizer;
var s = Tabs.throneSalvage;
var toDelete = s.buildList(true);
$('#trDelResults').html("<div> " + toDelete.length + " item(s) targeted for deletion</div>");
for (i =0; i < toDelete.length; i++)
{
var item = unsafeWindow.kocThroneItems[toDelete[i]];
if (item.isBroken || item.isEquipped)
{
t.selectCard(toDelete[i], "orange");
}
else
{
t.selectCard(toDelete[i], "red");
}
}
},
paintTable : function() {
// fill in the table
var t = Tabs.organizer;
var m = "";
var mm;
var tab = document.getElementById('trDisplayTable');
var ii = Math.max(t.itemLists['chair'].length, t.itemLists['table'].length, t.itemLists['window'].length, t.itemLists['banner'].length, t.itemLists['advisor'].length, t.itemLists['trophy'].length, t.itemLists['candelabrum'].length, t.itemLists['hero'].length, t.itemLists['statue'].length, t.itemLists['pet'].length);
m += "<tr align=center valign=top><th width=10%>Chairs</th><th width=10%>Tables</th><th width=10%>Windows</th><th width=10%>Banners</th><th width=10%>Advisors</th><th width=10%>Throphies</th><th width=10%>Candelabra</th><th width=10%>Heroes</th><th width=10%>Statues</th><th width=10%>Pets</th></tr>";
for (var k= 0; k < ii ; k++)
{
mm = '<TR align=left valign=top style="height: auto;">';
for (i in t.itemTypes)
{
var item = t.itemLists[i][k];
var item_num = 0;
var id="card";
if (item != null)
{
id += item.id;
item_num = item.id;
}
mm += '<TD class="tdcard" style="overflow: visible; width:auto; height: 150px; border: 4px solid white;" id="' + id +'" >';
mm += t.buildCard(t.itemLists[i][k]);
mm += '</TD>';
}
mm += '</TR>';
m+= mm;
}
tab.innerHTML = m;
// repair the height/width caused by the 2d transform
var d = document.getElementById ('trTableDiv');
var t = document.getElementById ('trDisplayTable');
var nodes = t.getElementsByTagName('td');
for (n=0; n < nodes.length; n++)
{
var d2 = nodes[n].childNodes[0];
var h = d2.offsetHeight;
var w = d2.offsetWidth;
d2.style.height = (TABLE_SCALE * h) + "px";
d2.style.width = (TABLE_SCALE * w) + "px";
}
$(".trCardDisp").click( function( A){
var theId = $(this).attr("id").split("trCardItem")[1];
unsafeWindow.cm.ContextualMenuThrone.renderMenu( $(this), unsafeWindow.kocThroneItems[theId]);
});
// add the large tooltip
if (presetData.noTooltips != true) $("td.tdcard").on("mouseenter", "*", function (A) {
A.stopPropagation();
var top = $(this).parents("td.tdcard")
var theId = top.attr("id").split("card")[1];
if (!theId || theId == 0) {
return;
}
var zz;
if (zz = unsafeWindow.kocThroneItems[theId])
{ unsafeWindow.cm.ThroneView.hoverItem(A, top, zz);
$("#kofcNewTooltipDiv").css('position', 'absolute');
$("#kofcNewTooltipDiv").css('left', ($("#tr_dialog").position().left+200) + 'px');
$("#kofcNewTooltipDiv").css('top', A.pageY-350 + 'px');
}
else
{
$("#kofcNewTooltipDiv").remove();
setTimeout( function () {Tabs.organizer.show();}, 200);
}
});
if (presetData.noTooltips != true) $("td.tdcard").on( "mouseleave", "*", function (A) {
var theId = $(this).parents("td.tdcard").attr("id").split("card")[1];
if (unsafeWindow.kocThroneItems[theId]) {}
//unsafeWindow.cm.ThroneView.unhoverItem(A, this, unsafeWindow.kocThroneItems[theId])
});
// add yellow and blue borders
$("div.trCard").removeClass("blueBorder2");
$("div.trCard").removeClass("yellowBorder2");
$("div.trCard").children("div.greenBorder2").remove();
for (ii in queueData.list) {
var list_item = queueData.list[ii];
if (!list_item) continue;
if (list_item.status != "complete") {
var id = list_item.item;
if (list_item.action == "upgrade") $("div#trCardItem" + id).find("div.trCard").addClass("blueBorder2");
if (list_item.action == "enhance") $("div#trCardItem" + id).find("div.trCard").addClass("yellowBorder2");
}
}
for (ii in presetData.taggedItems) {
$("div#trCardItem" + ii).find("div.trCard").append("<div class='greenBorder2' style='border: 8px solid cyan; background: none; width: 184px; height: 288px;'></div>");
}
},
// select a kabam preset
selectPreset : function (p)
{
// highlight the selected set of cards
var t = Tabs.organizer;
t.clearHighlights();
p += "";
if (p.indexOf("local") >=0 ) {
// highlight the local preset
var localNum = +(p.split("local")[1]);
var items = presetData.items[localNum];
if (!items || items.length==0) return;
for (i in items)
{
t.selectCard(items[i], "green");
}
return;
}
// highlight the standard preset
var equipedItems = Seed.throne.slotEquip[parseInt(p)];
if (equipedItems != null)
{
for (ll =0; ll < equipedItems.length; ll++)
{
t.selectCard(equipedItems[ll], "green");
}
}
},
// fill the lists w/ the current TR items
fillLists : function ()
{
var t = Tabs.organizer;
for (i in t.itemTypes)
{
t.itemLists[i] = new Array;
}
for (k in unsafeWindow.kocThroneItems) {
var throne_item = unsafeWindow.kocThroneItems[k];
// apply filters
var faction = throne_item.faction;
var level = throne_item.level;
if (!($('#trFaction'+faction).is(':checked')) ) continue;
if (!($('#trLevel'+level).is(':checked')) ) continue;
// put the equipped items first
if (throne_item.isEquipped)
t.itemLists[throne_item.type].unshift(throne_item);
else
t.itemLists[throne_item.type].push(throne_item);
}
},
// sort the lists in the desired order
sortLists : function ()
{
var t = Tabs.organizer;
upgradeData.sortInactive = ($("#trSortInactive").attr('checked') == 'checked');
for (i in t.itemLists)
{
t.itemLists[i].sort( function (item1, item2) {
return t.sortValue(item2) - t.sortValue(item1);
});
}
},
sortValue : function (item)
{
var t = Tabs.organizer;
var retValue = 0.0;
for (e in item.effects)
{
try {
var N = item.effects[e];
var effect=CM.thronestats.effects[N.id][1];
var tier=CM.thronestats.tiers[N.id][N.tier];
if (!tier) CM.thronestats.tiers[N.id][N.tier-1]
var B=+(e.split("slot")[1]);
var base = tier.base || 0;
var level = item.level || 0;
var growth = tier.growth || 0;
var quality = item.quality || 0;
if (B> quality && !upgradeData.sortInactive)
{
return +retValue;
}
var percent=+( base+(( level* level+ level)* growth*0.5));
if ( (effect == (t.sortEffect + " Debuff")) && (t.sortType != "buff"))
{
retValue -= percent;
}
else if (effect == t.sortEffect && t.sortType != "debuff")
{
retValue += percent;
}
} catch (e) {
}
}
return +retValue;
},
// clear all the highlists
clearHighlights : function()
{
var t = Tabs.organizer;
for (k in unsafeWindow.kocThroneItems)
{
var throne_item = unsafeWindow.kocThroneItems[k];
t.selectCard(throne_item.id, "white");
}
},
// highlight a card
selectCard : function(itemId, color)
{
var t = Tabs.organizer;
var item = unsafeWindow.kocThroneItems[itemId];
if (item) t.selectedItems[item.type] = itemId;
td = document.getElementById( "card"+itemId);
if (td)
{
td.style.borderColor = color;
}
},
clearCards : function()
{
var t = Tabs.organizer;
for (k in t.selectedItems)
{
var td = document.getElementById( "card" + t.selectedItems[k]);
if (td)
{
td.style.borderColor = "white";
}
}
t.selectedItems = [];
},
// create the card to display
buildCard : function(I){
var t = Tabs.organizer;
var D = [];
var w=CM.thronestats.mightByQuality;
var z=CM.thronestats.mightByLevel;
var text_only = false;
if (I == null)
{
D.push("<div>");
D.push("</div>");
return D.join("");
}
D.push("<div class='trCardDisp' id='trCardItem" + I.id + "' style='border: 1px solid white; clear: both; overflow: visible; position: relative; left: 0px; top: 0px; -moz-transform: scale(" + TABLE_SCALE + ", "+ TABLE_SCALE + "); -moz-transform-origin: 0% 0%; -webkit-transform: scale(" + TABLE_SCALE + ", "+ TABLE_SCALE + "); -webkit-transform-origin: 0% 0%;);'>");
if (I.isBroken)
{
D.push(" <div class='cardOverlay semi_transparent rot45'> Broken </div>");
}
D.push(" <div class='trCard' style='white-space: normal; padding: 0px;'> ");
D.push("<div class='section' style='overflow: visible;' id = 'idsection'>");
D.push(" <div class='title "+I.createPrefix().toLowerCase()+"' style='text-transform: capitalize;'> ");
D.push(I.name);
if (!text_only) D.push(" ["+I.id+"]");
D.push(" </div> ");
D.push(" <div class='description'> ");
if (!text_only)
{
D.push(" <div class='portrait "+I.faction+" "+I.type+"'> </div> ");
D.push("<ul>");
D.push("<li> "+uW.g_js_strings.commonstr.faction+": "+I.faction+"</li>");
D.push("<li> "+uW.g_js_strings.commonstr.quality+": "+I.createPrefix()+"</li>");
D.push("<li> "+uW.g_js_strings.commonstr.type+": "+I.type+"</li>");
D.push("<li> "+uW.g_js_strings.commonstr.level+": "+I.level+"</li>");
D.push("<li> "+uW.g_js_strings.commonstr.might+": "+(w[I.quality].Might+z[I.level].Might)+"</li>");
D.push("</ul>");
D.push(" </div> ");
D.push(" <ul> ");
}
for (M in I.effects)
{
try {
var N = I.effects[M];
effect=CM.thronestats.effects[N.id];
tier=CM.thronestats.tiers[N.id][N.tier];
if (!tier) tier=CM.thronestats.tiers[N.id][N.tier-1];
var base = tier.base || 0;
var level = I.level || 0;
var growth = tier.growth ||0;
percent=+(base+((level*level+level)*growth*0.5));
var wholeNumber = false;
if ( Math.round(parseFloat(percent)) == parseFloat(percent)) wholeNumber = true;
percent=(percent>0)?"+"+percent:+percent;
if (wholeNumber)
percent = parseFloat(percent).toFixed(0);
else
percent= parseFloat(percent).toFixed(2);
// percent=Math.ceil(percent);
css=(M%2===0)?"even":"odd";
B=+(M.split("slot")[1]);
if(B<=I.quality){
D.push(" <li class='effect "+css+"'> "+percent+"% "+effect[1]+" </li> ");
}else{
D.push(" <li class='effect disabled "+css+"'> "+percent+"% "+effect[1]+" </li> ");
}
}
catch (e) {}
}
D.push(" </ul> ");
D.push(" </div> ");
D.push(" </ul> ");
D.push(" </div> ");
D.push(" </div> ");
return D.join("");
},
show: function(){
var t = Tabs.organizer;
t.fillLists();
t.sortLists()
t.paintTable();
t.selectPreset(document.getElementById ('PresetList').value);
},
hide: function(){
}
}
/** ********************************* Log Tab ********************************** */
Tabs.trActionLog = {
tabOrder: 600,
tabLabel : 'Log',
myDiv : null,
logTab : [null, null, null],
maxEntries: 300,
saveEntries : [[],[],[]],
state : null,
init : function (div){
var t = Tabs.trActionLog;
t.myDiv = div;
t.myDiv.innerHTML = '<div id=logScroll style=" position: static; width: 710px; height: 500px; overflow-x: hidden; overflow-y: auto;" >\
<DIV class=trStat>UPGRADE LOG - VERSION: '+ Version+'</div>\
<DIV style="height:535px; max-height:535px;">\
<TABLE cellpadding=0 cellspacing=0 id=trsuccesslog class=trTabLined width=100%><TR><TD width=20%></td><TD width=80%></td></tr></table>\
<DIV class=trStat>Action Log</div>\
<TABLE cellpadding=0 cellspacing=0 id=tractionlog class=trTabLined width=100%><TR><TD width=20%></td><TD width=80%></td></tr></table>\
<DIV class=trStat>Salvage Log</div>\
<TABLE cellpadding=0 cellspacing=0 id=trsalvagelog class=trTabLined width=100%><TR><TD width=20%></td><TD width=80%></td></tr></table></div></div>';
t.logTab[0] = document.getElementById('trsuccesslog');
t.logTab[1] = document.getElementById('tractionlog');
t.logTab[2] = document.getElementById('trsalvagelog');
t.state = 1;
for (var j=0; j<3; j++)
{
var logVar = 'trlog_';
if (j !=0) logVar += (j + "_")
logVar += getServerId();
var a = JSON2.parse(GM_getValue (logVar, '[]'));
if (matTypeof(a) == 'array'){
t.saveEntries[j] = a;
for (var i=0; i<t.saveEntries[j].length; i++)
t._addTab(j, t.saveEntries[j][i].msg, t.saveEntries[j][i].ts);
}
}
window.addEventListener('unload', t.onUnload, false);
$("#logScroll").resizable({
minWidth: 710,
maxWidth: 1000,
minHeight: 180,
maxHeight: 1100,
stop: function(event, ui) {
upgradeData.logH = ui.size.height + 'px';
upgradeData.logW = ui.size.width + 'px';
saveUpgradeData();
}
});
$("#logScroll").css('height', upgradeData.logH).css('width', upgradeData.logW);
},
hide : function (){
},
show : function (){
},
onUnload : function (){
var t = Tabs.trActionLog;
if (!ResetAll) GM_setValue ('trlog_'+getServerId(), JSON2.stringify(t.saveEntries[0]));
if (!ResetAll) GM_setValue ('trlog_1_'+getServerId(), JSON2.stringify(t.saveEntries[1]));
if (!ResetAll) GM_setValue ('trlog_2_'+getServerId(), JSON2.stringify(t.saveEntries[2]));
},
_addTab : function (lnum, msg, ts){
var t = Tabs.trActionLog;
if (t.state != 1)
return;
if (t.logTab[lnum].rows.length >= t.maxEntries)
t.logTab[lnum].deleteRow(t.maxEntries-1);
var row = t.logTab[lnum].insertRow(0);
row.vAlign = 'top';
row.insertCell(0).innerHTML = ts;
row.insertCell(1).innerHTML = msg;
},
log : function (lnum, msg){
var t = Tabs.trActionLog;
var d = new Date();
var ts = d.toDateString().substring(3,10) + " "+ d.toTimeString().substring(0,8);
t._addTab (lnum, msg, ts);
while (t.saveEntries[lnum].length >= 30)
t.saveEntries[lnum].shift();
t.saveEntries[lnum].push ({msg:msg, ts:ts});
}
}
function trSuccessLog (msg){
if (!Tabs.trActionLog.tabDisabled)
Tabs.trActionLog.log (0,msg);
}
function trActionLog (msg){
if (!Tabs.trActionLog.tabDisabled)
Tabs.trActionLog.log (1,msg);
}
function trSalvageLog (msg){
if (!Tabs.trActionLog.tabDisabled)
Tabs.trActionLog.log(2,msg);
}
/** ***************** options ********************* */
Tabs.options = {
tabOrder: 700,
tabLabel: 'Options',
myDiv : null,
init : function (div) {
var t = Tabs.options;
t.myDiv = div;
// header stuff
var m = '<Div id=optionScroll style=" position: static; width: 700px; height: 500px; overflow-x: hidden; overflow-y: auto;">';
m += '<DIV id=trOptions class=trStat>OPTIONS</div><TABLE id=trOptionTbl width=100% height=0% class=trTab>';
m += '<TR><TD width=100%><INPUT id=trupdate type=checkbox '+ (TRGlobalOptions.trUpdate?'CHECKED ':'') +'/>Check for script updates on userscripts.org (all domains) <INPUT id=trupdatenow type=button value="Update Now" /></TD></TR>';
m += '<TR><TD width=100%><INPUT id=trDisableAnim type=checkbox '+ (upgradeData.disableAnim?'CHECKED ':'') +'/> Disable failure animation (Big red X) </TD></TR>';
m += '<TR><TD width=100%><INPUT id=trPresetOption type=checkbox '+ (upgradeData.presetWidget?'CHECKED ':'') +'/> Enable preset selector widget (requires refresh)</TD></TR>';
m += '<TR><TD width=100%>Reset guardian/preset widget locations<INPUT id=trResetWidgets type=button value="Reset" /></TD></TR>';
m += '<TR><td><div class=trStat>Salvage Options</div></td></TR>';
m += '<tr><td><div>Load salvager settings from domain number: <INPUT id=trLoadDomain type=text size=3 maxlength=3 /><INPUT id=trLoadRules type=button value="Load"/></div></td></tr>';
m += '<TR><TD><div style="white-space: pre;" ><INPUT id=trSalMinCity type=checkbox '+ (salvageData.minCity?' CHECKED':'') +'/> Keep minimum aetherstone in each city. ';
m += ' Minimum number of aetherstones: <INPUT id=trSalMinStone type=text size=7 maxlength=7 value="' + salvageData.minStones+ '"/></div></td></TR>';
m += '<TR><TD>Minimum method: <select id=trMinMethod><option value="order">City order</option><option value="lowest">Lowest city</option> </select></TD></TR>';
m += '<TR><TD><div style="white-space: pre;" ><INPUT id=trSalAnyCity type=checkbox '+ (salvageData.anyCity?' CHECKED':'') +'/> When primary city is full, put aetherstones in any city. ';
m += ' Maximum number of aetherstones: <INPUT id=trMaxStone type=text size=7 maxlength=7 value="' + salvageData.maxStones+ '"/></div></td></TR>';
m += '<TR><TD>Overflow method: <select id=trOverflow><option value="order">City order</option><option value="lowest">Lowest city</option> </select></TD></TR>';
m += '<TR><TD><div style="white-space: pre;" ><INPUT id=trSalUpgradeFirst type=checkbox '+ (salvageData.upgradeFirst?' CHECKED':'') +'/> Upgrade items to +1 before deleting.';
m += ' Maximum quality: <select id="trSalUpgradeQuality">';
m += '<option value="0">'+ uW.g_js_strings.throneRoom.simple +'</option>';
m += '<option value="1">'+ uW.g_js_strings.throneRoom.common +'</option>';
m += '<option value="2">'+ uW.g_js_strings.throneRoom.uncommon +'</option>';
m += '<option value="3">'+ uW.g_js_strings.throneRoom.rare +'</option>';
m += '<option value="4">'+ uW.g_js_strings.throneRoom.epic +'</option>';
m += '<option value="5">'+ uW.g_js_strings.throneRoom.wondrous +'</option>';
m += '</select> </div></td></tr>';
m += '<TR><TD><div style="white-space: pre;" ><INPUT id=trSalUpgradeManual type=checkbox '+ (salvageData.upgradeManual?' CHECKED':'') +'/> Upgrade items to +1 on manual delete.</td></tr>';
m += '<TR><td><div class=trStat>Upgrade Options</div></td></TR>';
m += '<tr><td width=25%>Retry interval (seconds): <INPUT id=trUpRefresh type=text size=3 maxlength=3 value="' +upgradeData.retryInterval+ '"/></td></tr>';
m += ' <tr><td colspan=2><div style="white-space: pre;"><INPUT id=trAnyCity type=checkbox '+ (upgradeData.anyCity?' CHECKED':'') +'/> When primary city is low, use aetherstones from any city. ';
m += ' Minimum number of aetherstones: <INPUT id=trMinStone type=text size=7 maxlength=7 value="' +upgradeData.minStones+ '"/> </div></td></tr>';
m += '<tr><td colspan=2> <INPUT id=trWhisperCheck type=checkbox '+ (upgradeData.whisperToMe?'CHECKED ':'') +'/> Whisper to myself on successful upgrades</td></tr> ';
m += '<tr><td colspan=2> <INPUT id=trBuffsCheck type=checkbox '+ (upgradeData.buffsOff?'CHECKED ':'') +'/> Prevent Kabam from automatically selecting upgrade tokens</td></tr> ';
m += '<tr><td colspan=2><INPUT id=trSafetyCheck type=checkbox '+ (upgradeData.safetyOn?'CHECKED ':'') +'/> Disable manual upgrades if less than <input id=trSafetyLimit size=10 maxlength=10 value="' + upgradeData.safetyLimit +'" /> aetherstone</td></tr> ';
m += '<tr><td colspan=2><INPUT id=trTokenCheck type=checkbox '+ (upgradeData.removeTokens?'CHECKED ':'') +'/> Remove master and lucky tokens from upgrade panel </td></tr> ';
m += '<tr><td colspan=2><INPUT id=trMultiUp type=checkbox '+ (upgradeData.multiUpgrade?'CHECKED ':'') +'/> Add button for combined upgrade/enhancement</td></tr> ';
m += '<tr><td colspan=2><INPUT id=trNoMassS type=checkbox '+ (upgradeData.noMassSalvage?'CHECKED ':'') +'/> Remove button for Mass Salvage</td></tr> ';
m += '<tr><td colspan=2><INPUT id=trSalvageSafety type=checkbox '+ (upgradeData.salvageSafety?'CHECKED ':'') +'/> Remove Salvage button for the first <INPUT id=trSafetyNum type=text size=3 maxlength=3 value="' +upgradeData.numSafety+ '"/> items</td></tr> ';
m += '<TR><td><div class=trStat>Organizer Options</div></td></TR>';
m += '<TR><td><div style="text-align:center;"> Local Preset Names/Descriptions</div></td></TR>';
for (j=0; j<presetData.num_presets; j++ )
{
if (!presetData.desc[j]) presetData.desc[j] = 'Preset ' + String.fromCharCode(65 + j);
if (!presetData.ids[j]) presetData.ids[j] = String.fromCharCode(65 + j);
m += '<tr><td style="width: 650px; white-space: nowrap;">Name: <INPUT class=trNameEntry id=trPresetName' + j + ' type=text size=8 maxlength=8 value="' + presetData.ids[j] + '"/> Description: <INPUT class=trDescEntry id=trPresetDesc' +j+' type=text size=80 maxlength=100 value="' + presetData.desc[j] + '"/></td></tr>';
}
m += '<TR><TD><div style="white-space: pre;" >Number of presets: <INPUT id=trNumPresets type=text size=4 maxlength=2 value="' +presetData.num_presets+ '"/> <INPUT id=trNoTooltips type=checkbox '+ (presetData.noTooltips?' CHECKED':'') +'/> Do not show large portrait tooltips</div></td></tr>';
m += '</table></div>';
t.myDiv.innerHTML = m;
$("#optionScroll").resizable({
minWidth: 710,
maxWidth: 810,
minHeight: 300,
maxHeight: 780,
stop: function(event, ui) {
upgradeData.optionH = ui.size.height + 'px';
upgradeData.optionW = ui.size.width + 'px';
saveUpgradeData();
}
});
$("#optionScroll").css('height', upgradeData.optionH).css('width', upgradeData.optionW);
$('#trDisableAnim').change( function (){
upgradeData.disableAnim = document.getElementById('trDisableAnim').checked;
disableAnimation(upgradeData.disableAnim);
saveUpgradeData();
}
);
$('#trPresetOption').change( function (){
upgradeData.presetWidget = document.getElementById('trPresetOption').checked;
saveUpgradeData();
}
);
$('#trupdate').change( function (){
TRGlobalOptions.trUpdate = document.getElementById('trupdate').checked;
GM_setValue ('TROptions_??', JSON2.stringify(TRGlobalOptions));
}
);
$('#trWhisperCheck').change( function (){
upgradeData.whisperToMe = document.getElementById('trWhisperCheck').checked;
saveUpgradeData();
}
);
$('#trSafetyCheck').change( function (){
upgradeData.safetyOn = document.getElementById('trSafetyCheck').checked;
saveUpgradeData();
}
);
$('#trTokenCheck').change( function (){
upgradeData.removeTokens = document.getElementById('trTokenCheck').checked;
saveUpgradeData();
}
);
$('#trMultiUp').change( function (){
upgradeData.multiUpgrade = document.getElementById('trMultiUp').checked;
saveUpgradeData();
}
);
$('#trNoMassS').change( function (){
upgradeData.noMassSalvage = document.getElementById('trNoMassS').checked;
saveUpgradeData();
});
$('#trSalvageSafety').change( function (){
upgradeData.salvageSafety = document.getElementById('trSalvageSafety').checked;
saveUpgradeData();
});
$("#trSafetyNum").change ( function() {
upgradeData.numSafety = parseInt($("#trSafetyNum").val());
saveUpgradeData();
});
$('#trBuffsCheck').change( function (){
upgradeData.buffsOff = document.getElementById('trBuffsCheck').checked;
saveUpgradeData();
}
);
$('#trSafetyLimit').change( function (){
upgradeData.safetyLimit = parseInt($("#trSafetyLimit").val());
saveUpgradeData();
}
);
$('#trupdatenow').click(
function() { AutoUpdater_132329.call(true,true); }
);
$('#trResetWidgets').click(
function() { resetGuardWidget(); resetPresetWidget(); }
);
$('#trSalMinCity').change( function(){
salvageData.minCity = document.getElementById('trSalMinCity').checked;
saveSalvageData();
});
$('#trSalAnyCity').change( function(){
salvageData.anyCity = document.getElementById('trSalAnyCity').checked;
saveSalvageData();
});
$('#trSalUpgradeFirst').change( function(){
salvageData.upgradeFirst = document.getElementById('trSalUpgradeFirst').checked;
saveSalvageData();
});
$('#trSalUpgradeManual').change( function(){
salvageData.upgradeManual = document.getElementById('trSalUpgradeManual').checked;
saveSalvageData();
});
// set the upgrade quality limit widget
$("#trSalUpgradeQuality").val(salvageData.upgradeFirstQual);
$("#trSalUpgradeQuality").change( function() { salvageData.upgradeFirstQual = $("#trSalUpgradeQuality").val(); saveSalvageData();});
$("#trSalMinStone").change ( function() {
salvageData.minStones = $("#trSalMinStone").val();
saveSalvageData();
});
$("#trMaxStone").change ( function() {
salvageData.maxStones = $("#trMaxStone").val();
saveSalvageData();
});
$('#trUpRefresh').change( function(){
upgradeData.retryInterval = parseInt(document.getElementById('trUpRefresh').value);
if (upgradeData.retryInterval < 15) upgradeData.retryInterval = 15;
saveUpgradeData();
});
$("#trMinStone").change ( function() {
upgradeData.minStones = $("#trMinStone").val();
saveUpgradeData();
});
$("#trLoadRules").click(function () {
var d = $("#trLoadDomain").val();
if (d != null)
loadSalvageData(d);
});
// set the overflow widget
$("#trOverflow").val(salvageData.overflow);
$("#trOverflow").change( function() { salvageData.overflow = $("#trOverflow").val(); saveSalvageData();});
$("#trMinMethod").val(salvageData.minMethod);
$("#trMinMethod").change( function() { salvageData.minMethod = $("#trMinMethod").val(); saveSalvageData();});
// read the preset names and descriptions
$("input.trNameEntry").change(function () {
var id= $(this).attr('id');
var num = id.split("trPresetName")[1];
presetData.ids[num]= $(this).val();
savePresetData();
Tabs.organizer.init(Tabs.organizer.myDiv);
});
$("input.trDescEntry").change (function () {
var id= $(this).attr('id');
var num = id.split("trPresetDesc")[1];
presetData.desc[num]= $(this).val();
savePresetData();
Tabs.organizer.init(Tabs.organizer.myDiv);
});
$('#trNoTooltips').change( function(){
presetData.noTooltips = document.getElementById('trNoTooltips').checked;
savePresetData();
Tabs.organizer.show();
});
$("#trNumPresets").change ( function() {
var newNum = $("#trNumPresets").val();
if (presetData.num_presets != newNum)
{
presetData.num_presets = newNum;
t.init(t.myDiv);
savePresetData();
Tabs.organizer.init(Tabs.organizer.myDiv);
}
});
disableAnimation(upgradeData.disableAnim);
},
show : function () {
},
hide : function () {
}
}
/** ********************************* Cap Tab ********************************** */
Tabs.caps = {
tabOrder: 800,
tabLabel : 'Caps',
myDiv : null,
init : function (div){
var t = Tabs.caps
t.myDiv = div;
var m = '<DIV id=trCaps class=trStat width=100%>Throne Room Caps</div>';
m += '<TABLE id=trCapTbl width=100%">';
m += '<TR><TD width="250px"><B>Effect</b></td><TD width="50px"><B>Max</b></td><TD><B>Min</b></td><TD style="border:0;width:50px"></td><TD width="250px"><B>Effect</b></td><TD width="50px"><B>Max</b></td><TD width="50px"><B>Min</b></td></tr><TR>';
//Throne room caps grab loop from Power Bot
//Original Authors : KoC Scripters
var counter =0;
for (k in unsafeWindow.cm.thronestats.boosts){
counter++
var boost = unsafeWindow.cm.thronestats.boosts[k]
m += '<TD>'+ boost.BoostName + '</td><TD>'+ boost.Max +'<SPAN id=maxPerc_'+k+'></div></td><TD>' + boost.Min + '<SPAN id=minPerc_'+k+'></div>';
if (counter % 2 == 0){
m += '<TR>';
}else {
m += '</td><TD style="border:0">';
}
}
t.myDiv.innerHTML = m;
for (k in unsafeWindow.cm.thronestats.boosts){
var boost = unsafeWindow.cm.thronestats.boosts[k]
if (boost.CapType == "percent"){
document.getElementById('maxPerc_'+k).innerHTML = '%'
if (boost.Min != "none"){
document.getElementById('minPerc_'+k).innerHTML = '%'
}
}
}
},
show : function (){
},
hide : function (){
}
}
/** ***************** Throne upgrade ********************* */
Tabs.upgrader = {
tabOrder: 100,
tabLabel: 'Upgrade',
tabDisabled : false,
myDiv : null,
repairId : 0,
repairEnd : 0,
timerH : null,
clearTimerH : null,
qualities : [ uW.g_js_strings ? uW.g_js_strings.throneRoom.simple: "Simple",
uW.g_js_strings ? uW.g_js_strings.throneRoom.common : "Common",
uW.g_js_strings ? uW.g_js_strings.throneRoom.uncommon : "Uncommon",
uW.g_js_strings ? uW.g_js_strings.throneRoom.rare : "Rare",
uW.g_js_strings ?uW.g_js_strings.throneRoom.epic : "Epic",
uW.g_js_strings ?uW.g_js_strings.throneRoom.wondrous : "Wondrous"],
upgradePath : {
0: {maxLev: 2, nextQual: 2 },
1: {maxLev: 2, nextQual: 2 },
2: {maxLev: 3, nextQual: 4 },
3: {maxLev: 3, nextQual: 4 },
4: {maxLev: 4, nextQual: 5 }
},
repaint : function() {
var t = Tabs.upgrader;
t.init(t.myDiv);
},
init : function (div){
var t = Tabs.upgrader;
t.myDiv = div;
if (unsafeWindow.g_js_strings)
{
t.qualities = [ unsafeWindow.g_js_strings.throneRoom.simple,
unsafeWindow.g_js_strings.throneRoom.common,
unsafeWindow.g_js_strings.throneRoom.uncommon,
unsafeWindow.g_js_strings.throneRoom.rare,
unsafeWindow.g_js_strings.throneRoom.epic,
unsafeWindow.g_js_strings.throneRoom.wondrous];
}
// header stuff
var m = '<Div id=trfield><DIV id=trUpgrader class=trStat>AUTOMATED UPGRADER</div><TABLE id=trupgrader width=100% height=0% class=trTab>';
m+= '</table></div>';
//
m += '<TABLE width=100% id=trupdtable class=trTabPad>';
m += '<tr>';
if (upgradeData.active == false) {
m += '<TD width=25%><div><INPUT id=trUpgraderPower type=button value="Upgrade = OFF"/></div></td>';
} else {
m += '<TD width=25%><div><INPUT id=trUpgraderPower type=button value="Upgrader = ON"/></div></td>';
}
m += '<td width=25%><INPUT id=trOneItem type=checkbox '+ (queueData.oneItem ? ' CHECKED':'') +'/> Upgrade 1 at a time</td>';
m += '<td width=25%><INPUT id=trRepairAll type=checkbox '+ (upgradeData.repairAll?' CHECKED':'') +'/> Repair all TR items</td>';
m += '<td width=25%/></tr>';
m += ' <tr><td colspan=3><div ><b>City to use aetherstones from: </b><span id="trUpgradeCity"></span></div></td>';
m += ' <td><div id=trStoneRemain></div></td></tr>';
m += '<tr><td colspan=4><hr></td></tr>';
m += '<tr align="center"><td colspan=4><div id=trUpgradeStatus class=indent25> <br> </div></td></tr>';
m += '<tr align="center"><td colspan=4><div id=trLastResult class=indent25> <br> </div></td></tr>';
m += '<tr><td colspan=4><hr></td></tr></table>';
m += '<TABLE id=trupdtable2 class=trTabPad>';
m += '<tr><td><div style="max-width:90%;">Item: <select id="trUpgradeList" style="width: 80%;">';
m += '<option value="0">--Items--</option>';
for (k in unsafeWindow.kocThroneItems) {
var throne_item = unsafeWindow.kocThroneItems[k];
m += '<option value="'+k+'">'+throne_item.name+' [ ' + throne_item.id +' ] </option>';
}
m += '</select></div></td>';
m += '<td><div id=trActionDiv>Action: <select id="trAction">';
m += '<option value="upgrade">Upgrade</option>';
m += '<option value="enhance">Enhance</option>';
m += '<option value="both">Both</option>';
m += '</select></div></td>';
m += '<td><div id=trMaxDiv></div></td>';
m += "<td><div><INPUT id=trQueueAdd type=button value='Add'/></div></td></tr>";
m += '<tr><td colspan=4><hr/</td></tr>';
m += '<tr><td colspan=4><div id=trQScroll style=" position: static; width: 700px; height: 300px; overflow-x: visible; overflow-y: auto;"><div id=trQDiv /></div></td></tr>';
m += '<tr align=center><div><td><input style="float: left;" id=trClearQ type=button value="Clear Queue"/></div></td><td colspan=1></td><td colspan=2><a id=trpplink><img id=trpp /></a></td></tr>';
m += '</table>';
m+='</div>';
t.myDiv.innerHTML = m;
$('#trClearQ').click( function() {
queueData.list =[];
saveQueueData();
Tabs.upgrader.buildQueueDisplay();
});
$("#trQScroll").resizable({
minWidth: 710,
maxWidth: 1200,
minHeight: 200,
maxHeight: 800,
stop: function(event, ui) {
upgradeData.upgradeH = ui.size.height + 'px';
upgradeData.upgradeW = ui.size.width + 'px';
saveUpgradeData();
}
});
$("#trQScroll").css('height', upgradeData.upgradeH).css('width', upgradeData.upgradeW);
$("#trpplink")
.attr('href', 'https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=FDW4NZ6PRMDMJ&lc=US&item_name=TR%20Organizer%20Donations&item_number=1001¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted')
.attr('target', '_blank');
$("#trpp")
.attr( 'src', 'https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif')
.attr( 'alt', 'dontae')
.css( 'cursor', 'pointer');
document.getElementById('trUpgraderPower').addEventListener('click', function(){t.togglePower(this);} , false);
document.getElementById('trRepairAll').addEventListener('change', function(){
upgradeData.repairAll = document.getElementById('trRepairAll').checked;
saveUpgradeData();
}, false);
document.getElementById('trAnyCity').addEventListener('change', function(){
upgradeData.anyCity = document.getElementById('trAnyCity').checked;
saveUpgradeData();
}, false);
new CdispCityPicker ('trupcitysel', document.getElementById('trUpgradeCity'), true, t.e_CityButton, upgradeData.uCityNum);
// wait for the current repair to finish before starting
t.setStones( Seed.resources["city" + Seed.cities[upgradeData.uCityNum][0]]["rec5"][0]);
t.setStatus("Loading ....");
//$(div).append(m);
$("#trQDiv").html('<div><table id="trQueue" class="trTabLined" width="100%"/></div>');
$("#trQueueAdd").click( function () { t.addQueue();});
$("#trOneItem").change( function () {
queueData.oneItem = document.getElementById('trOneItem').checked;
saveQueueData();
});
var d = 2 + Math.random() * 8;
if (Seed.queue_throne != null && Seed.queue_throne.end != null)
{
var repairTimeLeft = Seed.queue_throne.end- unixTime();
t.repairEnd = Seed.queue_throne.end;
t.repairId = Seed.queue_throne.itemId;
var n = new Date(t.repairEnd *1000);
t.setStatus("Waiting until " + n.toLocaleTimeString() + " for repair to complete. Item: " + unsafeWindow.kocThroneItems[t.repairId].name);
setTimeout(t.clearRepair, (repairTimeLeft+1)*1000);
if (repairTimeLeft >0) d += repairTimeLeft;
}
t.buildLevelWidget();
t.buildQueueDisplay();
$("#trAction").change( function() {t.buildLevelWidget();});
if (t.timerH == null)
t.timerH = setTimeout(t.doAction, d*1000);
},
e_CityButton : function (city, x, y){
var t = Tabs.upgrader;
upgradeData.uCityNum = city.idx;
saveUpgradeData();
t.setStones(Seed.resources["city" + Seed.cities[upgradeData.uCityNum][0]]["rec5"][0]);
},
addUpgradeItem : function(id) {
var t = Tabs.upgrader;
var qItem = new QueueItem();
qItem.item = id;
qItem.action = "upgrade";
qItem.level = maxTrLevel;
queueData.list.push(qItem);
saveQueueData();
$("div#throneInventoryItem" + id).addClass('blueBorder');
$("div#trCardItem" + id).find("div.trCard").addClass("blueBorder2");
t.buildQueueDisplay();
},
addEnhanceItem : function(id) {
var t = Tabs.upgrader;
var qItem = new QueueItem();
qItem.item = id;
qItem.action = "enhance";
qItem.level = 5;
queueData.list.push(qItem);
saveQueueData();
$("div#throneInventoryItem" + id).addClass('yellowBorder');
$("div#trCardItem" + id).find("div.trCard").addClass("yellowBorder2");
t.buildQueueDisplay();
},
addBothItem : function (id) {
var t = Tabs.upgrader;
var throne_item = unsafeWindow.kocThroneItems[id];
if (!throne_item)
{
logit("Unable to find throne item.");
return;
}
var qual = +throne_item.quality;
var lev = +throne_item.level;
if (qual >= 5) {
logit("Item already at wondrous");
return;
}
var maxLev = null;
var nextQual = null;
var qItem = null;
while (qual < 5) {
maxLev = t.upgradePath[qual].maxLev;
nextQual = t.upgradePath[qual].nextQual;
if (lev < maxLev) {
qItem = new QueueItem();
qItem.item = id;
qItem.action = "upgrade";
qItem.level = maxLev;
queueData.list.push(qItem);
$("div#throneInventoryItem" + id).addClass('blueBorder');
$("div#trCardItem" + id).find("div.trCard").addClass("blueBorder2");
}
qItem = new QueueItem();
qItem.item = id;
qItem.action = "enhance";
qItem.level = nextQual;
queueData.list.push(qItem);
$("div#throneInventoryItem" + id).addClass('yellowBorder');
$("div#trCardItem" + id).find("div.trCard").addClass("yellowBorder2");
lev = maxLev;
qual = nextQual;
}
saveQueueData();
t.buildQueueDisplay();
},
doAction :function ()
{
var t = Tabs.upgrader;
var retryTime = upgradeData.retryInterval;
try {
// check if repair is done
var ti = t.clearRepair();
if ( ti <= 0)
{
// repair is done
if (queueData.oneItem || (queueData.doingRepairs == true))
{
if (upgradeData.repairAll == true)
{
var lastBroken = 0;
// repair everything
for (k in unsafeWindow.kocThroneItems)
{
var throne_item = unsafeWindow.kocThroneItems[k];
if (!throne_item) continue;
if (throne_item.isBroken)
{
lastBroken = throne_item.id;
}
}
// repair from the botton up. This forces the items broken in the +1 upgrades to be fixed first so the salvager can continue
if (lastBroken != 0)
{
t.doRepair(lastBroken);
clearTimeout(t.timerH);
t.timerH = setTimeout(t.doAction, retryTime*1000);
return;
}
} else {
// repair first broken item in queue
for (k in queueData.list)
{
var q = queueData.list[k];
if (!q) continue;
var throne_item = unsafeWindow.kocThroneItems[q.item];
if ((throne_item == null) || (queueData.list[k].status == "complete"))
continue;
if ( throne_item.isBroken )
{
t.doRepair(throne_item.id);
clearTimeout(t.timerH);
t.timerH = setTimeout(t.doAction, retryTime*1000);
return;
} else if (queueData.oneItem) {
break;
}
}
}
}
// all repairs complete
queueData.doingRepairs = false;
// set the index
t.selectNext();
saveQueueData();
// if we reach the end of the queue, start repair cycle
if (queueData.index <0) {
t.setStatus("Reached end of queue.")
queueData.doingRepairs = true;
saveQueueData();
clearTimeout(Tabs.upgrader.timerH);
t.timerH = setTimeout(t.doAction, retryTime*1000);
return;
}
// upgrade/enhance next item
var qItem = queueData.list[queueData.index];
if (qItem) {
//qItem.triesTotal++;
//qItem.triesThis++;
if (qItem.action == "enhance")
t.doEnhance(qItem.item);
else
t.doUpgrade(+qItem.item, false);
}
} else {
// come back after repair is complete
retryTime = ti + 5;
var n = new Date(t.repairEnd *1000);
t.setStatus("Waiting until " + n.toLocaleTimeString() + " for repair to complete. Item: " + unsafeWindow.kocThroneItems[t.repairId].name);
}
unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
} catch(e) {
logit("do action exception");
logit ("exception: " + inspect(e,3,1));
}
// recycle
clearTimeout(Tabs.upgrader.timerH);
t.timerH = setTimeout(t.doAction, retryTime*1000);
},
selectNext : function () {
if (queueData.index >= queueData.list.length) queueData.index = 0;
if (queueData.index < 0) queueData.index = 0;
// for single item mode, always start from the top
if (queueData.oneItem) queueData.index = 0;
var l = queueData.list.length;
for (i=queueData.index; i < l; i++ ) {
var item = queueData.list[i];
if (!item) continue;
//var id = item.item;
var throne_item = unsafeWindow.kocThroneItems[item.item];
if ( (queueData.list[i].status != "complete")
&& ( throne_item != null)
&& (!throne_item.isBroken) )
{
if ( ((item.action == "enhance") && (item.level <= throne_item.quality)) ||
((item.action == "upgrade") && (item.level <= throne_item.level)) ) {
item.status = "complete";
} else {
queueData.index = i;
return;
}
}
}
// if we get here, the queue is complete
queueData.index = -1;
},
doEnhance : function(eItem) {
var t = Tabs.upgrader;
try {
if (upgradeData.active == false || eItem ==0)
{
t.setStatus("Powered off");
return;
}
var y = unsafeWindow.kocThroneItems[eItem];
if (!y) return;
if (y.isBroken)
{
// repair and then try again later
t.doRepair(eItem);
return;
}
var num_city = t.pickCity();
if ( num_city < 0)
{
t.setStatus("Not enough aetherstones to enhance. Minimum of " + upgradeData.minStones + " needed. Waiting for more ...");
return;
}
var t_city = unsafeWindow.currentcityid;
unsafeWindow.currentcityid = Seed.cities[num_city][0];
var w = unsafeWindow.cm.ThronePanelController.calcCost("enhance", y, null, "stones");
unsafeWindow.currentcityid = t_city;
if ( (w.gems.use > 0) || (w.stones.total > parseInt(Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0]) ))
{
t.setStatus("Not enough aetherstones to enhance.");
return;
}
var qI = queueData.list[queueData.index];
if (qI)
{
qI.triesTotal++;
qI.triesThis++;
}
var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams);
params.ctrl = 'throneRoom\\ThroneRoomServiceAjax';
params.action = 'upgradeQuality';
params.throneRoomItemId = eItem;
params.payment = "aetherstone";
params.buffItemId = 0;
params.cityId = Seed.cities[num_city][0];
//logit("Sending enhance request");
t.setStatus("Sending enhance request");
new AjaxRequest(unsafeWindow.g_ajaxpath + "ajax/_dispatch53.php" + unsafeWindow.g_ajaxsuffix, {
method: "post",
parameters: params,
loading: true,
onSuccess: function (transport) {
try {
//logit("enhance request sucess");
//logit("transport: " + inspect(transport,3,1));
var rslt = eval("(" + transport.responseText + ")");
//logit("rslt: " + inspect(rslt,3,1));
if(rslt.ok){
Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0] = Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0] - rslt.aetherstones;
if (rslt.gems > 0)
{
trActionLog('Upgrader accidentally spent gems! Upgrader turned off');
t.setStatus("Error ... shutting down");
upgradeData.active = false;
saveUpgradeData();
}
if (rslt.success)
{
//logit("successful enhancement");
upgradeStats.enhanceSuccess[y.quality][y.level]++;
y.level = rslt.item.level;
y.quality = rslt.item.quality
y.status = rslt.item.status;
saveUpgradeStats();
y.name = y.createName();
Tabs.upgrader.repaint();
t.setResult("Enhance successful. " + addCommas(rslt.aetherstones) + " aetherstones used.");
t.setStones(Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0]);
t.setStatus("Attempting next action");
unsafeWindow.cm.sounds.play("tr_success_build");
// update the cost line
var qItem = queueData.list[queueData.index];
if (qItem)
{
var now = new Date();
qItem.lastUpgrade = "Enhanced to " + Tabs.upgrader.qualities[y.quality] + " " + now.toDateString().substring(3,10) + " " + now.toTimeString().substring(0,8) + " in " + qItem.triesThis + " attempts";
if (!qItem.upgrades) qItem.upgrades = [];
qItem.upgrades.push(qItem.lastUpgrade);
var msg = 'Enhanced '+unsafeWindow.kocThroneItems[eItem].name + ' [ ' + eItem + '] to quality ' + rslt.item.quality+ " in " + qItem.triesThis + " attempts. " + qItem.triesTotal + " total attempts for this item.";
trSuccessLog(msg);
if (upgradeData.whisperToMe) sendChat("/"+ Seed.player.name +' ' + msg);
if (qItem.level <= y.quality) {
qItem.status = "complete";
upgradeData.newUpgradeState = 2;
}
else {
var now = new Date();
qItem.status = "Partially enhanced";
qItem.triesLast = qItem.triesThis;
qItem.triesThis = 0;
if (upgradeData.newUpgradeState !=2 ) upgradeData.newUpgradeState =1;
}
saveUpgradeData();
setUpgradeColor();
}
saveQueueData();
Tabs.upgrader.buildQueueDisplay();
clearTimeout(Tabs.upgrader.timerH);
t.timerH = setTimeout(t.doAction, 10* 1000);
}
else
{
//logit("enhance failed");
trActionLog('Enhance failed Throne room item '+unsafeWindow.kocThroneItems[eItem].name);
upgradeStats.enhanceFailure[y.quality][y.level]++;
y.level = rslt.item.level;
y.quality = rslt.item.quality;
y.status = rslt.item.status;
saveUpgradeStats();
if (rslt["break"])
{
y.isBroken = true;
y.brokenType = "quality";
}
y.name = y.createName();
t.setResult("Enhance failed. " + addCommas(rslt.aetherstones) + " aetherstones used");
t.setStones(Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0]);
//t.setStatus("Starting repair ...");
var qItem = queueData.list[queueData.index];
if (qItem) if (qItem.status == "not started") qItem.status = "started";
saveQueueData();
Tabs.upgrader.buildQueueDisplay();
clearTimeout(Tabs.upgrader.timerH);
Tabs.upgrader.timerH = setTimeout(t.doAction, 10*1000);
//t.doRepair(y.id);
}
unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
//if (rslt.heatupModifier) unsafeWindow.cm.HeatUpModel.attemptCallback(+(rslt.heatupModifier));
}
else
{
logit("enhance error");
logit("Enhance result:" + inspect (rslt, 3, 1));
t.setStatus("Unable to enhance at this time ... waiting for next cycle");
}
} catch (e) {
//logit("exception: " + inspect(e,3,1));
}
return;
},
onFailure: function (rst) {
logit("Enhance request error. Waiting for next cycle.");
t.setStatus("Unable to send enhance request. Waiting for next cycle");
logit("result: " + inspect(rst,3,1));
// try to repair item
//t.doRepair(y.id);
return;
}
});
} catch (e) {
//logit("exception");
//logit ("exception: "+ inspect(e,5,2,true));
}
return;
},
doUpgrade : function(uItem, bypass) {
var t = Tabs.upgrader;
var y = unsafeWindow.kocThroneItems[uItem];
if ( uItem ==0 || y == null)
{
t.setStatus("Item not found.");
return;
}
if ( (upgradeData.active == false) && (bypass !=true))
{
t.setStatus("Powered off.");
return;
}
if (bypass == true && Tabs.throneSalvage.deleting != true)
{
// delete cycle has been canceled. Don't upgrade this item
return;
}
if (y.isBroken)
{
// repair and then try again later
t.doRepair(uItem);
return;
}
var num_city = t.pickCity();
if ( num_city < 0)
{
t.setStatus("Not enough aetherstones to upgrade. Minimum of " + upgradeData.minStones + " needed. Waiting for more ...");
return;
}
var t_city = unsafeWindow.currentcityid;
unsafeWindow.currentcityid = Seed.cities[num_city][0];
var w = unsafeWindow.cm.ThronePanelController.calcCost("upgrade", y, null, "stones");
unsafeWindow.currentcityid = t_city;
if ( (w.gems.use > 0) || (w.stones.total > parseInt(Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0]) ))
{
t.setStatus("Not enough aetherstones to upgrade.");
return;
}
if (bypass != true)
{
var qI = queueData.list[queueData.index];
if (qI)
{
qI.triesTotal++;
qI.triesThis++;
}
t.setStatus("Sending upgrade request ...");
}
var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams);
params.ctrl = 'throneRoom\\ThroneRoomServiceAjax';
params.action = 'upgradeLevel';
params.throneRoomItemId = uItem;
params.buffItemId = 0;
params.payment = "aetherstone";
params.cityId = Seed.cities[num_city][0];
new AjaxRequest(unsafeWindow.g_ajaxpath + "ajax/_dispatch53.php" + unsafeWindow.g_ajaxsuffix, {
method: "post",
parameters: params,
loading: true,
onSuccess: function (transport) {
try {
//logit("transport: " + inspect(transport,3,1));
var rslt = eval("(" + transport.responseText + ")");
if(rslt.ok){
Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0] = Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0] - rslt.aetherstones;
if (rslt.gems > 0)
{
t.setStatus("Error .... Shutting down.");
trActionLog('Upgrader accidentally spent gems! Upgrader turned off');
upgradeData.active = false;
saveUpgradeData();
}
if (rslt.success)
{
//logit("upgrade successful");
t.setStones(Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0]);
y.level = rslt.item.level;
y.quality = rslt.item.quality;
y.name = y.createName();
if (bypass !=true)
{
upgradeStats.upgradeSuccess[y.quality][y.level]++;
saveUpgradeStats();
Tabs.upgrader.repaint();
t.setResult("Upgrade successful. " + addCommas(rslt.aetherstones) + " aetherstones used.");
t.setStatus("Attempting next upgrade");
unsafeWindow.cm.sounds.play("tr_success_build");
var qItem = queueData.list[queueData.index];
if (qItem) {
var now = new Date();
qItem.lastUpgrade = "Upgraded to +" + y.level + " " + now.toDateString().substring(3,10) + " "+ now.toTimeString().substring(0,8) + " in " + qItem.triesThis + " attempts";
if (!qItem.upgrades) qItem.upgrades = [];
qItem.upgrades.push (qItem.lastUpgrade);
var msg = 'Upgraded '+unsafeWindow.kocThroneItems[uItem].name + ' [' + uItem + '] to level ' + rslt.item.level + " in " + qItem.triesThis + " attempts. " + qItem.triesTotal + " total attempts for this item.";
if (upgradeData.whisperToMe) sendChat("/"+ Seed.player.name +' ' + msg);
trSuccessLog(msg);
if (qItem.level <= y.level) {
qItem.status = "complete";
upgradeData.newUpgradeState =2;
}
else {
var now = new Date();
qItem.status = "Partially upgraded";
qItem.triesLast = qItem.triesThis;
qItem.triesThis = 0;
if (upgradeData.newUpgradeState !=2) upgradeData.newUpgradeState = 1;
}
saveUpgradeData();
setUpgradeColor();
}
saveQueueData();
Tabs.upgrader.buildQueueDisplay();
clearTimeout(Tabs.upgrader.timerH);
Tabs.upgrader.timerH = setTimeout(Tabs.upgrader.doAction, 10* 1000);
}
}
else
{
logit("upgrade failed");
t.setStones(Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0]);
trActionLog('Upgrade failed Throne room item '+unsafeWindow.kocThroneItems[uItem].name);
if (rslt["break"]) {
y.isBroken = true;
y.brokenType = "level";
}
y.status = rslt.item.status;
y.name = y.createName();
if (bypass !=true)
{
upgradeStats.upgradeFailure[y.quality][y.level]++;
saveUpgradeStats();
t.setResult("Upgrade failed. " + addCommas(rslt.aetherstones) + " aetherstones used");
//t.setStatus("Starting repair ... ");
var qItem = queueData.list[queueData.index];
if (qItem.status == "not started") qItem.status = "started";
saveQueueData();
Tabs.upgrader.buildQueueDisplay();
//t.doRepair(uItem); // fix item
clearTimeout(Tabs.upgrader.timerH);
Tabs.upgrader.timerH = setTimeout(Tabs.upgrader.doAction, 10*1000);
}
}
unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
if (rslt.heatupModifier) unsafeWindow.cm.HeatUpModel.attemptCallback(+(rslt.heatupModifier));
return;
}
else
{
//logit("upgrade not ok");
//logit("result: " + inspect(rslt,3,1));
if (bypass !=true)
{
t.setStatus("Upgrade request not accepted. Waiting for next cycle.");
} else {
if (rslt.msg && rslt.msg.indexOf("Has status 2") > -1)
{
// the object is in the locked rows. Shutdown deleting until the next pass
Tabs.throneSalvage.delItems = [];
Tabs.throneSalvage.deleting = false;
logit("Reached locked items. Salvaging complete.");
}
}
logit("Upgrade result:" + inspect (rslt, 3, 1));
}
} catch (e) {
//logit("upgrade exception");
// logit("Exception: " + inspect(e,3,1));
}
return;
},
onFailure: function (rrr) {
logit("upgrade failure");
logit("RRR: " + inspect(rrr,3,1));
t.setStatus("Unable to transmitt upgrade request. Waiting for next cycle.");
unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
return;
}
});
return;
},
addQueue : function () {
var t = Tabs.upgrader;
var action = $("#trAction").val();
if (action == "both") {
t.addBothItem($("#trUpgradeList").val());
return;
}
var qItem = new QueueItem();
qItem.item = $("#trUpgradeList").val();
qItem.action = $("#trAction").val();
qItem.level = $("#trMaxLevel").val();
if (qItem.item == 0) return;
queueData.list.push(qItem);
saveQueueData();
t.buildQueueDisplay();
},
buildLevelWidget : function () {
var t = Tabs.upgrader;
var m;
if ($("#trAction").val() == "enhance") {
m = '<div id=trMaxDiv> Max: <select id="trMaxLevel">';
for (i =1; i <=5; i++) {
m += '<option value="' + i + '">' + t.qualities[i] + '</option>';
}
m += '</select></div>';
} else if ($("#trAction").val() == "upgrade") {
m = '<div id=trMaxDiv> Max: <select id="trMaxLevel">';
for (i =1; i <= maxTrLevel; i++) {
m += '<option value="' + i + '"> +' + i + '</option>';
}
m += '</select></div>';
} else {
m = '<div id=trMaxDiv> - <select id="trMaxLevel">';
m += '</select></div>';
}
$("#trMaxDiv").html(m);
if ($("#trAction").val() == "enhance") {
$("#trMaxLevel").val(5);
} else if ($("#trAction").val() == "upgrade") {
$("#trMaxLevel").val(maxTrLevel);
}
},
buildQueueDisplay : function () {
var t = Tabs.upgrader;
$("#trQueue").html("<table id='trQueue' width='100%' class=trTabPad/>");
$("#trQueue").append("<tr><th width=5%>Reorder</th><th width='8%'>Status</th><th width='25%'>Item</th><th width='5%'>Action</th><th width='5%'>Max</th><th width='40%'>Status/Last Upgrade/Attempts</th><th width='10%'>Remove</th></tr>");
for (ii in queueData.list) {
var q = queueData.list[ii];
if (!q) continue;
var the_item = unsafeWindow.kocThroneItems[q.item];
var name = "Unknown / Item removed";
var id = 0;
if (the_item)
{
name = the_item.name;
id = the_item.id;
}
var m = "<tr><td><div class='trup' id=trUpRow" + ii +" /><div class='trdown' id=trDownRow" + ii +" /></td>"
+ "<td><div id=trState" + ii +"></div></td><td class=trUpdaterItemName id=trUpdaterItem" + id + " >"
+ name + " [" +id + "]" + "</td><td>" + q.action + "</td><td>";
if (q.action =="enhance") {
m += '<div style="text-align: center;"><select id="trChangeLevel' + ii +'" style="width:90px; text-align: center;">';
for (i =1; i <=5; i++) {
m += '<option value="' + i + '" '+ (q.level==i ? 'selected' : '' ) +'>' + t.qualities[i] + '</option>';
}
m += '</select></div>';
} else {
m += '<div style="text-align: center;"><select id="trChangeLevel' + ii +'" style="width:90px; text-align: center;">';
for (i =1; i <= maxTrLevel; i++) {
m += '<option value="' + i + '" '+ (q.level==i ? 'selected' : '' ) +'> +' + i + '</option>';
}
m += '</select></div>';
}
m += "</td><td style='text-align: center; white-space: pre-wrap;'>" + q.status + " / ";
if (q.lastUpgrade) m += q.lastUpgrade;
m += " / " + q.triesThis + " tries this level, " + q.triesTotal + " tries total"
m += "</td>";
m += "<td><div><div id=trQueueRemove" + ii + " class=trremove/></div></td></tr>";
$("#trQueue").append(m);
}
for (var j=0; j < queueData.list.length; j++)
{
var q = queueData.list[j];
if (!q) continue;
var the_item = unsafeWindow.kocThroneItems[q.item];
$("#trQueueRemove"+j).attr('v1', j);
$("#trQueueRemove"+j).click( function () {t.deleteQueueItem( $(this).attr('v1') );});
$("#trUpRow"+j).attr('v1', j);
$("#trUpRow"+j).click( function () { t.moveUpRow(+($(this).attr('v1') ));});
$("#trDownRow"+j).attr('v1', j);
$("#trDownRow"+j).click( function () { t.moveDownRow(+($(this).attr('v1') ));});
$("#trChangeLevel"+j).attr('v1', j);
$("#trChangeLevel"+j).change( function () { t.changeLevel(+($(this).attr('v1') ), $(this).val() ) });
if (!the_item || !(the_item.id)) {
$("#trState"+j).html("<div style='text-align:center'> ??</div>");
} else if (q.status == "complete") {
$("#trState"+j).addClass('trsuccess');
} else if (the_item.isBroken) {
if (the_item.id == t.repairId) {
$("#trState"+j).addClass('trhammer');
} else {
$("#trState"+j).addClass('trbroken');
}
} else {
$("#trState"+j).html("<div class='trgbtn'/>");
$("#trState"+j).css('text-align', 'center');
}
}
if (presetData.noTooltips != true)
{
$(".trUpdaterItemName").mouseover( function (td) {
td.stopPropagation();
var theId = $(this).attr("id").split("trUpdaterItem")[1];
if (!theId || theId == 0) {
return;
}
var zz;
if (zz = unsafeWindow.kocThroneItems[theId])
{
unsafeWindow.cm.ThroneView.hoverItem(td, this, zz);
$("#kofcNewTooltipDiv").css('position', 'absolute');
$("#kofcNewTooltipDiv").css('left', ($("#tr_dialog").position().left+200) + 'px');
$("#kofcNewTooltipDiv").css('top', td.pageY-330 + 'px');
}
else
{
$("#kofcNewTooltipDiv").remove();
setTimeout( function () {Tabs.updater.show();}, 200);
}
});
}
},
deleteQueueItem : function (i) {
// delete an item from the queue
var t = Tabs.upgrader;
queueData.list.splice(i,1);
if (i > queueData.index) queueData.index--;
saveQueueData();
t.buildQueueDisplay();
},
changeLevel : function (index, level) {
var t = Tabs.upgrader;
var q = queueData.list[index];
if (!q) return;
q.level = level;
saveQueueData();
t.buildQueueDisplay();
},
moveUpRow : function (i) {
if (i<1) return;
var t = Tabs.upgrader;
var q = queueData.list.splice(i,1);
queueData.list.splice(i-1,0,q[0]);
if (i == queueData.index)
queueData.index--;
else if (queueData.index == i-1)
queueData.index++;
saveQueueData();
t.buildQueueDisplay();
},
moveDownRow : function (index) {
if (index > (queueData.list.length - 2)) return;
var t = Tabs.upgrader;
var q = queueData.list.splice(index,1);
queueData.list.splice(index+1,0,q[0]);
if (i == queueData.index)
queueData.index++;
else if (queueData.index == i+1)
queueData.index--;
saveQueueData();
t.buildQueueDisplay();
},
updateTRTab : function() {
$("#trexecupgrade").html("Upgrade " + (upgradeData.active ? "ON" : "OFF"));
},
togglePower: function(obj){
var t = Tabs.upgrader;
var btn = document.getElementById('trUpgraderPower');
if (upgradeData.active == true) {
upgradeData.active = false;
btn.value = "Upgrade = OFF";
t.setStatus("Powered off");
} else {
upgradeData.active = true;
btn.value = "Upgrade = ON";
t.setStatus("Power on");
}
if (upgradeData.active == false)
{
}
t.updateTRTab();
saveUpgradeData();
},
toggleSelect: function(obj){
var btn = document.getElementById('trUpgraderSelect');
var t = Tabs.upgrader;
if (upgradeData.enhanceAction == true) {
upgradeData.enhanceAction = false;
btn.value = "Action = Upgrade";
} else {
upgradeData.enhanceAction = true;
btn.value = "Action = Enhance";
}
t.updateTRSelect();
saveUpgradeData();
},
setStatus : function (s)
{
document.getElementById('trUpgradeStatus').innerHTML = "<div>" + s + "</div>";
},
setResult : function (s)
{
document.getElementById('trLastResult').innerHTML = "<div>" + s + "</div>";
},
setStones : function(n)
{
var st = addCommas(n) + " stones";
document.getElementById('trStoneRemain').innerHTML = "<div>" + st + "</div>";
},
pickCity : function () {
var t = Tabs.upgrader;
var cid = upgradeData.uCityNum;
if ( parseInt(Seed.resources["city" + Seed.cities[cid][0]]["rec5"][0]) >= upgradeData.minStones) return cid;
if (upgradeData.anyCity)
{
for (i= 0; i < Seed.cities.length; i++)
{
if ( parseInt(Seed.resources["city" + Seed.cities[i][0]]["rec5"][0]) >= upgradeData.minStones) return i;
}
}
return -1;
},
doRepair : function( rItem) {
var t = Tabs.upgrader;
var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams);
if (upgradeData.active == false || rItem == 0 || unsafeWindow.kocThroneItems[rItem] == null)
{
logit("repair is turned off");
return;
}
var theItem = unsafeWindow.kocThroneItems[rItem];
params.action = 'timeRepair';
params.throneRoomItemId = rItem;
params.ctrl = 'throneRoom\\ThroneRoomServiceAjax';
new AjaxRequest(unsafeWindow.g_ajaxpath + "ajax/_dispatch53.php" + unsafeWindow.g_ajaxsuffix, {
method: "post",
parameters: params,
loading: true,
onSuccess: function (transport) {
//logit("repair success");
//logit("tport: " + inspect(transport,3,1));
var rslt = eval("(" + transport.responseText + ")");
//logit("rslt: " + inspect(rslt,3,1));
if(rslt.ok){
trActionLog('Starting repair for Throne room item '+unsafeWindow.kocThroneItems[rItem].name);
Seed.queue_throne.itemId= rItem;
Seed.queue_throne.start=unixTime();
Seed.queue_throne.end= rslt.eta;
t.repairId = rItem;
t.repairEnd = rslt.eta;
var n = new Date(t.repairEnd *1000);
t.setStatus("Repair begun ... Repair will be complete at " + n.toLocaleTimeString() + ". Item: " + unsafeWindow.kocThroneItems[t.repairId].name);
var x = rslt.eta - unixTime();
unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
t.clearTimerH = setTimeout(t.clearRepair, (x+1)*1000);
var item = unsafeWindow.kocThroneItems[rItem];
Tabs.upgrader.buildQueueDisplay();
// uW.cm.ThronePanelView.clickSpeedUp(item);
}
else
{
logit ("Repair failed");
if (rslt.msg == "Item is not broken")
{
unsafeWindow.kocThroneItems[rItem].isBroken = false;
t.clearRepair();
}
// regrab the end times in case this is caused by a manual repair
if (Seed.queue_throne && Seed.queue_throne.end && Seed.queue_throne.itemId)
{
t.repairEnd = Seed.queue_throne.end;
t.repairId = Seed.queue_throne.itemId;
}
logit("result:" + inspect(rslt,3,1));
}
return;
},
onFailure: function (ttt) {
logit("repair error");
// this usually means a repair is in progress (such as a
// manual
// repair). Grab the seed data (if possible)
if (Seed.queue_throne && Seed.queue_throne.end)
{
t.repairEnd = Seed.queue_throne.end;
t.repairId = Seed.queue_throne.itemId;
}
logit("ttt: " + inspect(ttt,3,1));
return;
}
});
return;
},
clearRepair : function () {
var t = Tabs.upgrader;
var timeUntilDone = 0;
if (t.repairEnd == 0)
{
return timeUntilDone;
}
timeUntilDone = t.repairEnd - unixTime();
if (timeUntilDone <= 0)
{
// logit("clearing repair");
if (t.repairId != 0 && unsafeWindow.kocThroneItems[t.repairId] != null)
{
if (unsafeWindow.kocThroneItems[t.repairId].isBroken == true)
{
t.setStatus("Repair time complete.");
}
unsafeWindow.kocThroneItems[t.repairId].isBroken = false;
unsafeWindow.kocThroneItems[t.repairId].brokenType = "";
t.repairId = 0;
}
}
unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
return timeUntilDone;
},
show: function(){
Tabs.upgrader.repaint();
},
hide: function(){
}
};
/** ***************** Throne Enhancing Stats ********************* */
Tabs.estats = {
tabOrder: 300,
tabLabel: 'Enhance Stats',
tabDisabled : false,
myDiv : null,
init : function (div){
var t = Tabs.estats;
t.myDiv = div;
t.buildDisplay();
},
buildDisplay :function() {
var t = Tabs.estats;
var m = '<DIV class=trstat style="margin-top:5px; margin-bottom:5px;"><DIV id=trStatsMain class=trStat>ENHANCEMENT STATISTICS</div>';
m += '<DIV id= trStatsTabDiv align=left style="margin-top:10px; margin-bottom:10px; margin-left: 30px;">';
m += '<TABLE class=trStatTab align=center cellspacing=0>';
m += '<TR valign=top align=center><TH colspan=6>Enhancing Numbers (successes/failures)</TH></TR>';
var qstrings = new Array(uW.g_js_strings.throneRoom.simple, uW.g_js_strings.throneRoom.common, uW.g_js_strings.throneRoom.uncommon,
uW.g_js_strings.throneRoom.rare, uW.g_js_strings.throneRoom.epic, uW.g_js_strings.throneRoom.wondrous);
m += '<TR valign=top align=center><th></th>';
for( q =1; q <=5; q++)
{
m += "<td style='font-weight: bold;' class='td" + (q%2+1) +"' >";
m += qstrings[q];
m += '</td>';
}
m += '</tr>';
var st = [0,0,0,0,0];
var ft = [0,0,0,0,0];
for (l=0; l<= maxTrLevel; l++)
{
m += '<TR valign=top align=center>';
m += "<th>";
if (l !=0) m += "+";
m+= l + '</th>';
for( q =0; q <5; q++)
{
if (upgradeStats.enhanceSuccess[q][l] == null) upgradeStats.enhanceSuccess[q][l] =0;
if (upgradeStats.enhanceFailure[q][l] == null) upgradeStats.enhanceFailure[q][l] =0;
st[q] += upgradeStats.enhanceSuccess[q][l];
ft[q] += upgradeStats.enhanceFailure[q][l];
m += "<td class='td" + (q%2) +"' >";
m += upgradeStats.enhanceSuccess[q][l] + " / " + upgradeStats.enhanceFailure[q][l];
m += "</td>";
}
m += '</TR>';
}
m += '<TR valign=top align=center><th> Totals: </th>';
for( q =0; q <5; q++)
{
m += "<td style='font-weight: bold;' class='td" + (q%2) +"' >";
m += st[q] + " / " + ft[q];
m += "</td>";
}
m += '</TR>';
m += '<TR valign=top align=center><th> Percents: </th>';
for( q =0; q <5; q++)
{
m += "<td style='font-weight: bold;' class='td" + (q%2) +"' >";
if ( (st[q] + ft[q]) == 0 )
m += "--";
else
{
var p = (100* st[q] / (st[q] + ft[q]));
m += p.toFixed(2) + "%";
}
m += "</td>";
}
m += '</TR>';
m += '</TABLE></DIV>';
m += "<div id='trStats'></div>";
m += '</div>';
t.myDiv.innerHTML = m;
},
show: function(){
var t = Tabs.estats;
t.buildDisplay();
},
hide: function(){
}
}
/** ***************** Throne Upgrade Stats ********************* */
Tabs.ustats = {
tabOrder: 400,
tabLabel: 'Upgrade Stats',
tabDisabled : false,
myDiv : null,
init : function (div){
var t = Tabs.ustats;
t.myDiv = div;
t.buildTab();
},
buildTab : function ()
{
var t = Tabs.ustats;
var maxLevel = maxTrLevel;
var m = '<DIV class=trstat style="margin-top:5px; margin-bottom:5px;"><DIV id=trStatsMain2 class=trStat>UPGRADE STATISTICS</div>';
m += '<DIV id= trStatsTabDiv2 align=left style="margin-top:10px; margin-bottom:10px; margin-left: 30px;">';
m += '<TABLE class=trStatTab align=center cellspacing=0>';
m += '<TR valign=top align=center><TH colspan=14>Upgrading Numbers (successes/failures)</TH></TR>';
var qstrings = new Array(uW.g_js_strings.throneRoom.simple, uW.g_js_strings.throneRoom.common, uW.g_js_strings.throneRoom.uncommon,
uW.g_js_strings.throneRoom.rare, uW.g_js_strings.throneRoom.epic, uW.g_js_strings.throneRoom.wondrous);
m += '<TR valign=top align=center><th></th>';
for (l= 0; l< maxLevel; l++)
{
m += "<td style='font-weight: bold;' class='td" + (l%2) +"' >";
m+= "+" +(l+1) + "</td>";
}
m += '</TR>';
var st = [0,0,0,0,0,0,0,0,0,0,0,0];
var ft = [0,0,0,0,0,0,0,0,0,0,0,0];
for( q =0; q <=5; q++)
{
m += '<TR valign=top align=center><th>' + qstrings[q] + '</th>';
for (l=0; l< maxTrLevel; l++)
{
if (upgradeStats.upgradeSuccess[q][l] == null || isNaN(upgradeStats.upgradeSuccess[q][l])) upgradeStats.upgradeSuccess[q][l] =0;
if (upgradeStats.upgradeFailure[q][l] == null || isNaN(upgradeStats.upgradeFailure[q][l])) upgradeStats.upgradeFailure[q][l] =0;
st[l] += upgradeStats.upgradeSuccess[q][l];
ft[l] += upgradeStats.upgradeFailure[q][l];
m += "<td class='td" + (l%2) +"' >";
m += upgradeStats.upgradeSuccess[q][l] + " / " + upgradeStats.upgradeFailure[q][l];
m += "</td>";
}
m += '</TR>';
}
m += '<TR valign=top align=center><th> Totals: </th>';
for( l =0; l< maxLevel; l++)
{
m += "<td style='font-weight: bold;' class='td" + (l%2) +"' >";
m += st[l] + " / " + ft[l];
m += "</td>";
}
m += '</TR>';
m += '<TR valign=top align=center><th> Percents: </th>';
for( l =0; l < maxLevel; l++)
{
m += "<td style='font-weight: bold;' class='td" + (l%2) +"' >";
if ( (st[l] + ft[l]) == 0 )
m += "--";
else
{
var p = (100* st[l] / (st[l] + ft[l]));
m += p.toFixed(2) + "%";
}
m += "</td>";
}
m += '</TR>';
m += '</TABLE></DIV>';
m += "<div id='trStats2'></div>";
m += '</div>';
t.myDiv.innerHTML = m;
},
show: function(){
var t = Tabs.ustats;
t.buildTab();
},
hide: function(){
}
}
function findTab(div) {
for (o in Tabs)
{
if (Tabs[o].myDiv && (Tabs[o].myDiv == div)) return o;
}
return null;
}
var WinManager = {
wins : {}, // prefix : trPopup obj
didHide : [],
get : function (prefix){
var t = WinManager;
return t.wins[prefix];
},
add : function (prefix, pop){
var t = WinManager;
t.wins[prefix] = pop;
if (unsafeWindow.cpopupWins == null)
unsafeWindow.cpopupWins = {};
unsafeWindow.cpopupWins[prefix] = pop;
},
hideAll : function (){
var t = WinManager;
t.didHide = [];
for (k in t.wins){
if (t.wins[k].isShown()){
t.didHide.push (t.wins[k]);
t.wins[k].show (false);
}
}
},
restoreAll : function (){
var t = WinManager;
for (var i=0; i<t.didHide.length; i++)
t.didHide[i].show (true);
},
deleteWin : function (prefix){
var t = WinManager;
delete t.wins[prefix];
delete unsafeWindow.cpopupWins[prefix];
}
}
//registers the popup
//prefix must be a unique (short) name for the popup window
function trPopup(prefix) {
var pop = WinManager.get(prefix);
if (pop){
pop.show(false);
return pop;
}
// behind the salvage popup
this.BASE_ZINDEX = 111111;
// protos ...
this.show = show;
this.getTopDiv = getTopDiv;
this.getMainTopDiv = getMainTopDiv;
this.getMainDiv = getMainDiv;
this.getLayer = getLayer;
this.setLayer = setLayer;
//this.getLocation = getLocation;
//this.setLocation = setLocation;
this.focusMe = focusMe;
this.isShown = isShown;
this.unfocusMe = unfocusMe;
this.destroy = destroy;
// object vars ...
this.div = $("#tr_top")[0];
this.prefix = prefix;
var t = this;
this.div.addEventListener ('mousedown', e_divClicked, false);
WinManager.add(prefix, this);
function e_divClicked (){
t.focusMe();
}
function focusMe (){
t.setLayer(5);
for (k in unsafeWindow.cpopupWins){
if (k != t.prefix)
unsafeWindow.cpopupWins[k].unfocusMe();
}
}
function unfocusMe (){
t.setLayer(-5);
}
function destroy (){
document.body.removeChild(t.div);
WinManager.deleteWin (t.prefix);
}
function setLayer(zi){
t.div.style.zIndex = ''+ (this.BASE_ZINDEX + zi);
}
function getLayer(){
return parseInt(t.div.style.zIndex) - this.BASE_ZINDEX;
}
function getTopDiv(){
return document.getElementById(this.prefix+'_top');
}
function getMainDiv(){
return document.getElementById(this.prefix+'_main');
}
function getMainTopDiv(){
return document.getElementById(this.prefix+'_top');
}
function isShown (){
return $("#tr_dialog").dialog("isOpen");
}
function show(tf){
if (tf){
$("#tr_dialog").dialog("open");
t.focusMe ();
} else {
$("#tr_dialog").dialog("close");
}
return tf;
}
}
//onClick (city{name, id, x, y}, x, y) city may be null!
function CdispCityPicker (id, span, dispName, notify, selbut){
function CcityButHandler (t) {
var that = t;
function clickedCityBut (e){
if (that.selected != null)
that.selected.className = "castleBut castleButNon";
that.city = Cities.cities[e.target.id.substr(that.prefixLen)];
if (that.dispName)
document.getElementById(that.id+'cname').innerHTML = that.city.name;
e.target.className = "castleBut castleButSel";
that.selected = e.target;
if (that.coordBoxX){
that.coordBoxX.value = that.city.x;
that.coordBoxY.value = that.city.y;
var evt = document.createEvent("HTMLEvents");
evt.initEvent('change', true, true ); // event
// type,bubbling,cancelable
that.coordBoxX.dispatchEvent(evt);
that.coordBoxY.dispatchEvent(evt);
that.coordBoxX.style.backgroundColor = '#ffffff';
that.coordBoxY.style.backgroundColor = '#ffffff';
}
if (that.notify != null)
that.notify(that.city, that.city.x, that.city.y);
}
this.clickedCityBut = clickedCityBut;
}
function selectBut (idx){
document.getElementById(this.id+'_'+idx).click();
}
function bindToXYboxes (eX, eY){
function CboxHandler (t){
var that = t;
this.eventChange = eventChange;
if (that.city){
eX.value = that.city.x;
eY.value = that.city.y;
}
function eventChange (){
var xValue=that.coordBoxX.value.trim();
var xI=/^\s*([0-9]+)[\s|,|-|.]+([0-9]+)/.exec(xValue);
if(xI) {
that.coordBoxX.value=xI[1]
that.coordBoxY.value=xI[2]
}
var x = parseInt(that.coordBoxX.value, 10);
var y = parseInt(that.coordBoxY.value, 10);
if (isNaN(x) || x<0 || x>750){
that.coordBoxX.style.backgroundColor = '#ff8888';
return;
}
if (isNaN(y) || y<0 || y>750){
that.coordBoxY.style.backgroundColor = '#ff8888';
return;
}
that.coordBoxX.style.backgroundColor = '#ffffff';
that.coordBoxY.style.backgroundColor = '#ffffff';
if (that.notify != null)
that.notify (null, x, y);
}
return false;
}
this.coordBoxX = eX;
this.coordBoxY = eY;
var bh = new CboxHandler(this);
eX.maxLength=8;
eY.maxLength=3;
eX.style.width='2em';
eY.style.width='2em';
eX.addEventListener('change', bh.eventChange, false);
eY.addEventListener('change', bh.eventChange, false);
}
this.selectBut = selectBut;
this.bindToXYboxes = bindToXYboxes;
this.coordBoxX = null;
this.coordBoxY = null;
this.id = id;
this.dispName = dispName;
this.prefixLen = id.length+1;
this.notify = notify;
this.selected = null;
this.city = null;
var m = '';
for (var i=0; i<Cities.cities.length; i++)
m += '<INPUT class="castleBut castleButNon" id="'+ id +'_'+ i +'" value="'+ (i+1) +'" type=button />';
if (dispName)
m += ' <SPAN style="display:inline-block; width:85px; font-weight:bold;" id='+ id +'cname' +'></span>';
span.innerHTML = m;
var handler = new CcityButHandler(this);
for (var i=0; i<Cities.cities.length; i++)
document.getElementById (id+'_'+i).addEventListener('click', handler.clickedCityBut, false);
if (selbut != null)
this.selectBut(selbut);
};
function setCities(){
Cities.numCities = Seed.cities.length;
Cities.cities = [];
Cities.byID = {};
for (i=0; i<Cities.numCities; i++){
city = {};
city.idx = i;
city.id = parseInt(Seed.cities[i][0]);
city.name = Seed.cities[i][1];
city.x = parseInt(Seed.cities[i][2]);
city.y = parseInt(Seed.cities[i][3]);
city.tileId = parseInt(Seed.cities[i][5]);
city.provId = parseInt(Seed.cities[i][4]);
// getTroopDefTrainEstimates('city'+ city.id, city);
Cities.cities[i] = city;
Cities.byID[Seed.cities[i][0]] = city;
}
}
function addCommas(nStr){
nStr += '';
var x = nStr.split('.');
var x1 = x[0];
var x2 = x.length > 1 ? '.' + x[1] : '';
var rgx = /(\d+)(\d{3})/;
while (rgx.test(x1)) {
x1 = x1.replace(rgx, '$1' + ',' + '$2');
}
return x1 + x2;
}
String.prototype.startsWith = function(starter) {
return this.substring(0,starter.length) == starter;
};
String.prototype.endsWith = function(ender) {
return this.substring(this.length-ender.length) == ender;
};
String.prototype.capitalize = function() {
return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
};
/** *********** Updater code ************ */
//Function for displaying a confirmation message modal popup similar to the
//default javascript confirm() function
//but with the advantage being that it won't halt all other javascript being
//executed on the page.
//Original Author: Thomas Chapin (April 6, 2011)
function display_confirm(confirm_msg,ok_function,cancel_function){
if(!confirm_msg){confirm_msg="";}
var container_div = document.getElementById('modal_js_confirm');
var div;
if(!container_div) {
container_div=document.createElement('div');
container_div.id='modal_js_confirm';
container_div.style.position='absolute';
container_div.style.top='0px';
container_div.style.left='0px';
container_div.style.width='100%';
container_div.style.height='1px';
container_div.style.overflow='visible';
container_div.style.zIndex=2000005;
div=document.createElement('div');
div.id='modal_js_confirm_contents';
div.style.zIndex=2000005;
div.style.backgroundColor='#eee';
div.style.fontFamily='"lucida grande",tahoma,verdana,arial,sans-serif';
div.style.fontSize='11px';
div.style.textAlign='center';
div.style.color='#333333';
div.style.border='2px outset #666';
div.style.padding='10px';
div.style.position='relative';
div.style.width='300px';
div.style.height='100px';
div.style.margin='300px auto 0px auto';
div.style.display='block';
container_div.appendChild(div);
document.body.appendChild(container_div);
div.innerHTML = '<div style="text-align:center"><div>'+confirm_msg+'</div><br/><div>Press OK to continue.</div><br><button id="modal_js_confirm_ok_button">OK</button> <button id="modal_js_confirm_cancel_button">Cancel</button></div>';
var ok_button = document.getElementById('modal_js_confirm_ok_button');
ok_button.addEventListener('click',function() {
if(ok_function && typeof(ok_function) == "function"){
ok_function();
}
container_div.parentNode.removeChild(container_div);
},false);
var cancel_button = document.getElementById('modal_js_confirm_cancel_button');
cancel_button.addEventListener('click',function() {
if(cancel_function && typeof(cancel_function) == "function"){
cancel_function();
}
container_div.parentNode.removeChild(container_div);
},false);
}
}
//The following code is released under public domain.
var AutoUpdater_132329 = {
id: 411452,
days: 1, // check every 1 day
name: "KOC Throne Room Organizer",
version: Version,
time: new Date().getTime(),
call: function(response, secure) {
logit("checking version");
GM_xmlhttpRequest({
method: 'GET',
url: 'http'+(secure ? 's' : '')+'://userscripts.org/scripts/source/'+this.id+'.meta.js',
onload: function(xpr) {AutoUpdater_132329.compare(xpr, response);},
onerror: function(xpr) {if (secure) AutoUpdater_132329.call(response, false);}
});
},
enable: function() {
GM_registerMenuCommand("Enable "+this.name+" updates", function() {
GM_setValue('updated_132329', new Date().getTime()+'');
AutoUpdater_132329.call(true, true)
});
},
compareVersion: function(r_version, l_version) {
var r_parts = r_version.split(''),
l_parts = l_version.split(''),
r_len = r_parts.length,
l_len = l_parts.length,
r = l = 0;
for(var i = 0, len = (r_len > l_len ? r_len : l_len); i < len && r == l; ++i) {
r = +(r_parts[i] || '0');
l = +(l_parts[i] || '0');
}
return (r !== l) ? r > l : false;
},
compare: function(xpr,response) {
this.xversion=/\/\/\s*@version\s+(.+)\s*\n/i.exec(xpr.responseText);
this.xname=/\/\/\s*@name\s+(.+)\s*\n/i.exec(xpr.responseText);
if ( (this.xversion) && (this.xname[1] == this.name) ) {
this.xversion = this.xversion[1];
this.xname = this.xname[1];
} else {
if ( (xpr.responseText.match("the page you requested doesn't exist")) || (this.xname[1] != this.name) ) {
// GM_setValue('updated_132329', 'off');
}
return false;
}
var updated = this.compareVersion(this.xversion, this.version);
if ( updated ) {
display_confirm('A new version of '+this.xname+' is available.\nDo you wish to install the latest version?',
// Ok
function(){
try {
location.href = 'https://userscripts.org/scripts/source/411452.user.js';
} catch(e) {}
},
// Cancel
function(){
if ( AutoUpdater_132329.xversion ) {
if(confirm('Do you want to turn off auto updating for this script?')) {
// GM_setValue('updated_132329', 'off');
TRGlobalOptions.trUpdate = false;
GM_setValue ('TROptions_??', JSON2.stringify(TRGlobalOptions));
AutoUpdater_132329.enable();
alert('Automatic updates can be re-enabled for this script from the User Script Commands submenu.');
}
}
}
);
} else if (response){
alert('No updates available for '+this.name);
}
},
check: function(tf) {
if (!tf){
this.enable();
} else {
// convert days to milliseconds and compare
if (+this.time > (+GM_getValue('updated_132329', 0) + 1000*60*60*24*this.days)) {
GM_setValue('updated_132329', this.time+'');
this.call(false, true);
}
GM_registerMenuCommand("Check "+this.name+" for updates", function() {
GM_setValue('updated_132329', new Date().getTime()+'');
AutoUpdater_132329.call(true, true)
});
}
}
};
readTRGlobalOptions();
//even though Scriptish provides its own update mechanism (GM_updatingEnbled ==
//true), lets use this method.
if (typeof(GM_xmlhttpRequest) !== 'undefined' /*
* && typeof(GM_updatingEnabled)
* === 'undefined'
*/) {
try {
if (unsafeWindow.frameElement === null) {
AutoUpdater_132329.check(TRGlobalOptions.trUpdate);
}
} catch(e) {
AutoUpdater_132329.check(TRGlobalOptions.trUpdate);
}
}
/** ******* End updater code ************ */
String.prototype.capitalize = function(){
return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
}
//****************************
//This is a new implementation of the CalterUwFunc class to modify a function of the 'unsafewWindow' object.
//For reverse compatibility this implementation operates like the original, but multiple CalterUwFunc objects can be created for the same function.
//Each CalterUwFunc can be enabled or disabled independently. (Of course, the replacement strings must be compatible with each other to work
//simultaneously).
//The implementation uses a worker class CalterFuncModifier. One and only one CalterFuncModifier is created for each uw function modified.
//CalterFuncModifier allows multiple modifier string pairs to be applied. For individual control of specific mods, access the 'modIndex'
//member to determine the index of the first mod and then directly call the operations of the 'funcModifier' member.
//This implementation creates/uses a registry of CalterFuncModifier's that is added to the unsafeWindow object so that changes
//to the same function in different scripts is possible.
//****************************
var CalterUwFunc = function (funcName, findReplace) {
this.isAvailable = isAvailable;
this.setEnable = setEnable;
this.funcName = funcName;
this.funcModifier = null;
this.modIndex = 0;
this.numberMods = 0;
// find an existing CalterUwFunc if it already exists
if (!unsafeWindow.calterRegistry) unsafeWindow.calterRegistry = {};
var calterF = null;
if (unsafeWindow.calterRegistry[funcName]) {
// use the existing function modifier
calterF = unsafeWindow.calterRegistry[funcName];
for (i=0; i< findReplace.length; i++) {
calterF.addModifier(findReplace[i]);
}
} else {
// create and register the new calter
calterF = new CalterFuncModifier(funcName, findReplace);
unsafeWindow.calterRegistry[funcName] = calterF;
}
this.funcModifier = calterF;
if (findReplace != null)
{
this.numberMods = findReplace.length;
this.modIndex = this.funcModifier.numModifiers()- this.numberMods;
}
function isAvailable() {
// check if any of the replace strings matched the original function
var avail = false;
for (i= this.modIndex; i < this.modIndex + this.numberMods; i++ )
{
if (this.funcModifier.testModifier(i)) avail= true;
}
return avail;
}
function setEnable(tf) {
this.funcModifier.enableModifier(this.modIndex, tf, this.numberMods);
}
}
var CalterFuncModifier = function (funcName, findReplace) {
// (second argument is now optional )
this.applyModifiers = applyModifiers;
this.addModifier = addModifier;
this.enableModifier = enableModifier;
this.testModifier = testModifier;
this.modEnabled = modEnabled;
this.numModifiers = numModifiers;
this.funcName = funcName;
this.funcOld = null;
this.funcOldString = null;
this.funcNew = null;
this.modifiers = [];
this.modsActive = [];
try {
var x = this.funcName.split('.');
var f = unsafeWindow;
for (var i=0; i<x.length; i++)
f = f[x[i]];
ft = f.toString();
this.funcOld = f;
this.funcOldString = ft.replace ('function '+ this.funcName, 'function');
if (findReplace) {
this.modifiers = findReplace;
this.modsActive = new Array(findReplace.length);
for (var i=0; i<findReplace.length; i++){
this.modsActive[i] = false;
}
}
} catch (err) {
logit("CalterFuncModifier "+ this.funcName+" "+err);
}
// test if this modifier works on the original function.
// true = match found / replace possible
// false = does not match
function testModifier(modNumber) {
x = this.funcOldString.replace(this.modifiers[modNumber][0], this.modifiers[modNumber][1]);
if (x != this.funcOldString)
{
return true;
}
return false;
}
// use the active modifiers to create/apply a new function
function applyModifiers() {
try {
var rt = this.funcOldString;
var active = false;
for (var i=0; i< this.modifiers.length; i++){
if ( !this.modsActive[i]) continue;
x = rt.replace(this.modifiers[i][0], this.modifiers[i][1]);
if (x == rt) // if not found
{
// print out an error message when the match fails.
// These messages get lost on a refresh, so wait a few seconds to put it in the error log.
setTimeout( function (fname, repStr, ftstr) {
return function () {
logit("Unable to replace string in function " + fname);
logit("Replacment string:" + repStr );
logit("Function listing: " + ftstr);
return;
}
}(this.funcName, this.modifiers[i][0], ft), 3000);
}
else {
}
rt = x;
active = true;
}
this.funcNew = rt;
if (active) {
// apply the new function
uW.uwuwuwFunc(this.funcName +' = '+ this.funcNew);
} else {
// set to the original function
var x1 = this.funcName.split('.');
var f1 = unsafeWindow;
for (var i=0; i<x1.length-1; i++)
f1 = f1[x1[i]];
f1[x1[x1.length-1]] = this.funcOld;
}
} catch (err) {
logit("CalterFuncModifier "+ this.funcName+" "+err);
}
}
// add additional modifiers. The index of the modifier is returned so the caller can enable/disable it specificially
function addModifier(fr) {
this.modifiers.push(fr);
this.modsActive.push(false);
// return the index of the newly added modifier
return this.modifiers.length-1;
}
// turn on/off some of the modifiers.
// 'len' allows setting consectutive modifiers to the same value.
// If len is null, 1 is used
function enableModifier(modNumber, value, len) {
if (len == null) len = 1;
for (i = modNumber; i < modNumber + len; i++) {
if ( i < this.modsActive.length) {
this.modsActive[i] = value;
}
}
this.applyModifiers();
}
function modEnabled(modNumber) {
if ( modNumber < this.modsActive.length)
return this.modsActive[modNumber];
}
function numModifiers() {
return this.modifiers.length;
}
};
//only run in the main iframe
if (document.location.toString().match('src/main_src.php') ) trStartup ();