There are 4 previous versions of this script.
the source is over 100KB, syntax highlighting in the browser is too slow
// ==UserScript==
// @name KOC Throne Room Organizer
// @version 20120925
// @namespace Pray
// @homepage https://userscripts.org/scripts/show/
// @delay 1000
// @include *.kingdomsofcamelot.com/*main_src.php*
// @include *.kingdomsofcamelot.com/*standAlone.php*
// @include *apps.facebook.com/kingdomsofcamelot/*
// @include *kabam.com/kingdoms-of-camelot/play*
// @updateURL https://userscripts.org/scripts/source/132329.meta.js
// @require https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
// @require https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/jquery-ui.min.js
// @description Organizes, upgrades and salvages KOC throne room items
// ==/UserScript==
var Version = '20120925_mm';
var trPopUpTopClass = 'trPopTop';
var ResetAll = false;
var DEBUG_TRACE = false;
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 d2 = "sLqbRnctKUMERKQAEgA8oCN9xXg6jZarQhtTyH2NQYyeXhujHo9VjDthmEYkWkaioj0td1XaGaO4kS5XhhL0wgi2JOXLjSRsIFNHR1waxG8Zgg3bGPwM2msHS2CPSDxgOs25iAGFKqVNrxqjHZdId2WuK5cRr3iYqGauFZ";
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,
throneSaveNum : 10,
currentTab : null,
trWinIsOpen : false,
Opacity : 1.0,
anyCity : true,
uCityNum : 0,
sCityNum : 0,
repairAll : false,
trWinPos : {},
disableAnim : 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'],
desc : ['Preset A', 'Preset B', 'Preset C', 'Preset D', 'Preset E', 'Preset F', 'Preset G', 'Preset H', 'Preset I', 'Preset J'],
num_presets: 10,
noTooltips : false,
};
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},
1: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
2: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
3: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
4: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
5: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10: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},
1: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
2: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
3: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
4: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
5: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10: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},
1: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
2: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
3: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
4: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
5: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10: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},
1: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
2: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
3: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
4: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0},
5: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0} },
};
var salvageData = {
salvageActive : false,
throneSaveNum : 10,
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,
maxStones : 980000,
anyCity : true,
overflow : "order",
numSalvaged : {0: 0, 1: 0, 2:0, 3:0, 4:0, 5:0, 6:0},
};
var Cities = {};
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 (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();
readUpgradeStats();
readSalvageData();
readQueueData();
readPresetData();
logit ("Throne room organizer loaded");
//GM_addStyle("ul#throneInventoryList li > div { width: 28px !important;} ")
installHandlerFunctions();
var styles = '.xtab {padding-right: 5px; border:none; background:none; white-space:nowrap;}\
.xtabBR {padding-right: 5px; border:none; background:none;}\
.semi_transparent { zoom: 1; filter: alpha(opacity=60); opacity: 0.6;} \
div.trTitle { text-shadow: 0px 1px 0px white; margin-top: 3px; line-height: 24px; text-align: center; color: #5C3317; font: bold 1.3em Georiga; }\
.rot45 { transform: rotate(-45deg); -ms-transform: rotate(-45deg); -webkit-transform: rotate(-45deg); -o-transform: rotate(-45deg); -moz-transform: rotate(-45deg); -moz-transform-origin: 50% 50%; z-index: 10;}\
div.cardOverlay { font: cracked; width: 100%; font-size:3.5em; position: absolute; left: 0%; top: 30%; color: red; text-align: center; text-shadow: 2px 2px 4px #000;} \
div.trCloseSpan {float: right; background-image: url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/close_icon.png"); background-repeat: no-repeat; height: 20px; width: 20px; }\
body table.trMainTab tbody tr td {background: none;}\
body table.trTabDef tbody tr td {background: none;}\
#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;}\
table.trTab tr td {border:none; background:none; white-space:nowrap; padding:4px}\
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 tr td {border:1px none none solid none; padding: 2px 5px; white-space:nowrap;}\
table.trOptions tr td {border:1px none none solid none; padding: 1px 3px; white-space:nowrap;}\
table.trSrchResults tr td {border:1px none none solid none; padding: 1px 3px; white-space:nowrap;}\
table.trTabSome tr td {border:none; background:none; padding: 1px 3px; white-space:nowrap;}\
table.trTabPad tr td { padding-left: 8px; background: none;}\
table.trTabPad2 tr td { 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 a {color:inherit }\
table.trMainTab tr td {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 {padding: 0px 0px;}\
table.trMainTab tr td.sel {font-weight:bold; font-size:13px; }\
table.trMainTab tr td.notSel {font-weight:bold; font-size:13px; }\
tr.trPopTop td { background-color:transparent; border:none; height: 21px; padding:0px;}\
tr.trretry_trPopTop td { background-color:#a00; color:#fff; border:none; height: 21px; padding:0px; }\
tr.trMainPopTop td { background-color:#ded; border:none; height: 42px; padding:0px; } \
tr.trretry_trMainPopTop td { background-color:#a00; color:#fff; border:none; height: 42px; 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;}\
div.trPopup { background: url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/modal/736_bg_tile.jpg") repeat transparent 0% 0%; }\
div.trPopup { background: url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/dialog_740_r2_c1.jpg") no-repeat transparent 0% 0%; }\
/* 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.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.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{font:bold 16px Georiga; overflow: hidden;}\
div.trCard>div{float:left;border:1px solid #a56631;margin:0px;padding:0px;width:200px;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#t_throneStatList li { float: left; width: 22px; height: 22px; text-align: center; color: white; }\
ul#t_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#t_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#t_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#t_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; }\
div.tt {margin-left: -999em; position: absolute;}\
div.indent25 {padding-left:25px}\
a.loadPreset:hover div.tt { 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: absolut; left: 250px; 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();
}
mainPop = new trPopup ('tr', upgradeData.trWinPos.x, upgradeData.trWinPos.y, 720,850, true,
function (){
tabManager.hideTab();
upgradeData.trWinIsOpen=false;
saveUpgradeData();
});
mainPop.autoHeight (true);
mainPop.getMainDiv().innerHTML = '<STYLE>'+ styles +'</style>';
setCities();
CM.cheatDetector.detect = foo;
tabManager.init (mainPop.getMainDiv());
if (upgradeData.trWinIsOpen){
mainPop.show (true);
tabManager.showTab();
}
window.addEventListener('unload', onUnload, false);
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');
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');
}
}
$("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
buildPresetWidget();
trDispTimer = setInterval(updateTimerDisp , 1000);
}
var foo = function() {
};
//callback handler when a preset button is presed
function processPresetClick(btn)
{
// don't do anything if already the right preset
if (btn == unsafeWindow.seed.throne.activeSlot) return;
// send message
unsafeWindow.AjaxCall.gPostRequest(
"ajax/_dispatch53.php",
{
ctrl: "throneRoom\\ThroneRoomServiceAjax",
action: "setPreset",
presetId: btn
},
function (v) {
if (v.ok === true)
{
// success
var H = unsafeWindow.seed.throne.slotEquip[btn];
unsafeWindow.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
{
logit("Preset change failed. Error code: " + v.error_code);
}
}
);
}
//update the preset list buttons
function setPresetWidget(slot)
{
// logit("preset: " + slot);
var x = ($("#t_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 = $("#t_throneInventoryPreset" + slot + ", #throneInventoryPreset" + slot);
s.removeClass('active');
s.addClass('selected')
s.unbind("mouseenter").unbind("mouseleave");
}
//create a preset list on the main display
function buildPresetWidget()
{
var E = [];
var J = unsafeWindow.seed.throne.activeSlot;
var F = unsafeWindow.seed.throne.slotNum;
for (var G = 0; G < 8; ++G) {
var H = G + 1;
var I = $("<li/>");
if (H === J) {
I.attr("id", "t_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", "t_throneInventoryPreset" + H);
I.addClass("buy");
I.html(H);
I.bind("click", function () {
unsafeWindow.cm.ContextualMenuThrone.renderMenu(this, null);
})
} else {
if (H <= F) {
I.attr("id", "t_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", "t_throneInventoryPreset" + H);
I.addClass("locked");
I.html(H)
}
}
}
E.push(I)
}
var C = $("<ul/>", {
id: "t_throneStatList",
addClass: "presetList",
style: "padding: 0; margin: 5px; list-style: none; overflow: hidden; float: left; border: 5px outset tan;",
});
$.each(E, function (K, L) {
C.append(L)
})
//$("div.tabs_engagement").append(C);
//$("div#kocmain_bottom").append(C);
var aa = $("<div/>", {height: '40px'});
$(aa).append(C);
$("div.mod_comm").prepend(aa);
var p = $("div.mod_comm").css('top');
if (+p.split('px')[0] < -611)
{
$("div.mod_comm").css('top', "-610px");
$("div.comm_body").css('top', '40px');
}
$("div.mod_comm").bind('DOMAttrModified', function ()
{
var p = $("div.mod_comm").css('top');
if (+p.split('px')[0] < -611)
{
$("div.mod_comm").css('top', "-610px");
$("div.comm_body").css('top', '40px');
}
});
}
function updateTimerDisp () {
var t = Tabs.upgrader;
var timeUntilDone = 0;
if (t.repairEnd != 0)
{
timeUntilDone = t.repairEnd - unixTime();
}
if (timeUntilDone > 0)
{
$("#trtimerdisp").html("<span id='trhammer'></span> " + rectime(timeUntilDone))
.css('text-align', 'left')
.css('width', '100px');
}
else
{
$("#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 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');
}
}
};
unsafeWindow.cm.ThroneView.renderInventory = ri2;
// 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 set the item to auto-enhance
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
var 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
var 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);
$(".buttonv2.red").click(function() { $(".mediumModal").css('z-index', 120000);});
}
};
// 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();
};
// hook up to the new function
CM.ThronePanelView.renderPanel = renderPanel2;
}
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 trMainTab (me){
if (me.button == 2){
var c = getClientCoords (document.getElementById('main_engagement_tabs'));
mainPop.setLocation ({x: c.x+4, y: c.y+c.height});
}
}
function onUnload (){
upgradeData.trWinPos = mainPop.getLocation();
if (!ResetAll) saveUpgradeData();
}
function mouseMainTab (me){ // right-click on main button resets window
// location
if (me.button == 2){
var c = getClientCoords (document.getElementById('main_engagement_tabs'));
mainPop.setLocation ({x: c.x+4, y: c.y+c.height});
}
}
function attachTab()
{
unsafeWindow.hideShow = trHideShow;
//unsafeWindow.execSelect = Tabs.upgrader.toggleSelect;
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="trexecselect" class="inactive" onclick="execSelect()">Select</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>');
'<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"><span> Next </span>',
'<div id="nextStatContainer" class="nextStat" onclick="clickNext()"><span> Next *Click Me* </span>');
}
function trHideShow (){
if (mainPop.toggleHide(mainPop)){
tabManager.showTab();
upgradeData.trWinIsOpen = true;
} else {
tabManager.hideTab();
upgradeData.trWinIsOpen = false;
}
saveUpgradeData();
}
function hideMe (){
mainPop.show (false);
tabManager.hideTab();
upgradeData.trWinIsOpen = false;
saveUpgradeData();
}
function showMe (){
mainPop.show (true);
tabManager.showTab();
upgradeData.trWinIsOpen = true;
saveUpgradeData();
}
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;
}
var tabManager = {
tabList : {}, // {name, obj, div}
currentTab : null,
init : function (mainDiv){
var t = tabManager;
var sorter = [];
for (k in Tabs){
if (!Tabs[k].tabDisabled){
t.tabList[k] = {};
t.tabList[k].name = k;
t.tabList[k].obj = Tabs[k];
if (Tabs[k].tabLabel != null)
t.tabList[k].label = Tabs[k].tabLabel;
else
t.tabList[k].label = k;
if (Tabs[k].tabOrder != null)
sorter.push([Tabs[k].tabOrder, t.tabList[k]]);
else
sorter.push([1000, t.tabList[k]]);
t.tabList[k].div = document.createElement('div');
}
}
sorter.sort (function (a,b){return a[0]-b[0]});
var m = '<TABLE cellspacing=1 class=trMainTab><TR class=tabsbar style="margin-top: 15px; margin-left: 0px;">';
for (var i=0; i<sorter.length; i++) {
m += '<TD class=spacer></td><TD align=center class=notSel id=trtc'+ sorter[i][1].name +' ><A class="tab trTab" style="width: 100px; margin-top: 0px;"><SPAN>'+ sorter[i][1].label +'</span></a></td>';
// m += '<TD align=center class=notSel id=trtc'+
// sorter[i][1].name +'
// ><A><SPAN>'+ sorter[i][1].label +'</span></a></td>';
if ((i+1)%9 == 0) m+='</tr><TR>';
}
m+='</tr></table>';
// m += '<TD class=spacer width=90% align=right>'+ Version
// +' </td></tr></table>';
mainPop.getMainTopDiv().innerHTML = m;
for (k in t.tabList) {
if (t.tabList[k].name == upgradeData.currentTab)
t.currentTab =t.tabList[k] ;
document.getElementById('trtc'+ k).addEventListener('click', this.e_clickedTab, false);
var div = t.tabList[k].div;
div.style.display = 'none';
div.style.height = '100%';
mainDiv.appendChild(div);
try {
t.tabList[k].obj.init(div);
} catch (e){
div.innerHTML = "INIT ERROR: "+ e;
}
}
if (t.currentTab == null)
t.currentTab = sorter[0][1];
t.setTabStyle (document.getElementById ('trtc'+ t.currentTab.name), true);
t.currentTab.div.style.display = 'block';
$("a.trTab").click( function () {
$("a.trTab").removeClass("selected");
$(this).addClass("selected");
}
);
},
hideTab : function (){
var t = tabManager;
t.currentTab.obj.hide();
},
showTab : function (){
var t = tabManager;
t.currentTab.obj.show();
},
setTabStyle : function (e, selected){
if (selected){
e.className = 'sel';
$(e).find("a.trTab").addClass("selected");
} else {
e.className = 'notSel';
$(e).find("a.trTab").removeClass("selected");
}
},
e_clickedTab : function (e){
var t = tabManager;
var newTab = t.tabList[e.target.parentNode.parentNode.id.substring(4)];
if (!newTab) return;
if (t.currentTab.name != newTab.name){
t.setTabStyle (document.getElementById ('trtc'+ t.currentTab.name), false);
t.setTabStyle (document.getElementById ('trtc'+ newTab.name), true);
t.currentTab.obj.hide ();
t.currentTab.div.style.display = 'none';
t.currentTab = newTab;
newTab.div.style.display = 'block';
upgradeData.currentTab = newTab.name;
}
newTab.obj.show();
},
}
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 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);
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,
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 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><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 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 += '</select></span></div></td>';
m += '<td align="right"><INPUT id=trAddRule type=button value="Create Rule"/></td>';
m += '</tr></table>';
m += '<TABLE class=trTabPad 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;">Number of items salvaged: '+ addCommas(salvageData.numSalvagedItems) + ' </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='trRuleDisplay' style=' max-height:350px; height:250px; overflow-x: auto; overflow-y:scroll;'>";
m += '</div></div>';
t.myDiv.innerHTML = m;
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 (upgradeData.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);
t.start();
},
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]));
}
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 cid = upgradeData.sCityNum;
if ( Seed.resources["city" + Seed.cities[cid][0]]["rec5"][0] <= salvageData.maxStones) return cid;
var ind = -1;
var lowest = 9999999;
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 (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 ( 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">';
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);
}
document.getElementById('trSalvagerPower').addEventListener('click', function(){t.togglePower(this);} , false);
},
updateTRTab : function() {
$("#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);
t.delItems = [];
} else {
salvageData.salvageActive = true;
var btn = document.getElementById('trSalvagerPower');
btn.value = "Salvager = ON";
t.doSalvage();
t.start();
}
t.updateTRTab();
saveSalvageData();
},
// 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) {
return;
}
if (t.deleting == true) return;
t.deleting = true;
t.setStatus('Salvaging items');
t.delItems = t.buildList(false);
if (t.delItems.length > 0) {
t.doDelete();
} else {
t.deleting = false;
t.setStatus('No items to salvage. Waiting for next cycle.');
}
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 > 90)
$("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;
},
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;
},
doDelete : function(){
if(!salvageData.salvageActive) {
return;
}
var t = Tabs.throneSalvage;
var id = t.delItems[0];
var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams);
var num_city = t.pickCity();
if ( num_city < 0)
{
t.setStatus("All cities are (nearly) full of aetherstone");
num_city = upgradeData.sCityNum;
}
var item = unsafeWindow.kocThroneItems[id];
if (item)
t.setStatus('Salvaging ' + item.name);
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) {
var rslt = eval("(" + transport.responseText + ")");
var throne_item = unsafeWindow.kocThroneItems[id];
if(rslt.ok) {
if (throne_item) trSalvageLog('Deleted Throne room item '+ throne_item.name);
salvageData.numSalvagedItems++;
saveSalvageData();
$("#trNumSalv").html('<div style="text-align: center;">Number of items salvaged: '+ addCommas(salvageData.numSalvagedItems) + ' </div>');
// temporarily set the city id
var tmp = unsafeWindow.currentcityid;
unsafeWindow.currentcityid = Seed.cities[num_city][0];
if (throne_item) {
salvageData.numSalvaged[throne_item.quality]++;
saveSalvageData();
throne_item.salvage();
}
unsafeWindow.currentcityid = tmp;
}
else
{
logit("salvage failed");
logit("rslt: " + inspect(rslt,3,1));
Tabs.throneSalvage.setStatus('Unable to salvage item ' + throne_item.name);
unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
unsafeWindow.update_seed_ajax(true, function() {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
setTimeout (t.doDelete, 2200);
} else {
t.deleting = false;
t.setStatus('Salvaging complete. Waiting for next cycle.');
return;
}
},
onFailure: function () {
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;
}
if ( (this.buffType == "e" || this.buffType == "b") && card_effect == this.effect)
{
numberFound++;
}
if ( (this.buffType == "e" || this.buffType == "d") && card_effect == (this.effect + " Debuff"))
{
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},
selectedItems : [],
panelId: -1,
panelType: "upgrade",
panelNextLevel : 2,
sortEffect: "none",
sortType: "both",
sortInactive: true,
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 style="width: 720px;">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><tr align=center><td width=15%/><td width=30%><div><span>View preset: <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++)
{
m += '<option value="local'+k+'"> Local: '+ presetData.ids[k] +'</option>';
}
m += '</select></span></div></td>';
m += '<TD width=20%><INPUT id=testSalvage type=button value=" Test Salvage "/></td><td id=trDelResults></td>';
m += '</tr>';
m+= '<tr><td colspan=1><span style="width: 130px; float: left; margin-top: 4px; margin-right: 4px; margin-left: 5px;"> Switch to preset: </span>';
m+= '</td><td colspan=3>';
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 += '<span style="float: right; margin-top: 4px; margin-right: 4px; margin-left: 5px;"> Note: Final preset is overwritten when using local presets.</span>'
m += '</td></tr>';
m+= '<tr><td colspan=1><span style="width: 130px; float: left; margin-top: 4px; margin-right: 4px; margin-left: 5px;"> Switch to local preset: </span>';
m+= '</td><td colspan=3>';
for (a=0; a< presetData.num_presets; a++)
{
m += '<a style="font-family: serif;" class="button20 loadPreset" id=trLoad'+ a + ' > <span> '+ presetData.ids[a] + ' </span>';
m += '<div class="tt"> <b>' + presetData.ids[a] +':</b> ' + presetData.desc[a] + '</div></a>';
}
m += '</td></tr>';
m+= '<tr><td colspan=1><span style="width: 130px; float: left; margin-top: 4px; margin-right: 4px; margin-left: 5px;"> Save local preset: </span>';
m+= '</td><td colspan=3>';
for (a=0; a< presetData.num_presets; a++)
{
m += '<a style="font-family: serif;" class="buttonDown20 savePreset" id=trSave'+ a + ' > <span>' + presetData.ids[a] + ' </span></a>';
}
m += '</td></tr>';
m += '<tr align=center><td colspan=4><div id=trSwitchStatus></div></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 '+ ( t.sortInactive ?' CHECKED':'') +'/> Include Inactive</td>';
m +='</tr></table>';
m += "<div id='trScrollDiv' style='width: 720px; max-height:480px; height:480px; overflow-x: auto; overflow-y:scroll;'>";
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);
m += "<div id='trTableDiv' style='width: 100%;'>";
m += '<TABLE id=trDisplayTable width=100% height=0% class=trTab>';
m += "<tr align=center><th>Chairs</th><th>Tables</th><th>Windows</th><th>Banners</th><th>Advisors</th><th>Trophies</th></tr>";
m += '</table></div>';
m += '</div>';
m += '</div>';
t.myDiv.innerHTML = m;
t.paintTable();
$("#PresetList").click( function() {t.selectPreset( $(this).val());});
$("#testSalvage").click(function() {t.testSalvage();});
// default to highlight the active preset
t.selectPreset(Seed.throne.activeSlot);
document.getElementById ('PresetList').value = Seed.throne.activeSlot;
$("#trSortList").change( function () {
t.sortEffect = $(this).val();
t.show();
});
$("#trSortType").change( function() {
t.sortType = $(this).val();
t.show();
});
$("#trSortInactive").change( function() {
t.show();
});
$(".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]);
});
$(".savePreset").click( function () {
var id= $(this).attr('id');
Tabs.organizer.saveLocalPreset(+id.split("trSave")[1]);
});
},
setSwitchStatus : function(s) {
$("#trSwitchStatus").html(s);
},
loadLocalPreset : function (id) {
var t = Tabs.organizer;
//logit("load: " + id );
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;
}
// grab the list of items equipped in the last slot
var ei = Seed.throne.slotEquip[Seed.throne.slotNum];
var c = 0;
t.switchingPresets = true;
// see if we are already on the last slot
if (Seed.throne.slotNum != Seed.throne.activeSlot) {
// switch to the last preset
t.setSwitchStatus("Switching to last active slot ...");
processPresetClick(Seed.throne.slotNum);
c++;
} else {
t.setSwitchStatus("Already in last 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) {
return function () {
Tabs.organizer.equipItem(I2, Seed.throne.slotNum);
Tabs.organizer.setSwitchStatus("Equipping " + I2.name);
};
}
setTimeout (f(I), 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.");
},
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("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 bump = t.panelNextLevel;
if (P == "enhance")
{
if ( (X.quality + bump ) > 5)
{
bump = 5 - X.quality;
}
}
else if ( (X.level + bump) > 10)
{
bump = 10 - X.level;
}
var R = [],
Q, Y, S, U, N = {},
T, W;
if (V == "next") {
if (P == "enhance") {
X.quality += bump;
$("#nextStatContainer span").html('<span> ' + X.createPrefix() + ' </span>');
} else {
if (P == "upgrade") {
X.level += bump;
$("#nextStatContainer span").html('<span> Level ' + X.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];
U = +(S.base) + ((X.level * X.level + X.level) * +(S.growth) / 2);
U = U.toFixed(2);
N[aa.id] = {};
N[aa.id].percent = U;
N[aa.id].name = Y[1];
if (Q % 2 == 0) {
T = "even"
} else {
T = "odd"
}
if (Q <= X.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") {
X.quality -= bump
} else {
if (P == "upgrade") {
X.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(""));
},
// 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);
m += "<tr align=center valign=top><th width=17%>Chairs</th><th width=17%>Tables</th><th width=17%>Windows</th><th width=17%>Banners</th><th width=16%>Advisors</th><th width=16%>Throphies</th></tr>";
for (var k= 0; k < ii ; k++)
{
mm = '<TR align=left valign=top>';
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="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 theId = $(this).parents("td.tdcard").attr("id").split("card")[1];
$("#contextMenu").remove();
if (!theId || theId == 0) {
return;
}
if (unsafeWindow.kocThroneItems[theId])
{
unsafeWindow.cm.ThroneView.hoverItem(A, this, unsafeWindow.kocThroneItems[theId]);
$("#kofcNewTooltipDiv").css('position', 'absolute');
$("#kofcNewTooltipDiv").css('left', ($("#tr_outer").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");
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");
}
}
},
// 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];
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;
t.sortInactive = $("#trSortInactive").attr('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)
{
var N = item.effects[e];
var effect=CM.thronestats.effects[N.id][1];
var tier=CM.thronestats.tiers[N.id][N.tier];
var B=+(e.split("slot")[1]);
if (B> item.quality && !t.sortInactive)
{
return +retValue;
}
var percent=+(tier.base+((item.level*item.level+item.level)*tier.growth*0.5));
if ( (effect == (t.sortEffect + " Debuff")) && (t.sortType != "buff"))
{
retValue -= percent;
}
else if (effect == t.sortEffect && t.sortType != "debuff")
{
retValue += percent;
}
}
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];
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;
if (I == null)
{
D.push("<div>");
D.push("</div>");
return D.join("");
}
D.push("<div class='trCardDisp' id='trCardItem" + I.id + "' style='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);
D.push(" </div> ");
D.push(" <div class='description'> ");
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)
{
var N = I.effects[M];
effect=CM.thronestats.effects[N.id];
tier=CM.thronestats.tiers[N.id][N.tier];
percent=+(tier.base+((I.level*I.level+I.level)*tier.growth*0.5));
percent=(percent>0)?"+"+percent:+percent;
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> ");
}
}
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(Seed.throne.activeSlot);
document.getElementById ('PresetList').value = Seed.throne.activeSlot;
},
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 class=trStat>UPGRADE LOG - VERSION: '+ Version+'</div><DIV style="height:535px; max-height:535px; overflow-y:auto">\
<TABLE cellpadding=0 cellspacing=0 id=trsuccesslog class=trTabLined><TR><TD></td><TD width=95%></td></table>\
<DIV class=trStat>Action Log</div>\
<TABLE cellpadding=0 cellspacing=0 id=tractionlog class=trTabLined><TR><TD></td><TD width=95%></td></table>\
<DIV class=trStat>Salvage Log</div>\
<TABLE cellpadding=0 cellspacing=0 id=trsalvagelog class=trTabLined><TR><TD></td><TD width=95%></td></table></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);
},
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><DIV id=trOptions class=trStat>OPTIONS</div><TABLE id=trOptionTbl width=100% height=0% class=trTab>';
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=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><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=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+ '"/></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 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><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++ )
{
m += '<tr><td>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;" ><INPUT id=trNoTooltips type=checkbox '+ (presetData.noTooltips?' CHECKED':'') +'/> Do not show large portrait tooltips';
m += '</table></div>';
t.myDiv.innerHTML = m;
$('#trDisableAnim').change( function (){
upgradeData.disableAnim = document.getElementById('trDisableAnim').checked;
disableAnimation(upgradeData.disableAnim);
}
);
$('#trupdate').change( function (){
TRGlobalOptions.trUpdate = document.getElementById('trupdate').checked;
GM_setValue ('TROptions_??', JSON2.stringify(TRGlobalOptions));
}
);
$('#trupdatenow').click(
function() { AutoUpdater_132329.call(true,true); }
);
$('#trSalAnyCity').change( function(){
salvageData.anyCity = document.getElementById('trSalAnyCity').checked;
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();});
// 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();
});
disableAnimation(upgradeData.disableAnim);
},
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 : [ "Simple",
"Common",
"Uncommon",
"Rare",
"Epic",
"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 width=50%><div><span>Item: <select id="trUpgradeList">';
m += '<option value="0">--Items--</option>';
for (k in unsafeWindow.kocThroneItems) {
var throne_item = unsafeWindow.kocThroneItems[k];
m += '<option value="'+k+'">'+throne_item.name+'</option>';
}
m += '</select></span></div></td>';
m += '<td width=30%><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 width=40%><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=trQDiv style="overflow-y: scroll; height: 300px;"></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();
t.buildQueueDisplay();
});
$("#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("<table id='trQueue' width='100%'/>");
$("#trQueueAdd").click( function () { t.addQueue();});
$("#trOneItem").change( function () {
queueData.oneItem = document.getElementById('trOneItem').checked;
saveQueueData();
});
t.buildLevelWidget();
t.buildQueueDisplay();
$("#trAction").change( function() {t.buildLevelWidget();});
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;
}
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 = 10;
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)
{
// repair everything
for (k in unsafeWindow.kocThroneItems)
{
var throne_item = unsafeWindow.kocThroneItems[k];
if (!throne_item) continue;
if (throne_item.isBroken)
{
t.doRepair(throne_item.id);
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);
}
} 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 ("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 > 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.buffItemId = 0;
params.payment = "aetherstone";
params.cityId = Seed.cities[num_city][0];
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) {
var rslt = eval("(" + transport.responseText + ")");
// logit("rslt: " + inspect(rslt,3,1));
if(rslt.ok){
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)
{
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();
t.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);
trSuccessLog('Enhanced '+unsafeWindow.kocThroneItems[eItem].name + ' to quality ' + rslt.item.quality+ " in " + qItem.triesThis + " attempts. " + qItem.triesTotal + " total attempts for this item.");
if (qItem.level <= y.quality) {
qItem.status = "complete";
}
else {
var now = new Date();
qItem.status = "Partially enhanced";
qItem.triesLast = qItem.triesThis;
qItem.triesThis = 0;
}
}
saveQueueData();
t.buildQueueDisplay();
clearTimeout(Tabs.upgrader.timerH);
t.timerH = setTimeout(t.doAction, 10* 1000);
}
else
{
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;
unsafeWindow.cm.HeatUpModel.attemptCallback(+(rslt.heatupModifier));
saveUpgradeStats();
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();
t.buildQueueDisplay();
clearTimeout(t.timerH);
t.timerH = setTimeout(t.doAction, 10*1000);
//t.doRepair(y.id);
}
unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
}
else
{
logit("Enhance result:" + inspect (rslt, 3, 1));
t.setStatus("Unable to enhance at this time ... waiting for next cycle");
}
return;
},
onFailure: function () {
logit("Enhance error. Waiting for next cycle.");
t.setStatus("Unable to send enhance request. Waiting for next cycle");
return;
},
});
} catch (e) {
logit ("exception: "+ inspect(e,3,1));
}
return;
},
doUpgrade : function(uItem) {
var t = Tabs.upgrader;
var y = unsafeWindow.kocThroneItems[uItem];
if (upgradeData.active == false || uItem ==0 || y == null)
{
t.setStatus("Powered off.");
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 > Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0] ))
{
t.setStatus("Not enough aetherstones to upgrade.");
return;
}
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) {
var rslt = eval("(" + transport.responseText + ")");
// logit("rslt: " + inspect(rslt,3,1));
if(rslt.ok){
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)
{
upgradeStats.upgradeSuccess[y.quality][y.level]++;
saveUpgradeStats();
y.level = rslt.item.level;
y.quality = rslt.item.quality;
y.name = y.createName();
t.repaint();
t.setResult("Upgrade successful. " + addCommas(rslt.aetherstones) + " aetherstones used.");
t.setStones(Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0]);
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);
trSuccessLog('Upgraded '+unsafeWindow.kocThroneItems[uItem].name + ' to level ' + rslt.item.level + " in " + qItem.triesThis + " attempts. " + qItem.triesTotal + " total attempts for this item.");
if (qItem.level <= y.level) {
qItem.status = "complete";
}
else {
var now = new Date();
qItem.status = "Partially upgraded";
qItem.triesLast = qItem.triesThis;
qItem.triesThis = 0;
}
}
saveQueueData();
t.buildQueueDisplay();
clearTimeout(t.timerH);
t.timerH = setTimeout(t.doAction, 10* 1000);
}
else
{
trActionLog('Upgrade failed Throne room item '+unsafeWindow.kocThroneItems[uItem].name);
upgradeStats.upgradeFailure[y.quality][y.level]++;
saveUpgradeStats();
y.isBroken = true;
y.brokenType = "level";
y.status = rslt.item.status;
y.name = y.createName();
unsafeWindow.cm.HeatUpModel.attemptCallback(+(rslt.heatupModifier));
t.setResult("Upgrade 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.status == "not started") qItem.status = "started";
saveQueueData();
t.buildQueueDisplay();
//t.doRepair(uItem); // fix item
clearTimeout(t.timerH);
t.timerH = setTimeout(t.doAction, 10*1000);
}
unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
return;
}
else
{
t.setStatus("Upgrade request not accepted. Waiting for next cycle.");
logit("Upgrade result:" + inspect (rslt, 3, 1));
}
return;
},
onFailure: function () {
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 <=10; 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(10);
}
},
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='30%'>Item</th><th width='5%'>Action</th><th width='5%'>Max</th><th width='45%'>Status/Last Upgrade/Attempts</th><th>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";
if (the_item)
name = the_item.name;
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>"
+ name + "</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 <=10; i++) {
m += '<option value="' + i + '" '+ (q.level==i ? 'selected' : '' ) +'> +' + i + '</option>';
}
m += '</select></div>';
}
m += "</td><td style='text-align: center;'>" + 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');
}
}
},
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]);
/*
$($("#trQueue")[0].rows[i])
.find('td')
.wrapInner('<div style="display: none;" />')
.parent()
.find('td > div')
.slideDown(700, function(){
var $set = $(this);
$set.replaceWith($set.contents());
});
*/
/*
$($("#trQueue")[0].rows[i])
.find('tr div')
.slideDown(700);
*/
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");
}
t.updateTRTab();
if (upgradeData.active == false)
{
}
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 ( 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 ( 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];
// var rItem = upgradeData.item;
params.ctrl = 'throneRoom\\ThroneRoomServiceAjax';
params.action = 'timeRepair';
params.throneRoomItemId = rItem;
params.cityId = Seed.cities[upgradeData.uCityNum][0];
new AjaxRequest(unsafeWindow.g_ajaxpath + "ajax/_dispatch53.php" + unsafeWindow.g_ajaxsuffix, {
method: "post",
parameters: params,
loading: true,
onSuccess: function (transport) {
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];
t.buildQueueDisplay();
// uW.cm.ThronePanelView.clickSpeedUp(item);
}
else
{
if (rslt.msg == "Item is not broken")
{
t.setStatus("Item is repaired.");
t.repairId = rItem;
t.repairEnd = 0;
t.clearRepair();
}
}
return;
},
onFailure: function () {
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.Seed.queue_throne.end)
{
t.repairEnd = Seed.queue_throne.end;
t.repairId = Seed.queue_throne.itemId;
}
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<=10; 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 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=12>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<10; 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];
var ft = [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<10; l++)
{
if (upgradeStats.upgradeSuccess[q][l] == null) upgradeStats.upgradeSuccess[q][l] =0;
if (upgradeStats.upgradeFailure[q][l] == null) 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<10; 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 <10; 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(){
},
}
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);
},
delete : function (prefix){
var t = WinManager;
delete t.wins[prefix];
delete unsafeWindow.cpopupWins[prefix];
}
}
function CWinDrag (clickableElement, movingDiv, enabled) {
var t=this;
this.setEnable = setEnable;
this.setBoundRect = setBoundRect;
this.debug = debug;
this.dispEvent = dispEvent;
this.lastX = null;
this.lastY = null;
this.enabled = true;
this.moving = false;
this.theDiv = movingDiv;
this.body = document.body;
this.ce = clickableElement;
this.moveHandler = new CeventMove(this).handler;
this.outHandler = new CeventOut(this).handler;
this.upHandler = new CeventUp(this).handler;
this.downHandler = new CeventDown(this).handler;
this.clickableRect = null;
this.boundRect = null;
this.bounds = null;
this.enabled = false;
if (enabled == null)
enabled = true;
this.setEnable (enabled);
function setBoundRect (b){ // this rect (client coords) will not go
// outside
// of current body
this.boundRect = boundRect;
this.bounds = null;
}
function setEnable (enable){
if (enable == t.enabled)
return;
if (enable){
clickableElement.addEventListener('mousedown', t.downHandler, false);
t.body.addEventListener('mouseup', t.upHandler, false);
} else {
clickableElement.removeEventListener('mousedown', t.downHandler, false);
t.body.removeEventListener('mouseup', t.upHandler, false);
}
t.enabled = enable;
}
function CeventDown (that){
this.handler = handler;
var t = that;
function handler (me){
if (t.bounds == null){
t.clickableRect = getClientCoords(clickableElement);
t.bodyRect = getClientCoords(document.body);
if (t.boundRect == null)
t.boundRect = t.clickableRect;
t.bounds = {top:10-t.clickableRect.height, bot:t.bodyRect.height-25, left:40-t.clickableRect.width, right:t.bodyRect.width-25};
}
if (me.button==0 && t.enabled){
t.body.addEventListener('mousemove', t.moveHandler, true);
t.body.addEventListener('mouseout', t.outHandler, true);
t.lastX = me.clientX;
t.lastY = me.clientY;
t.moving = true;
}
}
}
function CeventUp (that){
this.handler = handler;
var t = that;
function handler (me){
if (me.button==0 && t.moving)
_doneMoving(t);
}
}
function _doneMoving (t){
t.body.removeEventListener('mousemove', t.moveHandler, true);
t.body.removeEventListener('mouseout', t.outHandler, true);
t.moving = false;
}
function CeventOut (that){
this.handler = handler;
var t = that;
function handler (me){
if (me.button==0){
t.moveHandler (me);
}
}
}
function CeventMove (that){
this.handler = handler;
var t = that;
function handler (me){
if (t.enabled && !t.wentOut){
var newTop = parseInt(t.theDiv.style.top) + me.clientY - t.lastY;
var newLeft = parseInt(t.theDiv.style.left) + me.clientX - t.lastX;
if (newTop < t.bounds.top){ // if out-of-bounds...
newTop = t.bounds.top;
_doneMoving(t);
} else if (newLeft < t.bounds.left){
newLeft = t.bounds.left;
_doneMoving(t);
} else if (newLeft > t.bounds.right){
newLeft = t.bounds.right;
_doneMoving(t);
} else if (newTop > t.bounds.bot){
newTop = t.bounds.bot;
_doneMoving(t);
}
t.theDiv.style.top = newTop + 'px';
t.theDiv.style.left = newLeft + 'px';
t.lastX = me.clientX;
t.lastY = me.clientY;
}
}
}
function debug (msg, e){
logit ("*************** "+ msg +" ****************");
logit ('clientWidth, Height: '+ e.clientWidth +','+ e.clientHeight);
logit ('offsetLeft, Top, Width, Height (parent): '+ e.offsetLeft +','+ e.offsetTop +','+ e.offsetWidth +','+ e.offsetHeight +' ('+ e.offsetParent +')');
logit ('scrollLeft, Top, Width, Height: '+ e.scrollLeft +','+ e.scrollTop +','+ e.scrollWidth +','+ e.scrollHeight);
}
function dispEvent (msg, me){
logit (msg + ' Button:'+ me.button +' Screen:'+ me.screenX +','+ me.screenY +' client:'+ me.clientX +','+ me.clientY +' rTarget: '+ me.relatedTarget);
}
}
//creates a 'popup' div
//prefix must be a unique (short) name for the popup window
function trPopup (prefix, x, y, width, height, enableDrag, onClose) {
var pop = WinManager.get(prefix);
if (pop){
pop.
(false);
return pop;
}
// this.BASE_ZINDEX = 100402; // value should put it in front of the TR and
// behind the salvage popup
this.BASE_ZINDEX = 111111;
// protos ...
this.show = show;
this.toggleHide = toggleHide;
this.getTopDiv = getTopDiv;
this.getMainTopDiv = getMainTopDiv;
this.getMainDiv = getMainDiv;
this.getLayer = getLayer;
this.setLayer = setLayer;
this.setEnableDrag = setEnableDrag;
this.getLocation = getLocation;
this.setLocation = setLocation;
this.focusMe = focusMe;
this.isShown = isShown;
this.unfocusMe = unfocusMe;
this.centerMe = centerMe;
this.destroy = destroy;
this.autoHeight = autoHeight;
// object vars ...
this.div = document.createElement('div');
this.prefix = prefix;
this.onClose = onClose;
var t = this;
this.div.className = 'trPopup '+ prefix +'_trPopup';
this.div.id = prefix +'_outer';
// this.div.style.background = "#fff";
this.div.style.zIndex = this.BASE_ZINDEX // KOC modal is 100210 ?
this.div.style.display = 'none';
this.div.style.width = width + 'px';
this.div.style.height = height + 'px';
this.div.style.maxHeight = height + 'px';
this.div.style.overflowY = 'show';
this.div.style.position = "absolute";
this.div.style.top = y +'px';
this.div.style.left = x + 'px';
this.div.style.padding = '5px 9px 0px 9px';
if (trPopUpTopClass==null)
topClass = 'trPopupTop '+ prefix +'_trPopupTop';
else
topClass = trPopUpTopClass +' '+ prefix +'_'+ trPopUpTopClass;
var m = '<TABLE class=trTabDef cellspacing=0 width=100% height=100%>';
m += '<TR vAlign=top id="'+ prefix +'_bar" class="'+ topClass +'"><td width="95%"><div class="trTitle">Throne Room Organizer</div></td><TD><div id='+ prefix +'_X align=right valign=top onmouseover="this.style.cursor=\'pointer\'" class=trCloseSpan> </span></td></tr>';
m += '<tr><td colspan=2 id="'+ prefix +'_top"></td></tr>';
m += '<TR><TD colspan=2 height=100% valign=top class="trPopMain '+ prefix +'_trPopMain" id="'+ prefix +'_main"></td></tr>';
m += '<tr><td colspan=2><div id=tr_footer></div></td>';
m += '</tr></table>';
document.body.appendChild(this.div);
this.div.innerHTML = m;
document.getElementById(prefix+'_X').addEventListener ('click', e_XClose, false);
this.dragger = new CWinDrag (document.getElementById(prefix+'_bar'), this.div, enableDrag);
this.div.addEventListener ('mousedown', e_divClicked, false);
WinManager.add(prefix, this);
function e_divClicked (){
t.focusMe();
}
function e_XClose (){
t.show(false);
if (t.onClose != null)
t.onClose();
}
function autoHeight (onoff){
if (onoff)
t.div.style.height = '';
else
t.div.style.height = t.div.style.maxHeight;
}
function focusMe (){
t.setLayer(5);
for (k in unsafeWindow.cpopupWins){
if (k != t.prefix)
unsafeWindow.cpopupWins[k].unfocusMe();
}
}
function unfocusMe (){
t.setLayer(-5);
}
function getLocation (){
return {x: parseInt(this.div.style.left), y: parseInt(this.div.style.top)};
}
function setLocation (loc){
t.div.style.left = loc.x +'px';
t.div.style.top = loc.y +'px';
}
function destroy (){
document.body.removeChild(t.div);
WinManager.delete (t.prefix);
}
function centerMe (parent){
if (parent == null){
var coords = getClientCoords(document.body);
} else
var coords = getClientCoords(parent);
var x = ((coords.width - parseInt(t.div.style.width)) / 2) + coords.x;
var y = ((coords.height - parseInt(t.div.style.height)) / 2) + coords.y;
if (x<0)
x = 0;
if (y<0)
y = 0;
t.div.style.left = x +'px';
t.div.style.top = y +'px';
}
function setEnableDrag (tf){
t.dragger.setEnable(tf);
}
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 t.div.style.display == 'block';
}
function show(tf){
if (tf){
t.div.style.display = 'block';
t.focusMe ();
} else {
t.div.style.display = 'none';
}
return tf;
}
function toggleHide(t){
if (t.div.style.display == 'block') {
return t.show (false);
} else {
return t.show (true);
}
}
}
//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;
this.clickedCityBut = clickedCityBut;
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);
}
}
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 += '';
x = nStr.split('.');
x1 = x[0];
x2 = x.length > 1 ? '.' + x[1] : '';
var rgx = /(\d+)(\d{3})/;
while (rgx.test(x1)) {
x1 = x1.replace(rgx, '$1' + ',' + '$2');
}
return x1 + x2;
}
/** *********** 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: 132329,
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/132329.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 ************ */
// only run in the main iframe
if (document.location.toString().match('src/main_src.php') ) trStartup ();