KOC Throne Room Organizer

Organizes, upgrades and salvages KOC throne room items

  1. // ==UserScript==
  2. // @name KOC Throne Room Organizer
  3. // @version 20140209a
  4. // @namespace mmm
  5. // @homepage https://userscripts.org/scripts/show/132329
  6. // @delay 2000
  7. // @priority -10
  8. // @include *.kingdomsofcamelot.com/*main_src.php*
  9. // @include *kabam.com/kingdoms-of-camelot/play*
  10. // @resource jqcss http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css
  11. // @icon https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_chair_normal_1.png
  12. // @require https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
  13. // @require https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js
  14. // @grant unsafeWindow
  15. // @grant GM_getValue
  16. // @grant GM_setValue
  17. // @grant GM_addStyle
  18. // @grant GM_xmlhttpRequest
  19. // @grant GM_log
  20. // @grant GM_registerMenuCommand
  21. // @grant GM_getResourceText
  22. // @grant GM_getResourceURL
  23. // @description Organizes, upgrades and salvages KOC throne room items
  24. // @contributionURL https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=FDW4NZ6PRMDMJ&lc=US&item_name=TR%20Organizer%20Donations&item_number=1001&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted
  25. // @contributionAmount $3.00
  26. // @screenshot http://s3.amazonaws.com/uso_ss/icon/132329/large.png?1346825647 http://s3.amazonaws.com/uso_ss/icon/132329/thumb.png?1346825647
  27. // @screenshot http://s3.amazonaws.com/uso_ss/18392/large.png?1346825591 http://s3.amazonaws.com/uso_ss/18392/thumb.png?1346825591
  28. // ==/UserScript==
  29.  
  30.  
  31. //var xx= {level: 2}; alert(CM.ThronePanelController.calcRiskBarWidth("upgrade", xx, 0))
  32.  
  33. var Version = '20140209a_mm';
  34.  
  35. var trPopUpTopClass = 'trPopTop';
  36. var ResetAll = false;
  37. var DEBUG_TRACE = false;
  38.  
  39. var maxTrLevel = 15;
  40.  
  41. /*
  42. * Modifiedd from object.watch polyfill
  43. *
  44. * 2012-04-03
  45. *
  46. * By Eli Grey, http://eligrey.com
  47. * Public Domain.
  48. * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
  49. */
  50.  
  51. //This version has been updated to allow more than one updater
  52.  
  53. function contentEval(source) {
  54. // Check for function input.
  55. if ('function' == typeof source) {
  56. // Execute this function with no arguments, by adding parentheses.
  57. // One set around the function, required for valid syntax, and a
  58. // second empty set calls the surrounded function.
  59. source = '(' + source + ')();'
  60. }
  61.  
  62. // Create a script node holding this source code.
  63. var script = document.createElement('script');
  64. script.setAttribute("type", "application/javascript");
  65. script.textContent = source;
  66.  
  67. // Insert the script node into the page, so it will run, and immediately
  68. // remove it to clean up.
  69. document.body.appendChild(script);
  70. document.body.removeChild(script);
  71. }
  72.  
  73.  
  74. function addWatchFunctions() {
  75. // object.watch
  76. if (!Object.prototype.multiWatch) {
  77. Object.defineProperty(Object.prototype, "multiWatch", {
  78. enumerable: false,
  79. configurable: true,
  80. writable: false,
  81. value: function (prop, watcher) {
  82. var obj = this,
  83. oldval = this[prop],
  84. newval = oldval,
  85. getter = function () {
  86. return newval;
  87. },
  88. setter = function (val) {
  89.  
  90. oldval = newval;
  91.  
  92. for (var f=0; f < obj.watchers[prop].length; f++) {
  93. obj.watchers[prop][f](prop, oldval, val);
  94. }
  95. newval = val;
  96. return newval;
  97. };
  98.  
  99. if (delete obj[prop]) { // can't watch constants
  100. Object.defineProperty(this, prop, {
  101. get: getter,
  102. set: setter,
  103. enumerable: true,
  104. configurable: true
  105. });
  106.  
  107. if (!obj.watchers) obj.watchers = {};
  108.  
  109. if (!obj.watchers[prop]) obj.watchers[prop] = [];
  110.  
  111. // check for duplicates
  112. for (var i=0; i < obj.watchers[prop].length; i++){
  113. if(obj.watchers[prop][i] === watcher){
  114. return;
  115. }
  116. }
  117.  
  118. //obj.watchers[prop].push( eval(watcher)); //add the new watcher in the watchers array
  119. obj.watchers[prop].push(watcher);
  120. }
  121.  
  122. }
  123. });
  124. }
  125.  
  126. // object.unwatch
  127. if (!Object.prototype.multiUnwatch) {
  128. Object.defineProperty(Object.prototype, "multiUnwatch", {
  129. enumerable: false,
  130. configurable: true,
  131. writable: false,
  132. value: function (prop, watcher) {
  133. var obj = this;
  134.  
  135. // if a watcher is supplied, just remove it
  136. if(arguments.length == 2) {
  137. for(var i=0; i < obj.watchers[prop].length; i++){
  138. var w = obj.watchers[prop][i];
  139.  
  140. if(w == watcher) {
  141. obj.watchers[prop].splice(i, 1);
  142. }
  143. }
  144. } else {
  145. obj.watchers[prop] = [];
  146. }
  147.  
  148. if (obj.watchers[prop].length == 0 )
  149. {
  150. delete obj.watchers[prop];
  151. var val = this[prop];
  152. delete this[prop]; // remove accessors
  153. this[prop] = val;
  154. }
  155. }
  156. });
  157. }
  158. }
  159.  
  160. //add the new functions to the main window
  161. contentEval(addWatchFunctions);
  162.  
  163. //add the new functions to this script
  164. addWatchFunctions();
  165.  
  166.  
  167. 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');};}}());
  168. var JSON2 = JSON;
  169.  
  170. var URL_CASTLE_BUT = "data:image/png;base64,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";
  171. var URL_CASTLE_BUT_SEL = "data:image/png;base64,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";
  172. var success_image = "data:image/png;base64,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";
  173. 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";
  174. var up_glow="data:image/png;base64,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";
  175. 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=";
  176. var down_glow = "data:image/png;base64,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";
  177. var gbtn_img = "data:image/png;base64,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";
  178. 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=";
  179. var remove_glow = "data:image/png;base64,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";
  180.  
  181. var upgradeData = {
  182. active : false,
  183. item : 0,
  184. retryInterval : 30,
  185. enhanceAction : false,
  186. enhanceItem : 0,
  187. enhanceMax : 5,
  188. minStones : 100000,
  189. switchToUpgrade : true,
  190. salvageActive : false,
  191. currentTab : null,
  192. trWinIsOpen : false,
  193. Opacity : 1.0,
  194. anyCity : true,
  195. uCityNum : 0,
  196. sCityNum : 0,
  197. repairAll : false,
  198. trWinPos : {},
  199. disableAnim : false,
  200. upgradeH: '300px',
  201. upgradeW: '700px',
  202. salvageH: '300px',
  203. salvageW: '710px',
  204. organizeH: '500px',
  205. organizeW: '770px',
  206. optionH: '500px',
  207. optionW: '700px',
  208. logH: '500px',
  209. logW: '710px',
  210. activeTab: 1,
  211. sortSelected: "none",
  212. buffSelected: "both",
  213. sortInactive: true,
  214. newUpgradeState: 0,
  215. whisperToMe: false,
  216. safetyOn: false,
  217. buffsOff: false,
  218. safetyLimit: 50000,
  219. multiUpgrade: false,
  220. noMassSalvage: false,
  221. salvageSafety: false,
  222. numSafety: 40,
  223. presetWidget: true,
  224. removeTokens: false
  225. };
  226.  
  227. var queueData = {
  228. list : [],
  229. oneItem : true,
  230. doingRepairs : false,
  231. index : 0,
  232. dataConverted : false
  233. };
  234.  
  235. var TRGlobalOptions = {
  236. trUpdate : false
  237. };
  238.  
  239. var presetData = {
  240. items : [],
  241. ids : ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R'],
  242. desc : ['Preset A', 'Preset B', 'Preset C', 'Preset D', 'Preset E', 'Preset F', 'Preset G', 'Preset H', 'Preset I', 'Preset J',
  243. 'Preset K', 'Preset L', 'Preset M', 'Preset N', 'Preset O', 'Preset P', 'Preset Q', 'Preset R'],
  244. num_presets: 10,
  245. noTooltips : false,
  246. usePreset : 0,
  247. taggedItems: {}
  248. };
  249.  
  250. var TABLE_SCALE =0.47;
  251.  
  252. var upgradeStats = {
  253. upgradeSuccess: {0: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  254. 1: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  255. 2: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  256. 3: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  257. 4: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  258. 5: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0} },
  259.  
  260. upgradeFailure: {0: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  261. 1: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  262. 2: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  263. 3: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  264. 4: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  265. 5: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0} },
  266.  
  267. enhanceSuccess: {0: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  268. 1: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  269. 2: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  270. 3: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  271. 4: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  272. 5: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0} },
  273.  
  274. enhanceFailure: {0: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  275. 1: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  276. 2: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  277. 3: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  278. 4: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0},
  279. 5: {0: 0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0} }
  280. };
  281.  
  282. var salvageData = {
  283. salvageActive : false,
  284. throneSaveNum : 40,
  285. minQuality : 3,
  286. 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]}]}],
  287. numSalvagedItems : 0,
  288. numSalvagedItems2 : 0,
  289. maxStones : 980000,
  290. anyCity : true,
  291. overflow : "order",
  292. numSalvaged : {0: 0, 1: 0, 2:0, 3:0, 4:0, 5:0, 6:0},
  293. upgradeFirst : false,
  294. upgradeFirstQual : 2,
  295. upgradedToDelete : [],
  296. upgradeManual : false
  297. };
  298.  
  299. var presetPosition = null;
  300. var guardPosition = null;
  301.  
  302. var n = new Date();
  303. salvageData.since = n.valueOf();
  304.  
  305. var Seed = unsafeWindow.seed;
  306. var Tabs = {};
  307. var uW = unsafeWindow;
  308. //var firefoxVersion = getFirefoxVersion();
  309. var CM = unsafeWindow.cm;
  310. var Cities = {};
  311.  
  312. var trStartupTimer = null;
  313.  
  314. var trDispTimer = null;
  315.  
  316. function trStartup (){
  317.  
  318. if (!unsafeWindow.cm)
  319. return;
  320.  
  321. if (uW.trLoaded)
  322. return;
  323.  
  324. var metc = getClientCoords(document.getElementById('main_engagement_tabs'));
  325. if (metc.width==null || metc.width==0){
  326. trStartupTimer = setTimeout (trStartup, 1000);
  327. return;
  328. }
  329.  
  330. uW.trLoaded = Version;
  331.  
  332. readUpgradeData();
  333.  
  334. if (upgradeData.uCityNum && upgradeData.uCityNum > Seed.cities.length -1 ) upgradeData.uCityNum = 0;
  335. if (upgradeData.sCityNum && upgradeData.sCityNum > Seed.cities.length -1 ) upgradeData.sCityNum = 0;
  336.  
  337. readUpgradeStats();
  338. readSalvageData();
  339. readQueueData();
  340. readPresetData();
  341.  
  342. logit ("Throne room organizer loaded");
  343.  
  344. installHandlerFunctions();
  345.  
  346. var styles = '.xtab {padding-right: 5px; border:none; background:none; white-space:nowrap;}\
  347. .xtabBR {padding-right: 5px; border:none; background:none;}\
  348. .greenBorder { margin-right: -100%; margin-bottom: -100%; height: 72%; width: 72%; padding: 4%; border: 3px solid cyan; background: transparent;}\
  349. div.greenBorder2 {position: absolute; }\
  350. .semi_transparent { zoom: 1; filter: alpha(opacity=60); opacity: 0.6;} \
  351. .rot45 { transform: rotate(-45deg); -ms-transform: rotate(-45deg); -webkit-transform: rotate(-45deg); -o-transform: rotate(-45deg); -moz-transform: rotate(-45deg); -moz-transform-origin: 100% 100%; z-index: 10;}\
  352. div.cardOverlay { font: cracked; font-size:3.5em; position: absolute; left: 0%; top: 50%; color: red; text-align: center; text-shadow: 2px 2px 4px #000;} \
  353. body table.trMainTab tbody tr td {background: transparent;}\
  354. table.trTabdef { height: 0px;}\
  355. .trCardDisp { display: static;}\
  356. table.trTabDef thead {background: transparent;}\
  357. table.trPopMain tbody tr td,th {background: transparent;}\
  358. table.trTabDef tbody tr td {background: transparent; height: 0px; }\
  359. table.trTab tr td, th { border: 1px solid brown;}\
  360. #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;}\
  361. #tr_footer { background-size: cover; -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; }\
  362. table.trTab tr td,th {border:none; background:none; padding: 0px}\
  363. table.trTab#trDisplayTable tr th { border: 3px solid grey; font-size:1.2em; }\
  364. table.trStatTab tr td { background-color: #ffffff; white-space:nowrap; padding:5px; border-bottom:solid black 1px;}\
  365. table.trStatTab tr td:last-child { border-right:solid black 1px; }\
  366. table.trStatTab tr:first-child th { border-top:solid black 1px; }\
  367. table.trStatTab tr td.td0 { background-color: white; }\
  368. table.trStatTab tr td.td1 { background-color: #eeeeee; }\
  369. table.trStatTab tr td.td2 { background-color: white; }\
  370. table.trStatTab tr th {border:solid black 1px; border-top: none; background-color: #357; color: white; white-space:nowrap; padding:5px}\
  371. 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} \
  372. 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} \
  373. table.trStatTab tr:first-child th:first-child { -moz-border-radius-topleft:10px; -webkit-border-top-left-radius:10px; border-top-left-radius:10px} \
  374. table.trStatTab tr:first-child th:last-child { -moz-border-radius-topright:10px; -webkit-border-top-right-radius:10px; border-top-right-radius:10px} \
  375. table.trTabLined tbody tr td {border-bottom:1px solid gray; padding: 2px 5px; }\
  376. table.trOptions tr td,th {border:1px none none solid none; padding: 1px 3px; white-space:nowrap;}\
  377. table.trSrchResults tr td,th {border:1px none none solid none; padding: 1px 3px; white-space:nowrap;}\
  378. table.trTabSome tr td,th {border:none; background:none; padding: 1px 3px; white-space:nowrap;}\
  379. table.trTabPad tr td,th { padding-left: 2px; background: none;}\
  380. table.trTabPad2 tr td,th { padding-left: 20px; background: none;}\
  381. .trDetLeft {padding:0 5px 0 0 !important; font-weight:bold; text-align:right}\
  382. .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;}\
  383. .trentry {padding: 7px; white-space:nowrap;}\
  384. button::-moz-focus-inner, input[type="submit"]::-moz-focus-inner { border: none; }\
  385. button::-moz-focus-inner, input[type="button"]::-moz-focus-inner { border: none; }\
  386. .castleBut {outline:0px; margin-left:0px; margin-right:0px; width:24px; height:26px; font-size:12px; font-weight:bold;}\
  387. .castleBut:hover {background-image:url("'+ URL_CASTLE_BUT_SEL +'")}\
  388. .castleButNon {background-image:url("'+ URL_CASTLE_BUT +'")}\
  389. .castleButSel {background-image:url("'+ URL_CASTLE_BUT_SEL +'")}\
  390. input.trDefButOn {cursor:pointer; border:1px solid #45d183; -moz-box-shadow:inset 0px 1px 5px #3aef8b; -moz-border-radius:5px;}\
  391. input.trDefButOff {cursor:pointer; border:1px solid #f61646; -moz-box-shadow:inset 0px 1px 5px #f6375f; -moz-border-radius:5px;}\
  392. table.trMainTab { empty-cells: show; }\
  393. table.trMainTab tr td,th a {color:inherit }\
  394. table.trMainTab tr td,th {height:60%; empty-cells:show; padding: 0px 0px 0px 0px; margin-top:5px; white-space:nowrap; border: 1px solid; border-style: none none solid none; -moz-border-radius:5px; }\
  395. table.trMainTab tr td.spacer,th.space {padding: 0px 0px;}\
  396. table.trMainTab tr th.sel,td.sel {font-weight:bold; font-size:13px; }\
  397. table.trMainTab tr th.notSel,td.notSel {font-weight:bold; font-size:13px; }\
  398. tr.trPopTop td,th { background-color:transparent; border:none; height: 21px; padding:0px;}\
  399. .trPopMain { -moz-box-shadow:inset 0px 0px 10px #6a6a6a; -moz-border-radius-bottomright: 20px; -moz-border-radius-bottomleft: 20px;}\
  400. .trPopup { border:3px ridge #666; opacity:'+upgradeData.Opacity+'; -moz-border-radius:25px; -moz-box-shadow: 1px 1px 5px #000000;}\
  401. .trPopup { overflow-x: hide; overflow-y: hide; max-height: 900px; min-height: 400px; height: 500px; }\
  402. #tr_top { background: url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/dialog_740_r2_c1.jpg") no-repeat transparent 0% 0%; }\
  403. #tr_top { background-size: cover; -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; }\
  404. /* this was needed because the css used a object id and not a class. reusing the ID caused display issues w/ the TR tooltips */ \
  405. div.trCard {width: 200px;}\
  406. div.trCard div.description>div{width:70px;height:70px; }\
  407. 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;}\
  408. 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;}\
  409. 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;}\
  410. 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;}\
  411. 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;}\
  412. 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;}\
  413. div.trCard div.description div.briton.hero{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_hero_normal_1_5.png") top left no-repeat;}\
  414. div.trCard div.description div.briton.statue{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_statue_normal_1_5.png") top left no-repeat;}\
  415. div.trCard div.description div.briton.candelabrum{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/briton_candelabrum_normal_1_5.png") top left no-repeat;}\
  416. 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;}\
  417. 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;}\
  418. 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;}\
  419. 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;}\
  420. 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;}\
  421. 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;}\
  422. div.trCard div.description div.druid.hero{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/druid_hero_normal_1_5.png") top left no-repeat;}\
  423. div.trCard div.description div.druid.statue{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/druid_statue_normal_1_5.png") top left no-repeat;}\
  424. div.trCard div.description div.druid.candelabrum{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/druid_candelabrum_normal_1_5.png") top left no-repeat;}\
  425. 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;}\
  426. 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;}\
  427. 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;}\
  428. 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;}\
  429. 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;}\
  430. 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;}\
  431. div.trCard div.description div.fey.hero{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/fey_hero_normal_1_5.png") top left no-repeat;}\
  432. div.trCard div.description div.fey.statue{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/fey_statue_normal_1_5.png") top left no-repeat;}\
  433. div.trCard div.description div.fey.candelabrum{background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/icons/70/fey_candelabrum_normal_1_5.png") top left no-repeat;}\
  434. div.trCard{font:bold 16px Georiga; overflow: hidden;}\
  435. div.trCard>div{float:left;border:1px solid #a56631;margin:0px;padding:0px;width:200px; height: 300px;background:transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/modal/modal_med_bg_4.png") -200px 0 no-repeat;}\
  436. 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;}\
  437. 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;}\
  438. div.trCard .disabled{opacity:.5;}\ div.trCard ul{margin:0px;padding:0;list-style:none;}\
  439. div.trCard li{padding:0px 0 0 0px;color:#3f2300;font-weight:bold;font-size:16px;}\
  440. div.trCard div.description{overflow:hidden;border-bottom:1px solid #703200;padding:5px 0;}\
  441. div.trCard div.description{overflow:hidden;border-bottom:1px solid #703200;}\
  442. div.trCard div.description div.portrait{float:left;}\
  443. div.trCard div.description div.portrait{border:3px solid #deaf69;margin-right:10px;}\
  444. div.trCard div.description>ul{float:left;margin:3px 0 0 0;padding:0;}\
  445. div.trCard div.description>ul li{padding:0;font-weight:bold;font-size:13px;text-transform:capitalize;}\
  446. div.trRule {border:2px inset #c0c0c0; margin-right:10px; margin-left:10px; margin-bottom:2px; padding-left:5px; padding-bottom:5px} \
  447. div.trRuleCreate {margin-right:10px; padding-right: 5px; margin-bottom:2px; padding-bottom:5px} \
  448. div.trRule { background-color: #eeeeee; } \
  449. div.blueBorder { border: 2px solid blue; } \
  450. div.blueBorder2 { border: 10px solid blue; } \
  451. div.yellowBorder { outline: 2px solid yellow; outline-offset:0px; }\
  452. div.yellowBorder2 { outline: 10px solid yellow; outline-offset:0px; }\
  453. #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;}\
  454. 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;}\
  455. 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;}\
  456. 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;}\
  457. div.trup { display=inline; background-image: url('+ up_img +'); background-repeat: no-repeat; background-color: transparent; width: 28px; height: 24px; }\
  458. div.trup:hover { display=inline; background-image: url('+ up_glow +'); background-repeat: no-repeat; background-color: transparent; width: 28px; height: 24px; }\
  459. div.trremove { display=inline; background-image: url('+ remove_img +'); background-repeat: no-repeat; background-color: transparent; width: 50px; height: 50px; }\
  460. div.trremove:hover { display=inline; background-image: url('+ remove_glow +'); background-repeat: no-repeat; background-color: transparent; width: 50px; height: 50px; }\
  461. div.trdown { display=inline; background-image: url('+ down_img +'); background-repeat: no-repeat; background-color: transparent; width: 28px; height: 24px; }\
  462. div.trdown:hover { display=inline; background-image: url('+ down_glow +'); background-repeat: no-repeat; background-color: transparent; width: 28px; height: 24px; }\
  463. div.trgbtn { display=inline; background-image: url('+ gbtn_img +'); background-repeat: no-repeat; background-color: transparent; width: 32px; height: 32px; margin: 0px; }\
  464. ul#MM_throneStatList li { float: left; width: 22px; height: 22px; text-align: center; color: white; }\
  465. ul#MM_throneStatList li.active { background: transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/modal/set_active.png") top left no-repeat; } \
  466. ul#MM_throneStatList li.selected { background: transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/modal/set_selected.png") top left no-repeat; }\
  467. ul#MM_throneStatList li.locked { background: transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/modal/set_locked.png") top left no-repeat; text-indent: -999px; }\
  468. ul#MM_throneStatList li.buy { background: transparent url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/throne/modal/set_buy.png") top left no-repeat; text-indent: -999px; }\
  469. #trQueue th { text-align: center; }\
  470. a.loadGPreset { border-radius:5px; border-style: solid; border-width: 3px; }\
  471. div.indent25 {padding-left:25px}\
  472. li.guardbutton { border: 4px inset Peru; display: inline; float: left; width: 31px; height: 33px; text-align: center; color: white; }\
  473. li.guardbutton.active { border: 4px solid blue;}\
  474. li.guardbutton:hover div.tt { visibility: visible;}\
  475. li.guardbutton div.tt { visibility: hidden; border-radius: 5px 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;\
  476. 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);\
  477. font-family: Calibri, Tahoma, Geneva, sans-serif; font-weight: normal;\
  478. position: relative; left: -30px; top: 50px; \
  479. margin-left: 0; width: 200px; background-color: white; color: black;\
  480. background: #FFFFAA; border: 1px solid #FFAD33; padding: 0.8em 1em;}\
  481. #preset_tt {margin-left: -999em; position: absolute;}\
  482. #preset_tt.showit { border-radius: 5px 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;\
  483. 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);\
  484. font-family: Calibri, Tahoma, Geneva, sans-serif; font-weight: normal;\
  485. position: absolute; left: 400px; top: 100px; z-index: 99;\
  486. margin-left: 0; width: 200px; background-color: white; color: black;\
  487. background: #FFFFAA; border: 1px solid #FFAD33; padding: 0.8em 1em;}';
  488.  
  489. window.name = 'TR';
  490.  
  491. if (upgradeData.trWinPos==null || upgradeData.trWinPos.x==null || upgradeData.trWinPos.x=='' || isNaN(upgradeData.trWinPos.x)){
  492. var c = getClientCoords (document.getElementById('main_engagement_tabs'));
  493. upgradeData.trWinPos.x = 100;
  494. upgradeData.trWinPos.y = 100;
  495. saveUpgradeData();
  496. }
  497.  
  498. var newCSS = GM_getResourceText ("jqcss");
  499.  
  500. GM_addStyle (newCSS);
  501. GM_addStyle (styles);
  502.  
  503. // clear some styles
  504. var styles2 = ".trDiag .ui-widget-content { font-size: 1.0em; background: none; border: none;}" +
  505. ".trDiag.ui-widget-content { font-size: 0.95em; background: none; border: none;}" +
  506. ".trDiag .ui-tabs .ui-tabs-nav li a { font-weight: bold; font-family: georgia,arial,sans-serif; color: white; font-size: 1.0em; background: url('https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/tab_unselected.png') no-repeat scroll 0% 0% transparent;}" +
  507. ".trDiag .ui-tabs .ui-tabs-nav li.ui-tabs-active a { background: url('https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/tab_selected.png') no-repeat scroll 0% 0% transparent;}" +
  508. ".trDiag .ui-widget-content a { color: white;}" +
  509. ".trDiag a.buttonDown20 span { color: white;}" +
  510. ".trDiag .ui-widget {font-size: 1.0em;}" +
  511. ".trDiag.ui-dialog .ui-dialog-title {margin: 0px; width: 100%;}" +
  512. ".trDiag .ui-widget-header {background: none; border: none;}" +
  513. ".trDiag .ui-state-deafault {background-color: none; }" +
  514. ".trDiag .ui-widget .ui-widget {font-size: 0.9em;}" +
  515. ".trDiag .ui-dialog-titlebar {text-shadow: 0px 1px 0px white; line-height: 24px; text-align: center; color: #5C3317; font: bold 1.3em Georiga;}" +
  516. '.trDiag.ui-dialog .ui-dialog-titlebar-close { background-position: 0px 0px; background-image: url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/close_icon.png"); background-repeat: no-repeat; height: 20px; width: 20px; }' +
  517. ".trDiag.ui-dialog .ui-dialog-titlebar-close { width: 20px; height: 20px;}" +
  518. ".trDiag .ui-resizable-s { background: rgba(0,0,255,0.3);}" +
  519. ".trDiag .ui-tabs .ui-tabs-nav { position: relative; top: 10px; left: 15px;}" +
  520. "table.trTable tbody tr td { background: none;}";
  521.  
  522. GM_addStyle(styles2);
  523.  
  524. var prefix = 'tr';
  525. var topClass = 'trPopTop';
  526.  
  527. $("#mainbody").append(
  528. "<div id='tr_dialog' class='trPopup tr_trPopup'>"
  529. + '<TABLE class=trTab cellspacing=0 width=100% height=100%>'
  530. + '<tbody><TR><TD colspan=2><div width=720px height=100% valign=top class="trPopMain '+ prefix +'_trPopMain" id="'+ prefix +'_main"></div></td></tr>'
  531. + '<tr><td colspan=2><div id=tr_footer></div></td>'
  532. + '</tr></tbody></table></div>');
  533.  
  534. $("#tr_dialog").css({
  535. "overflow-y": "hidden",
  536. "overflow-x": "hidden",
  537. "padding": '0px'
  538. });
  539.  
  540. var trPop = null;
  541. var tStr= 'Throne Room Organizer';
  542.  
  543. $("#tr_dialog").dialog({
  544. title: tStr,
  545. //zIndex: 111111,
  546. position: [ upgradeData.trWinPos.x, upgradeData.trWinPos.y],
  547. draggable: true,
  548. height: "auto",
  549. maxHeight: 2000,
  550. minHeight: 300,
  551. width: "auto",
  552. resizable: false,
  553. autoOpen: upgradeData.trWinIsOpen,
  554. dragStop: function( event, ui ) {
  555. upgradeData.trWinPos.x = ui.position.left;
  556. upgradeData.trWinPos.y = ui.position.top;
  557. saveUpgradeData();
  558. },
  559. close: function( event, ui ) {
  560. upgradeData.trWinIsOpen = false;
  561. saveUpgradeData();
  562. },
  563. open: function( event, ui ) {
  564. $("#tr_dialog").parent().css('z-index', 111111 );
  565. if (trPop) trPop.focusMe();
  566. }
  567. });
  568.  
  569. $("#tr_dialog").css('max-height', '2000px');
  570. $("#tr_dialog").parent().attr( {id: 'tr_top', padding: '0px'});
  571. mainPop = $("#tr_top")[0];
  572. $("div#tr_bar").css( {background: 'none', border: 'none'} );
  573. $("#tr_top").addClass('trDiag');
  574.  
  575. var mainDiv = $("#tr_top")[0];
  576.  
  577. trPop = new trPopup('tr');
  578.  
  579. // block the copy/paste stuff added by sharethis
  580. var a = document.getElementsByTagName("body")[0];
  581. a.oncopy = function () { return true;}
  582.  
  583. setCities();
  584.  
  585. CM.cheatDetector.detect = foo;
  586.  
  587. $("#tr_main").html(
  588. '<div>\
  589. <ul>\
  590. <li><a href="#tabs-upgrade">Upgrade</a></li>\
  591. <li><a href="#tabs-salvage">Salvage</a></li>\
  592. <li><a href="#tabs-organize">Organize</a></li>\
  593. <li><a href="#tabs-estats">Enhance Stats</a></li>\
  594. <li><a href="#tabs-ustats">Upgrade Stats</a></li>\
  595. <li><a href="#tabs-options">Options</a></li>\
  596. <li><a href="#tabs-log">Log</a></li>\
  597. </ul>\
  598. <div id="tabs-upgrade"> Options tab </div>\
  599. <div id="tabs-salvage"> Salvage tab </div>\
  600. <div id="tabs-organize"> Organize tab </div>\
  601. <div id="tabs-estats"> EStats tab </div>\
  602. <div id="tabs-ustats"> UStats tab </div>\
  603. <div id="tabs-options"> Options tab </div>\
  604. <div id="tabs-log"> Log tab </div>\
  605. </div>');
  606.  
  607. $("#tr_main").tabs({
  608. heightStyle: "content",
  609. active: upgradeData.activeTab,
  610. beforeActivate: function( event, ui ) {
  611. if (ui.oldPanel && ui.oldPanel[0]) {
  612. tab = findTab(ui.oldPanel[0]);
  613. if (tab) {
  614. Tabs[tab].hide();
  615. }
  616. }
  617. if (ui.newPanel && ui.newPanel[0]) {
  618. var tab = findTab(ui.newPanel[0]);
  619. if (tab) Tabs[tab].show();
  620. }
  621. }
  622. });
  623.  
  624. // set the width of all main tab divs
  625. /*
  626. $("#tr_main>div").css({
  627. "width": "auto",
  628. "padding": "0px"
  629. });
  630. */
  631.  
  632. window.addEventListener('unload', onUnload, false);
  633.  
  634. Tabs.options.init($("#tabs-options")[0]);
  635. Tabs.trActionLog.init($("#tabs-log")[0]);
  636. Tabs.upgrader.init($("#tabs-upgrade")[0]);
  637. Tabs.throneSalvage.init($("#tabs-salvage")[0]);
  638. Tabs.organizer.init($("#tabs-organize")[0]);
  639. Tabs.ustats.init($("#tabs-ustats")[0]);
  640. Tabs.estats.init($("#tabs-estats")[0]);
  641.  
  642. $( "#tr_main" ).tabs( "refresh" );
  643.  
  644. AddMainTabLink('TR Organizer', trHideShow, trMainTab);
  645. attachTab();
  646.  
  647. // set the labels on the new salvage tab
  648. /*
  649. $("a.throne").click( function() {
  650. Tabs.throneSalvage.updateTRTab();
  651. Tabs.upgrader.updateTRTab();
  652. //Tabs.upgrader.updateTRSelect();
  653. $("ul#throneInventoryList > li > div").removeClass('blueBorder');
  654. $("ul#throneInventoryList > li > div").removeClass('yellowBorder');
  655. $("div#throneMainContainer div#heroContainer").css('left', '450px');
  656.  
  657. for (ii in queueData.list) {
  658. var list_item = queueData.list[ii];
  659. if (!list_item) continue;
  660. if (list_item.status != "complete") {
  661. var id = list_item.item;
  662. if (list_item.action == "upgrade") $("div#throneInventoryItem" + id).addClass('blueBorder');
  663. if (list_item.action == "enhance") $("div#throneInventoryItem" + id).addClass('yellowBorder');
  664. }
  665.  
  666. }
  667.  
  668. for (ii in presetData.taggedItems) {
  669. $("div#throneInventoryItem" + ii).prepend("<div class='greenBorder'></div>");
  670. }
  671.  
  672. $("ul#throneInventoryList").css('height', '520px');
  673. $("div#throneInventoryContainer").css('height', '520px');
  674.  
  675. // update the other presets buttons when clicked
  676. $('ul#throneStatList li.active, ul#throneStatList li.selected').click(
  677. function () {
  678. var s = $(this).attr('id').split('throneInventoryPreset')[1];
  679. setPresetWidget(+s);
  680. });
  681. });
  682. */
  683.  
  684. // create a preset list on the main display. Wait 2 seconds for the chat-on-right to fire first.
  685. if (upgradeData.presetWidget) setTimeout(buildPresetWidget,2000);
  686.  
  687. // set the color on the tab button
  688. setUpgradeColor();
  689.  
  690. trDispTimer = setInterval(updateTimerDisp , 1000);
  691.  
  692. }
  693.  
  694. var foo = function() {
  695. };
  696.  
  697. function setUpgradeColor() {
  698. if (upgradeData.newUpgradeState == 0)
  699. $("#trtab>span").css('color', '#FFFF66');
  700. else if (upgradeData.newUpgradeState == 1)
  701. $("#trtab>span").css('color', 'cyan');
  702. else if (upgradeData.newUpgradeState == 2)
  703. $("#trtab>span").css('color', 'red');
  704. }
  705.  
  706.  
  707. var presetTimer = null;
  708. var presetFailures = 0;
  709.  
  710. //callback handler when a preset button is presed
  711. function processPresetClick(btn)
  712. {
  713. // if there is a timer still running, kill it
  714. clearTimeout(presetTimer);
  715. // don't do anything if already the right preset
  716. if (btn == Seed.throne.activeSlot) {
  717. // redarw everything
  718. setPresetWidget(btn);
  719. unsafeWindow.cm.ThroneView.renderThrone();
  720. unsafeWindow.cm.ThroneView.renderStats();
  721. Tabs.organizer.show();
  722. //return;
  723. }
  724.  
  725. // send message
  726. unsafeWindow.AjaxCall.gPostRequest(
  727. "ajax/_dispatch53.php",
  728. {
  729. ctrl: "throneRoom\\ThroneRoomServiceAjax",
  730. action: "setPreset",
  731. presetId: btn
  732. },
  733. function (v) {
  734. if (v.ok === true)
  735. {
  736. presetFailures = 0;
  737. // success
  738. var H = Seed.throne.slotEquip[btn];
  739. Seed.throne.activeSlot = btn;
  740.  
  741. // set the right items as equiped
  742. $.each(unsafeWindow.kocThroneItems, function (I, J) {
  743. C = $.inArray(J.id, H) > -1;
  744. if (C) {
  745. J.isEquipped = true;
  746. } else {
  747. J.isEquipped = false;
  748. }
  749. });
  750.  
  751. // update the buttons
  752. setPresetWidget(btn);
  753. unsafeWindow.cm.ThroneView.renderThrone();
  754. unsafeWindow.cm.ThroneView.renderStats();
  755.  
  756. // redraw the organizer tab
  757. Tabs.organizer.show();
  758. }
  759. else
  760. {
  761. presetFailures++;
  762. logit("Preset change failed. Error code: " + v.error_code);
  763. // try again in 2 seconds
  764. if (presetFailures <=10) {
  765. presetTimer = setTimeout( function () {processPresetClick(btn)}, 2000);
  766. }
  767. else
  768. {
  769. // after 10 failures, give up
  770. presetFailures = 0;
  771. }
  772. }
  773. }
  774. );
  775. }
  776.  
  777. //handler when a guardian button is presed
  778. function processGuardianClick(type)
  779. {
  780. // callback. only called when successful
  781. var cb = function(h)
  782. {
  783. // set the outline and turn the background gray
  784. var btn = "li.guardbutton." + type;
  785. $("li.guardbutton").removeClass('active');
  786. $(btn).css('background-color', 'darkgray');
  787. $(btn).addClass('active');
  788.  
  789. // after lockout time is complete, redraw the control
  790. var timeLeft = h.finishTime - unixTime();
  791. setTimeout( function ()
  792. {
  793. h.summonFinishCallback(type, unsafeWindow.cm.guardianSummonModel.getSummonGuardian());
  794. $(btn).css('background-color', 'white');
  795. drawGuardWidget();
  796. }, (timeLeft + 1.0)* 1000);
  797. };
  798. // change guardian
  799. unsafeWindow.cm.guardianSummonModel.summon(type, cb)
  800. }
  801.  
  802. //update the preset list buttons
  803. function setPresetWidget(slot)
  804. {
  805. var x = ($("#MM_throneStatList .selected, #throneStatList .selected"));
  806. x.removeClass('selected');
  807. x.addClass('active');
  808. x.bind("mouseenter", function (I) {
  809. unsafeWindow.cm.ThroneView.boostsTooltip(this, I, I.target.id)
  810. });
  811. x.bind("mouseleave", function (I) {
  812. unsafeWindow.removeTooltip()
  813. });
  814.  
  815. var s = $("#MM_throneInventoryPreset" + slot + ", #throneInventoryPreset" + slot);
  816. s.removeClass('active');
  817. s.addClass('selected')
  818. s.unbind("mouseenter").unbind("mouseleave");
  819.  
  820. $("a.loadGPreset").css('border-color', 'transparent');
  821. $("#trPresetNum" + slot ).css('border-color', 'green');
  822.  
  823. document.getElementById ('PresetList').value = slot;
  824. Tabs.organizer.selectPreset(slot);
  825. }
  826.  
  827. //create a preset list on the main display
  828. function buildPresetWidget()
  829. {
  830. var E = [];
  831. var J = Seed.throne.activeSlot;
  832. var F = Seed.throne.slotNum;
  833.  
  834. for (var G = 0; G < 16; ++G) {
  835. var H = G + 1;
  836. var I = $("<li/>");
  837. if (H === J) {
  838. I.attr("id", "MM_throneInventoryPreset" + H);
  839. I.addClass("selected");
  840. I.html(H);
  841. I.bind("click", {
  842. idx: G
  843. }, function (K) {
  844. var L = K.data.idx + 1;
  845. processPresetClick(L);
  846. });
  847.  
  848. } else {
  849. if (H === (F + 1)) {
  850. I.attr("id", "MM_throneInventoryPreset" + H);
  851. I.addClass("buy");
  852. I.bind("click", function () {
  853. unsafeWindow.cm.ContextualMenuThrone.renderMenu(this, null);
  854. })
  855. } else {
  856. if (H <= F) {
  857. I.attr("id", "MM_throneInventoryPreset" + H);
  858. I.addClass("active");
  859. I.html(H);
  860. I.bind("click", {
  861. idx: G
  862. }, function (K) {
  863. var L = K.data.idx + 1;
  864. processPresetClick(L);
  865. });
  866. I.bind("mouseenter", function (K) {
  867. unsafeWindow.cm.ThroneView.boostsTooltip(this, K, K.target.id)
  868. });
  869. I.bind("mouseleave", function (K) {
  870. unsafeWindow.removeTooltip()
  871. })
  872. } else {
  873. I.attr("id", "MM_throneInventoryPreset" + H);
  874. I.addClass("locked");
  875. }
  876. }
  877. }
  878. E.push(I)
  879. }
  880.  
  881. var C = $("<ul/>", {
  882. id: "MM_throneStatList",
  883. addClass: "presetList",
  884. style: "width: 178px; padding: 0px; margin: 0px; list-style: none; overflow: hiddden; float: left; border: 5px outset Peru; position: absolute; background: white;"
  885. });
  886.  
  887. $.each(E, function (K, L) {
  888. C.append(L)
  889. });
  890.  
  891. var aa = $("<div id='tr_presetBox'/>");
  892. aa.append(C);
  893. aa.css({
  894. "height": "55px",
  895. "width": "190px",
  896. "overflow": "visible",
  897. "position": "absolute",
  898. "z-index": "100000"
  899. })
  900. $("#kocContainer").append(aa);
  901.  
  902. // make a selector box for picking a guardian
  903. var C2 = $("<ul/>", {
  904. id: "t_throneGuardList",
  905. addClass: "presetList",
  906. style: "padding: 0px; margin: 0px; list-style: none; overflow: visible; float: left; border: 4px outset Peru;"
  907. });
  908.  
  909. var guardTypes = ["wood", "ore", "food", "stone"];
  910. var offsets = [" 77% 47% ", " 77% 73% ", " 77% 60% "," 77% 85% "]; // default to highest level. TODO: set the icon based on the current level
  911.  
  912. for (g =0; g < 4; g++)
  913. {
  914. var type = guardTypes[g];
  915.  
  916. var bb = $("<li/>").html('<div/>').css(
  917. {
  918. 'padding': '0px',
  919. 'background': 'url("https://kabam1-a.akamaihd.net/kingdomsofcamelot/fb/e2/src/img/guardian_change_spritemap102.png") no-repeat scroll ' + offsets[g] + ' white',
  920. 'background-size': '350px'
  921. });
  922. bb.addClass("guardbutton").addClass(type);
  923. bb.append("<div class='tt'>" + unsafeWindow.g_js_strings.guardian["tooltipSummon_" + type] + "</div>");
  924.  
  925. bb.bind("click", {
  926. gt: type
  927. }, function (K) {
  928. processGuardianClick(K.data.gt);
  929. });
  930.  
  931. C2.append(bb);
  932. }
  933.  
  934. aa = $("<div id='tr_guardBox'/>");
  935. aa.append(C2);
  936. aa.css({"height": "48px",
  937. "width": "164px",
  938. "position": "absolute",
  939. "overflow": "visible",
  940. "z-index": "100000"}
  941. );
  942.  
  943. $("#kocContainer").append(aa);
  944.  
  945. // move the chat box down
  946. var p = $("div.mod_comm").css('top');
  947. p = +p.split('px')[0] + 70;
  948. $("div.mod_comm").css('top', p + "px");
  949.  
  950. var CHAT_BG_IMAGE = "data:image/gif;base64,R0lGODlhagHQAvcAAP%2F%2F5v%2F%2F1v%2F33v%2F31vf35v%2F3zvf33v%2F3xff31vf3zv%2Fv3u%2F33v%2Fv1v%2Fvzvfv1vfvzvfvxffvvffmzu%2Fmvebmvffere%2Feve%2Fete%2Fere%2Fepebevebeteberd7evd7ete%2FWpebWtd7Wtd7Wrd7WpdbWrd7Ord7OpdbOrdbOpdbFpc7FtdbFnM7FnMXFrc7FlM69rc69nM69lM69jMW9nMW9lMW9jL29nL29lM61jMW1nMW1lMW1jL21nMW1hL21lL21jMWtlLW1lL2tnL2tlL2thL2te7WthL2le72lc7WlhL2la7Wle7Wlc7Wla62le62lc7Wce7Wcc62chLWca6WcjK2cc6WchK2ca62cY6Wcc6Wca6WUhK2Ua6WUa6WUY5yUY5yMa5yMY5yMWpSMa5SMY5SMWoyMY5SEa5SEY4SEe4yEY4yEWoyEUpx7Uox7Wox7UoR7WoR7UoRzUntzY4RzSntzUntzSnNzSntrSmtrY3NrSmtjOhlrzmNaSjpjhBljxRljvRljtRlarRlapRlSnBlSlBlKjBlKhBlKexlCexlCcxlCa0o6CCE6Uhk6Yxk6WkopAEIpADopABAxQjEpEDEpCCEpMRkpMTohADEhACkhCDEZACkZACEZCCEZACEQABkQABkIABAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAagHQAgAI%2FgB1NGgAB02XJUaWKFziZEmShRAVOplIcSIUKA4fLsG4EUqVj1kqNpQosmJEJ1VGSvx4saXLlwxLTvxYReFHmSgnkqRJkabPn0CrvGypE2fFlEZLCl3I8SJEKCirZJmKNGlJIxRJjoza0CREq0eVBq0KNqdIpFo7ehQ61OVYLTSnZoGbUUoSJ0yeNJlR4EGdOGsCC37jRvAaN4gDI37DuDHjOI3dOHYcR46cyZgzI94cmfMby6BBZ34Tp7Tp0ocZFx79GPNp03LsjLZcGjRk1ZJZE278%2Bvbj3qZVH0482rQdO8DjbEZ8OnHwNaU9q9ZNOvnpzryTvzEcuLRr4MWt%2Fgev%2FpoOHdPm0zOWszkOm%2Fc3HjxY42QGChQmRNw%2FQaL%2FiRP7%2FYeCCAT%2BR6B%2B9yUYoIAKmuCgCSVEWMKDD5aAH4UOXkghCvz15yEJCoYoIgoT3gehCSRieKKEEkIogoQj3pcChx7%2Bx99%2FH%2F7H4o4RoohCCjNyaOOCAIb4YX8xJriCggDqGGGRIloo4oYaVgjjiBnGmGWSCdqIoopbhljhg1yWaeYKQJZwwoEjjHBDAgmoYcQGfRVg550DFJCnnQP0ead88tkJ56AJCEoonAUMpOiddiraAKOQRsrooZQOmqiji17qqKaLYurpp54WUGilk3IKaqiMNuAnpIiuKiqi%2F68W2uhAktYKKa13nqorpolemmukj9p6a6278kqqsH8%2B8CcEyhZwwAGMPgCBnQI1sIYRIDQAQbGbcmqqow%2BAGm64npKL6bjncituA%2BiiO1C77MYL77i5BtuXueqCqum37ALq77%2F%2B5vvuv%2F0GPLDBBhfbLr6KAkxwwacCKnC6706M67f1OhtBBBAcwOwADjgwA7tygJGEDjrkoPLKKvuwsg8w5wCzD0MMMXMOKKO8MhApsywzD0AHLfTQQc88NMxBDwHE0kwD4fPLM0dtdNRAU0200DPXXDPNWnettNc8s8yz1DPPYHYOVZNt9NE%2B6KB0z27rvDLKRa9dddBo86C21f5D5%2B3D1XjnMMPKgO8NeN12H6643joA0TXPTXstueQ%2FDPFDD5gXofkPlQuRgwQSwOGGGmecAcbpqIOxhRVWSCEF663DLrsVW9Re%2B%2By45667FVTsrvvrwPsu%2FPC2F7867Lfvfjztt9vOfPLD0%2F588dFXb73yy%2Bee%2FfXcd8%2B98eCHD%2F4ZcMxRRx1zwHHGEkQwQQcj8O%2FRRx8vMOBAHX2Iov%2F%2B%2FPfv%2F%2F8ADKAAB0jAAhrwgAhMoAIXyMAGOvCBEIygAxmhhyUUgQ3wy%2BALDKCAOeRPgiAMoQhHSMISmvCEKEzh%2Fxixhh6IIYOMaIEBDOBBFdrwhjjMoQ53yEMJsrAK7%2F6DXwsIQIAa9vCISEyiEpfIRAMyogtV2AP8XkBEIzbxiljMoha3%2BMA9ZGENU1RABz%2FIxTKa8YxoZCIZjBDGMYLijXCMoxznSMc62vGOeMyjHvfIxz768Y%2BADKQgB0nIQhrykG%2FcQxQZ8QIxehCRkIykJCdJyUpa8pKYzCQoGMGFNjByho%2FUpChHScpSmvKUqBRkF7gQQ0f2IZWwjKUsZ0nLWuIxCzuIIQdDacte%2BvKXwAwmIHGpSzcK85jITKYyY0nMFrhymdCMpjSnWchmPpOa2MymNrNpTWNu85vgDGcvs9CDVnpTnOhMpzozmQUimNODnYinPOdJz3ra8574zP%2BnPvfJz376858ADahAB0rQghr0oAhNqDzJ%2Bc4%2BKPShEI2oRCdK0Ypa9KIYjWc34ZnRjnr0oyANqUhHStCNOpSkKE2pSlfK0pbmk6HOHKNLZ0rTmtr0piUtZyNlitOe%2BvSnQE0pQ3fK0aAa9ahITWpBh%2BpKpTr1qVCFKlN5GtWqWvWqM4UpKE%2BK1a569asZbacuachVsJr1rGgtqTtlSFZNuPWtcI2rXOdK17ra9a54zate98rXvvr1r4ANrGAHS9jCGvatYmWrBw%2FL2MY69rGQjaxkJ0vZyro1C0Uo5mIty9nOevazoA2taAOLWc32YbSoTa1qV8va1t61CkdoqGv%2BZ0vb2tr2toGFrWxxy9ve%2Bva3qdUtUU8L3OIa97jIHaxwXZnc5jr3uc9d7hihS93qWre20t3sdbfL3e5aVrcx9SAlxkve8pr3vOhNr3rXy972uve98I2vfOdL3%2Fra9774za9%2B90veKhQBEuHVA38HTOACG%2FjACE6wghfM4PFC4QgAdqSAG0zhClv4whjOsIbt%2B%2BAIj3HDIA6xiEdM4hKztwpIgIQKXNmISbj4xTCOsYxnTOMa2%2FjGOM6xjnfM4x77%2BMdADrKQh0zkIhf5EpagxBVSTNQ88OHJUI6ylKdM5Spb%2BcpYzrKWt8zlLnv5y2AOs5jHTOYym%2FnMUH5Cilv%2BsIAF5CEPf4iznOdM5zrb%2Bc54zrOe98znPvv5z4AOtKAHTehCG%2FrQiE60nO0CCRsgwM1%2BAISkJ03pSlv60pjOtKY3zelOe%2FrToA61qEdN6lKb%2BtSoTrWqJ22FJEBiBgPoYKRXTeta2%2FrWuM61rnfN614DwgpLgAQMBCDrQBj72MhOtrKXzexmO%2FvZ0I62tKdN7Wpb%2B9rYzra2t83tbnv72A2BxE7T4AdBmPvc6E63utfN7na7%2B93wjre8503vetv73vjOt773ze9%2B%2B%2FvcRoiCh8n974Ib%2FOAIT7jCF87whjvc3EaA8LjzMIiKW%2FziGM%2B4xjfO8Y57%2FOMgD7nIR07%2F8pKb%2FOQoT7nKV87ylls8CRIXYxryQIia2%2FzmOM%2B5znfO8577%2FOdAD7rQh070ohv96EhPutKXzvSm2zzi4pY5zZ1O9apb%2FepYz7rWt871rhPCCEyWeiHGTvaym%2F3saE%2B72tfO9ra7%2Fe1wj7vc5073utv97njPu973TnawR10BMzeE4AdP%2BMIb%2FvCIT7ziF8%2F4xjv%2B8ZCPvOQnT%2FnKW%2F7ymM%2B85gcP9Q12MA%2BbD73oR0%2F60pv%2B9KhPveoFnxAAgzIPh4i97GdP%2B9rb%2Fva4z73ud8%2F73vv%2B98APvvCHT%2FziG%2F%2F4yE%2B%2B7I3ABNfTMA%2BIiL70p0%2F96lv%2F%2BtjPvva3z%2F3u%2Fnv%2F%2B%2BAPv%2FjHT%2F7ym%2F%2F86E%2B%2F9Jn%2F9znkIRHwj7%2F850%2F%2F%2Btv%2F%2FvjPv%2F73z%2F%2F%2B%2B%2F%2F%2FABiAAjiABFiABniACBh%2FftdICOB%2BivCAEBiBEjiBFFiBFniBGJiBGriBHNiBHviBIBiCIjiCJFiCJniCEAhzABYy7rcILviCMBiDMjiDNFiDNniDOJiDOriDPNiDPviDQBiEQjiERFiERviCKtgCDtCAeXCETviEUBiFUjiFVFiFVniFLpgEUKBibeZ%2BjvCFYBiGYjiGZFiGZniGaJiGariGbNiGbviGcBiHcjiHdFiHdniHYPgDUBAJKvB6j%2FCHgBiIgjiIhFiIhniIiJiI%2F4q4iIzYiI74iJAYiZI4iZRYiZZ4iYAoBcHGAyEDB1SgAgAQiqI4iqRYiqZ4iqiYiqq4iqzYiq74irAYi7I4i7RYi7Z4i7iIix1gA1kQASk2AwLQAHjQBSeQi8Z4jMiYjMq4jMzYjM74jKi4i13wASmWAwMgjGggAtC4jdzYjd74jeAYjrlIAjfgBRmgBJDgA9qCB2WgjeL4jvAYj%2FI4j%2FTIiiJQA1iQAVMACT8gLXZABu5YjwI5kARZkAZJixsQA1dQAQLnAwnwAHZQBiNwkBRZkRZ5kfOYkAspcDdQABAQkROJkSI5kiRZkre4ATRwBR8gcDXgkSBpkjAZkzI5k%2F%2F3yAUfsI80wAASgAfZOJM%2B%2BZNAWZAj0ANecJOvNgA72ZNBuZRM2ZTcOJRFuY868AAMwJMo4JRYmZVaeYscIAMqmWJTWZVkcJVbWZZmeZameAEKuZKQMJXCOJZoGZdyqZVqqZINuS14AJdzuZd86ZMXgAM2KXA7gJdlQJZ9eZiIiZEbsAM2mWKD%2BZaGmZiSOZkCuZhXgAGOuS3%2FGJmU2ZmeCY4b4JUVkJkNsJmfeZqouY0XIJoC9wN98Y8BmZqyOZu5CAIxEJjp%2BJpKSZu82ZuxaJt2mZsPgAdrEJu%2BeZzIaYq2iZs%2B0BfEaZzJGZ3IqZFs2ZzDWZzSmZ3JqZEY0JD%2Fzomd2hmevAmc3RkJ1mkHagCd4rmenUmeU2Ce8mEHu8me9EmZ7mme7FIHYxAC9dmfk8kBMeAF5amOfrGf%2Fnmgh9mVRRkF%2BFmg%2FImgECqXobmgkfAD%2BUkGDxqhGlqWCrqSFXqhGbqhIuqUAEqhBKqfITqiKgqUtimgDHqiBrqiMvqTLZoBL5qfMTqjOgqTCUmhNCAfepCjOzqkIjmhHvqjDxCkKUqkTHqQG1ADPgqkQtqkVEqQTxqlSTqlVbqlGQmlRxoueKClXDqm4nil1BgJPyqMYkqmbNqNZsoEaAqma9qmdOqMZsqgaaqkdbqn3Gik7%2BkD8lEHGMqnhGqnNaCS%2F3AKqH7RjoXaqMr4pJeZqIHKqI5aqbm4mpEKn4uqnpbaqa%2BIqQM6qZzqqaSqiqD6oqJaqqrqihdwqB6qqHVAqas6q6jYqpkKq7JKq7o6ipCKmXGapAC5q8IqipD6AXCKpHoQrMMqrMV6rECqrMuqq72KBL%2Bal6MarZ36pFXgq0iKB19wrdhaqdNard8arrRqmRjgrMJYrua6qugKpyOzruDaroTKATuAqJFQLYLqAfSqqnV5k%2Fk6ELHKr%2F1KqnWZrgHbAPtasAarkAirr2RAsAxrqdwJpxArsRPrqKGZqRebsZYKqhYrsBHrsZW6mlpgrAm7sCTbqKtZlCFbmuy6sv%2BEOgEKmQEvawcxK7N7SrOXSa3Vogc5q7N0agEOC5bycQfQKrRDW7Rt%2BazzqrRMSrQ927TASgJQW6dS66tTWbVXS6c8251Um6xP27U6%2BrUNKaVWS7ZkSp4phqxzqrZDSp4Cl6ZhuqRwy6Ry%2B6t6erdbmrdua7d8u6PciafSsreB26SDG6cQYLiHS6TcSa0zIKWA27gr%2Brjm6ZxqMLmUO6IJ2ZiXO5yZu7mOe5u%2Bap14ELqiK7gxoAUIa7qom7ozapusm6jscrqaC7sQ2qKtW7uvi7sq2qMoS6C267syCry0C7q3S7z9abyaKqjJq7z0Camj2ZYgCr2ce6ijGbB%2BMaj%2F1ruh4yoQftG73Yug38su6Pm846ud5QuR4pu%2B%2FWmrZwq%2BddC%2B7kuftqq11Vu%2FB2oBh4qZ1Mu%2B6Ku%2F0xkDWOC%2F4Hu%2BAuyfPWrA5ku%2FCay%2BAUqN%2F4vADxy9AcrAAFzBFlzAYLmODqzB26mQ0ysQEDC8ICyeGjnC67gGAXzCqZmQHBy23OvC2QnD3PqsLUzDn2nDbRsujKvDAxzDefq2QCybC9zDDfDDRdybwEutQ5zDSyyZTay3MxzFTHzBPQysUGzFh5nCEAarVczFsjkB9zi1YLzFYjyXE8AB%2FUutZ5zGvLmxpRuoYQzHp3mwbkzHaGzHaInHzVvHfNyZfvzGgYya%2F3Kcx9u7x4W8lZYbuUmKBsW4yJ%2FJtvkqpSUgyZNctNVKxJg8l8CZAZAruZ3cnjUbylmqyKPMlJ%2FsxOFiB5ycyme5ynFammCAyrDMogQMyrPsyrZ8yz5pm%2FnIysJYy76MmBqZAU0QCY6sxMUcl5%2BczMsMyM0cy7mczG47ttPclC36AdYspdiczUsJAl4KzU4Lzp4cwaycpd9szjQawd08zL3MziIpuyi7tc4rz2gpzldgs9p7z%2Fhslvp8pCIbz%2F9ckeIcmGiavwWtlQHtxAq90FhJyfJrBgQN0QWZuDSQnxRt0VkJAl5ZnjTQF3Ww0RztlPpcno7MyyVt0hHMoCn9yv8rTZK669LxCdMxPc%2BkS9MQadM3fZHLidI1XdE9HY%2FbbMrMPNQmOcXLzNNI7aTorMyi3NQzCcM2qrdMLdVWGsHOOpxXjdUCuc3kPJzE7NUwCdZQLdZCTdbdaNaRC89qbZJmTbdj%2FdYjuc3vKddpTdfPaNezXLd6XdcBqo%2Bfi6J%2FjdPm%2BKci3dWFHY4g4AKHPdiKvdjfuAErkI%2BI7aCSbZGUbdmf%2B495ndnISNn7fNevKc2gTY%2BiLdjN%2BZGmfdrymNqJWtqf7dq4uAEscKv%2B%2BMG0DY8aoMnn2dq7LY4akJKlm9izHdy0ONw9C9nHjdyyqAH9G9uJ7Nz1CN24Pd3UPY%2F%2Fyl3cmJ3d8tjby92cDSAHY6AB3i2PX%2BvGieLX5w2PNLut6p3Ekd3eufjecyzfzU3fqmjfeYzf%2Bi2O%2FA2f%2Fv3f4Njb8C3gR03gzjjc2xrbA67g3bjdDs7eEM6Nyo2yIY3dFb6Ntm2OxyrSwL3hx6gBLCCg8GrcIr6NJG7iaAri%2BZ3iALDiCJvh%2FgzjzagBMODhv1rjNr6MOK7jNB7iPV6LP87PND7fQ66KRe7EiY2xST7iKWnkKP7kyajcUr7TL57iF%2F7hrJ3lIq4BOoCvId3lVF7lYQ6wGa7SZQ7lKkna3b3muWjl76kDTQ7nxsjgGDDnIrvOdo6KFZuwsNnntU0D%2F6yLqhCZq4I%2Bi4m7tYGe6LXYqwyaA%2BYr5I7u5%2FeKsCMDkSNb6Yp%2B6ccqsk7O6ax6qPwMsXwu6gBgAV7pofK76aj%2BqQ4rcK0e6q9uqrFOvQrr6rXOinLMoLO%2B6664sVWNpCoL7KuolgiNpDh76qJOtDa51XcQtMZ%2BijyL4a0s7dNeiuldyVqc7aqYtT7LLneA5IkO7pEg6afs7alo7pK%2BuJQO7H%2Fe7smatupuitQZsu5O7%2FVOiouuLfO%2B7%2FYe69r77wDP7wIv6Q0w7vpe8ACQtyRM8Awfig5fuO%2B%2B6xPv7l6%2B4f2O8RFPrJpMwp7d8aFouSCv296et6ttByws8g2%2Flv%2Fqjbwsn7ium%2FEVLvOYS%2FMQ3rkDevMxf5uvqps4r%2BBG%2BqKyHfMyIKAvz%2BMMH5oczNws35ULmWKE3PHTmo7%2BiAZBT%2BBPGsxWX8Imn%2B1bD8q5%2BZFYH%2FP4qMvnWfYiP67WqfQFb7m%2FnfX%2F%2FbhdL59yr98JybpSLx88eff0fcRW%2F8h%2B396Ar6h6oPZUj8WBf%2FiDf94pvPeC3%2FNRv%2FiIH%2FE6n8WM3%2FNcANJ9kflrT7pSbycJru6Xn5sFMPreXviJgvpg%2F9TWmayN792de6YZ7vkdj8eQMOZ9L%2FkYAGFjHvIdv8arHvrbuwEiL%2FxmHNRP75W6TOzkLugc4AL7jMhqTvXSP8f%2BWB7z18%2Fk2f%2F5y92tz9%2FncF%2B4lb%2F0mvyji4sGl%2Bz92M%2F60265f8v7Rh3%2Bdg7%2Fchr72Q2ctN%2FKcx3x%2Bg8QTCL5eNDADpgQABQuZNjQ4UOIESVOpFjR4kWMGTVu5NjR40eQIUNuiHEFg0AaDx7gGZNQ5EuYMWXOpFnT5k2cEEmaRBJphko9LXMOJVrU6FGkSUXuPOnzAQQ9alwqpVrV6lWsWSmCiKHlg0CCD4JO1VrW7Fm0aTly9fI1UsqVZMiqpVvX7l2qIGi0FTijgFi5eAUPJlw4pN62Pf0CnmvY8WPIhdl%2B6AnXjtDImTVvPssVS4YpA1VebszZ9GnUNtmCFv3%2BgHRq2LFlg0ScAWXBOphn7%2Bbd2yGIHV5sv8Wt2%2Fdx5KmBf65cvHRy6NEly2BOvEHu59K1b08LgjqG5g%2BwcydfHq33z02Iizdu3v17pOhZ%2F2SfHf59%2FDHlh6Y%2FPv9%2FAGGSTz368EAoQAQTXCuGz%2FhTyUD7FJRwQgBWc3Cl9ijUcMLJLmQpwg1DvK9Dp8TKUEQU8SNJuAvHSvHF%2F0j6TIn1giIBRhzhm4xGuGzM8cfydizRRSCLlM7CEj80csnkJiPwwROZlFK5GNpSz7Iop9RyMxLDem1LME9DMiz%2FwjQzszH%2FKvNMNg1Ls74245SsStbIzFJOPM0CYYUGW1szT0D%2Fz9qAzzoTgDNQRM3SYIUrWLvB0D8TlZSqRRsNzQdI75x005yYAms0TTkVlSamesIUAjvQAHFUVl%2FSoCTwInkU1cBatdWmV0361LVQb%2FV1Iw1oaDS8L381NqRgG72N11WPdVaiYLUYzsten7XWoWinBbXZa7sFIFtTcTvQW3KhFTaDygq4btxy222IAliXLdZdeieId7156W3XXl1by1ffcoVtilpuAb412YG3NdjdZIfDsuCFWW2YCUkIjrjcbCl%2B%2BGJyX5UWJXUj5fhYj9H1KeQxQBi5Ww1g%2BPgtNatdmdOWX4ZL5JkPdtlhlXDOuVWPP7gyZoh%2FDjRat2gg2miS%2FmnwCuRDmfZ1YpijltpWhJeto9arbd2ghn5TorXortvcYIewn7KD67JH%2FdqkKNbbmuy2zXwbg7hvlrlus2moAu%2BKC5Jjb77PJOnvuAm6ju3CJT0cbz%2FVEKFxTrmCeyAIXCNjcson1QvuwHnlvPNEP4c8pesIJ31K0%2FN2bvXSBXadWdgRvXv2f2s3G%2BzTQd1Ad0DP7jcsPBgHnk3hYw1Lj82Px3MDGrhQ%2FsHmnY8z1%2Bmttt5M7MOrowsPtm%2Bz%2B6q%2FD1%2F8M8lXWnv0tWyZp6qLH739Ld9vav2o5qd%2FSg1Y0LViNanhfPtzHwu0cL%2B%2F4EEqBKyfAREoljXQjYET6t8B%2FqGWvwnyz4HLwmAGmUQSCxKHAfLz4AerdL8HjHAM%2BithjjyGQhWysIUw6t%2F%2FlNaAoMhwhimqIQZCc0Mi7dCFLmuKXxqgJCEOUTi3OaLqkvifV7Xlh0Bx4hPxE8UPTNFEErTie7CoRQh18UVR9OF6wihGFLXMC2WkQQNoh0YRRZE1bXwjHDf0RXxV0Y7kwaMOFLZHDckxNH7EEBcBKZ0X%2FtCNxTPkIaFjvx%2F%2BRQ%2BqciQFiRhJsVCykgoq2RQksT47LHCTCULS%2BuogylEGqJRqMl4qR9SVpPWsla58DwhjyT5aerEkPHsAHPSYS97k6pa%2BbCQwY2OBXS6LmMbEDzLT%2FsYAXw6Qme5xZqxSAs0x%2FG6a76lmeJa5TWrCypu%2FBCdq1KeSb5aTj%2BJcDxzYpc7tvLA5DXBnMeGJpr1YswENcEMXtHlP7dSmJzpwYz0Bup3JoKQBEIgDOQ8amRVl0ScLbeiNHhqdFc3HjRW9KEbpNEh1NdSeHSUMkgjaSzBIk6S9QVIOGPCAhqp0pbvJaGhcisuZxqamJfJZTlGzAf8NZwb77KlPTQNUZUkiB0R1qFHvUsGvKJWpI3WqWqCq0NRRtapoqZlbTlqHd27VnC6L6lfBJ9bYXFUSOghZFjSAVtj0MFwFgIMRKADX1MhTVgkogBuMgNe8wpJifinAGn4A%2F1hzClYShDUsYk8TNI09oABqOKxjOWO%2FKGBCaZOtrGU1g1lMDJWznt0MZhfbgNGSNjP2G%2BwABkBZ1a42Bn9DwmJdC9vYQuZVfzvCWhvAANzm1jHY6y1BgNtZ4RaGuIFrQHCTW1JYFbcgavDBc90UXeZS17pzOqB0m1vd7Q4mBF0BzyehpNXw3oRqFkvvU88VLoM0tb05oRpckDhfujQsPPfFb1r06y%2F59rcmyaKMaNaFXgHDJFcmA2WAEyyTc9bxwWaJAROyl7sJW4VfCZNwhrGy4XB12MNWIR97R4wV7MnLwSf%2BCPa0iGEWH8XFeURwjDWy4L4szcZVqZnJZjAA9v6obMeU2hnUijpk9cJAWXJbMZIxAlm5zdLJOIGyKaU8ZVw5LWk6xnJR%2FmvKJnd5IvVFWY3FDJGsle%2FKZ46JBnSwZKWNjc1DcTOc1bbmOYvkcxm4Us%2FCnOeG7NmTYDYzoBXiYgA2YHCFNrTlMKAeH6hLDng2tEcc3WfxVK%2FSM5mxlzS9af0IzJMmBrWARG2dI5f6xueKZFZVrZ8385nGr1Ywq2dNa5EgbIrxZTSg68xhRuJazzTAQvaCLWzaCCxctNIhsp98Lzv1Os8pto4cwursG%2B9SMWXGtkcWvG0Rd%2Fsi9lMM9aQ9Z9ZGggdADuW52VzBk0hi3eJBpbgzAm%2BK6f%2BA3fW297g3ONGV8LvfFcH3kCQ38Hv%2Fmz5RKQHCn71GJvLX4WOmU2QLAOOJN0QDLrCgeZvo7jMXHHUSzzia%2F31DkpccW0TMMQ7%2FvOmaFVFdQVQ5mqt0S5rXHFs312LOdc4QPNIgc3q49s8PfcIpourllQ76QjFec0G%2BxelLN3TQ1UZ1X%2FM8En5UOsjF3MenpNzondy6G5nn9S73WJGMMfpDYo5JBaIdy1w54KD%2F0u62%2F6Yrc7y7wNtOd4laWe5TrjIrB%2B9kYS5r0XnXeEluKVLGAz2Z64F85I%2B%2B5KHScwxvtfy32DnUXo5Bpm0nH%2Bhj2nnPw48%2Blbd8hFkf%2BQhHE%2FX%2Bem0jPVM6e%2FJWZp%2FuHL3REaPPB%2FTz8EgOwV4cVtAuDH%2FIiEkaRVeI%2Boj2xfkWtfxOTT8G6kd%2BRWzcaNF9%2F9Gyw9T7P1%2BNQmGK9TwjqT%2Fon7Mty%2B3qzu%2FENh5PdcaROn9C1n%2FiSC3wV9nPZv7TPfEYP52zpXxzI7BSvh3bACUrKwQkQKjzn%2F5DwCzovZ8jt7KjpyS4q87DQIIqLOSCvQYcLNRqLNy7gqiCgX0ywQ4cwdNKrRZEwSnAhA90LtiDlRkULRtkvBSzrdcaAtRLPcoIrdsCwhMsrx8DLiPsQHGyLSUMwuXKAQf4riB0tN7igekCr86zwuzSQsvjQsXRLtT%2FA0OVEMMtzD0DM8MvJKKB2ic1FEGesC1%2BCkEeVDIkBDI4oMO8AwE7rK0f6yU9%2FLsm%2FMM8DMLxOqDaWh83CMTvsyE3ekPG24kPyCw6gsS8sxfE0ay%2FsMS2u4DZwoAl%2BKRH9MLIE4EeaItQrERSZDxTbIvMqsEgCMLbwQQfQC01iEXU44DgmERatEVG%2FLkNkAG40SzJKkTUu4AaWKMoMK8BMMb4%2B7yCcMbqc7wlcAp6wsVnRMFQpA84wMbqkwGvWMafuEZZrIEDyqyfaEZv1D5zvAB0fAB1lEVYoUR43MG8E4EY4AJeTInX%2BkWdczTXGQC%2FksfLQZ2BHMN8xBtiFMi%2F%2F0JIfQxINWjIM3zIhbTHtsNHiuRHizQ6jNxHN%2FTHmsNIDDgCqXuAjfw5DkjIuCGkk9S5lJSeVyxDkFS5l1RIlpzJkqvJmDTJdWQ8naTBMuzJvHtJXjwpTuTIZNzHv3CDJfzCpJxBRWzKyAOBp%2FykpZRKxvMOKbLK4MNJ%2B%2BM5rlxEedxKRfTK%2FeM5TezKscyitBRL6EPLG3LLM4Q4WlQJufxCGeCLulRL1BOBpGQCWlxKs3Q4fEwMTZzDKrw5wIxLrNzDE1pMdWHKxFwjJDhMyXxL4UjEqwxCXRSDD1iCwETMXNwBzwTNSJtDzrM8ESDNzwzNuyxF1jyCwOTLzltNz%2F%2FsrbIMQlO8zbYcTIQzgR64TasUzc4zgSJggw%2FAzcj0zYEzzjf4ACJgrtdkvBVggufsgdCZzrxjFDr4ABwYTu00ugngTu%2B0yr5iTnsbzyugAxP4zs0Kz58bTyxgz%2B9UHPjUOXvxAjxoz7okzsizlzDYA%2F6sRRA8xhUQAwHFgUw4qfusOQuQgTIQ0BhY0BVET3GzANLczxjoTxb8T9IUUBnoxeay0G6zFwRtTwqFwcjzxBPFARr0ReiTgRMlgkwgrKP8x%2BBkzyjYBBV8ADQgUWy7ACJgAzEwATTgBKF7AMNKzT1EgSVggyX4ADz4BKGjwi80gTBYgxUoAUag0gIoADT%2F8AEmFU8Q0IEw%2BIEUAANK%2BIQfgAAIIIMf4EDfmAA6nYCFkFOlsFOQwFOLqFM0G1OGoAAK8NNA1QA%2BfQhBTVRFTdQJGFRH1QANaFRJHdQ6pVMLoABIrdRK1QALsFM6hVRQBdVP5VRStQBOtQBUTVUL2IANUFVVnYBVvQBX7dRU%2FR0LAIENAAEQmAANKNMu0IESAIMuDYU4WwMjQIEQCIENSNZk1VVdDQERiFYRSFZpZdZoBQForVYR8ABu9QBWZVVmZVUPCIFxZVZzzVVsNVdqldZrRddv3QB2lVYTmFcUMAER4AARGIFoJddu7dZ1jdYSiFd2RQGCZdcSKIETSNgT%2FwhYaT1YEyBYFDhYhEXYhD3YhIVYjI3YEkCBFOhYjyXYj%2BXYFMDYjgVZjz3ZkBXZEzDZjIXYlDVZFkBZj2UBmk0BmqVZkGWBnG1ZnkWBFViBjP1ZoR3ZkSXYFWCBo%2F3ZjhVapm1ap3Xam41apG3am12BGNiBGtiBHTjaGXCCJAABH2CEURgFYj2AwjICGmCBGVBbGqCBGYABuIWBGJjbuW1bu73ZGUhbFoABqbVbv50BwM1btw1cwSXcuIUBv01cxU3cGsharM3aHugBIpjcHtDayn1cv%2FUBzfWBHfgBzyUCz%2FVcrd2BySUCIzAC0C3d0j1dI%2FjcH1DdJYhd1k0C1P9VXda9XdpFXSOIXd693SXI3dPlXd6lXeEt3iW4Xd8V3t29XSdoXuSd3SQwXuXd3eMN3ue93uuN3SLY3uKNXtml3iUogvAN3u%2BV3uIVX%2FE93iIwgvU13fXdXvgVXid4Ai3ogi8Igy5Ygh8Agx9omT4IhU8YBVEQugDwq%2BbNAgRO4CyogirIAi3QAgZ%2B4C54YC1QYASm4ApG4Al%2BYAvuYA%2F%2BYAZWYAzuAhIm4REmYS%2FQAi8IAzEQgzB4YS%2BI4RKeYfv9Ahv%2BAjLIYR0mgxfu4TAggzIoAx8eYiJ%2B4RwO4iDeYSLO4R5mYiPeYR5u4ij%2B4SLugiLGXxrO4hKuXy3eYAxTzuAvpuAJXmAHDmEEroLmfYInaF42doIqUOM1ZmM4nmMGZmMGvuM7hmM3ZmA1xmM%2F5uM5juM1ll8n4F04jmArLoM1YIMyWGMYGIAf6NKxFQVRCAgAOw%3D%3D";
  951. $("div.mod_comm").css('background', 'url(' + CHAT_BG_IMAGE + ')');
  952.  
  953.  
  954. $("#tr_presetBox").draggable({stop: function( event, ui ) {
  955. presetPosition = $("#tr_presetBox").position();
  956. savePresetPosition();
  957. } });
  958.  
  959. $("#tr_guardBox").draggable({stop: function( event, ui ) {
  960. guardPosition = $("#tr_guardBox").position();
  961. saveGuardPosition();
  962. } });
  963.  
  964. readGuardPosition();
  965. if (!guardPosition)
  966. resetGuardWidget();
  967. else
  968. {
  969. $('#tr_guardBox').css({
  970. "left": guardPosition.left + "px",
  971. "top": guardPosition.top + "px"});
  972. }
  973.  
  974. readPresetPosition();
  975. if (!presetPosition)
  976. resetPresetWidget();
  977. else
  978. {
  979. $('#tr_presetBox').css({
  980. "left": presetPosition.left + "px",
  981. "top": presetPosition.top + "px"});
  982. }
  983.  
  984. drawGuardWidget();
  985.  
  986. // hook into citysel_click();
  987. var cityselMod = new CalterUwFunc("citysel_click",[['cm.PrestigeCityView.render()','cm.PrestigeCityView.render();tr_cityChanged();']]);
  988. unsafeWindow.tr_cityChanged = drawGuardWidget;
  989. cityselMod.setEnable(true);
  990.  
  991. $('#tr_presetBox').bind('mousedown', function(e) {
  992. if (e.which == 3) {
  993. resetPresetWidget();
  994. return false;
  995. }
  996. });
  997.  
  998. $('#tr_guardBox').bind('mousedown', function(e) {
  999. if (e.which == 3) {
  1000. resetGuardWidget();
  1001. return false;
  1002. }
  1003. });
  1004. }
  1005.  
  1006. function drawGuardWidget() {
  1007. // color the outline based on the current city
  1008.  
  1009. $("li.guardbutton").removeClass("active");
  1010. var cityId = unsafeWindow.currentcityid;
  1011.  
  1012. var y_offset = {
  1013. wood: " 47% ",
  1014. ore: " 72.5% ",
  1015. food: " 59.5% ",
  1016. stone: " 85% "
  1017. };
  1018.  
  1019. var x_offset = {
  1020. plate: 20,
  1021. junior: 134,
  1022. teenager: 248,
  1023. adult: 362,
  1024. adult2: 476,
  1025. adult3: 590
  1026. };
  1027.  
  1028. var x_by_level = {
  1029. 0: x_offset.plate,
  1030. 1: x_offset.junior,
  1031. 2: x_offset.junior,
  1032. 3: x_offset.junior,
  1033. 4: x_offset.teenager,
  1034. 5: x_offset.teenager,
  1035. 6: x_offset.adult,
  1036. 7: x_offset.adult,
  1037. 8: x_offset.adult,
  1038. 9: x_offset.adult,
  1039. 10: x_offset.adult2,
  1040. 11: x_offset.adult3,
  1041. 12: x_offset.adult3,
  1042. 13: x_offset.adult3,
  1043. 14: x_offset.adult3,
  1044. 15: x_offset.adult3
  1045. };
  1046.  
  1047. for (c in unsafeWindow.seed.guardian)
  1048. {
  1049. if (unsafeWindow.seed.guardian[c].cityId == cityId)
  1050. {
  1051. var type = unsafeWindow.seed.guardian[c].type;
  1052. $("li.guardbutton." + type).addClass("active");
  1053.  
  1054. for (t in y_offset)
  1055. {
  1056. var level = unsafeWindow.seed.guardian[c].cityGuardianLevels[t];
  1057. level = level ? level : 0;
  1058. var bg_offset = x_by_level[level]/776*100 + "% " + y_offset[t];
  1059. $("li.guardbutton." + t).css('background-position', bg_offset);
  1060. if (level)
  1061. $("li.guardbutton." + t).css('background-color', 'white');
  1062. else
  1063. $("li.guardbutton." + t).css('background-color', 'darkgray');
  1064. }
  1065. }
  1066. }
  1067. }
  1068.  
  1069. function resetGuardWidget() {
  1070. $("#tr_guardBox").position( {
  1071. my: "right bottom",
  1072. at: "right top-6",
  1073. of: "div.mod_comm",
  1074. collision: "fit"
  1075. });
  1076. delete guardPosition;
  1077. guardPosition = null;
  1078. saveGuardPosition();
  1079. }
  1080.  
  1081. function resetPresetWidget() {
  1082. $("#tr_presetBox").position( {
  1083. my: "left bottom",
  1084. at: "left+3 top",
  1085. of: "div.mod_comm",
  1086. collision: "fit"
  1087. });
  1088. delete presetPosition;
  1089. presetPosition = null;
  1090. savePresetPosition();
  1091. }
  1092.  
  1093. function updateTimerDisp () {
  1094.  
  1095. var t = Tabs.upgrader;
  1096. var timeUntilDone = 0;
  1097.  
  1098. if (t.repairEnd != 0)
  1099. {
  1100. timeUntilDone = t.repairEnd - unixTime();
  1101. }
  1102.  
  1103. if (timeUntilDone > 0)
  1104. {
  1105. $(document.querySelector('#trtimerdisp')).html("<span id='trhammer'></span> " + rectime(timeUntilDone))
  1106. .css('text-align', 'left')
  1107. .css('width', '100px');
  1108. }
  1109. else
  1110. {
  1111. $(document.querySelector('#trtimerdisp')).html("<span id='trhammer'></span> Done").css('width', '100px');
  1112. }
  1113. }
  1114.  
  1115.  
  1116. function rectime(secs) {
  1117. var min = Math.floor((secs)/60);
  1118. var sec = Math.ceil(secs - (min * 60));
  1119.  
  1120. if (sec < 10) {sec = "0" + sec;}
  1121. return min + ':' + sec;
  1122. }
  1123.  
  1124. var withAnim = null;
  1125. if (unsafeWindow.cm && unsafeWindow.cm.ThronePanelView) withAnim = unsafeWindow.cm.ThronePanelView.statusAnim;
  1126.  
  1127.  
  1128. function noAnim(result) {
  1129. if (result == "success")
  1130. {
  1131. var item_name = $("#thronePanelName").html();
  1132. var attempt_type = $("div.thronePanelContainer").find("li.selected").html();
  1133.  
  1134. var msg = "Manual ";
  1135. if (attempt_type)
  1136. msg += attempt_type;
  1137. else
  1138. msg += "upgrade/enhance";
  1139.  
  1140. msg += " successful.";
  1141.  
  1142. if (item_name) msg += " Item: " + item_name;
  1143.  
  1144. trSuccessLog(msg);
  1145.  
  1146. if (withAnim) withAnim(result);
  1147. }
  1148. $("div.thronePanelItemContainer").append("<div>" + result + "</div>");
  1149. }
  1150.  
  1151. function disableAnimation(disable) {
  1152. if (disable) {
  1153. // override the success failure animations
  1154. CM.ThronePanelView.statusAnim = noAnim;
  1155. } else {
  1156. if (withAnim) CM.ThronePanelView.statusAnim = withAnim;
  1157. }
  1158. }
  1159.  
  1160. function installHandlerFunctions() {
  1161.  
  1162. var oldR = unsafeWindow.cm.ThroneView.renderInventory;
  1163. var oldOpen = unsafeWindow.cm.ThroneView.openThrone;
  1164.  
  1165. var ri2 = function(l) {
  1166. oldR(l);
  1167. $("ul#throneInventoryList > li > div").removeClass('blueBorder');
  1168. $("ul#throneInventoryList > li > div").removeClass('yellowBorder');
  1169. for (ii in queueData.list) {
  1170. var list_item = queueData.list[ii];
  1171. if (!list_item) continue;
  1172. if (list_item.status != "complete") {
  1173. var id = list_item.item;
  1174.  
  1175. if (list_item.action == "upgrade") $("div#throneInventoryItem" + id).addClass('blueBorder');
  1176. if (list_item.action == "enhance") $("div#throneInventoryItem" + id).addClass('yellowBorder');
  1177. }
  1178.  
  1179. }
  1180.  
  1181. for (ii in presetData.taggedItems) {
  1182. $("div#throneInventoryItem" + ii).prepend("<div class='greenBorder'></div>");
  1183. }
  1184.  
  1185. $('div[id^="throneInventoryItem"]').bind("contextmenu",function(e){
  1186. e.preventDefault();
  1187. var theId = $(this).attr("id").split("throneInventoryItem")[1];
  1188. unsafeWindow.cm.ContextualMenuThrone.renderMenu( $(this), unsafeWindow.kocThroneItems[theId]);
  1189.  
  1190. return false;
  1191. });
  1192. };
  1193.  
  1194. var open2 = function(F) {
  1195. oldOpen(F);
  1196.  
  1197. $('div[id^="throneInventoryItem"]').bind("contextmenu",function(e){
  1198. e.preventDefault();
  1199. var theId = $(this).attr("id").split("throneInventoryItem")[1];
  1200. unsafeWindow.cm.ContextualMenuThrone.renderMenu( $(this), unsafeWindow.kocThroneItems[theId]);
  1201.  
  1202. return false;
  1203. });
  1204.  
  1205. // allow TR items to be dragged around
  1206. $("#advisorContainer").draggable();
  1207. $("#heroContainer").draggable();
  1208. $("#chairContainer").draggable();
  1209. $("#candelabrumContainer").draggable();
  1210. $("#tableContainer").draggable();
  1211. $("#windowContainer").draggable();
  1212. $("#bannerContainer").draggable();
  1213. $("#trophyContainer").draggable();
  1214. $("#statueContainer").draggable();
  1215. Tabs.throneSalvage.updateTRTab();
  1216. Tabs.upgrader.updateTRTab();
  1217. //Tabs.upgrader.updateTRSelect();
  1218. $("ul#throneInventoryList > li > div").removeClass('blueBorder');
  1219. $("ul#throneInventoryList > li > div").removeClass('yellowBorder');
  1220. $("div#throneMainContainer div#heroContainer").css('left', '450px');
  1221.  
  1222. for (ii in queueData.list) {
  1223. var list_item = queueData.list[ii];
  1224. if (!list_item) continue;
  1225. if (list_item.status != "complete") {
  1226. var id = list_item.item;
  1227. if (list_item.action == "upgrade") $("div#throneInventoryItem" + id).addClass('blueBorder');
  1228. if (list_item.action == "enhance") $("div#throneInventoryItem" + id).addClass('yellowBorder');
  1229. }
  1230.  
  1231. }
  1232.  
  1233. for (ii in presetData.taggedItems) {
  1234. $("div#throneInventoryItem" + ii).prepend("<div class='greenBorder'></div>");
  1235. }
  1236.  
  1237. $("ul#throneInventoryList").css('height', '520px');
  1238. $("div#throneInventoryContainer").css('height', '520px');
  1239.  
  1240. // update the other presets buttons when clicked
  1241. $('ul#throneStatList li.active, ul#throneStatList li.selected').click(
  1242. function () {
  1243. var s = $(this).attr('id').split('throneInventoryPreset')[1];
  1244. setPresetWidget(+s);
  1245. });
  1246.  
  1247.  
  1248.  
  1249. };
  1250.  
  1251. unsafeWindow.cm.ThroneView.renderInventory = ri2;
  1252. unsafeWindow.cm.ThroneView.openThrone = open2;
  1253.  
  1254. // intercept the render menu call for our own uses
  1255.  
  1256. // save the location of the old funtion
  1257. var oldF = unsafeWindow.cm.ContextualMenuThrone.renderMenu;
  1258.  
  1259. var renderMenu2 = function (l, j) {
  1260. // call the old one
  1261. oldF(l,j);
  1262.  
  1263. if (j != null)
  1264. {
  1265.  
  1266. // create a button to "tag" an item
  1267. var btn3 = document.createElement('a');
  1268. if ( !presetData.taggedItems[j.id])
  1269. {
  1270. $(btn3).addClass("buttonv2 h20 brown")
  1271. .html("Tag Item")
  1272. .css('color', 'white')
  1273. .bind("click", function () {
  1274. Tabs.organizer.addTagItem(j.id);
  1275. $("#contextMenu").remove();})
  1276. ;
  1277. } else {
  1278. $(btn3).addClass("buttonv2 h20 brown")
  1279. .html("Remove Tag")
  1280. .css('color', 'white')
  1281. .bind("click", function () {
  1282. Tabs.organizer.removeTagItem(j.id);
  1283. $("#contextMenu").remove();});
  1284. }
  1285. $("#contextMenu div.title").after(btn3);
  1286.  
  1287. // create a button to set the item to auto-enhance
  1288. if (j.quality < 5) {
  1289. var btn2 = document.createElement('a');
  1290. $(btn2).addClass("buttonv2 h20 green")
  1291. .html("Auto Enhance")
  1292. .css('color', 'yellow')
  1293. .bind("click", function () {
  1294. Tabs.upgrader.addEnhanceItem(j.id);
  1295. Tabs.upgrader.repaint();
  1296. $("#contextMenu").remove();});
  1297. $("#contextMenu div.title").after(btn2);
  1298. }
  1299.  
  1300. // create a button to set the item to auto-update
  1301. var btn = document.createElement('a');
  1302. $(btn).addClass("buttonv2 h20 green")
  1303. .html("Auto Upgrade")
  1304. .css('color', 'blue')
  1305. .bind("click", function () {
  1306. Tabs.upgrader.addUpgradeItem(j.id);
  1307. Tabs.upgrader.repaint();
  1308. $("#contextMenu").remove();});
  1309. $("#contextMenu div.title").after(btn);
  1310.  
  1311.  
  1312. // create a button to set the item to auto-update/enhance
  1313. if (upgradeData.multiUpgrade)
  1314. {
  1315. btn = document.createElement('a');
  1316. $(btn).addClass("buttonv2 h20 green")
  1317. .html("Auto Upgrade/Enhance")
  1318. .css('color', 'black')
  1319. .bind("click", function () {
  1320. Tabs.upgrader.addBothItem(j.id);
  1321. Tabs.upgrader.repaint();
  1322. $("#contextMenu").remove();});
  1323. $("#contextMenu div.title").after(btn);
  1324. }
  1325.  
  1326. // create a button to copy the stats
  1327. btn = document.createElement('a');
  1328. $(btn).addClass("buttonv2 h20 blue")
  1329. .html("Copy Stats")
  1330. .css('color', 'white')
  1331. .bind("click", function () {
  1332. var cText = $("div#trCardItem" + j.id).find("div.trCard").text();
  1333. if (cText) {
  1334. window.prompt ("Copy to clipboard: Ctrl+C", cText);
  1335. }
  1336. $("#contextMenu").remove();
  1337. });
  1338. $("#contextMenu div.title").after(btn);
  1339.  
  1340. // create a button to post the stats
  1341. btn = document.createElement('a');
  1342. $(btn).addClass("buttonv2 h20 blue")
  1343. .html("Post Stats to Chat")
  1344. .css('color', 'white')
  1345. .bind("click", function () {
  1346. var cText = $("div#trCardItem" + j.id).find("div.trCard").text();
  1347. if (cText) {
  1348. cText = cText.replace("Type", "||Type").replace("Quality","||Quality").replace("Level","||Level")
  1349. cText = cText.replace("Might","||Might").replace(/ /g, "||").replace(/\|\|\|\|/g, "||").replace(/\|\|\s*$/, "");
  1350. cText = ":::. |" + cText;
  1351. var table = cText.split("||");
  1352. for (row=1; row<=5; row++) {
  1353. table[table.length-6+row] = "Row " + row + ": " + table[table.length-6+row];
  1354. }
  1355. cText = table.join("||");
  1356.  
  1357. sendChat(cText);
  1358. }
  1359. $("#contextMenu").remove();
  1360. });
  1361.  
  1362. $("#contextMenu div.title").after(btn);
  1363. $(".buttonv2.red").click(function() { $(".mediumModal").css('z-index', 120000);});
  1364.  
  1365. if (!j.isBroken) {
  1366. // no salvage on first x items
  1367. if (upgradeData.salvageSafety) {
  1368.  
  1369. var keys =unsafeWindow.Object.keys(unsafeWindow.kocThroneItems);
  1370. var v = "" + j.id;
  1371. if ( keys.indexOf(v) < upgradeData.numSafety && keys.indexOf(v) > -1) {
  1372. $("#contextMenu a:nth-last-child(2)").remove();
  1373. }
  1374.  
  1375. }
  1376.  
  1377. if (upgradeData.noMassSalvage)
  1378. {
  1379. $("#contextMenu a").last().remove();
  1380. }
  1381. }
  1382.  
  1383. }
  1384.  
  1385. };
  1386.  
  1387. // hook up our new function
  1388. unsafeWindow.cm.ContextualMenuThrone.renderMenu = renderMenu2;
  1389.  
  1390. // add some new functionality here ...
  1391. var F2 = CM.ThronePanelView.renderPanel;
  1392.  
  1393. var renderPanel2 = function(v1, v2) {
  1394. F2(v1,v2);
  1395. // save off this data ...
  1396. Tabs.organizer.panelId = v2.id;
  1397. Tabs.organizer.panelType = v1;
  1398. Tabs.organizer.panelNextLevel = 2;
  1399.  
  1400. // register some callbacks when the buttons are pushed
  1401. addPanelCb();
  1402.  
  1403. var addClickAction = function ()
  1404. {
  1405. // add an action to the buttons to switch between upgrade/enhance
  1406. var pc = document.querySelector('#thronePanelContainer');
  1407. $(pc).children("div.navigation li").click( function (){
  1408. // clear the pulldown
  1409. unselectToken();
  1410.  
  1411. // buttons have been recreated. install action again
  1412. addClickAction();
  1413. });
  1414. }
  1415.  
  1416. var checkAstoneLevel = function () {
  1417. // check limit
  1418. var stones = parseInt(Seed.resources["city" + unsafeWindow.currentcityid]["rec5"][0]);
  1419. if (stones < upgradeData.safetyLimit) {
  1420. disableUpgradeButton();
  1421. }
  1422.  
  1423. if ( isNaN(stones)) {
  1424. disableUpgradeButton();
  1425. }
  1426. }
  1427.  
  1428. var disableUpgradeButton = function () {
  1429. // disable the button
  1430. $(document.querySelector('#thronePanelItemRequirementsContainer')).children("a.gemButtonv2").unbind("click");
  1431.  
  1432. // change the appearance
  1433. var container = document.querySelector('#thronePanelItemRequirementsContainer');
  1434. $(container).children("a.gemButtonv2").removeClass('green');
  1435. $(container).children("a.gemButtonv2").addClass('gray');
  1436. $(container).children("a.gemButtonv2").html("Low A-Stone")
  1437. }
  1438.  
  1439. var addClickAction2 = function ()
  1440. {
  1441. // add an action to the buttons to switch between upgrade/enhance
  1442. $(document.querySelector('#thronePanelContainer')).children("div.navigation li").click( function (){
  1443.  
  1444. // check every time the panel is switched
  1445. checkAstoneLevel();
  1446.  
  1447. // buttons have been recreated. install action again
  1448. addClickAction2();
  1449. });
  1450. }
  1451.  
  1452. if (upgradeData.removeTokens) {
  1453.  
  1454. // remove options for tokens
  1455. var removeItems = [unsafeWindow.ksoItems[20006].name, // lucky token
  1456. unsafeWindow.ksoItems[20007].name, // common master
  1457. unsafeWindow.ksoItems[20008].name, // uncommon
  1458. unsafeWindow.ksoItems[20009].name, // rare
  1459. unsafeWindow.ksoItems[20010].name, // epic
  1460. unsafeWindow.ksoItems[20011].name, // wondrous
  1461. unsafeWindow.ksoItems[20012].name, // +3 master
  1462. unsafeWindow.ksoItems[20013].name, // +5 master
  1463. unsafeWindow.ksoItems[20014].name, // +7
  1464. unsafeWindow.ksoItems[20015].name, // +9
  1465. unsafeWindow.ksoItems[20016].name, // +10
  1466. unsafeWindow.ksoItems[20017].name, // +11
  1467. unsafeWindow.ksoItems[20018].name, // +12
  1468. unsafeWindow.ksoItems[20019].name // super lucky token
  1469. ];
  1470.  
  1471. $(document.querySelector("#buffDropDown")).children("option").each( function() {
  1472. if ($.inArray($(this).text(), removeItems) > -1) $(this).remove();
  1473. });
  1474. }
  1475.  
  1476. if (upgradeData.safetyOn)
  1477. {
  1478. // remove the gem option
  1479. var sel = document.getElementById("costDropDown");
  1480. sel.remove(1);
  1481.  
  1482. // enforce a lower limit on a-stone. Disable button if too low.
  1483. // see if we have enough a-stone
  1484. checkAstoneLevel();
  1485.  
  1486. $(document.querySelector("#thronePanelItemRequirementsContainer")).children( "a.gemButtonv2").click ( function (){
  1487. // every time the button is pushed, check the levels
  1488. checkAstoneLevel();
  1489. });
  1490.  
  1491. addClickAction2();
  1492. }
  1493.  
  1494. function unselectToken() {
  1495.  
  1496. // if the user manually selected a buff, leave it alone
  1497. if (!buffChanged) {
  1498.  
  1499. // set the pull down to nothing when first displayed
  1500. $(document.querySelector("#buffDropDown")).val(0);
  1501.  
  1502. // set the pull down to nothing when first displayed
  1503. $(document.querySelector("#costDropDown")).val(0);
  1504.  
  1505. // remove the icon ....
  1506. $(document.querySelector("#thronePanelBuffIcon")).removeClass().addClass('icon').addClass('i0');
  1507. $(document.querySelector("#thronePanelBuffPrice")).children("span.items").html('');
  1508.  
  1509. // install an action to track when a buff is selected
  1510. $(document.querySelector("#buffDropDown")).change( function () {
  1511. buffChanged = true;
  1512. });
  1513.  
  1514. // install an action to track when a buff is selected
  1515. $(document.querySelector("#costDropDown")).change( function () {
  1516. buffChanged = true;
  1517. });
  1518.  
  1519. // reset once the dialog is closed
  1520. $(".throneContainer").children("div.close").click( function () {
  1521. buffChanged = false;
  1522. });
  1523. }
  1524. }
  1525.  
  1526. // force the buff item selection to be empty
  1527. if (upgradeData.buffsOff)
  1528. {
  1529. // deselect the token
  1530. unselectToken();
  1531.  
  1532. // add a clck action to set it back to nothing when switching between upgrade/enhance
  1533. addClickAction();
  1534. }
  1535.  
  1536. };
  1537.  
  1538. // hook up to the new function
  1539. CM.ThronePanelView.renderPanel = renderPanel2;
  1540.  
  1541. // override the salvageItem function to allow upgrade to +1 first
  1542. var salItemOrig = CM.ThroneController.salvageItem;
  1543. var salItemNew = function (item) {
  1544. if ( salvageData.upgradeManual )
  1545. {
  1546. if (item && item.quality <= salvageData.upgradeFirstQual && item.level==0 )
  1547. {
  1548. var status = Tabs.throneSalvage.deleting;
  1549. Tabs.throneSalvage.deleting = true;
  1550. Tabs.upgrader.doUpgrade(item.id,true);
  1551. Tabs.throneSalvage.deleting = status;
  1552. }
  1553. }
  1554. salItemOrig(item);
  1555. };
  1556.  
  1557. CM.ThroneController.salvageItem = salItemNew;
  1558.  
  1559. // watch the active slot so the TRO keeps up with changes
  1560. // This uses Object.watch() which is only defined on Gecko
  1561. try {
  1562.  
  1563. function updateThrone () {
  1564. unsafeWindow.cm.ThroneView.renderThrone();
  1565. unsafeWindow.cm.ThroneView.renderStats();
  1566. Tabs.organizer.show();
  1567. };
  1568.  
  1569. // This function watchs the TR active slot.
  1570. function slotWatcher(id, oldval, newval) {
  1571. try {
  1572. setPresetWidget(newval);
  1573. setTimeout(updateThrone, 200);
  1574. } catch (e) {
  1575. logit("error in slot watcher" + e.toString());
  1576. };
  1577. return newval;
  1578. };
  1579.  
  1580. // If the preset is changed, update the displays
  1581. Seed.throne.multiWatch("activeSlot", slotWatcher);
  1582. // some of the seed updates replace the seed.throne value. when this happens reinstall the watcher
  1583. Seed.multiWatch("throne", function (id, oldval, newval) {
  1584. // register with the seed so we know when the throne object is replaced
  1585. try {
  1586. // add a new watcher / remove the old one
  1587. //
  1588. if (oldval.multiUnwatch) oldval.multiUnwatch("activeSlot", slotWatcher);
  1589.  
  1590. // if another script create this object, the prototypes won't be defined. If so, add them now
  1591. if (!newval.multiWatch) {
  1592. newval.multiWatch = Object.prototype.multiWatch;
  1593. newval.multiUnwatch = Object.prototype.multiUnwatch;
  1594. }
  1595.  
  1596. newval.multiWatch("activeSlot", slotWatcher);
  1597. } catch (e) { logit("error in multiwatch handler: " + e.toString());}
  1598.  
  1599. return newval;
  1600. });
  1601. } catch (e) {}
  1602. }
  1603.  
  1604. var buffChanged = false;
  1605.  
  1606. function addPanelCb() {
  1607. // these elements get rebuilt after every click so they have to reinstall
  1608. // themselves ...
  1609. $("ul.tabsv2 > li:contains('enhance')").click( function() {Tabs.organizer.panelType = "enhance"; Tabs.organizer.panelNextLevel = 2; addPanelCb();});
  1610. $("ul.tabsv2 > li:contains('upgrade')").click( function() {Tabs.organizer.panelType = "upgrade"; Tabs.organizer.panelNextLevel = 2; addPanelCb();});
  1611. }
  1612.  
  1613. function onUnload (){
  1614.  
  1615. upgradeData.activeTab = $( "#tr_main" ).tabs( "option", "active");
  1616. upgradeData.sortSelected = $("#trSortList").val();
  1617. upgradeData.buffSelected = $("#trSortType").val();
  1618. upgradeData.sortInactive = ($("#trSortInactive").attr('checked') == 'checked');
  1619.  
  1620. if (!ResetAll) saveUpgradeData();
  1621. }
  1622.  
  1623. function trMainTab (me){ // right-click on main button resets window
  1624. if (me.button == 2){
  1625. $( "#tr_dialog" ).dialog( "option", "position",
  1626. {my: "left top",
  1627. at: "left+15 bottom+5",
  1628. of: "#main_engagement_tabs"});
  1629. }
  1630. }
  1631.  
  1632.  
  1633. function attachTab()
  1634. {
  1635.  
  1636. unsafeWindow.hideShow = trHideShow;
  1637. unsafeWindow.execSalvage = Tabs.throneSalvage.togglePower;
  1638. unsafeWindow.execUpgrade = Tabs.upgrader.togglePower;
  1639. unsafeWindow.clickNext = Tabs.organizer.showNext;
  1640.  
  1641. var str = unsafeWindow.cm.FETemplates.Throne.mainThrone.replace(
  1642. '<li id="throneStatTab" class="inactive"> Stats </li>',
  1643. '<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>');
  1644.  
  1645. str = str.replace( '<div id="thronePanelContainer">', '<div id="thronePanelContainer" style="z-index: 101">');
  1646. unsafeWindow.cm.FETemplates.Throne.mainThrone = str;
  1647.  
  1648. unsafeWindow.cm.FETemplates.Throne.throneInfo = unsafeWindow.cm.FETemplates.Throne.throneInfo.replace (
  1649. '<div id="throneInfoContainer">',
  1650. '<div id="throneInfoContainer" style="z-index: 100;">');
  1651.  
  1652. unsafeWindow.cm.FETemplates.Throne.mainThrone = unsafeWindow.cm.FETemplates.Throne.mainThrone.replace (
  1653. '<div id="throneInfoContainer">',
  1654. '<div id="throneInfoContainer" style="z-index: 100;">');
  1655.  
  1656. unsafeWindow.cm.FETemplates.Throne.thronePanel = unsafeWindow.cm.FETemplates.Throne.thronePanel.replace(
  1657. '<div class="thronePanelContainer">',
  1658. '<div class="thronePanelContainer" style="z-index: 101;">');
  1659.  
  1660. unsafeWindow.cm.FETemplates.Throne.thronePanel = unsafeWindow.cm.FETemplates.Throne.thronePanel.replace(
  1661. '<div id="nextStatContainer" class="nextStat"><span> Next </span>',
  1662. '<div id="nextStatContainer" class="nextStat" onclick="clickNext()"><span> Next *Click Me* </span>');
  1663.  
  1664. unsafeWindow.cm.FETemplates.Throne.mainThrone = unsafeWindow.cm.FETemplates.Throne.mainThrone.replace(
  1665. '<ul id="throneStatDisplay"></ul>', '<div style="width: 70%; margin-left: auto; margin-right: auto;"><input type="button" value="Post to Chat" onclick="postTR()"></input></div><ul id="throneStatDisplay"></ul>');
  1666.  
  1667. GM_addStyle( "div#throneMainContainer div#throneInfoContainer div.infoContainer div.statContainer div.stats > ul {height: 345px }");
  1668.  
  1669. function postTR() {
  1670. var cText = $(document.querySelector("#throneStatDisplay")).html();
  1671. cText = cText.replace(/\<\/li\>/g, "||").replace(/\<li.*?\>/g,"").replace(/\|\|\s*$/, "");
  1672. var title = $(document.querySelector("div.primarytitlebar span.title")).text();
  1673. cText = ":::. |" +title + "|| "+ cText;
  1674. sendChat(cText);
  1675. }
  1676.  
  1677. unsafeWindow.postTR = postTR;
  1678. }
  1679.  
  1680. function trHideShow (){
  1681. if ($(document.querySelector("#tr_dialog")).dialog("isOpen")){
  1682. $(document.querySelector("#tr_dialog")).dialog("close");
  1683. upgradeData.trWinIsOpen = false;
  1684. } else {
  1685. $(document.querySelector("#tr_dialog")).dialog("open");
  1686. upgradeData.trWinIsOpen = true;
  1687. // clear the color
  1688. upgradeData.newUpgradeState = 0;
  1689. setUpgradeColor();
  1690. }
  1691. saveUpgradeData();
  1692. }
  1693.  
  1694. //Simple method, as if it were typed in thru DOM
  1695. function sendChat (msg){
  1696. $(document.querySelector("#mod_comm_input")).val(msg);
  1697. uW.Chat.sendChat ();
  1698. }
  1699.  
  1700. function AddMainTabLink(text, eventListener, mouseListener) {
  1701. var label = "Throne Room";
  1702.  
  1703. var a=document.createElement('a');
  1704. a.className='button20';
  1705. a.innerHTML='<span style="color: #ff6">'+ label +'</span>';
  1706. a.id = 'trtab';
  1707. a.className='tab';
  1708.  
  1709. var tabs=document.getElementById('main_engagement_tabs');
  1710. if(!tabs) {
  1711. tabs=document.getElementById('topnav_msg');
  1712. if (tabs)
  1713. tabs=tabs.parentNode;
  1714. }
  1715. if (tabs) {
  1716. var e = tabs.parentNode;
  1717. var gmTabs = null;
  1718. for (var i=0; i<e.childNodes.length; i++){
  1719. var ee = e.childNodes[i];
  1720. if (ee.tagName && ee.tagName=='DIV' && ee.className=='tabs_engagement' && ee.id!='main_engagement_tabs'){
  1721. gmTabs = ee;
  1722. break;
  1723. }
  1724. }
  1725. if (gmTabs == null){
  1726. gmTabs = document.createElement('div');
  1727. gmTabs.className='tabs_engagement';
  1728. // gmTabs.style.background='#ca5';
  1729. tabs.parentNode.insertBefore (gmTabs, tabs);
  1730. gmTabs.style.whiteSpace='nowrap';
  1731. gmTabs.style.width='735px';
  1732. gmTabs.lang = 'en_PT';
  1733. }
  1734. if (gmTabs.firstChild)
  1735. gmTabs.insertBefore (a, gmTabs.firstChild);
  1736. else
  1737. gmTabs.appendChild(a);
  1738. a.addEventListener('click',eventListener, false);
  1739. if (mouseListener != null)
  1740. a.addEventListener('mousedown',mouseListener, true);
  1741. return a;
  1742. }
  1743. return null;
  1744. }
  1745.  
  1746.  
  1747. function getClientCoords(e){
  1748. if (e==null)
  1749. return {x:null, y:null, width:null, height:null};
  1750. var x=0, y=0;
  1751. ret = {x:0, y:0, width:e.clientWidth, height:e.clientHeight};
  1752. while (e.offsetParent != null){
  1753. ret.x += e.offsetLeft;
  1754. ret.y += e.offsetTop;
  1755. e = e.offsetParent;
  1756. }
  1757. return ret;
  1758. }
  1759.  
  1760. //emulate protoype's Ajax.Request ...
  1761. function AjaxRequest (url, opts){
  1762. var headers = {
  1763. 'X-Requested-With': 'XMLHttpRequest',
  1764. 'X-Prototype-Version': '1.6.1',
  1765. 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
  1766. };
  1767. var ajax = null;
  1768.  
  1769. if (window.XMLHttpRequest)
  1770. ajax=new XMLHttpRequest();
  1771. else
  1772. ajax=new ActiveXObject("Microsoft.XMLHTTP");
  1773.  
  1774. if (opts.method==null || opts.method=='')
  1775. method = 'GET';
  1776. else
  1777. method = opts.method.toUpperCase();
  1778.  
  1779. if (method == 'POST'){
  1780. headers['Content-type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
  1781. } else if (method == 'GET'){
  1782. addUrlArgs (url, opts.parameters);
  1783. }
  1784.  
  1785. ajax.onreadystatechange = function(){
  1786. // ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; states 0-4
  1787. if (ajax.readyState==4) {
  1788. if (ajax.status >= 200 && ajax.status < 305)
  1789. if (opts.onSuccess) opts.onSuccess(ajax);
  1790. else
  1791. if (opts.onFailure) opts.onFailure(ajax);
  1792. } else {
  1793. if (opts.onChange) opts.onChange (ajax);
  1794. }
  1795. }
  1796.  
  1797. ajax.open(method, url, true); // always async!
  1798.  
  1799. for (var k in headers)
  1800. ajax.setRequestHeader (k, headers[k]);
  1801. if (matTypeof(opts.requestHeaders)=='object')
  1802. for (var k in opts.requestHeaders)
  1803. ajax.setRequestHeader (k, opts.requestHeaders[k]);
  1804.  
  1805. if (method == 'POST'){
  1806. var a = [];
  1807. for (k in opts.parameters){
  1808. if(matTypeof(opts.parameters[k]) == 'object')
  1809. for(var h in opts.parameters[k])
  1810. a.push (k+'['+h+'] ='+ opts.parameters[k][h] );
  1811. else
  1812. a.push (k +'='+ opts.parameters[k] );
  1813. }
  1814. ajax.send (a.join ('&'));
  1815. } else {
  1816. ajax.send();
  1817. }
  1818. }
  1819.  
  1820. function MyAjaxRequest (url, o, noRetryX){
  1821. if (DEBUG_TRACE) logit (" 0 myAjaxRequest: "+ url +"\n" + inspect (o, 2, 1));
  1822. var opts = unsafeWindow.Object.clone(o);
  1823. var wasSuccess = o.onSuccess;
  1824. var wasFailure = o.onFailure;
  1825. var retry = 0;
  1826. var delay = 10;
  1827. var noRetry = noRetry===true?true:false;
  1828. opts.onSuccess = mySuccess;
  1829. opts.onFailure = myFailure;
  1830.  
  1831. new AjaxRequest(url, opts);
  1832. return;
  1833.  
  1834. function myRetry(){
  1835. ++retry;
  1836. new AjaxRequest(url, opts);
  1837. delay = delay * 2.25;
  1838. }
  1839. function myFailure(){
  1840. var o = {};
  1841. o.ok = false;
  1842. o.errorMsg = "AJAX Communication Failure";
  1843. wasFailure (o);
  1844. }
  1845. function mySuccess (msg){
  1846. var rslt = eval("(" + msg.responseText + ")");
  1847. if (!rslt)
  1848. {
  1849. logit("Message error: " + inspect(msg,3,1));
  1850. return;
  1851. }
  1852. var x;
  1853. if (window.EmulateAjaxError){
  1854. rslt.ok = false;
  1855. rslt.error_code=8;
  1856. }
  1857. if (rslt.ok){
  1858. if (rslt.updateSeed)
  1859. unsafeWindow.update_seed(rslt.updateSeed);
  1860. wasSuccess (rslt);
  1861. return;
  1862. }
  1863. rslt.errorMsg = unsafeWindow.printLocalError((rslt.error_code || null), (rslt.msg || null), (rslt.feedback || null));
  1864. // if ( (x = rslt.errorMsg.indexOf ('<br><br>')) > 0)
  1865. // rslt.errorMsg = rslt.errorMsg.substr (0, x-1);
  1866. if (!noRetry && (rslt.error_code==0 || rslt.error_code==8 || rslt.error_code==1 || rslt.error_code==3)){
  1867. dialogRetry (inspect(rslt.errorMsg), delay, function(){myRetry()}, function(){wasSuccess (rslt)}, rslt.error_code);
  1868. } else {
  1869. wasSuccess (rslt);
  1870. }
  1871. }
  1872. }
  1873.  
  1874. //example: https://www150.kingdomsofcamelot.com
  1875. var myServerId = null;
  1876. function getServerId() {
  1877. if (myServerId == null){
  1878. var m=/^[a-zA-Z]+([0-9]+)\./.exec(document.location.hostname);
  1879. if (m)
  1880. myServerId = m[1];
  1881. else
  1882. myServerId = '??';
  1883. }
  1884. return myServerId;
  1885. }
  1886.  
  1887. function logit (msg){
  1888. var now = new Date();
  1889. GM_log (getServerId() +' @ '+ now.toTimeString().substring (0,8) +'.' + now.getMilliseconds() +': '+ msg);
  1890. }
  1891.  
  1892. function saveUpgradeData (){
  1893. var serverID = getServerId();
  1894. setTimeout (function (){GM_setValue ('UpgradeDataMM2_'+serverID, JSON2.stringify(upgradeData));}, 0);
  1895. }
  1896.  
  1897. function savePresetData (){
  1898. var serverID = getServerId();
  1899. setTimeout (function (){GM_setValue ('PresetDataMM2_'+serverID, JSON2.stringify(presetData));}, 0);
  1900. }
  1901.  
  1902. function saveQueueData (){
  1903. var serverID = getServerId();
  1904. setTimeout (function (){GM_setValue ('QData_'+serverID, JSON2.stringify(queueData));}, 0);
  1905. }
  1906.  
  1907. function saveSalvageData (){
  1908. var serverID = getServerId();
  1909. setTimeout (function (){GM_setValue ('SalvageDataMM2_'+serverID, JSON2.stringify(salvageData));}, 0);
  1910. }
  1911.  
  1912. function saveUpgradeStats (){
  1913. var serverID = getServerId();
  1914. setTimeout (function (){GM_setValue ('UpgradeStats_'+serverID, JSON2.stringify(upgradeStats));}, 0);
  1915. }
  1916.  
  1917. function savePresetPosition (){
  1918. var serverID = getServerId();
  1919. setTimeout (function (){ GM_setValue ('PresetPosition_'+serverID, JSON2.stringify(presetPosition));}, 0);
  1920. }
  1921.  
  1922. function saveGuardPosition (){
  1923. var serverID = getServerId();
  1924. setTimeout (function (){ GM_setValue ('GuardPosition_'+serverID, JSON2.stringify(guardPosition));}, 0);
  1925. }
  1926.  
  1927. function readPresetPosition () {
  1928. var serverID = getServerId();
  1929. s = GM_getValue ('PresetPosition_'+serverID);
  1930. if (s != null){
  1931. presetPosition = JSON2.parse (s);
  1932. }
  1933. }
  1934.  
  1935. function readGuardPosition () {
  1936. var serverID = getServerId();
  1937. s = GM_getValue ('GuardPosition_'+serverID);
  1938. if (s != null){
  1939. guardPosition = JSON2.parse (s);
  1940. }
  1941. }
  1942.  
  1943. function readTRGlobalOptions (){
  1944. TRGlobalOptions = JSON2.parse (GM_getValue ('TROptions_??', '{}'));
  1945. }
  1946.  
  1947. function readUpgradeData (){
  1948. var serverID = getServerId();
  1949. s = GM_getValue ('UpgradeDataMM2_'+serverID);
  1950. if (s != null){
  1951. opts = JSON2.parse (s);
  1952. for (k in opts){
  1953. if (matTypeof(opts[k]) == 'object')
  1954. for (kk in opts[k])
  1955. upgradeData[k][kk] = opts[k][kk];
  1956. else
  1957. upgradeData[k] = opts[k];
  1958. }
  1959. }
  1960. }
  1961.  
  1962. function readPresetData (){
  1963. var serverID = getServerId();
  1964. s = GM_getValue ('PresetDataMM2_'+serverID);
  1965. if (s != null){
  1966. opts = JSON2.parse (s);
  1967. for (k in opts){
  1968. if (matTypeof(opts[k]) == 'object')
  1969. for (kk in opts[k])
  1970. presetData[k][kk] = opts[k][kk];
  1971. else
  1972. presetData[k] = opts[k];
  1973. }
  1974. }
  1975. }
  1976.  
  1977. function readQueueData (){
  1978. var serverID = getServerId();
  1979. s = GM_getValue ('QData_'+serverID);
  1980. if (s != null){
  1981. opts = JSON2.parse (s);
  1982. for (k in opts){
  1983. if (matTypeof(opts[k]) == 'object')
  1984. for (kk in opts[k])
  1985. queueData[k][kk] = opts[k][kk];
  1986. else
  1987. queueData[k] = opts[k];
  1988. }
  1989. }
  1990. }
  1991.  
  1992. function readSalvageData (){
  1993. var serverID = getServerId();
  1994. s = GM_getValue ('SalvageDataMM2_'+serverID);
  1995. if (s != null){
  1996. opts = JSON2.parse (s);
  1997. for (k in opts){
  1998. if (matTypeof(opts[k]) == 'object')
  1999. for (kk in opts[k])
  2000. salvageData[k][kk] = opts[k][kk];
  2001. else
  2002. salvageData[k] = opts[k];
  2003. }
  2004. }
  2005.  
  2006. // recreate the objects w/ functions
  2007. for (k in salvageData.ruleSet)
  2008. {
  2009. var r = salvageData.ruleSet[k];
  2010. var rule = new Rule(r.type, r.faction, r.conditions);
  2011. for (j in rule.conditions)
  2012. {
  2013. rule.conditions[j].checkCondition = checkCondition;
  2014. }
  2015. salvageData.ruleSet[k] = rule;
  2016. }
  2017. }
  2018.  
  2019. function readUpgradeStats (){
  2020. var serverID = getServerId();
  2021. s = GM_getValue ('UpgradeStats_'+serverID);
  2022. if (s != null){
  2023. opts = JSON2.parse (s);
  2024. for (k in opts){
  2025. if (matTypeof(opts[k]) == 'object')
  2026. for (kk in opts[k])
  2027. upgradeStats[k][kk] = opts[k][kk];
  2028. else
  2029. upgradeStats[k] = opts[k];
  2030. }
  2031. }
  2032. }
  2033.  
  2034. function loadSalvageData (domainId){
  2035.  
  2036. s = GM_getValue ('SalvageDataMM2_'+ domainId);
  2037.  
  2038. if (s==null) {
  2039. alert("Unable to find data from domain: " + domainId);
  2040. return;
  2041. }
  2042.  
  2043. if (s != null){
  2044. opts = JSON2.parse (s);
  2045. for (k in opts){
  2046. if (matTypeof(opts[k]) == 'object')
  2047. for (kk in opts[k])
  2048. salvageData[k][kk] = opts[k][kk];
  2049. else
  2050. salvageData[k] = opts[k];
  2051. }
  2052. }
  2053.  
  2054. // recreate the objects w/ functions
  2055. for (k in salvageData.ruleSet)
  2056. {
  2057. var r = salvageData.ruleSet[k];
  2058. var rule = new Rule(r.type, r.faction, r.conditions);
  2059. for (j in rule.conditions)
  2060. {
  2061. rule.conditions[j].checkCondition = checkCondition;
  2062. }
  2063. salvageData.ruleSet[k] = rule;
  2064. }
  2065.  
  2066. // turn off
  2067. salvageData.salvageActive = false;
  2068. clearInterval(Tabs.throneSalvage.sTimer);
  2069. clearInterval(Tabs.throneSalvage.delTimer);
  2070. Tabs.throneSalvage.deleting = false;
  2071. saveSalvageData();
  2072. alert('Salvage settings loaded from domain ' + domainId);
  2073. Tabs.throneSalvage.init(Tabs.throneSalvage.myDiv);
  2074. }
  2075.  
  2076. function inspect(obj, maxLevels, level, doFunctions){
  2077. var str = '', type, msg;
  2078. if(level == null) level = 0;
  2079. if(maxLevels == null) maxLevels = 1;
  2080. if(maxLevels < 1)
  2081. return 'Inspect Error: Levels number must be > 0';
  2082. if(obj == null)
  2083. return 'ERROR: Object is NULL\n';
  2084. var indent = '';
  2085. for (var i=0; i<level; i++)
  2086. indent += ' ';
  2087. for(property in obj) {
  2088. try {
  2089. type = matTypeof(obj[property]);
  2090. if (doFunctions==true && (type == 'function')){
  2091. str += indent + '(' + type + ') ' + property + "[FUNCTION]\n";
  2092. } else if (type != 'function') {
  2093. str += indent + '(' + type + ') ' + property + ( (obj[property]==null)?(': null'):('')) +' = '+ obj[property] +"\n";
  2094. }
  2095. if((type=='object' || type=='array') && (obj[property] != null) && (level+1 < maxLevels))
  2096. str += inspect(obj[property], maxLevels, level+1, doFunctions); // recurse
  2097. }
  2098. catch(err) {
  2099. // Is there some properties in obj we can't access? Print it red.
  2100. if(typeof(err) == 'string') msg = err;
  2101. else if(err.message) msg = err.message;
  2102. else if(err.description) msg = err.description;
  2103. else msg = 'Unknown';
  2104. str += '(Error) ' + property + ': ' + msg +"\n";
  2105. }
  2106. }
  2107. str += "\n";
  2108. return str;
  2109. }
  2110.  
  2111. function matTypeof (v){
  2112. if (typeof (v) == 'object'){
  2113. if (!v)
  2114. return 'null';
  2115. // else if (unsafeWindow.Object.prototype.toString.apply(v) === '[object
  2116. // Array]')
  2117. else if (v.constructor.toString().indexOf("Array")>=0 && typeof(v.splice)=='function')
  2118. return 'array';
  2119. else return 'object';
  2120. }
  2121. return typeof (v);
  2122. }
  2123.  
  2124.  
  2125. function unixTime (){
  2126. return parseInt (new Date().getTime() / 1000) + unsafeWindow.g_timeoff;
  2127. }
  2128.  
  2129. /** ***************** Throne Savlager ********************* */
  2130.  
  2131. Tabs.throneSalvage = {
  2132. tabOrder : 200,
  2133. tabLabel : 'Salvage',
  2134. tabDisabled : false,
  2135. myDiv : null,
  2136. timer : null,
  2137. city : null,
  2138. cityNum : 0,
  2139. delItems : [],
  2140. rowNum : 0,
  2141. sTimer : null,
  2142. delTimer : null,
  2143. upgradeProfit: true,
  2144. //salvageFailList: {},
  2145. //maxFailures: 2,
  2146.  
  2147. init : function (div) {
  2148. var t = Tabs.throneSalvage;
  2149. t.myDiv = div;
  2150.  
  2151. var m = '<Div><DIV id=trSalvage class=trStat>AUTOMATED SALVAGE</div>';
  2152. m += "<div id='trInfoArea'>";
  2153. m += '</div>';
  2154. m += '<TABLE class="trTabDef trTable" id=trupgrader width =100% height=0% class=trTab style="padding-left: 20px;">';
  2155. m += '<tr><th width=20%/><th width=30%/><th width=40%/><th/></tr>';
  2156. if (salvageData.salvageActive == false) {
  2157. m += '<tr><TD><div><INPUT id=trSalvagerPower type=button value="Salvager = OFF"/></div></td>';
  2158. } else {
  2159. m += '<tr><TD><div><INPUT id=trSalvagerPower type=button value="Salvager = ON"/></div></td>';
  2160. }
  2161.  
  2162.  
  2163. m += '<td colspan=3><b> City to put aetherstones: </b><div style="display: inline;" id=trSalvageCity /></td>';
  2164.  
  2165. m += '<tr><td><td/><tdtyle="text-align: center;"></td>';
  2166. m += '</tr></table>';
  2167.  
  2168. m += '<table class="trTabPad trTable"><hr/>';
  2169. m += '<tr><td width=35%><div> Keep all: <select id="trSalvageQuality">';
  2170. m += '<option value="1">Common</option>';
  2171. m += '<option value="2">Uncommon</option>';
  2172. m += '<option value="3">Rare</option>';
  2173. m += '<option value="4">Epic</option>';
  2174. m += '<option value="5">Wondrous</option>';
  2175. m += '</select> and higher</div></td>';
  2176.  
  2177. m += '<td colspan=2 width=24%>Keep the first <INPUT id=trSaveNum type=text size=3 maxlength=3 value="' + salvageData.throneSaveNum+ '"/> items</td>';
  2178. m += "</tr></table><hr/>";
  2179.  
  2180. m += "<div id='trRulesCreate' class='trRuleCreate'>";
  2181.  
  2182. // rules definition
  2183. m += '<TABLE class="trTabDef trTable" width=100% class=trTabPad style="padding-left: 10px;">';
  2184. m += '<tr><td> <b>Define the TR items to keep: </b> </td>';
  2185.  
  2186. m += '<td alight="left"><div><span>Faction: <select id="trFactionType">';
  2187. m += ' <option value="any">Any</option>';
  2188. m += ' <option value="fey">Fey</option>';
  2189. m += ' <option value="briton">Briton</option>';
  2190. m += ' <option value="druid">Druid</option>';
  2191. m += '</select></span></div></td>';
  2192. m += '<td alight="left"><div><span>Card type: <select id="trCardType">';
  2193. m += ' <option value="any">Any</option>';
  2194. m += ' <option value="chair">Chair</option>';
  2195. m += ' <option value="table">Table</option>';
  2196. m += ' <option value="window">Window</option>';
  2197. m += ' <option value="banner">Banner</option>';
  2198. m += ' <option value="advisor">Advisor</option>';
  2199. m += ' <option value="trophy">Trophy</option>';
  2200. m += ' <option value="candelabrum">Candelabrum</option>';
  2201. m += ' <option value="hero">Hero</option>';
  2202. m += ' <option value="statue">Statue</option>';
  2203. m += '</select></span></div></td>';
  2204. m += '<td align="right"><INPUT id=trAddRule type=button value="Create Rule"/></td>';
  2205. m += '</tr></table>';
  2206. m += '<TABLE class="trTabPad trTable" width=100% id="trConditionTable" style="padding-left: 5px;">';
  2207. m += '<tr><td align=left colspan=1><INPUT id=trAddRow type=button value="Add Row"/></td>';
  2208. m += '<td></td><td></td><td></td><td></td><td></td></tr>';
  2209. m += '</table>';
  2210. m += '</div><hr/>';
  2211. m += '<div id="trSalvStatus" style="text-align: center;" >Loading ... </div>';
  2212. m += '<div id="trNumSalv" style="text-align: center;"></div>';
  2213. m += '<hr/>';
  2214. m += '<div class=trRulePane>';
  2215. m += '<div align=center> <b> Salvager will keep items matching any of these rules </b></div>';
  2216. m += '<div id=trRuleScroll style="position: static; width: 710px; height: 300px; overflow-x: hidden; overflow-y: auto;" >';
  2217. m += "<div id='trRuleDisplay' >";
  2218. m += '</div></div></div>';
  2219. t.myDiv.innerHTML = m;
  2220.  
  2221. Tabs.throneSalvage.displayNumberSalvaged();
  2222.  
  2223. document.getElementById('trSalvagerPower').addEventListener('click', function(){t.togglePower(this);} , false);
  2224.  
  2225. new CdispCityPicker ('trcitysel', document.getElementById('trSalvageCity'), true, t.e_CityButton, upgradeData.sCityNum);
  2226. t.createRow();
  2227. t.buildRuleDisplay();
  2228.  
  2229. document.getElementById('trSaveNum').addEventListener('change', function(){
  2230. salvageData.throneSaveNum = parseInt(document.getElementById('trSaveNum').value);
  2231. if (salvageData.throneSaveNum < 0) salvageData.throneSaveNum = 0;
  2232. saveSalvageData();
  2233. }, false);
  2234. document.getElementById ('trSalvageQuality').addEventListener ('click', function() {t.setSalvageLevel(this.value);}, false);
  2235. document.getElementById ('trSalvageQuality').value = salvageData.minQuality;
  2236.  
  2237. document.getElementById ('trAddRow').addEventListener ('click', function() {t.createRow();}, false);
  2238. document.getElementById ('trAddRule').addEventListener ('click', function() {t.createRule();}, false);
  2239.  
  2240. $(document.querySelector("#trRuleScroll")).resizable({
  2241. minWidth: 720,
  2242. maxWidth: 1000,
  2243. minHeight: 180,
  2244. maxHeight: 700,
  2245. stop: function(event, ui) {
  2246. upgradeData.salvageH = ui.size.height + 'px';
  2247. upgradeData.salvageW = ui.size.width + 'px';
  2248. saveUpgradeData();
  2249. }
  2250. });
  2251.  
  2252. $(document.querySelector("#trRuleScroll")).css('height', upgradeData.salvageH).css('width', upgradeData.salvageW);
  2253.  
  2254. if (salvageData.upgradedToDelete.length > 0)
  2255. {
  2256. // some items were left over that need to be deleted
  2257. logit("Found " + salvageData.upgradedToDelete.length + " upgraded items that need to be deleted.");
  2258.  
  2259. for (k=0; k< salvageData.upgradedToDelete.length; k++)
  2260. {
  2261. var id = salvageData.upgradedToDelete[k];
  2262. // if the item is not longer in the inventory, remove the id
  2263. if (!unsafeWindow.kocThroneItems[id] ) {
  2264. logit("Removing item " + id +" from salvage list.");
  2265. salvageData.upgradedToDelete.splice(k,1); // Remove item from array
  2266. saveSalvageData();
  2267. k--;
  2268. }
  2269. }
  2270.  
  2271. // resume deleting things
  2272. if (salvageData.salvageActive)
  2273. {
  2274. t.delItems = salvageData.upgradedToDelete;
  2275. t.deleting = true;
  2276. t.upgradeAndDelete();
  2277. }
  2278. else
  2279. {
  2280. // if the salvager is powered off, clear the list
  2281. salvageData.upgradedToDelete = [];
  2282. saveSalvageData();
  2283. }
  2284. }
  2285.  
  2286. // this check makes sure upgrading before deleting is still profitable
  2287.  
  2288. t.upgradeProfit = (5*CM.WorldSettings.getSettingAsNumber("AETHERSTONE_SALVAGE_MULTIPLIER", 500) > CM.thronestats.upgrade[1]["Stones"]);
  2289. t.start();
  2290. },
  2291.  
  2292. tripOdometer : function() {
  2293. salvageData.numSalvagedItems2 = 0;
  2294. var now = new Date();
  2295. salvageData.since = now.valueOf();
  2296. saveSalvageData();
  2297. Tabs.throneSalvage.init(Tabs.throneSalvage.myDiv);
  2298. },
  2299.  
  2300. displayNumberSalvaged : function () {
  2301. var since = "";
  2302. var rate = "";
  2303. var now = new Date();
  2304.  
  2305. if (!salvageData.since) salvageData.since = now.valueOf();
  2306.  
  2307. var sinceD = new Date(salvageData.since);
  2308.  
  2309. since = sinceD.toDateString().substring(3,10) + " " + sinceD.toLocaleTimeString();
  2310. var duration = now.valueOf() - salvageData.since +1;
  2311. duration = duration / 1000.0;
  2312. rate = " (" + addCommas(Math.round(salvageData.numSalvagedItems2 / duration * 86400)) + " per day)";
  2313.  
  2314. $(document.querySelector("#trNumSalv")).html('<div style="text-align: center;"> '+ addCommas(salvageData.numSalvagedItems) + " items salvaged"
  2315. + ', ' + addCommas(salvageData.numSalvagedItems2) + ' items since ' + since + rate +
  2316. ' <input id="tripOdo" type=button value="Reset" /> </div>');
  2317.  
  2318. $(document.querySelector("#tripOdo")).click( function () {
  2319. Tabs.throneSalvage.tripOdometer();
  2320. });
  2321. },
  2322.  
  2323. createRow : function()
  2324. {
  2325. var t = Tabs.throneSalvage;
  2326. var table = document.getElementById('trConditionTable');
  2327. var rowCount = table.rows.length;
  2328. var row = table.insertRow(rowCount-1);
  2329. var rowId = "r" + t.rowNum;
  2330. t.rowNum++;
  2331. row.id = rowId;
  2332.  
  2333. var h = "<td> <select id='" + rowId + "sel1'> <option value='true'> </option> <option value='false'>NOT</option></select></td>";
  2334. h += "<td> <select id='" + rowId + "sel2'>";
  2335. h += " <option value='1'>1x</option>";
  2336. h += " <option value='2'>2x</option>";
  2337. h += " <option value='3'>3x</option>";
  2338. h += " <option value='4'>4x</option>";
  2339. h += " <option value='5'>5x</option>";
  2340. h += "</select></td>";
  2341. h += "<td> <select id='" + rowId + "sel3'>";
  2342. h += "</select></td>";
  2343. h += "<td> <select id='" + rowId + "sel4'>";
  2344. h += " <option value='e'>Either</option>";
  2345. h += " <option value='b'>Buff</option>";
  2346. h += " <option value='d'>Debuff</option>";
  2347. h += "</select></td>";
  2348.  
  2349. h += "<td> Slots: ";
  2350. h += " <input type=checkbox value='1' checked=true id='" + rowId + "slot1'/>1";
  2351. h += " <input type=checkbox value='2' checked=true id='" + rowId + "slot2'/>2";
  2352. h += " <input type=checkbox value='3' checked=true id='" + rowId + "slot3'/>3";
  2353. h += " <input type=checkbox value='4' checked=true id='" + rowId + "slot4'/>4";
  2354. h += " <input type=checkbox value='5' checked=true id='" + rowId + "slot5'/>5";
  2355. h += "</td>";
  2356.  
  2357. row.innerHTML = h;
  2358.  
  2359. var effects = [];
  2360.  
  2361. for (e in CM.thronestats.effects)
  2362. {
  2363. var effectName = CM.thronestats.effects[e][1].split(" Debuff")[0];
  2364. if (effects.indexOf(effectName) < 0) effects.push(effectName);
  2365. }
  2366.  
  2367. var select = document.getElementById(rowId + "sel3");
  2368. for(index in effects) {
  2369. select.options.add(new Option(effects[index], effects[index]));
  2370. }
  2371.  
  2372. // add in options for troops specific effects
  2373. select.options.add(new Option("Any Infantry","Infantry"));
  2374. select.options.add(new Option("Any Ranged","Ranged"));
  2375. select.options.add(new Option("Any Horsed","Horsed"));
  2376. select.options.add(new Option("Any Siege","Siege"));
  2377.  
  2378. var c = row.insertCell(5);
  2379. var btn = $("<input type=button value='X'/>");
  2380. $(btn).click( function () { t.removeRow(row);});
  2381. $(c).append( btn );
  2382.  
  2383. t.setFullness();
  2384. },
  2385.  
  2386. setSalvageLevel : function(level)
  2387. {
  2388. salvageData.minQuality = level;
  2389. saveSalvageData();
  2390. },
  2391.  
  2392. pickCity : function () {
  2393. var t = Tabs.throneSalvage;
  2394. var cid = upgradeData.sCityNum;
  2395. if ( parseInt(Seed.resources["city" + Seed.cities[cid][0]]["rec5"][0]) <= salvageData.maxStones) return cid;
  2396.  
  2397. var ind = -1;
  2398. var lowest = 9999999;
  2399.  
  2400. if (salvageData.anyCity)
  2401. {
  2402. for (i= 0; i < Seed.cities.length; i++)
  2403. {
  2404. if (salvageData.overflow == "lowest")
  2405. {
  2406. // put in the city w/ the lowest number of a-stone
  2407. if ( parseInt(Seed.resources["city" + Seed.cities[i][0]]["rec5"][0]) < lowest )
  2408. {
  2409. ind = i;
  2410. lowest = +Seed.resources["city" + Seed.cities[ind][0]]["rec5"][0];
  2411. }
  2412. }
  2413. else
  2414. {
  2415. // put in the first city with low stones
  2416. if ( parseInt(Seed.resources["city" + Seed.cities[i][0]]["rec5"][0]) <= salvageData.maxStones) {
  2417. return i;
  2418. }
  2419. }
  2420. }
  2421. }
  2422. return ind;
  2423. },
  2424.  
  2425. createRule : function()
  2426. {
  2427. var t = Tabs.throneSalvage;
  2428. t.readRows();
  2429. t.buildRuleDisplay();
  2430. },
  2431.  
  2432. buildRuleDisplay : function ()
  2433. {
  2434. var t = Tabs.throneSalvage;
  2435. var rd = document.getElementById('trRuleDisplay');
  2436.  
  2437. var m = '<TABLE width=100% class="trTabPad trTable">';
  2438.  
  2439. for (i =0; i < salvageData.ruleSet.length; i++)
  2440. {
  2441. var rule = salvageData.ruleSet[i];
  2442.  
  2443. m += '<tr>';
  2444. m += "<td width=90%><div class='trRule'>";
  2445.  
  2446. m += " Type: " + rule.type;
  2447. m += " Faction: " + rule.faction;
  2448.  
  2449. for (ii = 0; ii < rule.conditions.length; ii++)
  2450. {
  2451. var condition = rule.conditions[ii];
  2452.  
  2453. if (ii ==0 )
  2454. m += "<br> Item";
  2455. else
  2456. m += "<br> <u>and</u>";
  2457.  
  2458. if (condition.mustHave != "false")
  2459. m += " must have ";
  2460. else
  2461. m += " must NOT have ";
  2462.  
  2463. m += condition.number + "x ";
  2464. m += condition.effect + " ";
  2465.  
  2466. if (condition.buffType == "b")
  2467. m += "buff ";
  2468. else if (condition.buffType == "d")
  2469. m += "debuff ";
  2470. else
  2471. m += "buff or debuff ";
  2472.  
  2473. m += " in slot(s): ";
  2474.  
  2475. for (j = 0; j < condition.slots.length; j++)
  2476. {
  2477. if (condition.slots[j] ) m += (j+1) + " ";
  2478. }
  2479.  
  2480. }
  2481. m += "</div></td>";
  2482. m += "<td width=20%><INPUT id=trDelRule" + i + " type=button value='Delete Rule' /></td>";
  2483. m += '</tr>';
  2484. }
  2485.  
  2486. rd.innerHTML = m;
  2487.  
  2488. for (var j=0; j < salvageData.ruleSet.length; j++)
  2489. {
  2490. document.getElementById('trDelRule' +j).v1 = j;
  2491. document.getElementById('trDelRule' +j).addEventListener ('click', function() { t.deleteRule(this.v1);}, false);
  2492. }
  2493.  
  2494. },
  2495.  
  2496. updateTRTab : function() {
  2497. $(document.querySelector("#trexecsalvage")).html("Salvage " + (salvageData.salvageActive ? "ON" : "OFF"));
  2498. },
  2499.  
  2500.  
  2501. togglePower: function(obj){
  2502. var t = Tabs.throneSalvage;
  2503. if (salvageData.salvageActive == true) {
  2504. var btn = document.getElementById('trSalvagerPower');
  2505. salvageData.salvageActive = false;
  2506. btn.value = "Salvager = OFF";
  2507. clearInterval(t.sTimer);
  2508. clearInterval(t.delTimer);
  2509. t.delItems = [];
  2510. salvageData.upgradedToDelete = [];
  2511. t.deleting = false;
  2512. } else {
  2513. salvageData.salvageActive = true;
  2514. var btn = document.getElementById('trSalvagerPower');
  2515. btn.value = "Salvager = ON";
  2516. t.doSalvage();
  2517. t.start();
  2518. }
  2519. saveSalvageData();
  2520. t.updateTRTab();
  2521. },
  2522.  
  2523. // delete a rule from the ruleset
  2524. deleteRule : function(i)
  2525. {
  2526. var t = Tabs.throneSalvage;
  2527. salvageData.ruleSet.splice(i,1);
  2528. saveSalvageData();
  2529. t.buildRuleDisplay();
  2530. },
  2531.  
  2532. readRows : function()
  2533. {
  2534. var t = Tabs.throneSalvage;
  2535. var table = document.getElementById('trConditionTable');
  2536. var rowCount = table.rows.length;
  2537.  
  2538. var cType = document.getElementById('trCardType').value;
  2539. var faction = document.getElementById('trFactionType').value;
  2540.  
  2541. var conditions = [];
  2542. for (i=0; i < table.rows.length; i++)
  2543. {
  2544. var row = table.rows[i];
  2545. if (row.id)
  2546. {
  2547. var s1 = document.getElementById(row.id + "sel1");
  2548. var s2 = document.getElementById(row.id + "sel2");
  2549. var s3 = document.getElementById(row.id + "sel3");
  2550. var s4 = document.getElementById(row.id + "sel4");
  2551.  
  2552. var slots = [];
  2553. for (j =1; j <= 5; j++)
  2554. {
  2555. var ch = document.getElementById(row.id + "slot" + j);
  2556. slots.push(ch.checked);
  2557. }
  2558.  
  2559. var c = new Condition(s1.value, s2.value, s3.value, s4.value, slots );
  2560. conditions.push(c);
  2561. }
  2562. }
  2563. var rule1 = new Rule(cType, faction, conditions);
  2564. t.addRule(rule1);
  2565. },
  2566.  
  2567. removeRow : function(row)
  2568. {
  2569. var table = document.getElementById('trConditionTable');
  2570.  
  2571. for (i=0; i < table.rows.length ; i++ )
  2572. {
  2573. if (table.rows[i] == row)
  2574. {
  2575. table.deleteRow(i);
  2576. break;
  2577. }
  2578. }
  2579. },
  2580.  
  2581. // add a new rule
  2582. addRule : function(rule)
  2583. {
  2584. salvageData.ruleSet.push(rule);
  2585. saveSalvageData();
  2586. },
  2587.  
  2588. // callback for when salvage city is changed
  2589. e_CityButton : function (city, x, y){
  2590. var t = Tabs.throneSalvage;
  2591. upgradeData.sCityNum = city.idx;
  2592. saveUpgradeData();
  2593. },
  2594.  
  2595. start : function(){
  2596. var t = Tabs.throneSalvage;
  2597. if(salvageData.salvageActive) {
  2598. t.sTimer = setInterval(t.doSalvage, 1*60*1000);
  2599. }
  2600. },
  2601.  
  2602. // do the actual discard of TR items
  2603. doSalvage : function() {
  2604. var t = Tabs.throneSalvage;
  2605.  
  2606. t.setFullness();
  2607.  
  2608. if(!salvageData.salvageActive) {
  2609. t.deleting = false;
  2610. return;
  2611. }
  2612.  
  2613. if (t.deleting == true) {
  2614. logit("Deleting not complete");
  2615. return;
  2616. }
  2617.  
  2618. t.deleting = true;
  2619. t.setStatus('Salvaging items');
  2620.  
  2621. t.delItems = t.buildList(false);
  2622.  
  2623. // go through the list and remove items that have failed too many times
  2624.  
  2625. //logit("Del List 1: " + inspect(t.delItems,3,1));
  2626.  
  2627. // future
  2628. //for (ii =0; ii < t.delItems.length; ii++) {
  2629. //var id = t.delItems[ii];
  2630. //if ( t.salvageFailList[id] && t.salvageFailList[id] >= t.maxFailures)
  2631. // {
  2632. // logit("Maximum failures reached for item: " + id);
  2633. // t.delItems.splice(ii,1); // Remove item from array
  2634. // ii--; // back up the index
  2635. // }
  2636. //}
  2637. //logit("Del List 2: " + inspect(t.delItems,3,1));
  2638.  
  2639.  
  2640. if (t.delItems.length > 0) {
  2641. // upgrade items from +0 to +1 first
  2642. t.upgradeAndDelete();
  2643. } else {
  2644. // give enough time for the last delete to finish
  2645. setTimeout( function () {
  2646. t.deleting = false;
  2647. t.setStatus('No items to salvage. Waiting for next cycle.');
  2648. }, 3000);
  2649. }
  2650. t.setFullness();
  2651. },
  2652.  
  2653. setFullness : function () {
  2654. // change the color on the throne button when full
  2655.  
  2656. var num_items = unsafeWindow.Object.keys(unsafeWindow.kocThroneItems).length;
  2657. if (num_items > 110)
  2658. $("a.buttonv2.throne").css('color', 'red');
  2659. else
  2660. $("a.buttonv2.throne").css('color', 'black');
  2661. },
  2662.  
  2663. // Create the list of items to delete.
  2664. // If 'test' is set to true, then broken/equipted items are included.
  2665. buildList : function(test){
  2666. var t = Tabs.throneSalvage;
  2667.  
  2668. var throneSaveNum = salvageData.throneSaveNum;
  2669. var countItem = 0;
  2670. var retList = [];
  2671.  
  2672. for (k in unsafeWindow.kocThroneItems) {
  2673. var throne_item = unsafeWindow.kocThroneItems[k];
  2674. countItem++;
  2675.  
  2676. // ignore these things
  2677. if (throne_item.level !=0) continue;
  2678.  
  2679. // in test mode, include these items
  2680. // These items are at risk if they are repaired or unequiped.
  2681. if (test != true)
  2682. {
  2683. if (throne_item.isEquipped) continue;
  2684. if (throne_item.isBroken) continue;
  2685. }
  2686.  
  2687. // keep the first X items
  2688. if ( countItem <= throneSaveNum) continue;
  2689.  
  2690. // keep things w/ at least minQuality
  2691. if (throne_item.quality >= salvageData.minQuality) continue;
  2692.  
  2693. // check the rules
  2694. if (t.applyRules(throne_item.id)) continue;
  2695.  
  2696. // passes all tests
  2697. retList.push(throne_item.id);
  2698. }
  2699. return retList;
  2700. },
  2701.  
  2702. // put out a status message on the trSavlStatus div
  2703. setStatus : function(msg)
  2704. {
  2705. document.getElementById('trSalvStatus').innerHTML = msg;
  2706. },
  2707.  
  2708. // returns true if the item should be saved and not salvaged
  2709. applyRules : function(id) {
  2710. var t = Tabs.throneSalvage;
  2711. for (r in salvageData.ruleSet)
  2712. {
  2713. var rule = salvageData.ruleSet[r];
  2714. if ( rule.applyRule(id)) return true;
  2715. }
  2716. return false;
  2717. },
  2718.  
  2719. // update items to +1 before deleting
  2720. upgradeAndDelete : function () {
  2721. //logit("upgradeAndDelete");
  2722. var t = Tabs.throneSalvage;
  2723.  
  2724. if(!salvageData.salvageActive || t.delItems.length == 0) {
  2725. t.deleting = false;
  2726. return;
  2727. }
  2728.  
  2729. var id = +t.delItems[0];
  2730.  
  2731. // since simple +0 can be upgrade w/ near 100% success for 1500 a-stone and then salvaged for 2150
  2732. // upgrade all these items 1 level
  2733. if (salvageData.upgradeFirst && t.upgradeProfit)
  2734. {
  2735.  
  2736. var item = unsafeWindow.kocThroneItems[id];
  2737. if (item) {
  2738. if ( item.quality <= salvageData.upgradeFirstQual && item.level==0
  2739. && ( salvageData.upgradedToDelete.indexOf(id) < 0 ) )
  2740. {
  2741. salvageData.upgradedToDelete.push(id);
  2742. saveSalvageData();
  2743. Tabs.upgrader.doUpgrade(+id,true);
  2744. }
  2745. }
  2746. else
  2747. {
  2748. logit("item not found.");
  2749. }
  2750. }
  2751. // delete the item
  2752. t.delTimer = setTimeout( function () {t.doDelete(id)}, 4000);
  2753. },
  2754.  
  2755. removeItem : function (id, cityId, numStones) {
  2756.  
  2757. var item = unsafeWindow.kocThroneItems[id];
  2758. if (!item) return;
  2759.  
  2760. var c = +(Seed.resources["city" + cityId]["rec5"][0]);
  2761. var b = Seed.throne.slotEquip;
  2762.  
  2763. Seed.resources["city" + cityId]["rec5"][0] = c + numStones;
  2764. jQuery.each(b, function (g, h) {
  2765. a = jQuery.inArray(id, h);
  2766. if (a > -1) {
  2767. h.splice(a, 1)
  2768. }
  2769. });
  2770.  
  2771. delete unsafeWindow.kocThroneItems[id];
  2772. CM.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
  2773. },
  2774.  
  2775. doDelete : function(id) {
  2776.  
  2777. var t = Tabs.throneSalvage;
  2778. if(!salvageData.salvageActive || !t.deleting) {
  2779. t.deleting = false;
  2780. return;
  2781. }
  2782.  
  2783. //logit("deleting item: " + id);
  2784. var item = unsafeWindow.kocThroneItems[id];
  2785. if (item) t.setStatus('Salvaging ' + item.name);
  2786.  
  2787. var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams);
  2788. var num_city = t.pickCity();
  2789. if ( num_city < 0)
  2790. {
  2791. num_city = +upgradeData.sCityNum;
  2792. logit(" cities full");
  2793. t.setStatus("All cities are (nearly) full of aetherstone");
  2794. }
  2795.  
  2796. params.ctrl = 'throneRoom\\ThroneRoomServiceAjax';
  2797. params.action = 'salvage';
  2798. params.itemId = id;
  2799. params.cityId = Seed.cities[num_city][0];
  2800.  
  2801. new AjaxRequest(unsafeWindow.g_ajaxpath + "ajax/_dispatch53.php" + unsafeWindow.g_ajaxsuffix, {
  2802. method: "post",
  2803. parameters: params,
  2804. loading: true,
  2805. onSuccess: function (transport) {
  2806. try {
  2807. var rslt = eval("(" + transport.responseText + ")");
  2808. //logit("Salvage: " + inspect(rslt,3,1));
  2809. var throne_item = unsafeWindow.kocThroneItems[id];
  2810. if(rslt.ok) {
  2811. if (throne_item) trSalvageLog('Deleted Throne room item '+ throne_item.name);
  2812. salvageData.numSalvagedItems++;
  2813. salvageData.numSalvagedItems2++;
  2814. saveSalvageData();
  2815.  
  2816.  
  2817. if (throne_item) {
  2818. salvageData.numSalvaged[throne_item.quality]++;
  2819. saveSalvageData();
  2820. Tabs.throneSalvage.removeItem(id , Seed.cities[num_city][0], rslt.aetherstones);
  2821. }
  2822.  
  2823. Tabs.throneSalvage.displayNumberSalvaged();
  2824.  
  2825. var sidx = salvageData.upgradedToDelete.indexOf(id);
  2826. if (sidx >=0)
  2827. {
  2828. salvageData.upgradedToDelete.splice(sidx,1); // Remove item from array
  2829. saveSalvageData();
  2830. }
  2831. }
  2832. else
  2833. {
  2834. logit("rslt: " + inspect(rslt,3,1));
  2835. if (throne_item) Tabs.throneSalvage.setStatus('Unable to salvage item ' + throne_item.name);
  2836.  
  2837. // store off the object id and record the number of failures. If it fails too many times, skip it next time.
  2838. //if ( !t.salvageFailList[id] )
  2839. // t.salvageFailList[id] = 1;
  2840. //else
  2841. // t.salvageFailList[id]++;
  2842.  
  2843. //logit("Salvage failed. Current number of failures of item " + id +" is " + t.salvageFailList[id]);
  2844.  
  2845. unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
  2846. }
  2847.  
  2848. var idx = t.delItems.indexOf(id);
  2849. if (idx >=0)
  2850. {
  2851. t.delItems.splice(idx,1);
  2852. // Remove item from array regardless
  2853. // of success. Catch on next refresh
  2854. }
  2855. if (t.delItems.length > 0) { // Check if the array is empty
  2856. t.upgradeAndDelete();
  2857. } else {
  2858. //logit("deletes done");
  2859. t.deleting = false;
  2860. t.setStatus('Salvaging complete. Waiting for next cycle.');
  2861. return;
  2862. }
  2863. } catch (e) {
  2864. logit("Delete exception: " + inspect(e,3,1));
  2865. t.deleting = false;
  2866. }
  2867. },
  2868. onFailure: function () {
  2869. logit("failure case");
  2870. t.delIems = [];
  2871. t.deleting = false;
  2872. if (unsafeWindow.kocThroneItems[id] )
  2873. logit("salvage failed for item " + unsafeWindow.kocThroneItems[id].name );
  2874. unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
  2875. return;
  2876. }
  2877. });
  2878.  
  2879. },
  2880.  
  2881. show: function(){
  2882. },
  2883.  
  2884. hide: function(){
  2885. }
  2886. }
  2887.  
  2888. //class definition for upgrade queue items
  2889. function QueueItem()
  2890. {
  2891. this.item = 0;
  2892. this.action = "upgrade";
  2893. this.level = 1;
  2894. this.status = "not started";
  2895. this.triesTotal = 0;
  2896. this.triesThis = 0;
  2897. this.triesLast = 0;
  2898. this.lastUpgrade = "none";
  2899. this.upgrades = [];
  2900. }
  2901.  
  2902.  
  2903. //class definition for rules and conditions
  2904. function Rule(type, faction, conditions)
  2905. {
  2906. this.type = type;
  2907. this.faction = faction;
  2908. if (conditions)
  2909. this.conditions = conditions;
  2910. else
  2911. this.conditions = [];
  2912.  
  2913. this.addCondition = addCondition;
  2914. this.applyRule = applyRule;
  2915. }
  2916.  
  2917. function cloneRule( rule)
  2918. {
  2919. this.type = rule.type;
  2920. this.faction = rule.faction;
  2921. this.conditions = [];
  2922. if (rule.conditions) this.conditions = rule.conditions;
  2923.  
  2924. this.addCondition = addCondition;
  2925. this.applyRule = applyRule;
  2926. }
  2927.  
  2928. function addCondition(c)
  2929. {
  2930. this.conditions.push(c);
  2931. }
  2932.  
  2933. function applyRule(id)
  2934. {
  2935. var throne_item = unsafeWindow.kocThroneItems[id];
  2936.  
  2937. if (this.type != "any" && (this.type != throne_item.type)) return false;
  2938. if (this.faction != "any" && (this.faction != throne_item.faction)) return false;
  2939. for (r in this.conditions)
  2940. {
  2941. if (!this.conditions[r].checkCondition(id)) return false;
  2942. }
  2943. return true;
  2944. }
  2945.  
  2946. function Condition(mustHave, number, effect, buffType, slots )
  2947. {
  2948. this.mustHave = mustHave;
  2949. this.number = number;
  2950. this.effect = effect;
  2951. this.buffType = buffType;
  2952. this.slots = slots;
  2953.  
  2954. this.checkCondition = checkCondition;
  2955. }
  2956.  
  2957. function checkCondition(id)
  2958. {
  2959. var numberFound = 0;
  2960. var effectsFound = false;
  2961. // get card
  2962. var throne_item = unsafeWindow.kocThroneItems[id];
  2963.  
  2964. if (!throne_item) return false;
  2965.  
  2966. // for loop for stat
  2967. // count up occurances
  2968. for (i in throne_item.effects)
  2969. {
  2970. var card_effect = CM.thronestats.effects[throne_item.effects[i].id][1];
  2971. var slotid = i.split("slot")[1];
  2972.  
  2973. if (!this.slots[slotid-1])
  2974. {
  2975. continue;
  2976. }
  2977.  
  2978. var eff = this.effect + " ";
  2979.  
  2980. if (card_effect.indexOf(" Debuff") < 0) card_effect += " ";
  2981.  
  2982. if (!card_effect.startsWith(eff)) continue;
  2983.  
  2984. // special rule for Chance to Find Items
  2985. if ( (card_effect == "Chance to Find Items ") && (card_effect != eff ) ) continue;
  2986.  
  2987. // If we do not care about buff/debuff then we are done
  2988. if (this.buffType == "e") {
  2989. numberFound++;
  2990. } else {
  2991. // Does the description end with a Debuff
  2992. if (card_effect.endsWith(" Debuff")) {
  2993. // Are we looking for a debuff
  2994. if (this.buffType == "d")
  2995. {
  2996. numberFound++;
  2997. }
  2998. } else {
  2999. if (this.buffType == "b")
  3000. {
  3001. numberFound++;
  3002. }
  3003. }
  3004. }
  3005. }
  3006.  
  3007. if ( numberFound >= this.number)
  3008. {
  3009. effectsFound = true;
  3010. }
  3011.  
  3012. if (this.mustHave != "false")
  3013. return effectsFound;
  3014. else
  3015. return (!effectsFound);
  3016. }
  3017.  
  3018.  
  3019.  
  3020. /** **************** Throne organizer ********************* */
  3021.  
  3022. Tabs.organizer = {
  3023. tabOrder: 300,
  3024. tabLabel: 'Organize',
  3025. tabDisabled : false,
  3026. myDiv : null,
  3027. itemLists : [],
  3028. itemTypes : { chair: 0, table: 1, window: 2, banner: 3, advisor: 4, trophy: 5, candelabrum: 6, hero: 7, statue: 8},
  3029. selectedItems : [],
  3030. panelId: -1,
  3031. panelType: "upgrade",
  3032. panelNextLevel : 2,
  3033. sortEffect: "none",
  3034. sortType: "both",
  3035. factions: ['briton', 'fey', 'druid'],
  3036. switchingPresets : false,
  3037.  
  3038. init : function (div){
  3039. var t = Tabs.organizer;
  3040. // setup the lists for tables, chairs, etc.
  3041. t.fillLists();
  3042. t.myDiv = div;
  3043.  
  3044. // setup the tab
  3045. var m = '<Div><DIV id=trOrganizer class=trStat>ORGANIZER</div>';
  3046. var effects = [];
  3047. for (e in CM.thronestats.effects)
  3048. {
  3049. var effectName = CM.thronestats.effects[e][1].split(" Debuff")[0];
  3050. if (effects.indexOf(effectName) < 0) effects.push(effectName);
  3051. }
  3052.  
  3053. // header stuff
  3054. // preset selector
  3055. m += '<TABLE width=100% class="trTabPad2 trTable">';
  3056. m += '<tr width=100% align=center><td width=15%/><td width=30%/><td/></tr>';
  3057. m += '<tr><td><div><span>View preset: </td><td><select id="PresetList">';
  3058. m += '<option value="0">--Presets--</option>';
  3059.  
  3060. for (k= 1; k <= Seed.throne.slotNum; k++)
  3061. {
  3062. m += '<option value="'+k+'"> Preset: '+ k +'</option>';
  3063. }
  3064. for (k= 0; k < presetData.num_presets; k++)
  3065. {
  3066. if (presetData.ids[k])
  3067. m += '<option value="local'+k+'"> Local: '+ presetData.ids[k] +'</option>';
  3068. else
  3069. m += '<option value="local'+k+'"> Local: '+ String.fromCharCode(65 + k) +'</option>';
  3070. }
  3071.  
  3072. m += '</select></span></div></td>';
  3073. m += '<TD width=20%><INPUT id=testSalvage type=button value=" Test Salvage "/></td><td id=trDelResults></td>';
  3074. m += '</tr>';
  3075.  
  3076. m+= '<tr width=100% ><td colspan=1><span style="width: 130px; float: left; margin-top: 4px; margin-right: 4px;"> Switch to preset: </span>';
  3077. m+= '</td><td colspan=3 width=450px>';
  3078. for (a=1; a <= Seed.throne.slotNum; a++)
  3079. {
  3080. m += '<a style="font-family: serif; width: 25px;" class="button20 loadGPreset" id=trPresetNum'+ a + ' > <span> ' + a + ' </span></a>';
  3081. }
  3082. m += '</td></tr>';
  3083.  
  3084. if (presetData.num_presets > 0) {
  3085. m += '<div id="preset_tt"> <b>: </b> </div></a>';
  3086. m+= '<tr width=100%><td colspan=1><span style="width: 130px; float: left; margin-top: 4px; margin-right: 4px;"> Local preset: </span>';
  3087. m+= '</td><td colspan=3>';
  3088.  
  3089. m += '<select id="trLocalPresetList" style="float: left;">';
  3090.  
  3091. m += '<option value="-1">--Preset--</option>';
  3092. for (a=0; a< presetData.num_presets; a++)
  3093. {
  3094. m += '<option value="' + a + '">'+ presetData.ids[a] + '</option>';
  3095. }
  3096. m += '</select>';
  3097. m += '<a style=" font-family: serif; margin-left: 10px;" class="button20" id=trLoad><span>Load</span></a>';
  3098. m += '<a style=" font-family: serif; margin-left: 5px;" class="buttonDown20" id=trSave><span>Save</span></a>';
  3099. m += '<span style="float: left; margin-top: 4px; margin-right: 4px; margin-left: 10px;">';
  3100. if (presetData.num_presets > 0)
  3101. {
  3102. m += "Switch to slot <INPUT id=trPresetNumber type=text size=2 maxlength=2 value='" + parseInt(presetData.usePreset) + "' </input> when loading";
  3103. }
  3104. m += "</span></td></tr>" ;
  3105. }
  3106.  
  3107. m += '<tr align=center><td colspan=4><div id=trSwitchStatus></div></td></tr>';
  3108.  
  3109. m += '<tr><td colspan=4><hr/></td></tr>';
  3110. m +='<tr id=factionFilterRow><td colspan=4 align=center> Factions: ';
  3111. for (f in t.factions) {
  3112. var faction = t.factions[f];
  3113. m += '<INPUT id=trFaction'+faction + ' type=checkbox CHECKED >' + faction.capitalize() + '</input> ';
  3114. }
  3115.  
  3116. m +='</td></tr>';
  3117. m +='<tr id=levelFilterRow><td colspan=4 align=center> Levels: ';
  3118.  
  3119. for (level = 0; level <= maxTrLevel; level++)
  3120. {
  3121. m += '<INPUT id=trLevel'+level + ' type=checkbox CHECKED >' + level + '</input> ';
  3122. }
  3123.  
  3124. m += '</td></tr>';
  3125. m += '<tr align=center><td colspan=2><div><span>Sort: <select id="trSortList">';
  3126.  
  3127. m += '<option value="none">--Effect--</option>';
  3128. for (k in effects)
  3129. {
  3130. m += '<option value="' + effects[k] + '">'+ effects[k] +'</option>';
  3131. }
  3132. m += '</select></span></div></td>';
  3133.  
  3134. m += "<td> <select id='trSortType'>";
  3135. m += " <option value='both'>Either</option>";
  3136. m += " <option value='buff'>Buff</option>";
  3137. m += " <option value='debuff'>Debuff</option>";
  3138. m += "</select></td>";
  3139.  
  3140. m += '<td><INPUT id=trSortInactive type=checkbox '+ ( upgradeData.sortInactive ?' CHECKED':'') +'/> Include Inactive</td></tr>';
  3141.  
  3142.  
  3143. m += '<tr><td colspan=4><hr/></td></tr>';
  3144. m +='</table>';
  3145.  
  3146. m += "<div id='trScrollDiv' style='position: static; width: " + upgradeData.organizeW + "; height: " + upgradeData.organizeH + "; overflow-x: auto; overflow-y: auto;'>";
  3147.  
  3148. var ii = Math.max(t.itemLists['chair'].length, t.itemLists['table'].length, t.itemLists['window'].length, t.itemLists['banner'].length, t.itemLists['advisor'].length, t.itemLists['trophy'].length, t.itemLists['candelabrum'].length, t.itemLists['hero'].length, t.itemLists['statue'].length );
  3149.  
  3150. m += "<div id='trTableDiv' style='width: 100%;'>";
  3151. m += '<TABLE id=trDisplayTable width=100% height=0% class=trTab>';
  3152. m += "<tr align=center valign=top><th width=10%>Chairs</th><th width=10%>Tables</th><th width=10%>Windows</th><th width=10%>Banners</th><th width=10%>Advisors</th><th width=10%>Throphies</th><th width=10%>Candelabra</th><th width=10%>Heroes</th><th width=10%>Statues</th></tr>";
  3153. m += '</table></div>';
  3154. m += '</div>';
  3155. m += '</div>';
  3156.  
  3157. t.myDiv.innerHTML = m;
  3158. t.paintTable();
  3159.  
  3160. $(document.querySelector("#trScrollDiv")).resizable({
  3161. minWidth: 710,
  3162. maxWidth: 900,
  3163. minHeight: 180,
  3164. /*maxHeight: 560,*/
  3165. maxHeight: 1000,
  3166. stop: function(event, ui) {
  3167. upgradeData.organizeH = ui.size.height + 'px';
  3168. upgradeData.organizeW = ui.size.width + 'px';
  3169. saveUpgradeData();
  3170. }
  3171. });
  3172.  
  3173. $("#PresetList").click( function() {t.selectPreset( $(this).val());});
  3174. $("#testSalvage").click(function() {t.testSalvage();});
  3175.  
  3176. // default to highlight the active preset
  3177. document.getElementById ('PresetList').value = Seed.throne.activeSlot;
  3178. t.selectPreset(Seed.throne.activeSlot);
  3179. $("a.loadGPreset").css('border-color', 'transparent');
  3180. $(document.querySelector("#trPresetNum" + Seed.throne.activeSlot)).css('border-color', 'green')
  3181.  
  3182. $(document.querySelector("#trSortList")).change( function () {
  3183. t.sortEffect = $(this).val();
  3184. t.show();
  3185. });
  3186.  
  3187. $(document.querySelector("#trLocalPresetList")).children("option").hover(
  3188. function (e) {
  3189. var target = $(e.target);
  3190. var id = target.val();
  3191. if (id >= 0 ) {
  3192. $("#preset_tt").html('<b>' + presetData.ids[id] +':</b> ' + presetData.desc[id]);
  3193. $("#preset_tt").addClass('showit');
  3194. }
  3195. },
  3196. function () {
  3197. $(document.querySelector("#preset_tt")).removeClass('showit');
  3198. }
  3199.  
  3200. );
  3201.  
  3202. $("#trSortType").change( function() {
  3203. t.sortType = $(this).val();
  3204. t.show();
  3205. });
  3206.  
  3207. $("#trSortInactive").change( function() {
  3208. t.show();
  3209. });
  3210.  
  3211. $("#trPresetNumber").change( function() {
  3212. presetData.usePreset = $('#trPresetNumber').val();
  3213. savePresetData();
  3214. });
  3215.  
  3216. $(".loadGPreset").click( function () {
  3217. var id= $(this).attr('id');
  3218. processPresetClick(+id.split("trPresetNum")[1]);
  3219. });
  3220.  
  3221. $(".loadPreset").click( function () {
  3222. var id= $(this).attr('id');
  3223. Tabs.organizer.loadLocalPreset(+id.split("trLoad")[1]);
  3224. });
  3225.  
  3226. $("#trLoad").click( function () {
  3227. var preset = $('#trLocalPresetList').val();
  3228. if ( preset >= 0) Tabs.organizer.loadLocalPreset(preset);
  3229. });
  3230.  
  3231. $("#trSave").click( function () {
  3232. var preset = $('#trLocalPresetList').val();
  3233. if ( preset >= 0) Tabs.organizer.saveLocalPreset(preset);
  3234. });
  3235.  
  3236. $("#factionFilterRow input").change( function() {
  3237. t.show();
  3238. });
  3239.  
  3240. $("#levelFilterRow input").change( function() {
  3241. t.show();
  3242. });
  3243.  
  3244. $("#trSortList").val(upgradeData.sortSelected);
  3245. $("#trSortType").val(upgradeData.buffSelected);
  3246. t.sortEffect = upgradeData.sortSelected;
  3247. t.sortType = upgradeData.buffSelected;
  3248.  
  3249. t.show();
  3250.  
  3251. },
  3252.  
  3253. setSwitchStatus : function(s) {
  3254. $("#trSwitchStatus").html(s);
  3255. },
  3256.  
  3257. loadLocalPreset : function (id) {
  3258. var t = Tabs.organizer;
  3259.  
  3260. if (t.switchingPresets)
  3261. {
  3262. t.setSwitchStatus("Local preset switch still in prgres ....");
  3263. return;
  3264. }
  3265.  
  3266. var items = presetData.items[id];
  3267. if (!items || items.length==0)
  3268. {
  3269. t.setSwitchStatus("Local preset is empty");
  3270. return;
  3271. }
  3272.  
  3273. var c = 0;
  3274. t.switchingPresets = true;
  3275.  
  3276. var slot = parseInt(presetData.usePreset);
  3277.  
  3278. if (!slot ) slot = parseInt(Seed.throne.activeSlot);
  3279.  
  3280. // make sure it is in the valid range
  3281. if (slot < 1 || slot > Seed.throne.slotNum) slot = parseInt(Seed.throne.activeSlot);
  3282.  
  3283. // grab the list of items equipped in the slot about to be switched to
  3284. var ei = Seed.throne.slotEquip[slot];
  3285.  
  3286. // see if we are already on the correct slot
  3287. if (slot != Seed.throne.activeSlot) {
  3288. // switch to the correct preset
  3289. t.setSwitchStatus("Switching to slot " + slot);
  3290. processPresetClick(slot);
  3291. c++;
  3292. } else {
  3293. t.setSwitchStatus("Already in correct slot.");
  3294. }
  3295.  
  3296. var delay = 7;
  3297. for (i in items)
  3298. {
  3299. if (!items[i]) continue;
  3300.  
  3301. // only equip the items not already equipped
  3302. if (ei.indexOf(items[i]) < 0)
  3303. {
  3304. var I = unsafeWindow.kocThroneItems[+items[i]];
  3305.  
  3306. if (!I) {
  3307. t.setSwitchStatus("Throne room item " + items[i] + " not found");
  3308. continue;
  3309. }
  3310.  
  3311. var f = function (I2, s) {
  3312. return function () {
  3313. Tabs.organizer.equipItem(I2, s);
  3314. Tabs.organizer.setSwitchStatus("Equipping " + I2.name);
  3315. };
  3316. }
  3317. setTimeout (f(I, slot), c*delay*1000); // have to wait at least 5 seconds between switches
  3318. c++;
  3319. }
  3320. else
  3321. {
  3322. var I = unsafeWindow.kocThroneItems[+items[i]];
  3323. //t.setSwitchStatus("Item " + I.name + " is already equipped");
  3324. }
  3325. }
  3326.  
  3327. setTimeout ( function () {
  3328. Tabs.organizer.show();
  3329. t.switchingPresets = false;
  3330. t.setSwitchStatus("Local preset "+ presetData.ids[id] + " loaded.")
  3331. }, c* delay*1000 + 1000);
  3332. },
  3333.  
  3334. saveLocalPreset : function (id) {
  3335. var equipedItems = {};
  3336. var ei = Seed.throne.slotEquip[Seed.throne.activeSlot];
  3337.  
  3338. // convert array to an object
  3339. for (j=0; j < ei.length; j++) {
  3340. equipedItems[j] = ei[j];
  3341. }
  3342.  
  3343. presetData.items[id] = equipedItems;
  3344. savePresetData();
  3345. Tabs.organizer.setSwitchStatus("Local preset " + presetData.ids[id] + " saved.");
  3346. },
  3347.  
  3348. addTagItem : function (itemId) {
  3349. presetData.taggedItems[itemId] = true;
  3350. $("#throneInventoryItem" + itemId).prepend("<div class='greenBorder'></div>");
  3351. $("div#trCardItem" + itemId).find("div.trCard").append("<div class='greenBorder2' style='border: 8px solid cyan; background: none; width: 184px; height: 288px;'></div>");
  3352. savePresetData();
  3353. },
  3354.  
  3355. removeTagItem : function (itemId) {
  3356. if (presetData.taggedItems[itemId])
  3357. {
  3358. delete presetData.taggedItems[itemId];
  3359. $("#throneInventoryItem" + itemId).children(".greenBorder").remove();
  3360. $("#trCardItem" + itemId + " div.greenBorder2").remove();
  3361. savePresetData();
  3362. }
  3363. },
  3364.  
  3365. equipItem : function ( I, preset) {
  3366. if (!I) return;
  3367. unsafeWindow.AjaxCall.gPostRequest("ajax/_dispatch53.php", {
  3368. ctrl: "throneRoom\\ThroneRoomServiceAjax",
  3369. action: "equipItem",
  3370. itemId: I.id,
  3371. presetId: preset
  3372. }, function (u) {
  3373. //logit("result: "+ inspect(u,3,1));
  3374. if (u.ok === true) {
  3375. unsafeWindow.cm.ThroneView.clickItemEquip(I);
  3376. Tabs.organizer.show();
  3377. } else {
  3378. if (I && I.name) {
  3379. Tabs.organizer.setSwitchStatus("Unable to equip item " + I.name);
  3380. } else {
  3381. Tabs.organizer.setSwitchStatus("Unable to equip item");
  3382. }
  3383. logit("Unable to equip item.");
  3384. cm.ModalManager.alert({
  3385. button_text: unsafeWindow.g_js_strings.commonstr.ok,
  3386. text: u.msg,
  3387. "class": "craftFailure",
  3388. exe: function () {
  3389. unsafeWindow.Modal.hideModalAll();
  3390. unsafeWindow.cm.ModalManager.close()
  3391. }
  3392. })
  3393. }
  3394. }, function (u) {
  3395. logit("equip error");
  3396. logit("e:" + inspect(u,3,1));
  3397.  
  3398. })
  3399. },
  3400.  
  3401. showNext : function () {
  3402. var t = Tabs.organizer;
  3403. if (t.panelId < 0) return;
  3404. var X = unsafeWindow.kocThroneItems[t.panelId];
  3405. var V = "next";
  3406. var P = t.panelType;
  3407.  
  3408. var level = X.level || 0;
  3409. var quality = X.quality || 0;
  3410.  
  3411. var bump = t.panelNextLevel;
  3412.  
  3413. if (P == "enhance")
  3414. {
  3415. if ( (quality + bump ) > 5)
  3416. {
  3417. bump = 5 - quality;
  3418. }
  3419. }
  3420. else if ( (level + bump) > maxTrLevel)
  3421. {
  3422. bump = maxTrLevel - level;
  3423. }
  3424.  
  3425. var R = [],
  3426. Q, Y, S, U, N = {},
  3427. T, W;
  3428. if (V == "next") {
  3429. if (P == "enhance") {
  3430. quality += bump;
  3431. $("#nextStatContainer span").html('<span> ' + X.createPrefix() + ' </span>');
  3432. } else {
  3433. if (P == "upgrade") {
  3434. level += bump;
  3435. $("#nextStatContainer span").html('<span> Level ' + level + ' </span>');
  3436. }
  3437. }
  3438. }
  3439. $.each(X.effects, function (Z, aa) {
  3440. Q = +(Z.split("slot")[1]);
  3441. Y = CM.thronestats.effects[aa.id];
  3442. S = CM.thronestats.tiers[aa.id][aa.tier];
  3443. if (!S) CM.thronestats.tiers[aa.id][aa.tier-1]
  3444. var base = S.base || 0;
  3445. var growth = S.growth || 0;
  3446.  
  3447. U = +(base) + ((level * level + level) * +(growth) / 2);
  3448.  
  3449. var wholeNumber = false;
  3450. if ( Math.round(U) == U) wholeNumber = true;
  3451.  
  3452. if (wholeNumber)
  3453. U = U.toFixed(0);
  3454. else
  3455. U= U.toFixed(2);
  3456.  
  3457. if (Q % 2 == 0) {
  3458. T = "even"
  3459. } else {
  3460. T = "odd"
  3461. }
  3462. if (Q <= quality) {
  3463. if (U > 1) {
  3464. R.push("<li class='" + T + "'>" + Y[1] + " +" + U + "%</li>")
  3465. } else {
  3466. R.push("<li class='" + T + "'>" + Y[1] + " " + U + "%</li>")
  3467. }
  3468. } else {
  3469. R.push("<li class='disabled " + T + "'>" + Y[1] + " + " + U + "%</li>")
  3470. }
  3471. });
  3472. if (V == "next") {
  3473. if (P == "enhance") {
  3474. quality -= bump
  3475. } else {
  3476. if (P == "upgrade") {
  3477. level -= bump;
  3478. }
  3479. }
  3480. }
  3481. if (V === "next") {
  3482. if (CM.ThronePanelController.isLastLevel(X, P)) {
  3483. W = $("<div/>").addClass("lock").attr("id", "lockedStatIcon");
  3484. $("#nextStatContainer").append(W)
  3485. } else {
  3486. $("#lockedStatIcon").remove()
  3487. }
  3488. }
  3489. t.panelNextLevel++;
  3490. $("#thronePanelStat2").html(R.join(""));
  3491.  
  3492. $("#thronePanelStat2 li").unbind("mouseenter").bind("mouseenter", function (Z) {
  3493. unsafeWindow.Tooltip.show(Z, $(this).html(), [-180, 5])
  3494. })
  3495. },
  3496.  
  3497. // highlight the items the salvager will target
  3498. testSalvage : function() {
  3499. var t = Tabs.organizer;
  3500. var s = Tabs.throneSalvage;
  3501. var toDelete = s.buildList(true);
  3502.  
  3503. $('#trDelResults').html("<div> " + toDelete.length + " item(s) targeted for deletion</div>");
  3504.  
  3505. for (i =0; i < toDelete.length; i++)
  3506. {
  3507. var item = unsafeWindow.kocThroneItems[toDelete[i]];
  3508. if (item.isBroken || item.isEquipped)
  3509. {
  3510. t.selectCard(toDelete[i], "orange");
  3511. }
  3512. else
  3513. {
  3514. t.selectCard(toDelete[i], "red");
  3515. }
  3516. }
  3517. },
  3518.  
  3519. paintTable : function() {
  3520. // fill in the table
  3521. var t = Tabs.organizer;
  3522. var m = "";
  3523. var mm;
  3524. var tab = document.getElementById('trDisplayTable');
  3525. var ii = Math.max(t.itemLists['chair'].length, t.itemLists['table'].length, t.itemLists['window'].length, t.itemLists['banner'].length, t.itemLists['advisor'].length, t.itemLists['trophy'].length, t.itemLists['candelabrum'].length, t.itemLists['hero'].length, t.itemLists['statue'].length);
  3526.  
  3527. m += "<tr align=center valign=top><th width=10%>Chairs</th><th width=10%>Tables</th><th width=10%>Windows</th><th width=10%>Banners</th><th width=10%>Advisors</th><th width=10%>Throphies</th><th width=10%>Candelabra</th><th width=10%>Heroes</th><th width=10%>Statues</th></tr>";
  3528. for (var k= 0; k < ii ; k++)
  3529. {
  3530. mm = '<TR align=left valign=top style="height: auto;">';
  3531. for (i in t.itemTypes)
  3532. {
  3533. var item = t.itemLists[i][k];
  3534. var item_num = 0;
  3535. var id="card";
  3536. if (item != null)
  3537. {
  3538. id += item.id;
  3539. item_num = item.id;
  3540. }
  3541. mm += '<TD class="tdcard" style="overflow: visible; width:auto; height: 150px; border: 4px solid white;" id="' + id +'" >';
  3542. mm += t.buildCard(t.itemLists[i][k]);
  3543. mm += '</TD>';
  3544. }
  3545. mm += '</TR>';
  3546. m+= mm;
  3547. }
  3548. tab.innerHTML = m;
  3549. // repair the height/width caused by the 2d transform
  3550. var d = document.getElementById ('trTableDiv');
  3551. var t = document.getElementById ('trDisplayTable');
  3552. var nodes = t.getElementsByTagName('td');
  3553.  
  3554. for (n=0; n < nodes.length; n++)
  3555. {
  3556. var d2 = nodes[n].childNodes[0];
  3557. var h = d2.offsetHeight;
  3558. var w = d2.offsetWidth;
  3559. d2.style.height = (TABLE_SCALE * h) + "px";
  3560. d2.style.width = (TABLE_SCALE * w) + "px";
  3561. }
  3562.  
  3563. $(".trCardDisp").click( function( A){
  3564. var theId = $(this).attr("id").split("trCardItem")[1];
  3565. unsafeWindow.cm.ContextualMenuThrone.renderMenu( $(this), unsafeWindow.kocThroneItems[theId]);
  3566. });
  3567.  
  3568. // add the large tooltip
  3569.  
  3570. if (presetData.noTooltips != true) $("td.tdcard").on("mouseenter", "*", function (A) {
  3571. A.stopPropagation();
  3572. var top = $(this).parents("td.tdcard")
  3573. var theId = top.attr("id").split("card")[1];
  3574.  
  3575. if (!theId || theId == 0) {
  3576. return;
  3577. }
  3578.  
  3579. var zz;
  3580. if (zz = unsafeWindow.kocThroneItems[theId])
  3581. { unsafeWindow.cm.ThroneView.hoverItem(A, top, zz);
  3582. $("#kofcNewTooltipDiv").css('position', 'absolute');
  3583. $("#kofcNewTooltipDiv").css('left', ($("#tr_dialog").position().left+200) + 'px');
  3584. $("#kofcNewTooltipDiv").css('top', A.pageY-350 + 'px');
  3585. }
  3586. else
  3587. {
  3588. $("#kofcNewTooltipDiv").remove();
  3589. setTimeout( function () {Tabs.organizer.show();}, 200);
  3590. }
  3591. });
  3592.  
  3593. if (presetData.noTooltips != true) $("td.tdcard").on( "mouseleave", "*", function (A) {
  3594. var theId = $(this).parents("td.tdcard").attr("id").split("card")[1];
  3595. if (unsafeWindow.kocThroneItems[theId]) {}
  3596. //unsafeWindow.cm.ThroneView.unhoverItem(A, this, unsafeWindow.kocThroneItems[theId])
  3597. });
  3598.  
  3599. // add yellow and blue borders
  3600. $("div.trCard").removeClass("blueBorder2");
  3601. $("div.trCard").removeClass("yellowBorder2");
  3602. $("div.trCard").children("div.greenBorder2").remove();
  3603.  
  3604. for (ii in queueData.list) {
  3605. var list_item = queueData.list[ii];
  3606. if (!list_item) continue;
  3607. if (list_item.status != "complete") {
  3608. var id = list_item.item;
  3609.  
  3610. if (list_item.action == "upgrade") $("div#trCardItem" + id).find("div.trCard").addClass("blueBorder2");
  3611. if (list_item.action == "enhance") $("div#trCardItem" + id).find("div.trCard").addClass("yellowBorder2");
  3612. }
  3613. }
  3614.  
  3615. for (ii in presetData.taggedItems) {
  3616. $("div#trCardItem" + ii).find("div.trCard").append("<div class='greenBorder2' style='border: 8px solid cyan; background: none; width: 184px; height: 288px;'></div>");
  3617. }
  3618.  
  3619.  
  3620. },
  3621.  
  3622. // select a kabam preset
  3623. selectPreset : function (p)
  3624. {
  3625. // highlight the selected set of cards
  3626. var t = Tabs.organizer;
  3627. t.clearHighlights();
  3628.  
  3629. p += "";
  3630.  
  3631. if (p.indexOf("local") >=0 ) {
  3632. // highlight the local preset
  3633. var localNum = +(p.split("local")[1]);
  3634. var items = presetData.items[localNum];
  3635.  
  3636. if (!items || items.length==0) return;
  3637.  
  3638. for (i in items)
  3639. {
  3640. t.selectCard(items[i], "green");
  3641. }
  3642. return;
  3643. }
  3644.  
  3645. // highlight the standard preset
  3646. var equipedItems = Seed.throne.slotEquip[parseInt(p)];
  3647. if (equipedItems != null)
  3648. {
  3649. for (ll =0; ll < equipedItems.length; ll++)
  3650. {
  3651. t.selectCard(equipedItems[ll], "green");
  3652. }
  3653. }
  3654. },
  3655.  
  3656. // fill the lists w/ the current TR items
  3657. fillLists : function ()
  3658. {
  3659. var t = Tabs.organizer;
  3660.  
  3661. for (i in t.itemTypes)
  3662. {
  3663. t.itemLists[i] = new Array;
  3664. }
  3665.  
  3666. for (k in unsafeWindow.kocThroneItems) {
  3667. var throne_item = unsafeWindow.kocThroneItems[k];
  3668.  
  3669. // apply filters
  3670. var faction = throne_item.faction;
  3671. var level = throne_item.level;
  3672.  
  3673. if (!($('#trFaction'+faction).is(':checked')) ) continue;
  3674. if (!($('#trLevel'+level).is(':checked')) ) continue;
  3675.  
  3676. // put the equipped items first
  3677. if (throne_item.isEquipped)
  3678. t.itemLists[throne_item.type].unshift(throne_item);
  3679. else
  3680. t.itemLists[throne_item.type].push(throne_item);
  3681. }
  3682. },
  3683.  
  3684. // sort the lists in the desired order
  3685. sortLists : function ()
  3686. {
  3687. var t = Tabs.organizer;
  3688. upgradeData.sortInactive = ($("#trSortInactive").attr('checked') == 'checked');
  3689. for (i in t.itemLists)
  3690. {
  3691. t.itemLists[i].sort( function (item1, item2) {
  3692. return t.sortValue(item2) - t.sortValue(item1);
  3693. });
  3694. }
  3695. },
  3696.  
  3697. sortValue : function (item)
  3698. {
  3699. var t = Tabs.organizer;
  3700. var retValue = 0.0;
  3701. for (e in item.effects)
  3702. {
  3703. try {
  3704. var N = item.effects[e];
  3705. var effect=CM.thronestats.effects[N.id][1];
  3706.  
  3707. var tier=CM.thronestats.tiers[N.id][N.tier];
  3708. if (!tier) CM.thronestats.tiers[N.id][N.tier-1]
  3709.  
  3710. var B=+(e.split("slot")[1]);
  3711. var base = tier.base || 0;
  3712. var level = item.level || 0;
  3713. var growth = tier.growth || 0;
  3714. var quality = item.quality || 0;
  3715.  
  3716. if (B> quality && !upgradeData.sortInactive)
  3717. {
  3718. return +retValue;
  3719. }
  3720.  
  3721. var percent=+( base+(( level* level+ level)* growth*0.5));
  3722. if ( (effect == (t.sortEffect + " Debuff")) && (t.sortType != "buff"))
  3723. {
  3724. retValue -= percent;
  3725. }
  3726. else if (effect == t.sortEffect && t.sortType != "debuff")
  3727. {
  3728. retValue += percent;
  3729. }
  3730. } catch (e) {
  3731.  
  3732. }
  3733.  
  3734. }
  3735. return +retValue;
  3736. },
  3737.  
  3738. // clear all the highlists
  3739. clearHighlights : function()
  3740. {
  3741. var t = Tabs.organizer;
  3742.  
  3743. for (k in unsafeWindow.kocThroneItems)
  3744. {
  3745. var throne_item = unsafeWindow.kocThroneItems[k];
  3746. t.selectCard(throne_item.id, "white");
  3747. }
  3748.  
  3749. },
  3750.  
  3751. // highlight a card
  3752. selectCard : function(itemId, color)
  3753. {
  3754. var t = Tabs.organizer;
  3755. var item = unsafeWindow.kocThroneItems[itemId];
  3756.  
  3757. if (item) t.selectedItems[item.type] = itemId;
  3758. td = document.getElementById( "card"+itemId);
  3759. if (td)
  3760. {
  3761. td.style.borderColor = color;
  3762. }
  3763. },
  3764.  
  3765. clearCards : function()
  3766. {
  3767. var t = Tabs.organizer;
  3768. for (k in t.selectedItems)
  3769. {
  3770. var td = document.getElementById( "card" + t.selectedItems[k]);
  3771. if (td)
  3772. {
  3773. td.style.borderColor = "white";
  3774. }
  3775. }
  3776. t.selectedItems = [];
  3777. },
  3778.  
  3779. // create the card to display
  3780. buildCard : function(I){
  3781. var t = Tabs.organizer;
  3782. var D = [];
  3783. var w=CM.thronestats.mightByQuality;
  3784. var z=CM.thronestats.mightByLevel;
  3785.  
  3786. var text_only = false;
  3787.  
  3788. if (I == null)
  3789. {
  3790. D.push("<div>");
  3791. D.push("</div>");
  3792. return D.join("");
  3793. }
  3794. D.push("<div class='trCardDisp' id='trCardItem" + I.id + "' style='border: 1px solid white; clear: both; overflow: visible; position: relative; left: 0px; top: 0px; -moz-transform: scale(" + TABLE_SCALE + ", "+ TABLE_SCALE + "); -moz-transform-origin: 0% 0%; -webkit-transform: scale(" + TABLE_SCALE + ", "+ TABLE_SCALE + "); -webkit-transform-origin: 0% 0%;);'>");
  3795. if (I.isBroken)
  3796. {
  3797. D.push(" <div class='cardOverlay semi_transparent rot45'> Broken </div>");
  3798. }
  3799. D.push(" <div class='trCard' style='white-space: normal; padding: 0px;'> ");
  3800. D.push("<div class='section' style='overflow: visible;' id = 'idsection'>");
  3801. D.push(" <div class='title "+I.createPrefix().toLowerCase()+"' style='text-transform: capitalize;'> ");
  3802. D.push(I.name);
  3803. if (!text_only) D.push(" ["+I.id+"]");
  3804. D.push(" </div> ");
  3805. D.push(" <div class='description'> ");
  3806. if (!text_only)
  3807. {
  3808.  
  3809. D.push(" <div class='portrait "+I.faction+" "+I.type+"'> </div> ");
  3810. D.push("<ul>");
  3811. D.push("<li> "+uW.g_js_strings.commonstr.faction+": "+I.faction+"</li>");
  3812. D.push("<li> "+uW.g_js_strings.commonstr.quality+": "+I.createPrefix()+"</li>");
  3813. D.push("<li> "+uW.g_js_strings.commonstr.type+": "+I.type+"</li>");
  3814. D.push("<li> "+uW.g_js_strings.commonstr.level+": "+I.level+"</li>");
  3815. D.push("<li> "+uW.g_js_strings.commonstr.might+": "+(w[I.quality].Might+z[I.level].Might)+"</li>");
  3816. D.push("</ul>");
  3817. D.push(" </div> ");
  3818. D.push(" <ul> ");
  3819. }
  3820.  
  3821. for (M in I.effects)
  3822. {
  3823. try {
  3824. var N = I.effects[M];
  3825. effect=CM.thronestats.effects[N.id];
  3826.  
  3827. tier=CM.thronestats.tiers[N.id][N.tier];
  3828. if (!tier) tier=CM.thronestats.tiers[N.id][N.tier-1];
  3829.  
  3830. var base = tier.base || 0;
  3831. var level = I.level || 0;
  3832. var growth = tier.growth ||0;
  3833.  
  3834. percent=+(base+((level*level+level)*growth*0.5));
  3835.  
  3836. var wholeNumber = false;
  3837. if ( Math.round(parseFloat(percent)) == parseFloat(percent)) wholeNumber = true;
  3838.  
  3839. percent=(percent>0)?"+"+percent:+percent;
  3840.  
  3841. if (wholeNumber)
  3842. percent = parseFloat(percent).toFixed(0);
  3843. else
  3844. percent= parseFloat(percent).toFixed(2);
  3845. // percent=Math.ceil(percent);
  3846. css=(M%2===0)?"even":"odd";
  3847. B=+(M.split("slot")[1]);
  3848. if(B<=I.quality){
  3849. D.push(" <li class='effect "+css+"'> "+percent+"% "+effect[1]+" </li> ");
  3850. }else{
  3851. D.push(" <li class='effect disabled "+css+"'> "+percent+"% "+effect[1]+" </li> ");
  3852. }
  3853. }
  3854. catch (e) {}
  3855.  
  3856. }
  3857. D.push(" </ul> ");
  3858. D.push(" </div> ");
  3859. D.push(" </ul> ");
  3860. D.push(" </div> ");
  3861. D.push(" </div> ");
  3862. return D.join("");
  3863.  
  3864. },
  3865.  
  3866. show: function(){
  3867. var t = Tabs.organizer;
  3868. t.fillLists();
  3869. t.sortLists()
  3870. t.paintTable();
  3871. t.selectPreset(document.getElementById ('PresetList').value);
  3872. },
  3873.  
  3874. hide: function(){
  3875. }
  3876. }
  3877.  
  3878.  
  3879. /** ********************************* Log Tab ********************************** */
  3880. Tabs.trActionLog = {
  3881. tabOrder: 600,
  3882. tabLabel : 'Log',
  3883. myDiv : null,
  3884. logTab : [null, null, null],
  3885. maxEntries: 300,
  3886. saveEntries : [[],[],[]],
  3887. state : null,
  3888.  
  3889. init : function (div){
  3890. var t = Tabs.trActionLog;
  3891. t.myDiv = div;
  3892. t.myDiv.innerHTML = '<div id=logScroll style=" position: static; width: 710px; height: 500px; overflow-x: hidden; overflow-y: auto;" >\
  3893. <DIV class=trStat>UPGRADE LOG - VERSION: '+ Version+'</div>\
  3894. <DIV style="height:535px; max-height:535px;">\
  3895. <TABLE cellpadding=0 cellspacing=0 id=trsuccesslog class=trTabLined width=100%><TR><TD width=20%></td><TD width=80%></td></tr></table>\
  3896. <DIV class=trStat>Action Log</div>\
  3897. <TABLE cellpadding=0 cellspacing=0 id=tractionlog class=trTabLined width=100%><TR><TD width=20%></td><TD width=80%></td></tr></table>\
  3898. <DIV class=trStat>Salvage Log</div>\
  3899. <TABLE cellpadding=0 cellspacing=0 id=trsalvagelog class=trTabLined width=100%><TR><TD width=20%></td><TD width=80%></td></tr></table></div></div>';
  3900. t.logTab[0] = document.getElementById('trsuccesslog');
  3901. t.logTab[1] = document.getElementById('tractionlog');
  3902. t.logTab[2] = document.getElementById('trsalvagelog');
  3903. t.state = 1;
  3904.  
  3905. for (var j=0; j<3; j++)
  3906. {
  3907. var logVar = 'trlog_';
  3908. if (j !=0) logVar += (j + "_")
  3909. logVar += getServerId();
  3910.  
  3911. var a = JSON2.parse(GM_getValue (logVar, '[]'));
  3912.  
  3913. if (matTypeof(a) == 'array'){
  3914. t.saveEntries[j] = a;
  3915. for (var i=0; i<t.saveEntries[j].length; i++)
  3916. t._addTab(j, t.saveEntries[j][i].msg, t.saveEntries[j][i].ts);
  3917. }
  3918. }
  3919.  
  3920. window.addEventListener('unload', t.onUnload, false);
  3921.  
  3922. $("#logScroll").resizable({
  3923. minWidth: 710,
  3924. maxWidth: 1000,
  3925. minHeight: 180,
  3926. maxHeight: 1100,
  3927. stop: function(event, ui) {
  3928. upgradeData.logH = ui.size.height + 'px';
  3929. upgradeData.logW = ui.size.width + 'px';
  3930. saveUpgradeData();
  3931. }
  3932. });
  3933.  
  3934. $("#logScroll").css('height', upgradeData.logH).css('width', upgradeData.logW);
  3935. },
  3936.  
  3937. hide : function (){
  3938. },
  3939.  
  3940. show : function (){
  3941. },
  3942.  
  3943. onUnload : function (){
  3944. var t = Tabs.trActionLog;
  3945. if (!ResetAll) GM_setValue ('trlog_'+getServerId(), JSON2.stringify(t.saveEntries[0]));
  3946. if (!ResetAll) GM_setValue ('trlog_1_'+getServerId(), JSON2.stringify(t.saveEntries[1]));
  3947. if (!ResetAll) GM_setValue ('trlog_2_'+getServerId(), JSON2.stringify(t.saveEntries[2]));
  3948. },
  3949.  
  3950. _addTab : function (lnum, msg, ts){
  3951. var t = Tabs.trActionLog;
  3952. if (t.state != 1)
  3953. return;
  3954. if (t.logTab[lnum].rows.length >= t.maxEntries)
  3955. t.logTab[lnum].deleteRow(t.maxEntries-1);
  3956. var row = t.logTab[lnum].insertRow(0);
  3957. row.vAlign = 'top';
  3958. row.insertCell(0).innerHTML = ts;
  3959. row.insertCell(1).innerHTML = msg;
  3960. },
  3961.  
  3962. log : function (lnum, msg){
  3963. var t = Tabs.trActionLog;
  3964. var d = new Date();
  3965. var ts = d.toDateString().substring(3,10) + " "+ d.toTimeString().substring(0,8);
  3966. t._addTab (lnum, msg, ts);
  3967. while (t.saveEntries[lnum].length >= 30)
  3968. t.saveEntries[lnum].shift();
  3969. t.saveEntries[lnum].push ({msg:msg, ts:ts});
  3970. }
  3971. }
  3972.  
  3973. function trSuccessLog (msg){
  3974. if (!Tabs.trActionLog.tabDisabled)
  3975. Tabs.trActionLog.log (0,msg);
  3976. }
  3977.  
  3978. function trActionLog (msg){
  3979. if (!Tabs.trActionLog.tabDisabled)
  3980. Tabs.trActionLog.log (1,msg);
  3981. }
  3982.  
  3983. function trSalvageLog (msg){
  3984. if (!Tabs.trActionLog.tabDisabled)
  3985. Tabs.trActionLog.log(2,msg);
  3986. }
  3987.  
  3988. /** ***************** options ********************* */
  3989.  
  3990. Tabs.options = {
  3991. tabOrder: 700,
  3992. tabLabel: 'Options',
  3993. myDiv : null,
  3994.  
  3995. init : function (div) {
  3996. var t = Tabs.options;
  3997. t.myDiv = div;
  3998.  
  3999. // header stuff
  4000. var m = '<Div id=optionScroll style=" position: static; width: 700px; height: 500px; overflow-x: hidden; overflow-y: auto;">';
  4001. m += '<DIV id=trOptions class=trStat>OPTIONS</div><TABLE id=trOptionTbl width=100% height=0% class=trTab>';
  4002. m += '<TR><TD width=100%><INPUT id=trupdate type=checkbox '+ (TRGlobalOptions.trUpdate?'CHECKED ':'') +'/>Check for script updates on userscripts.org (all domains) &nbsp; &nbsp; <INPUT id=trupdatenow type=button value="Update Now" /></TD></TR>';
  4003. m += '<TR><TD width=100%><INPUT id=trDisableAnim type=checkbox '+ (upgradeData.disableAnim?'CHECKED ':'') +'/> Disable failure animation (Big red X) </TD></TR>';
  4004. m += '<TR><TD width=100%><INPUT id=trPresetOption type=checkbox '+ (upgradeData.presetWidget?'CHECKED ':'') +'/> Enable preset selector widget (requires refresh)</TD></TR>';
  4005. m += '<TR><TD width=100%>Reset guardian/preset widget locations<INPUT id=trResetWidgets type=button value="Reset" /></TD></TR>';
  4006.  
  4007. m += '<TR><td><div class=trStat>Salvage Options</div></td></TR>';
  4008. 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>';
  4009. 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. ';
  4010. m += ' Maximum number of aetherstones: <INPUT id=trMaxStone type=text size=7 maxlength=7 value="' + salvageData.maxStones+ '"/></div></td></TR>';
  4011. m += '<TR><TD>Overflow method: <select id=trOverflow><option value="order">City order</option><option value="lowest">Lowest city</option> </select></TD></TR>';
  4012. m += '<TR><TD><div style="white-space: pre;" ><INPUT id=trSalUpgradeFirst type=checkbox '+ (salvageData.upgradeFirst?' CHECKED':'') +'/> Upgrade items to +1 before deleting.';
  4013.  
  4014. m += ' Maximum quality: <select id="trSalUpgradeQuality">';
  4015. m += '<option value="0">'+ uW.g_js_strings.throneRoom.simple +'</option>';
  4016. m += '<option value="1">'+ uW.g_js_strings.throneRoom.common +'</option>';
  4017. m += '<option value="2">'+ uW.g_js_strings.throneRoom.uncommon +'</option>';
  4018. m += '<option value="3">'+ uW.g_js_strings.throneRoom.rare +'</option>';
  4019. m += '<option value="4">'+ uW.g_js_strings.throneRoom.epic +'</option>';
  4020. m += '<option value="5">'+ uW.g_js_strings.throneRoom.wondrous +'</option>';
  4021. m += '</select> </div></td></tr>';
  4022.  
  4023. m += '<TR><TD><div style="white-space: pre;" ><INPUT id=trSalUpgradeManual type=checkbox '+ (salvageData.upgradeManual?' CHECKED':'') +'/> Upgrade items to +1 on manual delete.</td></tr>';
  4024.  
  4025. m += '<TR><td><div class=trStat>Upgrade Options</div></td></TR>';
  4026. m += '<tr><td width=25%>Retry interval (seconds): <INPUT id=trUpRefresh type=text size=3 maxlength=3 value="' +upgradeData.retryInterval+ '"/></td></tr>';
  4027. 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. ';
  4028. m += ' Minimum number of aetherstones: <INPUT id=trMinStone type=text size=7 maxlength=7 value="' +upgradeData.minStones+ '"/> </div></td></tr>';
  4029. m += '<tr><td colspan=2> <INPUT id=trWhisperCheck type=checkbox '+ (upgradeData.whisperToMe?'CHECKED ':'') +'/> Whisper to myself on successful upgrades</td></tr> ';
  4030. m += '<tr><td colspan=2> <INPUT id=trBuffsCheck type=checkbox '+ (upgradeData.buffsOff?'CHECKED ':'') +'/> Prevent Kabam from automatically selecting upgrade tokens</td></tr> ';
  4031. m += '<tr><td colspan=2><INPUT id=trSafetyCheck type=checkbox '+ (upgradeData.safetyOn?'CHECKED ':'') +'/> Disable manual upgrades if less than <input id=trSafetyLimit size=10 maxlength=10 value="' + upgradeData.safetyLimit +'" /> aetherstone</td></tr> ';
  4032. m += '<tr><td colspan=2><INPUT id=trTokenCheck type=checkbox '+ (upgradeData.removeTokens?'CHECKED ':'') +'/> Remove master and lucky tokens from upgrade panel </td></tr> ';
  4033. m += '<tr><td colspan=2><INPUT id=trMultiUp type=checkbox '+ (upgradeData.multiUpgrade?'CHECKED ':'') +'/> Add button for combined upgrade/enhancement</td></tr> ';
  4034. m += '<tr><td colspan=2><INPUT id=trNoMassS type=checkbox '+ (upgradeData.noMassSalvage?'CHECKED ':'') +'/> Remove button for Mass Salvage</td></tr> ';
  4035. m += '<tr><td colspan=2><INPUT id=trSalvageSafety type=checkbox '+ (upgradeData.salvageSafety?'CHECKED ':'') +'/> Remove Salvage button for the first <INPUT id=trSafetyNum type=text size=3 maxlength=3 value="' +upgradeData.numSafety+ '"/> items</td></tr> ';
  4036.  
  4037. m += '<TR><td><div class=trStat>Organizer Options</div></td></TR>';
  4038. m += '<TR><td><div style="text-align:center;"> Local Preset Names/Descriptions</div></td></TR>';
  4039.  
  4040. for (j=0; j<presetData.num_presets; j++ )
  4041. {
  4042. if (!presetData.desc[j]) presetData.desc[j] = 'Preset ' + String.fromCharCode(65 + j);
  4043. if (!presetData.ids[j]) presetData.ids[j] = String.fromCharCode(65 + j);
  4044. m += '<tr><td style="width: 650px; white-space: nowrap;">Name: <INPUT class=trNameEntry id=trPresetName' + j + ' type=text size=8 maxlength=8 value="' + presetData.ids[j] + '"/> Description: <INPUT class=trDescEntry id=trPresetDesc' +j+' type=text size=80 maxlength=100 value="' + presetData.desc[j] + '"/></td></tr>';
  4045. }
  4046.  
  4047. m += '<TR><TD><div style="white-space: pre;" >Number of presets: <INPUT id=trNumPresets type=text size=4 maxlength=2 value="' +presetData.num_presets+ '"/> <INPUT id=trNoTooltips type=checkbox '+ (presetData.noTooltips?' CHECKED':'') +'/> Do not show large portrait tooltips</div></td></tr>';
  4048. m += '</table></div>';
  4049.  
  4050. t.myDiv.innerHTML = m;
  4051.  
  4052. $("#optionScroll").resizable({
  4053. minWidth: 710,
  4054. maxWidth: 810,
  4055. minHeight: 300,
  4056. maxHeight: 780,
  4057. stop: function(event, ui) {
  4058. upgradeData.optionH = ui.size.height + 'px';
  4059. upgradeData.optionW = ui.size.width + 'px';
  4060. saveUpgradeData();
  4061. }
  4062. });
  4063.  
  4064. $("#optionScroll").css('height', upgradeData.optionH).css('width', upgradeData.optionW);
  4065.  
  4066. $('#trDisableAnim').change( function (){
  4067. upgradeData.disableAnim = document.getElementById('trDisableAnim').checked;
  4068. disableAnimation(upgradeData.disableAnim);
  4069. saveUpgradeData();
  4070. }
  4071. );
  4072.  
  4073. $('#trPresetOption').change( function (){
  4074. upgradeData.presetWidget = document.getElementById('trPresetOption').checked;
  4075. saveUpgradeData();
  4076. }
  4077. );
  4078.  
  4079. $('#trupdate').change( function (){
  4080. TRGlobalOptions.trUpdate = document.getElementById('trupdate').checked;
  4081. GM_setValue ('TROptions_??', JSON2.stringify(TRGlobalOptions));
  4082. }
  4083. );
  4084.  
  4085. $('#trWhisperCheck').change( function (){
  4086. upgradeData.whisperToMe = document.getElementById('trWhisperCheck').checked;
  4087. saveUpgradeData();
  4088. }
  4089. );
  4090.  
  4091. $('#trSafetyCheck').change( function (){
  4092. upgradeData.safetyOn = document.getElementById('trSafetyCheck').checked;
  4093. saveUpgradeData();
  4094. }
  4095. );
  4096.  
  4097. $('#trTokenCheck').change( function (){
  4098. upgradeData.removeTokens = document.getElementById('trTokenCheck').checked;
  4099. saveUpgradeData();
  4100. }
  4101. );
  4102.  
  4103. $('#trMultiUp').change( function (){
  4104. upgradeData.multiUpgrade = document.getElementById('trMultiUp').checked;
  4105. saveUpgradeData();
  4106. }
  4107. );
  4108.  
  4109. $('#trNoMassS').change( function (){
  4110. upgradeData.noMassSalvage = document.getElementById('trNoMassS').checked;
  4111. saveUpgradeData();
  4112. });
  4113.  
  4114. $('#trSalvageSafety').change( function (){
  4115. upgradeData.salvageSafety = document.getElementById('trSalvageSafety').checked;
  4116. saveUpgradeData();
  4117. });
  4118.  
  4119. $("#trSafetyNum").change ( function() {
  4120. upgradeData.numSafety = parseInt($("#trSafetyNum").val());
  4121. saveUpgradeData();
  4122. });
  4123.  
  4124.  
  4125. $('#trBuffsCheck').change( function (){
  4126. upgradeData.buffsOff = document.getElementById('trBuffsCheck').checked;
  4127. saveUpgradeData();
  4128. }
  4129. );
  4130.  
  4131. $('#trSafetyLimit').change( function (){
  4132. upgradeData.safetyLimit = parseInt($("#trSafetyLimit").val());
  4133. saveUpgradeData();
  4134. }
  4135. );
  4136.  
  4137. $('#trupdatenow').click(
  4138. function() { AutoUpdater_132329.call(true,true); }
  4139. );
  4140. $('#trResetWidgets').click(
  4141. function() { resetGuardWidget(); resetPresetWidget(); }
  4142. );
  4143.  
  4144. $('#trSalAnyCity').change( function(){
  4145. salvageData.anyCity = document.getElementById('trSalAnyCity').checked;
  4146. saveSalvageData();
  4147. });
  4148.  
  4149. $('#trSalUpgradeFirst').change( function(){
  4150. salvageData.upgradeFirst = document.getElementById('trSalUpgradeFirst').checked;
  4151. saveSalvageData();
  4152. });
  4153.  
  4154. $('#trSalUpgradeManual').change( function(){
  4155. salvageData.upgradeManual = document.getElementById('trSalUpgradeManual').checked;
  4156. saveSalvageData();
  4157. });
  4158.  
  4159. // set the upgrade quality limit widget
  4160. $("#trSalUpgradeQuality").val(salvageData.upgradeFirstQual);
  4161. $("#trSalUpgradeQuality").change( function() { salvageData.upgradeFirstQual = $("#trSalUpgradeQuality").val(); saveSalvageData();});
  4162.  
  4163. $("#trMaxStone").change ( function() {
  4164. salvageData.maxStones = $("#trMaxStone").val();
  4165. saveSalvageData();
  4166. });
  4167.  
  4168. $('#trUpRefresh').change( function(){
  4169. upgradeData.retryInterval = parseInt(document.getElementById('trUpRefresh').value);
  4170. if (upgradeData.retryInterval < 15) upgradeData.retryInterval = 15;
  4171. saveUpgradeData();
  4172. });
  4173.  
  4174. $("#trMinStone").change ( function() {
  4175. upgradeData.minStones = $("#trMinStone").val();
  4176. saveUpgradeData();
  4177. });
  4178.  
  4179. $("#trLoadRules").click(function () {
  4180. var d = $("#trLoadDomain").val();
  4181. if (d != null)
  4182. loadSalvageData(d);
  4183. });
  4184.  
  4185. // set the overflow widget
  4186. $("#trOverflow").val(salvageData.overflow);
  4187. $("#trOverflow").change( function() { salvageData.overflow = $("#trOverflow").val(); saveSalvageData();});
  4188.  
  4189.  
  4190. // read the preset names and descriptions
  4191. $("input.trNameEntry").change(function () {
  4192. var id= $(this).attr('id');
  4193. var num = id.split("trPresetName")[1];
  4194. presetData.ids[num]= $(this).val();
  4195. savePresetData();
  4196. Tabs.organizer.init(Tabs.organizer.myDiv);
  4197. });
  4198.  
  4199. $("input.trDescEntry").change (function () {
  4200. var id= $(this).attr('id');
  4201. var num = id.split("trPresetDesc")[1];
  4202. presetData.desc[num]= $(this).val();
  4203. savePresetData();
  4204. Tabs.organizer.init(Tabs.organizer.myDiv);
  4205. });
  4206.  
  4207. $('#trNoTooltips').change( function(){
  4208. presetData.noTooltips = document.getElementById('trNoTooltips').checked;
  4209. savePresetData();
  4210. Tabs.organizer.show();
  4211.  
  4212. });
  4213.  
  4214. $("#trNumPresets").change ( function() {
  4215. var newNum = $("#trNumPresets").val();
  4216. if (presetData.num_presets != newNum)
  4217. {
  4218. presetData.num_presets = newNum;
  4219. t.init(t.myDiv);
  4220. savePresetData();
  4221. Tabs.organizer.init(Tabs.organizer.myDiv);
  4222. }
  4223. });
  4224.  
  4225.  
  4226. disableAnimation(upgradeData.disableAnim);
  4227. },
  4228.  
  4229.  
  4230. show : function () {
  4231.  
  4232. },
  4233.  
  4234. hide : function () {
  4235.  
  4236. }
  4237.  
  4238. }
  4239.  
  4240. /** ***************** Throne upgrade ********************* */
  4241.  
  4242. Tabs.upgrader = {
  4243. tabOrder: 100,
  4244. tabLabel: 'Upgrade',
  4245. tabDisabled : false,
  4246. myDiv : null,
  4247. repairId : 0,
  4248. repairEnd : 0,
  4249. timerH : null,
  4250. clearTimerH : null,
  4251. qualities : [ uW.g_js_strings ? uW.g_js_strings.throneRoom.simple: "Simple",
  4252. uW.g_js_strings ? uW.g_js_strings.throneRoom.common : "Common",
  4253. uW.g_js_strings ? uW.g_js_strings.throneRoom.uncommon : "Uncommon",
  4254. uW.g_js_strings ? uW.g_js_strings.throneRoom.rare : "Rare",
  4255. uW.g_js_strings ?uW.g_js_strings.throneRoom.epic : "Epic",
  4256. uW.g_js_strings ?uW.g_js_strings.throneRoom.wondrous : "Wondrous"],
  4257. upgradePath : {
  4258. 0: {maxLev: 2, nextQual: 2 },
  4259. 1: {maxLev: 2, nextQual: 2 },
  4260. 2: {maxLev: 3, nextQual: 4 },
  4261. 3: {maxLev: 3, nextQual: 4 },
  4262. 4: {maxLev: 4, nextQual: 5 }
  4263. },
  4264.  
  4265. repaint : function() {
  4266. var t = Tabs.upgrader;
  4267. t.init(t.myDiv);
  4268. },
  4269.  
  4270. init : function (div){
  4271. var t = Tabs.upgrader;
  4272. t.myDiv = div;
  4273.  
  4274. if (unsafeWindow.g_js_strings)
  4275. {
  4276. t.qualities = [ unsafeWindow.g_js_strings.throneRoom.simple,
  4277. unsafeWindow.g_js_strings.throneRoom.common,
  4278. unsafeWindow.g_js_strings.throneRoom.uncommon,
  4279. unsafeWindow.g_js_strings.throneRoom.rare,
  4280. unsafeWindow.g_js_strings.throneRoom.epic,
  4281. unsafeWindow.g_js_strings.throneRoom.wondrous];
  4282. }
  4283.  
  4284. // header stuff
  4285. var m = '<Div id=trfield><DIV id=trUpgrader class=trStat>AUTOMATED UPGRADER</div><TABLE id=trupgrader width=100% height=0% class=trTab>';
  4286. m+= '</table></div>';
  4287.  
  4288. //
  4289. m += '<TABLE width=100% id=trupdtable class=trTabPad>';
  4290.  
  4291. m += '<tr>';
  4292. if (upgradeData.active == false) {
  4293. m += '<TD width=25%><div><INPUT id=trUpgraderPower type=button value="Upgrade = OFF"/></div></td>';
  4294. } else {
  4295. m += '<TD width=25%><div><INPUT id=trUpgraderPower type=button value="Upgrader = ON"/></div></td>';
  4296. }
  4297.  
  4298. m += '<td width=25%><INPUT id=trOneItem type=checkbox '+ (queueData.oneItem ? ' CHECKED':'') +'/> Upgrade 1 at a time</td>';
  4299. m += '<td width=25%><INPUT id=trRepairAll type=checkbox '+ (upgradeData.repairAll?' CHECKED':'') +'/> Repair all TR items</td>';
  4300. m += '<td width=25%/></tr>';
  4301.  
  4302. m += ' <tr><td colspan=3><div ><b>City to use aetherstones from: </b><span id="trUpgradeCity"></span></div></td>';
  4303. m += ' <td><div id=trStoneRemain></div></td></tr>';
  4304. m += '<tr><td colspan=4><hr></td></tr>';
  4305. m += '<tr align="center"><td colspan=4><div id=trUpgradeStatus class=indent25> <br> </div></td></tr>';
  4306. m += '<tr align="center"><td colspan=4><div id=trLastResult class=indent25> <br> </div></td></tr>';
  4307. m += '<tr><td colspan=4><hr></td></tr></table>';
  4308.  
  4309. m += '<TABLE id=trupdtable2 class=trTabPad>';
  4310. m += '<tr><td><div style="max-width:90%;">Item: <select id="trUpgradeList" style="width: 80%;">';
  4311. m += '<option value="0">--Items--</option>';
  4312. for (k in unsafeWindow.kocThroneItems) {
  4313. var throne_item = unsafeWindow.kocThroneItems[k];
  4314. m += '<option value="'+k+'">'+throne_item.name+' [ ' + throne_item.id +' ] </option>';
  4315. }
  4316. m += '</select></div></td>';
  4317.  
  4318. m += '<td><div id=trActionDiv>Action: <select id="trAction">';
  4319. m += '<option value="upgrade">Upgrade</option>';
  4320. m += '<option value="enhance">Enhance</option>';
  4321. m += '<option value="both">Both</option>';
  4322. m += '</select></div></td>';
  4323. m += '<td><div id=trMaxDiv></div></td>';
  4324.  
  4325. m += "<td><div><INPUT id=trQueueAdd type=button value='Add'/></div></td></tr>";
  4326. m += '<tr><td colspan=4><hr/</td></tr>';
  4327. m += '<tr><td colspan=4><div id=trQScroll style=" position: static; width: 700px; height: 300px; overflow-x: visible; overflow-y: auto;"><div id=trQDiv /></div></td></tr>';
  4328.  
  4329. 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>';
  4330. m += '</table>';
  4331.  
  4332. m+='</div>';
  4333. t.myDiv.innerHTML = m;
  4334.  
  4335. $('#trClearQ').click( function() {
  4336. queueData.list =[];
  4337. saveQueueData();
  4338. Tabs.upgrader.buildQueueDisplay();
  4339. });
  4340.  
  4341. $("#trQScroll").resizable({
  4342. minWidth: 710,
  4343. maxWidth: 1200,
  4344. minHeight: 200,
  4345. maxHeight: 800,
  4346. stop: function(event, ui) {
  4347. upgradeData.upgradeH = ui.size.height + 'px';
  4348. upgradeData.upgradeW = ui.size.width + 'px';
  4349. saveUpgradeData();
  4350. }
  4351. });
  4352.  
  4353. $("#trQScroll").css('height', upgradeData.upgradeH).css('width', upgradeData.upgradeW);
  4354.  
  4355. $("#trpplink")
  4356. .attr('href', 'https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=FDW4NZ6PRMDMJ&lc=US&item_name=TR%20Organizer%20Donations&item_number=1001&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted')
  4357. .attr('target', '_blank');
  4358. $("#trpp")
  4359. .attr( 'src', 'https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif')
  4360. .attr( 'alt', 'dontae')
  4361. .css( 'cursor', 'pointer');
  4362.  
  4363. document.getElementById('trUpgraderPower').addEventListener('click', function(){t.togglePower(this);} , false);
  4364.  
  4365. document.getElementById('trRepairAll').addEventListener('change', function(){
  4366. upgradeData.repairAll = document.getElementById('trRepairAll').checked;
  4367. saveUpgradeData();
  4368. }, false);
  4369.  
  4370. document.getElementById('trAnyCity').addEventListener('change', function(){
  4371. upgradeData.anyCity = document.getElementById('trAnyCity').checked;
  4372. saveUpgradeData();
  4373. }, false);
  4374.  
  4375. new CdispCityPicker ('trupcitysel', document.getElementById('trUpgradeCity'), true, t.e_CityButton, upgradeData.uCityNum);
  4376.  
  4377. // wait for the current repair to finish before starting
  4378. t.setStones( Seed.resources["city" + Seed.cities[upgradeData.uCityNum][0]]["rec5"][0]);
  4379. t.setStatus("Loading ....");
  4380.  
  4381. //$(div).append(m);
  4382. $("#trQDiv").html('<div><table id="trQueue" class="trTabLined" width="100%"/></div>');
  4383.  
  4384. $("#trQueueAdd").click( function () { t.addQueue();});
  4385. $("#trOneItem").change( function () {
  4386. queueData.oneItem = document.getElementById('trOneItem').checked;
  4387. saveQueueData();
  4388. });
  4389.  
  4390.  
  4391. var d = 2 + Math.random() * 8;
  4392. if (Seed.queue_throne != null && Seed.queue_throne.end != null)
  4393. {
  4394. var repairTimeLeft = Seed.queue_throne.end- unixTime();
  4395. t.repairEnd = Seed.queue_throne.end;
  4396. t.repairId = Seed.queue_throne.itemId;
  4397. var n = new Date(t.repairEnd *1000);
  4398.  
  4399. t.setStatus("Waiting until " + n.toLocaleTimeString() + " for repair to complete. Item: " + unsafeWindow.kocThroneItems[t.repairId].name);
  4400. setTimeout(t.clearRepair, (repairTimeLeft+1)*1000);
  4401. if (repairTimeLeft >0) d += repairTimeLeft;
  4402. }
  4403.  
  4404. t.buildLevelWidget();
  4405. t.buildQueueDisplay();
  4406. $("#trAction").change( function() {t.buildLevelWidget();});
  4407.  
  4408.  
  4409. if (t.timerH == null)
  4410. t.timerH = setTimeout(t.doAction, d*1000);
  4411.  
  4412. },
  4413.  
  4414. e_CityButton : function (city, x, y){
  4415. var t = Tabs.upgrader;
  4416. upgradeData.uCityNum = city.idx;
  4417. saveUpgradeData();
  4418. t.setStones(Seed.resources["city" + Seed.cities[upgradeData.uCityNum][0]]["rec5"][0]);
  4419. },
  4420.  
  4421. addUpgradeItem : function(id) {
  4422. var t = Tabs.upgrader;
  4423. var qItem = new QueueItem();
  4424. qItem.item = id;
  4425. qItem.action = "upgrade";
  4426. qItem.level = maxTrLevel;
  4427. queueData.list.push(qItem);
  4428. saveQueueData();
  4429. $("div#throneInventoryItem" + id).addClass('blueBorder');
  4430. $("div#trCardItem" + id).find("div.trCard").addClass("blueBorder2");
  4431. t.buildQueueDisplay();
  4432. },
  4433.  
  4434. addEnhanceItem : function(id) {
  4435. var t = Tabs.upgrader;
  4436. var qItem = new QueueItem();
  4437. qItem.item = id;
  4438. qItem.action = "enhance";
  4439. qItem.level = 5;
  4440. queueData.list.push(qItem);
  4441. saveQueueData();
  4442. $("div#throneInventoryItem" + id).addClass('yellowBorder');
  4443. $("div#trCardItem" + id).find("div.trCard").addClass("yellowBorder2");
  4444. t.buildQueueDisplay();
  4445. },
  4446.  
  4447. addBothItem : function (id) {
  4448. var t = Tabs.upgrader;
  4449.  
  4450. var throne_item = unsafeWindow.kocThroneItems[id];
  4451. if (!throne_item)
  4452. {
  4453. logit("Unable to find throne item.");
  4454. return;
  4455. }
  4456.  
  4457. var qual = +throne_item.quality;
  4458. var lev = +throne_item.level;
  4459.  
  4460. if (qual >= 5) {
  4461. logit("Item already at wondrous");
  4462. return;
  4463. }
  4464.  
  4465. var maxLev = null;
  4466. var nextQual = null;
  4467. var qItem = null;
  4468.  
  4469. while (qual < 5) {
  4470. maxLev = t.upgradePath[qual].maxLev;
  4471. nextQual = t.upgradePath[qual].nextQual;
  4472.  
  4473. if (lev < maxLev) {
  4474. qItem = new QueueItem();
  4475. qItem.item = id;
  4476. qItem.action = "upgrade";
  4477. qItem.level = maxLev;
  4478. queueData.list.push(qItem);
  4479. $("div#throneInventoryItem" + id).addClass('blueBorder');
  4480. $("div#trCardItem" + id).find("div.trCard").addClass("blueBorder2");
  4481. }
  4482.  
  4483. qItem = new QueueItem();
  4484. qItem.item = id;
  4485. qItem.action = "enhance";
  4486. qItem.level = nextQual;
  4487. queueData.list.push(qItem);
  4488. $("div#throneInventoryItem" + id).addClass('yellowBorder');
  4489. $("div#trCardItem" + id).find("div.trCard").addClass("yellowBorder2");
  4490. lev = maxLev;
  4491. qual = nextQual;
  4492. }
  4493.  
  4494. saveQueueData();
  4495. t.buildQueueDisplay();
  4496. },
  4497.  
  4498. doAction :function ()
  4499. {
  4500. var t = Tabs.upgrader;
  4501. var retryTime = upgradeData.retryInterval;
  4502.  
  4503. try {
  4504. // check if repair is done
  4505. var ti = t.clearRepair();
  4506. if ( ti <= 0)
  4507. {
  4508. // repair is done
  4509. if (queueData.oneItem || (queueData.doingRepairs == true))
  4510. {
  4511. if (upgradeData.repairAll == true)
  4512. {
  4513. var lastBroken = 0;
  4514.  
  4515. // repair everything
  4516. for (k in unsafeWindow.kocThroneItems)
  4517. {
  4518. var throne_item = unsafeWindow.kocThroneItems[k];
  4519. if (!throne_item) continue;
  4520. if (throne_item.isBroken)
  4521. {
  4522. lastBroken = throne_item.id;
  4523. }
  4524. }
  4525.  
  4526. // repair from the botton up. This forces the items broken in the +1 upgrades to be fixed first so the salvager can continue
  4527. if (lastBroken != 0)
  4528. {
  4529. t.doRepair(lastBroken);
  4530. clearTimeout(t.timerH);
  4531. t.timerH = setTimeout(t.doAction, retryTime*1000);
  4532. return;
  4533. }
  4534. } else {
  4535. // repair first broken item in queue
  4536. for (k in queueData.list)
  4537. {
  4538. var q = queueData.list[k];
  4539. if (!q) continue;
  4540. var throne_item = unsafeWindow.kocThroneItems[q.item];
  4541. if ((throne_item == null) || (queueData.list[k].status == "complete"))
  4542. continue;
  4543.  
  4544. if ( throne_item.isBroken )
  4545. {
  4546. t.doRepair(throne_item.id);
  4547. clearTimeout(t.timerH);
  4548. t.timerH = setTimeout(t.doAction, retryTime*1000);
  4549. return;
  4550. } else if (queueData.oneItem) {
  4551. break;
  4552. }
  4553. }
  4554. }
  4555. }
  4556.  
  4557. // all repairs complete
  4558. queueData.doingRepairs = false;
  4559. // set the index
  4560. t.selectNext();
  4561. saveQueueData();
  4562.  
  4563. // if we reach the end of the queue, start repair cycle
  4564. if (queueData.index <0) {
  4565. t.setStatus("Reached end of queue.")
  4566. queueData.doingRepairs = true;
  4567. saveQueueData();
  4568. clearTimeout(Tabs.upgrader.timerH);
  4569. t.timerH = setTimeout(t.doAction, retryTime*1000);
  4570. return;
  4571. }
  4572.  
  4573. // upgrade/enhance next item
  4574. var qItem = queueData.list[queueData.index];
  4575.  
  4576. if (qItem) {
  4577. //qItem.triesTotal++;
  4578. //qItem.triesThis++;
  4579.  
  4580. if (qItem.action == "enhance")
  4581. t.doEnhance(qItem.item);
  4582. else
  4583. t.doUpgrade(+qItem.item, false);
  4584. }
  4585. } else {
  4586. // come back after repair is complete
  4587. retryTime = ti + 5;
  4588. var n = new Date(t.repairEnd *1000);
  4589. t.setStatus("Waiting until " + n.toLocaleTimeString() + " for repair to complete. Item: " + unsafeWindow.kocThroneItems[t.repairId].name);
  4590. }
  4591. unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
  4592. } catch(e) {
  4593. logit("do action exception");
  4594. logit ("exception: " + inspect(e,3,1));
  4595. }
  4596. // recycle
  4597. clearTimeout(Tabs.upgrader.timerH);
  4598. t.timerH = setTimeout(t.doAction, retryTime*1000);
  4599. },
  4600.  
  4601. selectNext : function () {
  4602.  
  4603. if (queueData.index >= queueData.list.length) queueData.index = 0;
  4604. if (queueData.index < 0) queueData.index = 0;
  4605.  
  4606. // for single item mode, always start from the top
  4607. if (queueData.oneItem) queueData.index = 0;
  4608.  
  4609. var l = queueData.list.length;
  4610. for (i=queueData.index; i < l; i++ ) {
  4611. var item = queueData.list[i];
  4612. if (!item) continue;
  4613. //var id = item.item;
  4614. var throne_item = unsafeWindow.kocThroneItems[item.item];
  4615. if ( (queueData.list[i].status != "complete")
  4616. && ( throne_item != null)
  4617. && (!throne_item.isBroken) )
  4618. {
  4619. if ( ((item.action == "enhance") && (item.level <= throne_item.quality)) ||
  4620. ((item.action == "upgrade") && (item.level <= throne_item.level)) ) {
  4621. item.status = "complete";
  4622. } else {
  4623. queueData.index = i;
  4624. return;
  4625. }
  4626. }
  4627. }
  4628.  
  4629. // if we get here, the queue is complete
  4630. queueData.index = -1;
  4631. },
  4632.  
  4633. doEnhance : function(eItem) {
  4634. var t = Tabs.upgrader;
  4635. try {
  4636. if (upgradeData.active == false || eItem ==0)
  4637. {
  4638. t.setStatus("Powered off");
  4639. return;
  4640. }
  4641. var y = unsafeWindow.kocThroneItems[eItem];
  4642.  
  4643. if (!y) return;
  4644.  
  4645. if (y.isBroken)
  4646. {
  4647. // repair and then try again later
  4648. t.doRepair(eItem);
  4649. return;
  4650. }
  4651.  
  4652. var num_city = t.pickCity();
  4653. if ( num_city < 0)
  4654. {
  4655. t.setStatus("Not enough aetherstones to enhance. Minimum of " + upgradeData.minStones + " needed. Waiting for more ...");
  4656. return;
  4657. }
  4658.  
  4659. var t_city = unsafeWindow.currentcityid;
  4660. unsafeWindow.currentcityid = Seed.cities[num_city][0];
  4661. var w = unsafeWindow.cm.ThronePanelController.calcCost("enhance", y, null, "stones");
  4662. unsafeWindow.currentcityid = t_city;
  4663.  
  4664. if ( (w.gems.use > 0) || (w.stones.total > parseInt(Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0]) ))
  4665. {
  4666. t.setStatus("Not enough aetherstones to enhance.");
  4667. return;
  4668. }
  4669.  
  4670. var qI = queueData.list[queueData.index];
  4671. if (qI)
  4672. {
  4673.  
  4674. qI.triesTotal++;
  4675. qI.triesThis++;
  4676. }
  4677.  
  4678. var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams);
  4679. params.ctrl = 'throneRoom\\ThroneRoomServiceAjax';
  4680. params.action = 'upgradeQuality';
  4681. params.throneRoomItemId = eItem;
  4682.  
  4683. params.payment = "aetherstone";
  4684. params.buffItemId = 0;
  4685. params.cityId = Seed.cities[num_city][0];
  4686.  
  4687. //logit("Sending enhance request");
  4688. t.setStatus("Sending enhance request");
  4689. new AjaxRequest(unsafeWindow.g_ajaxpath + "ajax/_dispatch53.php" + unsafeWindow.g_ajaxsuffix, {
  4690. method: "post",
  4691. parameters: params,
  4692. loading: true,
  4693. onSuccess: function (transport) {
  4694. try {
  4695. //logit("enhance request sucess");
  4696. //logit("transport: " + inspect(transport,3,1));
  4697. var rslt = eval("(" + transport.responseText + ")");
  4698. //logit("rslt: " + inspect(rslt,3,1));
  4699. if(rslt.ok){
  4700. Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0] = Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0] - rslt.aetherstones;
  4701. if (rslt.gems > 0)
  4702. {
  4703. trActionLog('Upgrader accidentally spent gems! Upgrader turned off');
  4704. t.setStatus("Error ... shutting down");
  4705. upgradeData.active = false;
  4706. saveUpgradeData();
  4707. }
  4708.  
  4709.  
  4710. if (rslt.success)
  4711. {
  4712. //logit("successful enhancement");
  4713. upgradeStats.enhanceSuccess[y.quality][y.level]++;
  4714. y.level = rslt.item.level;
  4715. y.quality = rslt.item.quality
  4716. y.status = rslt.item.status;
  4717. saveUpgradeStats();
  4718. y.name = y.createName();
  4719. Tabs.upgrader.repaint();
  4720. t.setResult("Enhance successful. " + addCommas(rslt.aetherstones) + " aetherstones used.");
  4721. t.setStones(Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0]);
  4722. t.setStatus("Attempting next action");
  4723. unsafeWindow.cm.sounds.play("tr_success_build");
  4724. // update the cost line
  4725. var qItem = queueData.list[queueData.index];
  4726. if (qItem)
  4727. {
  4728. var now = new Date();
  4729. qItem.lastUpgrade = "Enhanced to " + Tabs.upgrader.qualities[y.quality] + " " + now.toDateString().substring(3,10) + " " + now.toTimeString().substring(0,8) + " in " + qItem.triesThis + " attempts";
  4730. if (!qItem.upgrades) qItem.upgrades = [];
  4731. qItem.upgrades.push(qItem.lastUpgrade);
  4732.  
  4733. var msg = 'Enhanced '+unsafeWindow.kocThroneItems[eItem].name + ' [ ' + eItem + '] to quality ' + rslt.item.quality+ " in " + qItem.triesThis + " attempts. " + qItem.triesTotal + " total attempts for this item.";
  4734. trSuccessLog(msg);
  4735. if (upgradeData.whisperToMe) sendChat("/"+ Seed.player.name +' ' + msg);
  4736.  
  4737. if (qItem.level <= y.quality) {
  4738. qItem.status = "complete";
  4739. upgradeData.newUpgradeState = 2;
  4740. }
  4741. else {
  4742. var now = new Date();
  4743. qItem.status = "Partially enhanced";
  4744. qItem.triesLast = qItem.triesThis;
  4745. qItem.triesThis = 0;
  4746. if (upgradeData.newUpgradeState !=2 ) upgradeData.newUpgradeState =1;
  4747. }
  4748. saveUpgradeData();
  4749. setUpgradeColor();
  4750. }
  4751. saveQueueData();
  4752. Tabs.upgrader.buildQueueDisplay();
  4753. clearTimeout(Tabs.upgrader.timerH);
  4754. t.timerH = setTimeout(t.doAction, 10* 1000);
  4755. }
  4756. else
  4757. {
  4758. //logit("enhance failed");
  4759. trActionLog('Enhance failed Throne room item '+unsafeWindow.kocThroneItems[eItem].name);
  4760. upgradeStats.enhanceFailure[y.quality][y.level]++;
  4761. y.level = rslt.item.level;
  4762. y.quality = rslt.item.quality;
  4763. y.status = rslt.item.status;
  4764. saveUpgradeStats();
  4765. if (rslt["break"])
  4766. {
  4767. y.isBroken = true;
  4768. y.brokenType = "quality";
  4769. }
  4770. y.name = y.createName();
  4771. t.setResult("Enhance failed. " + addCommas(rslt.aetherstones) + " aetherstones used");
  4772. t.setStones(Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0]);
  4773. //t.setStatus("Starting repair ...");
  4774. var qItem = queueData.list[queueData.index];
  4775. if (qItem) if (qItem.status == "not started") qItem.status = "started";
  4776. saveQueueData();
  4777. Tabs.upgrader.buildQueueDisplay();
  4778. clearTimeout(Tabs.upgrader.timerH);
  4779. Tabs.upgrader.timerH = setTimeout(t.doAction, 10*1000);
  4780. //t.doRepair(y.id);
  4781. }
  4782. unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
  4783. //if (rslt.heatupModifier) unsafeWindow.cm.HeatUpModel.attemptCallback(+(rslt.heatupModifier));
  4784. }
  4785. else
  4786. {
  4787. logit("enhance error");
  4788. logit("Enhance result:" + inspect (rslt, 3, 1));
  4789. t.setStatus("Unable to enhance at this time ... waiting for next cycle");
  4790.  
  4791. }
  4792. } catch (e) {
  4793. //logit("exception: " + inspect(e,3,1));
  4794. }
  4795. return;
  4796. },
  4797. onFailure: function (rst) {
  4798. logit("Enhance request error. Waiting for next cycle.");
  4799. t.setStatus("Unable to send enhance request. Waiting for next cycle");
  4800. logit("result: " + inspect(rst,3,1));
  4801. // try to repair item
  4802. //t.doRepair(y.id);
  4803.  
  4804. return;
  4805. }
  4806. });
  4807. } catch (e) {
  4808. //logit("exception");
  4809. //logit ("exception: "+ inspect(e,5,2,true));
  4810.  
  4811. }
  4812. return;
  4813. },
  4814.  
  4815. doUpgrade : function(uItem, bypass) {
  4816. var t = Tabs.upgrader;
  4817. var y = unsafeWindow.kocThroneItems[uItem];
  4818. if ( uItem ==0 || y == null)
  4819. {
  4820. t.setStatus("Item not found.");
  4821. return;
  4822. }
  4823.  
  4824. if ( (upgradeData.active == false) && (bypass !=true))
  4825. {
  4826. t.setStatus("Powered off.");
  4827. return;
  4828. }
  4829.  
  4830. if (bypass == true && Tabs.throneSalvage.deleting != true)
  4831. {
  4832. // delete cycle has been canceled. Don't upgrade this item
  4833. return;
  4834. }
  4835.  
  4836. if (y.isBroken)
  4837. {
  4838. // repair and then try again later
  4839. t.doRepair(uItem);
  4840. return;
  4841. }
  4842.  
  4843. var num_city = t.pickCity();
  4844. if ( num_city < 0)
  4845. {
  4846. t.setStatus("Not enough aetherstones to upgrade. Minimum of " + upgradeData.minStones + " needed. Waiting for more ...");
  4847. return;
  4848. }
  4849.  
  4850. var t_city = unsafeWindow.currentcityid;
  4851. unsafeWindow.currentcityid = Seed.cities[num_city][0];
  4852. var w = unsafeWindow.cm.ThronePanelController.calcCost("upgrade", y, null, "stones");
  4853. unsafeWindow.currentcityid = t_city;
  4854.  
  4855. if ( (w.gems.use > 0) || (w.stones.total > parseInt(Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0]) ))
  4856. {
  4857. t.setStatus("Not enough aetherstones to upgrade.");
  4858. return;
  4859. }
  4860.  
  4861. if (bypass != true)
  4862. {
  4863. var qI = queueData.list[queueData.index];
  4864. if (qI)
  4865. {
  4866. qI.triesTotal++;
  4867. qI.triesThis++;
  4868. }
  4869.  
  4870. t.setStatus("Sending upgrade request ...");
  4871. }
  4872.  
  4873. var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams);
  4874. params.ctrl = 'throneRoom\\ThroneRoomServiceAjax';
  4875. params.action = 'upgradeLevel';
  4876. params.throneRoomItemId = uItem;
  4877. params.buffItemId = 0;
  4878. params.payment = "aetherstone";
  4879. params.cityId = Seed.cities[num_city][0];
  4880.  
  4881.  
  4882. new AjaxRequest(unsafeWindow.g_ajaxpath + "ajax/_dispatch53.php" + unsafeWindow.g_ajaxsuffix, {
  4883. method: "post",
  4884. parameters: params,
  4885. loading: true,
  4886. onSuccess: function (transport) {
  4887. try {
  4888.  
  4889. //logit("transport: " + inspect(transport,3,1));
  4890. var rslt = eval("(" + transport.responseText + ")");
  4891. if(rslt.ok){
  4892. Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0] = Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0] - rslt.aetherstones;
  4893.  
  4894. if (rslt.gems > 0)
  4895. {
  4896. t.setStatus("Error .... Shutting down.");
  4897. trActionLog('Upgrader accidentally spent gems! Upgrader turned off');
  4898. upgradeData.active = false;
  4899. saveUpgradeData();
  4900. }
  4901.  
  4902. if (rslt.success)
  4903. {
  4904. //logit("upgrade successful");
  4905. t.setStones(Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0]);
  4906. y.level = rslt.item.level;
  4907. y.quality = rslt.item.quality;
  4908. y.name = y.createName();
  4909.  
  4910. if (bypass !=true)
  4911. {
  4912. upgradeStats.upgradeSuccess[y.quality][y.level]++;
  4913. saveUpgradeStats();
  4914. Tabs.upgrader.repaint();
  4915.  
  4916. t.setResult("Upgrade successful. " + addCommas(rslt.aetherstones) + " aetherstones used.");
  4917. t.setStatus("Attempting next upgrade");
  4918. unsafeWindow.cm.sounds.play("tr_success_build");
  4919.  
  4920. var qItem = queueData.list[queueData.index];
  4921. if (qItem) {
  4922. var now = new Date();
  4923. qItem.lastUpgrade = "Upgraded to +" + y.level + " " + now.toDateString().substring(3,10) + " "+ now.toTimeString().substring(0,8) + " in " + qItem.triesThis + " attempts";
  4924.  
  4925. if (!qItem.upgrades) qItem.upgrades = [];
  4926. qItem.upgrades.push (qItem.lastUpgrade);
  4927.  
  4928. var msg = 'Upgraded '+unsafeWindow.kocThroneItems[uItem].name + ' [' + uItem + '] to level ' + rslt.item.level + " in " + qItem.triesThis + " attempts. " + qItem.triesTotal + " total attempts for this item.";
  4929. if (upgradeData.whisperToMe) sendChat("/"+ Seed.player.name +' ' + msg);
  4930. trSuccessLog(msg);
  4931. if (qItem.level <= y.level) {
  4932. qItem.status = "complete";
  4933. upgradeData.newUpgradeState =2;
  4934. }
  4935. else {
  4936. var now = new Date();
  4937. qItem.status = "Partially upgraded";
  4938. qItem.triesLast = qItem.triesThis;
  4939. qItem.triesThis = 0;
  4940. if (upgradeData.newUpgradeState !=2) upgradeData.newUpgradeState = 1;
  4941. }
  4942. saveUpgradeData();
  4943. setUpgradeColor();
  4944. }
  4945. saveQueueData();
  4946. Tabs.upgrader.buildQueueDisplay();
  4947. clearTimeout(Tabs.upgrader.timerH);
  4948. Tabs.upgrader.timerH = setTimeout(Tabs.upgrader.doAction, 10* 1000);
  4949. }
  4950. }
  4951. else
  4952. {
  4953. logit("upgrade failed");
  4954. t.setStones(Seed.resources["city" + Seed.cities[num_city][0]]["rec5"][0]);
  4955. trActionLog('Upgrade failed Throne room item '+unsafeWindow.kocThroneItems[uItem].name);
  4956. if (rslt["break"]) {
  4957. y.isBroken = true;
  4958. y.brokenType = "level";
  4959. }
  4960. y.status = rslt.item.status;
  4961. y.name = y.createName();
  4962. if (bypass !=true)
  4963. {
  4964. upgradeStats.upgradeFailure[y.quality][y.level]++;
  4965. saveUpgradeStats();
  4966. t.setResult("Upgrade failed. " + addCommas(rslt.aetherstones) + " aetherstones used");
  4967.  
  4968. //t.setStatus("Starting repair ... ");
  4969. var qItem = queueData.list[queueData.index];
  4970. if (qItem.status == "not started") qItem.status = "started";
  4971. saveQueueData();
  4972. Tabs.upgrader.buildQueueDisplay();
  4973. //t.doRepair(uItem); // fix item
  4974. clearTimeout(Tabs.upgrader.timerH);
  4975. Tabs.upgrader.timerH = setTimeout(Tabs.upgrader.doAction, 10*1000);
  4976. }
  4977. }
  4978. unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
  4979. if (rslt.heatupModifier) unsafeWindow.cm.HeatUpModel.attemptCallback(+(rslt.heatupModifier));
  4980. return;
  4981. }
  4982. else
  4983. {
  4984. //logit("upgrade not ok");
  4985. //logit("result: " + inspect(rslt,3,1));
  4986.  
  4987. if (bypass !=true)
  4988. {
  4989. t.setStatus("Upgrade request not accepted. Waiting for next cycle.");
  4990. } else {
  4991. if (rslt.msg && rslt.msg.indexOf("Has status 2") > -1)
  4992. {
  4993. // the object is in the locked rows. Shutdown deleting until the next pass
  4994. Tabs.throneSalvage.delItems = [];
  4995. Tabs.throneSalvage.deleting = false;
  4996. logit("Reached locked items. Salvaging complete.");
  4997. }
  4998. }
  4999.  
  5000. logit("Upgrade result:" + inspect (rslt, 3, 1));
  5001.  
  5002. }
  5003. } catch (e) {
  5004. //logit("upgrade exception");
  5005. // logit("Exception: " + inspect(e,3,1));
  5006. }
  5007. return;
  5008. },
  5009. onFailure: function (rrr) {
  5010. logit("upgrade failure");
  5011. logit("RRR: " + inspect(rrr,3,1));
  5012.  
  5013. t.setStatus("Unable to transmitt upgrade request. Waiting for next cycle.");
  5014. unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
  5015.  
  5016.  
  5017. return;
  5018. }
  5019. });
  5020.  
  5021. return;
  5022. },
  5023.  
  5024. addQueue : function () {
  5025. var t = Tabs.upgrader;
  5026.  
  5027. var action = $("#trAction").val();
  5028.  
  5029. if (action == "both") {
  5030. t.addBothItem($("#trUpgradeList").val());
  5031. return;
  5032. }
  5033.  
  5034. var qItem = new QueueItem();
  5035. qItem.item = $("#trUpgradeList").val();
  5036. qItem.action = $("#trAction").val();
  5037. qItem.level = $("#trMaxLevel").val();
  5038.  
  5039. if (qItem.item == 0) return;
  5040.  
  5041. queueData.list.push(qItem);
  5042. saveQueueData();
  5043. t.buildQueueDisplay();
  5044. },
  5045.  
  5046. buildLevelWidget : function () {
  5047. var t = Tabs.upgrader;
  5048. var m;
  5049. if ($("#trAction").val() == "enhance") {
  5050. m = '<div id=trMaxDiv> Max: <select id="trMaxLevel">';
  5051. for (i =1; i <=5; i++) {
  5052. m += '<option value="' + i + '">' + t.qualities[i] + '</option>';
  5053. }
  5054. m += '</select></div>';
  5055. } else if ($("#trAction").val() == "upgrade") {
  5056. m = '<div id=trMaxDiv> Max: <select id="trMaxLevel">';
  5057. for (i =1; i <= maxTrLevel; i++) {
  5058. m += '<option value="' + i + '"> +' + i + '</option>';
  5059. }
  5060. m += '</select></div>';
  5061. } else {
  5062. m = '<div id=trMaxDiv> - <select id="trMaxLevel">';
  5063. m += '</select></div>';
  5064. }
  5065.  
  5066. $("#trMaxDiv").html(m);
  5067. if ($("#trAction").val() == "enhance") {
  5068. $("#trMaxLevel").val(5);
  5069. } else if ($("#trAction").val() == "upgrade") {
  5070. $("#trMaxLevel").val(maxTrLevel);
  5071. }
  5072.  
  5073. },
  5074.  
  5075. buildQueueDisplay : function () {
  5076. var t = Tabs.upgrader;
  5077. $("#trQueue").html("<table id='trQueue' width='100%' class=trTabPad/>");
  5078. $("#trQueue").append("<tr><th width=5%>Reorder</th><th width='8%'>Status</th><th width='25%'>Item</th><th width='5%'>Action</th><th width='5%'>Max</th><th width='40%'>Status/Last Upgrade/Attempts</th><th width='10%'>Remove</th></tr>");
  5079.  
  5080. for (ii in queueData.list) {
  5081. var q = queueData.list[ii];
  5082. if (!q) continue;
  5083. var the_item = unsafeWindow.kocThroneItems[q.item];
  5084.  
  5085. var name = "Unknown / Item removed";
  5086. var id = 0;
  5087.  
  5088. if (the_item)
  5089. {
  5090. name = the_item.name;
  5091. id = the_item.id;
  5092. }
  5093.  
  5094. var m = "<tr><td><div class='trup' id=trUpRow" + ii +" /><div class='trdown' id=trDownRow" + ii +" /></td>"
  5095. + "<td><div id=trState" + ii +"></div></td><td class=trUpdaterItemName id=trUpdaterItem" + id + " >"
  5096. + name + " [" +id + "]" + "</td><td>" + q.action + "</td><td>";
  5097.  
  5098. if (q.action =="enhance") {
  5099. m += '<div style="text-align: center;"><select id="trChangeLevel' + ii +'" style="width:90px; text-align: center;">';
  5100. for (i =1; i <=5; i++) {
  5101. m += '<option value="' + i + '" '+ (q.level==i ? 'selected' : '' ) +'>' + t.qualities[i] + '</option>';
  5102. }
  5103. m += '</select></div>';
  5104. } else {
  5105. m += '<div style="text-align: center;"><select id="trChangeLevel' + ii +'" style="width:90px; text-align: center;">';
  5106. for (i =1; i <= maxTrLevel; i++) {
  5107. m += '<option value="' + i + '" '+ (q.level==i ? 'selected' : '' ) +'> +' + i + '</option>';
  5108. }
  5109. m += '</select></div>';
  5110. }
  5111.  
  5112. m += "</td><td style='text-align: center; white-space: pre-wrap;'>" + q.status + " / ";
  5113. if (q.lastUpgrade) m += q.lastUpgrade;
  5114.  
  5115. m += " / " + q.triesThis + " tries this level, " + q.triesTotal + " tries total"
  5116.  
  5117. m += "</td>";
  5118. m += "<td><div><div id=trQueueRemove" + ii + " class=trremove/></div></td></tr>";
  5119.  
  5120. $("#trQueue").append(m);
  5121. }
  5122.  
  5123. for (var j=0; j < queueData.list.length; j++)
  5124. {
  5125. var q = queueData.list[j];
  5126. if (!q) continue;
  5127. var the_item = unsafeWindow.kocThroneItems[q.item];
  5128.  
  5129. $("#trQueueRemove"+j).attr('v1', j);
  5130. $("#trQueueRemove"+j).click( function () {t.deleteQueueItem( $(this).attr('v1') );});
  5131.  
  5132. $("#trUpRow"+j).attr('v1', j);
  5133. $("#trUpRow"+j).click( function () { t.moveUpRow(+($(this).attr('v1') ));});
  5134.  
  5135. $("#trDownRow"+j).attr('v1', j);
  5136. $("#trDownRow"+j).click( function () { t.moveDownRow(+($(this).attr('v1') ));});
  5137.  
  5138. $("#trChangeLevel"+j).attr('v1', j);
  5139. $("#trChangeLevel"+j).change( function () { t.changeLevel(+($(this).attr('v1') ), $(this).val() ) });
  5140.  
  5141. if (!the_item || !(the_item.id)) {
  5142. $("#trState"+j).html("<div style='text-align:center'> ??</div>");
  5143. } else if (q.status == "complete") {
  5144. $("#trState"+j).addClass('trsuccess');
  5145. } else if (the_item.isBroken) {
  5146. if (the_item.id == t.repairId) {
  5147. $("#trState"+j).addClass('trhammer');
  5148. } else {
  5149. $("#trState"+j).addClass('trbroken');
  5150. }
  5151. } else {
  5152. $("#trState"+j).html("<div class='trgbtn'/>");
  5153. $("#trState"+j).css('text-align', 'center');
  5154. }
  5155. }
  5156.  
  5157.  
  5158. if (presetData.noTooltips != true)
  5159. {
  5160. $(".trUpdaterItemName").mouseover( function (td) {
  5161.  
  5162. td.stopPropagation();
  5163. var theId = $(this).attr("id").split("trUpdaterItem")[1];
  5164.  
  5165. if (!theId || theId == 0) {
  5166. return;
  5167. }
  5168.  
  5169. var zz;
  5170. if (zz = unsafeWindow.kocThroneItems[theId])
  5171. {
  5172. unsafeWindow.cm.ThroneView.hoverItem(td, this, zz);
  5173. $("#kofcNewTooltipDiv").css('position', 'absolute');
  5174. $("#kofcNewTooltipDiv").css('left', ($("#tr_dialog").position().left+200) + 'px');
  5175. $("#kofcNewTooltipDiv").css('top', td.pageY-330 + 'px');
  5176. }
  5177. else
  5178. {
  5179. $("#kofcNewTooltipDiv").remove();
  5180. setTimeout( function () {Tabs.updater.show();}, 200);
  5181. }
  5182. });
  5183.  
  5184. }
  5185.  
  5186. },
  5187.  
  5188. deleteQueueItem : function (i) {
  5189. // delete an item from the queue
  5190. var t = Tabs.upgrader;
  5191. queueData.list.splice(i,1);
  5192. if (i > queueData.index) queueData.index--;
  5193. saveQueueData();
  5194. t.buildQueueDisplay();
  5195. },
  5196.  
  5197. changeLevel : function (index, level) {
  5198. var t = Tabs.upgrader;
  5199.  
  5200. var q = queueData.list[index];
  5201. if (!q) return;
  5202.  
  5203. q.level = level;
  5204. saveQueueData();
  5205. t.buildQueueDisplay();
  5206. },
  5207.  
  5208. moveUpRow : function (i) {
  5209. if (i<1) return;
  5210. var t = Tabs.upgrader;
  5211. var q = queueData.list.splice(i,1);
  5212. queueData.list.splice(i-1,0,q[0]);
  5213.  
  5214. if (i == queueData.index)
  5215. queueData.index--;
  5216. else if (queueData.index == i-1)
  5217. queueData.index++;
  5218.  
  5219. saveQueueData();
  5220. t.buildQueueDisplay();
  5221. },
  5222.  
  5223. moveDownRow : function (index) {
  5224. if (index > (queueData.list.length - 2)) return;
  5225.  
  5226. var t = Tabs.upgrader;
  5227. var q = queueData.list.splice(index,1);
  5228. queueData.list.splice(index+1,0,q[0]);
  5229.  
  5230. if (i == queueData.index)
  5231. queueData.index++;
  5232. else if (queueData.index == i+1)
  5233. queueData.index--;
  5234.  
  5235. saveQueueData();
  5236. t.buildQueueDisplay();
  5237.  
  5238. },
  5239.  
  5240. updateTRTab : function() {
  5241. $("#trexecupgrade").html("Upgrade " + (upgradeData.active ? "ON" : "OFF"));
  5242. },
  5243.  
  5244. togglePower: function(obj){
  5245. var t = Tabs.upgrader;
  5246. var btn = document.getElementById('trUpgraderPower');
  5247. if (upgradeData.active == true) {
  5248. upgradeData.active = false;
  5249. btn.value = "Upgrade = OFF";
  5250. t.setStatus("Powered off");
  5251.  
  5252. } else {
  5253. upgradeData.active = true;
  5254. btn.value = "Upgrade = ON";
  5255. t.setStatus("Power on");
  5256. }
  5257.  
  5258. if (upgradeData.active == false)
  5259. {
  5260.  
  5261. }
  5262.  
  5263. t.updateTRTab();
  5264. saveUpgradeData();
  5265. },
  5266.  
  5267. toggleSelect: function(obj){
  5268. var btn = document.getElementById('trUpgraderSelect');
  5269. var t = Tabs.upgrader;
  5270. if (upgradeData.enhanceAction == true) {
  5271. upgradeData.enhanceAction = false;
  5272. btn.value = "Action = Upgrade";
  5273. } else {
  5274. upgradeData.enhanceAction = true;
  5275. btn.value = "Action = Enhance";
  5276. }
  5277. t.updateTRSelect();
  5278. saveUpgradeData();
  5279. },
  5280.  
  5281. setStatus : function (s)
  5282. {
  5283. document.getElementById('trUpgradeStatus').innerHTML = "<div>" + s + "</div>";
  5284. },
  5285.  
  5286. setResult : function (s)
  5287. {
  5288. document.getElementById('trLastResult').innerHTML = "<div>" + s + "</div>";
  5289. },
  5290.  
  5291. setStones : function(n)
  5292. {
  5293. var st = addCommas(n) + " stones";
  5294. document.getElementById('trStoneRemain').innerHTML = "<div>" + st + "</div>";
  5295. },
  5296.  
  5297. pickCity : function () {
  5298. var t = Tabs.upgrader;
  5299. var cid = upgradeData.uCityNum;
  5300. if ( parseInt(Seed.resources["city" + Seed.cities[cid][0]]["rec5"][0]) >= upgradeData.minStones) return cid;
  5301.  
  5302. if (upgradeData.anyCity)
  5303. {
  5304. for (i= 0; i < Seed.cities.length; i++)
  5305. {
  5306. if ( parseInt(Seed.resources["city" + Seed.cities[i][0]]["rec5"][0]) >= upgradeData.minStones) return i;
  5307. }
  5308. }
  5309. return -1;
  5310. },
  5311.  
  5312.  
  5313. doRepair : function( rItem) {
  5314. var t = Tabs.upgrader;
  5315. var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams);
  5316.  
  5317. if (upgradeData.active == false || rItem == 0 || unsafeWindow.kocThroneItems[rItem] == null)
  5318. {
  5319. logit("repair is turned off");
  5320. return;
  5321. }
  5322. var theItem = unsafeWindow.kocThroneItems[rItem];
  5323.  
  5324. params.action = 'timeRepair';
  5325. params.throneRoomItemId = rItem;
  5326. params.ctrl = 'throneRoom\\ThroneRoomServiceAjax';
  5327.  
  5328. new AjaxRequest(unsafeWindow.g_ajaxpath + "ajax/_dispatch53.php" + unsafeWindow.g_ajaxsuffix, {
  5329. method: "post",
  5330. parameters: params,
  5331. loading: true,
  5332. onSuccess: function (transport) {
  5333. //logit("repair success");
  5334. //logit("tport: " + inspect(transport,3,1));
  5335. var rslt = eval("(" + transport.responseText + ")");
  5336. //logit("rslt: " + inspect(rslt,3,1));
  5337. if(rslt.ok){
  5338. trActionLog('Starting repair for Throne room item '+unsafeWindow.kocThroneItems[rItem].name);
  5339. Seed.queue_throne.itemId= rItem;
  5340. Seed.queue_throne.start=unixTime();
  5341. Seed.queue_throne.end= rslt.eta;
  5342. t.repairId = rItem;
  5343. t.repairEnd = rslt.eta;
  5344. var n = new Date(t.repairEnd *1000);
  5345. t.setStatus("Repair begun ... Repair will be complete at " + n.toLocaleTimeString() + ". Item: " + unsafeWindow.kocThroneItems[t.repairId].name);
  5346. var x = rslt.eta - unixTime();
  5347. unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
  5348. t.clearTimerH = setTimeout(t.clearRepair, (x+1)*1000);
  5349. var item = unsafeWindow.kocThroneItems[rItem];
  5350. Tabs.upgrader.buildQueueDisplay();
  5351. // uW.cm.ThronePanelView.clickSpeedUp(item);
  5352. }
  5353. else
  5354. {
  5355. logit ("Repair failed");
  5356. if (rslt.msg == "Item is not broken")
  5357. {
  5358. unsafeWindow.kocThroneItems[rItem].isBroken = false;
  5359. t.clearRepair();
  5360. }
  5361.  
  5362. // regrab the end times in case this is caused by a manual repair
  5363. if (Seed.queue_throne && Seed.queue_throne.end && Seed.queue_throne.itemId)
  5364. {
  5365. t.repairEnd = Seed.queue_throne.end;
  5366. t.repairId = Seed.queue_throne.itemId;
  5367. }
  5368. logit("result:" + inspect(rslt,3,1));
  5369. }
  5370. return;
  5371. },
  5372. onFailure: function (ttt) {
  5373. logit("repair error");
  5374. // this usually means a repair is in progress (such as a
  5375. // manual
  5376. // repair). Grab the seed data (if possible)
  5377. if (Seed.queue_throne && Seed.queue_throne.end)
  5378. {
  5379. t.repairEnd = Seed.queue_throne.end;
  5380. t.repairId = Seed.queue_throne.itemId;
  5381. }
  5382. logit("ttt: " + inspect(ttt,3,1));
  5383. return;
  5384. }
  5385. });
  5386. return;
  5387. },
  5388.  
  5389. clearRepair : function () {
  5390. var t = Tabs.upgrader;
  5391. var timeUntilDone = 0;
  5392.  
  5393. if (t.repairEnd == 0)
  5394. {
  5395. return timeUntilDone;
  5396. }
  5397. timeUntilDone = t.repairEnd - unixTime();
  5398.  
  5399. if (timeUntilDone <= 0)
  5400. {
  5401. // logit("clearing repair");
  5402. if (t.repairId != 0 && unsafeWindow.kocThroneItems[t.repairId] != null)
  5403. {
  5404. if (unsafeWindow.kocThroneItems[t.repairId].isBroken == true)
  5405. {
  5406. t.setStatus("Repair time complete.");
  5407. }
  5408. unsafeWindow.kocThroneItems[t.repairId].isBroken = false;
  5409. unsafeWindow.kocThroneItems[t.repairId].brokenType = "";
  5410. t.repairId = 0;
  5411. }
  5412.  
  5413. }
  5414. unsafeWindow.cm.ThroneView.renderInventory(unsafeWindow.kocThroneItems);
  5415. return timeUntilDone;
  5416. },
  5417.  
  5418. show: function(){
  5419. Tabs.upgrader.repaint();
  5420. },
  5421.  
  5422. hide: function(){
  5423. }
  5424. };
  5425.  
  5426.  
  5427. /** ***************** Throne Enhancing Stats ********************* */
  5428.  
  5429. Tabs.estats = {
  5430. tabOrder: 300,
  5431. tabLabel: 'Enhance Stats',
  5432. tabDisabled : false,
  5433. myDiv : null,
  5434.  
  5435. init : function (div){
  5436. var t = Tabs.estats;
  5437. t.myDiv = div;
  5438. t.buildDisplay();
  5439. },
  5440.  
  5441. buildDisplay :function() {
  5442. var t = Tabs.estats;
  5443. var m = '<DIV class=trstat style="margin-top:5px; margin-bottom:5px;"><DIV id=trStatsMain class=trStat>ENHANCEMENT STATISTICS</div>';
  5444. m += '<DIV id= trStatsTabDiv align=left style="margin-top:10px; margin-bottom:10px; margin-left: 30px;">';
  5445. m += '<TABLE class=trStatTab align=center cellspacing=0>';
  5446.  
  5447. m += '<TR valign=top align=center><TH colspan=6>Enhancing Numbers (successes/failures)</TH></TR>';
  5448.  
  5449. var qstrings = new Array(uW.g_js_strings.throneRoom.simple, uW.g_js_strings.throneRoom.common, uW.g_js_strings.throneRoom.uncommon,
  5450. uW.g_js_strings.throneRoom.rare, uW.g_js_strings.throneRoom.epic, uW.g_js_strings.throneRoom.wondrous);
  5451.  
  5452.  
  5453. m += '<TR valign=top align=center><th></th>';
  5454. for( q =1; q <=5; q++)
  5455. {
  5456. m += "<td style='font-weight: bold;' class='td" + (q%2+1) +"' >";
  5457. m += qstrings[q];
  5458. m += '</td>';
  5459. }
  5460.  
  5461. m += '</tr>';
  5462.  
  5463.  
  5464. var st = [0,0,0,0,0];
  5465. var ft = [0,0,0,0,0];
  5466.  
  5467. for (l=0; l<= maxTrLevel; l++)
  5468. {
  5469. m += '<TR valign=top align=center>';
  5470. m += "<th>";
  5471. if (l !=0) m += "+";
  5472. m+= l + '</th>';
  5473. for( q =0; q <5; q++)
  5474. {
  5475. if (upgradeStats.enhanceSuccess[q][l] == null) upgradeStats.enhanceSuccess[q][l] =0;
  5476. if (upgradeStats.enhanceFailure[q][l] == null) upgradeStats.enhanceFailure[q][l] =0;
  5477. st[q] += upgradeStats.enhanceSuccess[q][l];
  5478. ft[q] += upgradeStats.enhanceFailure[q][l];
  5479.  
  5480. m += "<td class='td" + (q%2) +"' >";
  5481. m += upgradeStats.enhanceSuccess[q][l] + " / " + upgradeStats.enhanceFailure[q][l];
  5482. m += "</td>";
  5483. }
  5484. m += '</TR>';
  5485. }
  5486.  
  5487. m += '<TR valign=top align=center><th> Totals: </th>';
  5488. for( q =0; q <5; q++)
  5489. {
  5490. m += "<td style='font-weight: bold;' class='td" + (q%2) +"' >";
  5491. m += st[q] + " / " + ft[q];
  5492. m += "</td>";
  5493. }
  5494. m += '</TR>';
  5495.  
  5496. m += '<TR valign=top align=center><th> Percents: </th>';
  5497. for( q =0; q <5; q++)
  5498. {
  5499. m += "<td style='font-weight: bold;' class='td" + (q%2) +"' >";
  5500. if ( (st[q] + ft[q]) == 0 )
  5501. m += "--";
  5502. else
  5503. {
  5504. var p = (100* st[q] / (st[q] + ft[q]));
  5505. m += p.toFixed(2) + "%";
  5506. }
  5507. m += "</td>";
  5508. }
  5509. m += '</TR>';
  5510.  
  5511. m += '</TABLE></DIV>';
  5512.  
  5513. m += "<div id='trStats'></div>";
  5514. m += '</div>';
  5515. t.myDiv.innerHTML = m;
  5516. },
  5517.  
  5518. show: function(){
  5519. var t = Tabs.estats;
  5520. t.buildDisplay();
  5521. },
  5522.  
  5523. hide: function(){
  5524. }
  5525. }
  5526.  
  5527. /** ***************** Throne Upgrade Stats ********************* */
  5528.  
  5529. Tabs.ustats = {
  5530. tabOrder: 400,
  5531. tabLabel: 'Upgrade Stats',
  5532. tabDisabled : false,
  5533. myDiv : null,
  5534.  
  5535. init : function (div){
  5536. var t = Tabs.ustats;
  5537. t.myDiv = div;
  5538. t.buildTab();
  5539. },
  5540.  
  5541. buildTab : function ()
  5542. {
  5543. var t = Tabs.ustats;
  5544. var maxLevel = maxTrLevel;
  5545.  
  5546. var m = '<DIV class=trstat style="margin-top:5px; margin-bottom:5px;"><DIV id=trStatsMain2 class=trStat>UPGRADE STATISTICS</div>';
  5547. m += '<DIV id= trStatsTabDiv2 align=left style="margin-top:10px; margin-bottom:10px; margin-left: 30px;">';
  5548. m += '<TABLE class=trStatTab align=center cellspacing=0>';
  5549.  
  5550. m += '<TR valign=top align=center><TH colspan=14>Upgrading Numbers (successes/failures)</TH></TR>';
  5551.  
  5552. var qstrings = new Array(uW.g_js_strings.throneRoom.simple, uW.g_js_strings.throneRoom.common, uW.g_js_strings.throneRoom.uncommon,
  5553. uW.g_js_strings.throneRoom.rare, uW.g_js_strings.throneRoom.epic, uW.g_js_strings.throneRoom.wondrous);
  5554.  
  5555.  
  5556. m += '<TR valign=top align=center><th></th>';
  5557.  
  5558. for (l= 0; l< maxLevel; l++)
  5559. {
  5560. m += "<td style='font-weight: bold;' class='td" + (l%2) +"' >";
  5561. m+= "+" +(l+1) + "</td>";
  5562. }
  5563. m += '</TR>';
  5564. var st = [0,0,0,0,0,0,0,0,0,0,0,0];
  5565. var ft = [0,0,0,0,0,0,0,0,0,0,0,0];
  5566.  
  5567. for( q =0; q <=5; q++)
  5568. {
  5569. m += '<TR valign=top align=center><th>' + qstrings[q] + '</th>';
  5570. for (l=0; l< maxTrLevel; l++)
  5571. {
  5572. if (upgradeStats.upgradeSuccess[q][l] == null || isNaN(upgradeStats.upgradeSuccess[q][l])) upgradeStats.upgradeSuccess[q][l] =0;
  5573. if (upgradeStats.upgradeFailure[q][l] == null || isNaN(upgradeStats.upgradeFailure[q][l])) upgradeStats.upgradeFailure[q][l] =0;
  5574. st[l] += upgradeStats.upgradeSuccess[q][l];
  5575. ft[l] += upgradeStats.upgradeFailure[q][l];
  5576.  
  5577. m += "<td class='td" + (l%2) +"' >";
  5578. m += upgradeStats.upgradeSuccess[q][l] + " / " + upgradeStats.upgradeFailure[q][l];
  5579. m += "</td>";
  5580. }
  5581. m += '</TR>';
  5582. }
  5583.  
  5584. m += '<TR valign=top align=center><th> Totals: </th>';
  5585. for( l =0; l< maxLevel; l++)
  5586. {
  5587. m += "<td style='font-weight: bold;' class='td" + (l%2) +"' >";
  5588. m += st[l] + " / " + ft[l];
  5589. m += "</td>";
  5590. }
  5591. m += '</TR>';
  5592.  
  5593. m += '<TR valign=top align=center><th> Percents: </th>';
  5594. for( l =0; l < maxLevel; l++)
  5595. {
  5596. m += "<td style='font-weight: bold;' class='td" + (l%2) +"' >";
  5597. if ( (st[l] + ft[l]) == 0 )
  5598. m += "--";
  5599. else
  5600. {
  5601. var p = (100* st[l] / (st[l] + ft[l]));
  5602. m += p.toFixed(2) + "%";
  5603. }
  5604. m += "</td>";
  5605. }
  5606. m += '</TR>';
  5607.  
  5608. m += '</TABLE></DIV>';
  5609.  
  5610. m += "<div id='trStats2'></div>";
  5611. m += '</div>';
  5612. t.myDiv.innerHTML = m;
  5613. },
  5614.  
  5615. show: function(){
  5616. var t = Tabs.ustats;
  5617. t.buildTab();
  5618. },
  5619.  
  5620. hide: function(){
  5621. }
  5622. }
  5623.  
  5624. function findTab(div) {
  5625. for (o in Tabs)
  5626. {
  5627. if (Tabs[o].myDiv && (Tabs[o].myDiv == div)) return o;
  5628. }
  5629. return null;
  5630. }
  5631.  
  5632. var WinManager = {
  5633. wins : {}, // prefix : trPopup obj
  5634. didHide : [],
  5635.  
  5636. get : function (prefix){
  5637. var t = WinManager;
  5638. return t.wins[prefix];
  5639. },
  5640.  
  5641. add : function (prefix, pop){
  5642. var t = WinManager;
  5643. t.wins[prefix] = pop;
  5644. if (unsafeWindow.cpopupWins == null)
  5645. unsafeWindow.cpopupWins = {};
  5646. unsafeWindow.cpopupWins[prefix] = pop;
  5647. },
  5648.  
  5649. hideAll : function (){
  5650. var t = WinManager;
  5651. t.didHide = [];
  5652. for (k in t.wins){
  5653. if (t.wins[k].isShown()){
  5654. t.didHide.push (t.wins[k]);
  5655. t.wins[k].show (false);
  5656. }
  5657. }
  5658. },
  5659. restoreAll : function (){
  5660. var t = WinManager;
  5661. for (var i=0; i<t.didHide.length; i++)
  5662. t.didHide[i].show (true);
  5663. },
  5664.  
  5665. deleteWin : function (prefix){
  5666. var t = WinManager;
  5667. delete t.wins[prefix];
  5668. delete unsafeWindow.cpopupWins[prefix];
  5669. }
  5670. }
  5671.  
  5672.  
  5673. //registers the popup
  5674. //prefix must be a unique (short) name for the popup window
  5675. function trPopup(prefix) {
  5676. var pop = WinManager.get(prefix);
  5677. if (pop){
  5678. pop.show(false);
  5679. return pop;
  5680. }
  5681.  
  5682. // behind the salvage popup
  5683. this.BASE_ZINDEX = 111111;
  5684.  
  5685. // protos ...
  5686. this.show = show;
  5687. this.getTopDiv = getTopDiv;
  5688. this.getMainTopDiv = getMainTopDiv;
  5689. this.getMainDiv = getMainDiv;
  5690. this.getLayer = getLayer;
  5691. this.setLayer = setLayer;
  5692. //this.getLocation = getLocation;
  5693. //this.setLocation = setLocation;
  5694. this.focusMe = focusMe;
  5695. this.isShown = isShown;
  5696. this.unfocusMe = unfocusMe;
  5697. this.destroy = destroy;
  5698.  
  5699. // object vars ...
  5700. this.div = $("#tr_top")[0];
  5701. this.prefix = prefix;
  5702.  
  5703. var t = this;
  5704. this.div.addEventListener ('mousedown', e_divClicked, false);
  5705. WinManager.add(prefix, this);
  5706.  
  5707. function e_divClicked (){
  5708. t.focusMe();
  5709. }
  5710.  
  5711.  
  5712. function focusMe (){
  5713. t.setLayer(5);
  5714. for (k in unsafeWindow.cpopupWins){
  5715. if (k != t.prefix)
  5716. unsafeWindow.cpopupWins[k].unfocusMe();
  5717. }
  5718. }
  5719.  
  5720. function unfocusMe (){
  5721. t.setLayer(-5);
  5722. }
  5723.  
  5724.  
  5725. function destroy (){
  5726. document.body.removeChild(t.div);
  5727. WinManager.deleteWin (t.prefix);
  5728. }
  5729.  
  5730. function setLayer(zi){
  5731. t.div.style.zIndex = ''+ (this.BASE_ZINDEX + zi);
  5732. }
  5733. function getLayer(){
  5734. return parseInt(t.div.style.zIndex) - this.BASE_ZINDEX;
  5735. }
  5736. function getTopDiv(){
  5737. return document.getElementById(this.prefix+'_top');
  5738. }
  5739. function getMainDiv(){
  5740. return document.getElementById(this.prefix+'_main');
  5741. }
  5742. function getMainTopDiv(){
  5743. return document.getElementById(this.prefix+'_top');
  5744. }
  5745. function isShown (){
  5746. return $("#tr_dialog").dialog("isOpen");
  5747. }
  5748. function show(tf){
  5749. if (tf){
  5750. $("#tr_dialog").dialog("open");
  5751. t.focusMe ();
  5752. } else {
  5753. $("#tr_dialog").dialog("close");
  5754. }
  5755. return tf;
  5756. }
  5757. }
  5758.  
  5759. //onClick (city{name, id, x, y}, x, y) city may be null!
  5760. function CdispCityPicker (id, span, dispName, notify, selbut){
  5761. function CcityButHandler (t) {
  5762. var that = t;
  5763.  
  5764. function clickedCityBut (e){
  5765. if (that.selected != null)
  5766. that.selected.className = "castleBut castleButNon";
  5767. that.city = Cities.cities[e.target.id.substr(that.prefixLen)];
  5768. if (that.dispName)
  5769. document.getElementById(that.id+'cname').innerHTML = that.city.name;
  5770. e.target.className = "castleBut castleButSel";
  5771. that.selected = e.target;
  5772. if (that.coordBoxX){
  5773. that.coordBoxX.value = that.city.x;
  5774. that.coordBoxY.value = that.city.y;
  5775. var evt = document.createEvent("HTMLEvents");
  5776. evt.initEvent('change', true, true ); // event
  5777. // type,bubbling,cancelable
  5778. that.coordBoxX.dispatchEvent(evt);
  5779. that.coordBoxY.dispatchEvent(evt);
  5780. that.coordBoxX.style.backgroundColor = '#ffffff';
  5781. that.coordBoxY.style.backgroundColor = '#ffffff';
  5782. }
  5783. if (that.notify != null)
  5784. that.notify(that.city, that.city.x, that.city.y);
  5785. }
  5786.  
  5787. this.clickedCityBut = clickedCityBut;
  5788. }
  5789.  
  5790. function selectBut (idx){
  5791. document.getElementById(this.id+'_'+idx).click();
  5792. }
  5793.  
  5794. function bindToXYboxes (eX, eY){
  5795. function CboxHandler (t){
  5796. var that = t;
  5797. this.eventChange = eventChange;
  5798. if (that.city){
  5799. eX.value = that.city.x;
  5800. eY.value = that.city.y;
  5801. }
  5802. function eventChange (){
  5803. var xValue=that.coordBoxX.value.trim();
  5804. var xI=/^\s*([0-9]+)[\s|,|-|.]+([0-9]+)/.exec(xValue);
  5805. if(xI) {
  5806. that.coordBoxX.value=xI[1]
  5807. that.coordBoxY.value=xI[2]
  5808. }
  5809. var x = parseInt(that.coordBoxX.value, 10);
  5810. var y = parseInt(that.coordBoxY.value, 10);
  5811. if (isNaN(x) || x<0 || x>750){
  5812. that.coordBoxX.style.backgroundColor = '#ff8888';
  5813. return;
  5814. }
  5815. if (isNaN(y) || y<0 || y>750){
  5816. that.coordBoxY.style.backgroundColor = '#ff8888';
  5817. return;
  5818. }
  5819. that.coordBoxX.style.backgroundColor = '#ffffff';
  5820. that.coordBoxY.style.backgroundColor = '#ffffff';
  5821. if (that.notify != null)
  5822. that.notify (null, x, y);
  5823. }
  5824. return false;
  5825. }
  5826. this.coordBoxX = eX;
  5827. this.coordBoxY = eY;
  5828. var bh = new CboxHandler(this);
  5829. eX.maxLength=8;
  5830. eY.maxLength=3;
  5831. eX.style.width='2em';
  5832. eY.style.width='2em';
  5833. eX.addEventListener('change', bh.eventChange, false);
  5834. eY.addEventListener('change', bh.eventChange, false);
  5835. }
  5836.  
  5837. this.selectBut = selectBut;
  5838. this.bindToXYboxes = bindToXYboxes;
  5839. this.coordBoxX = null;
  5840. this.coordBoxY = null;
  5841. this.id = id;
  5842. this.dispName = dispName;
  5843. this.prefixLen = id.length+1;
  5844. this.notify = notify;
  5845. this.selected = null;
  5846. this.city = null;
  5847. var m = '';
  5848. for (var i=0; i<Cities.cities.length; i++)
  5849. m += '<INPUT class="castleBut castleButNon" id="'+ id +'_'+ i +'" value="'+ (i+1) +'" type=button />';
  5850. if (dispName)
  5851. m += ' &nbsp; <SPAN style="display:inline-block; width:85px; font-weight:bold;" id='+ id +'cname' +'></span>';
  5852. span.innerHTML = m;
  5853. var handler = new CcityButHandler(this);
  5854. for (var i=0; i<Cities.cities.length; i++)
  5855. document.getElementById (id+'_'+i).addEventListener('click', handler.clickedCityBut, false);
  5856. if (selbut != null)
  5857. this.selectBut(selbut);
  5858. };
  5859.  
  5860. function setCities(){
  5861. Cities.numCities = Seed.cities.length;
  5862. Cities.cities = [];
  5863. Cities.byID = {};
  5864. for (i=0; i<Cities.numCities; i++){
  5865. city = {};
  5866. city.idx = i;
  5867. city.id = parseInt(Seed.cities[i][0]);
  5868. city.name = Seed.cities[i][1];
  5869. city.x = parseInt(Seed.cities[i][2]);
  5870. city.y = parseInt(Seed.cities[i][3]);
  5871. city.tileId = parseInt(Seed.cities[i][5]);
  5872. city.provId = parseInt(Seed.cities[i][4]);
  5873. // getTroopDefTrainEstimates('city'+ city.id, city);
  5874. Cities.cities[i] = city;
  5875. Cities.byID[Seed.cities[i][0]] = city;
  5876. }
  5877. }
  5878.  
  5879. function addCommas(nStr){
  5880. nStr += '';
  5881. var x = nStr.split('.');
  5882. var x1 = x[0];
  5883. var x2 = x.length > 1 ? '.' + x[1] : '';
  5884. var rgx = /(\d+)(\d{3})/;
  5885. while (rgx.test(x1)) {
  5886. x1 = x1.replace(rgx, '$1' + ',' + '$2');
  5887. }
  5888. return x1 + x2;
  5889. }
  5890.  
  5891.  
  5892. String.prototype.startsWith = function(starter)
  5893. {
  5894. return this.substring(0,starter.length) == starter;
  5895. };
  5896.  
  5897. String.prototype.endsWith = function(ender)
  5898. {
  5899. return this.substring(this.length-ender.length) == ender;
  5900. };
  5901.  
  5902. String.prototype.capitalize = function()
  5903. {
  5904. return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
  5905. };
  5906.  
  5907.  
  5908. /** *********** Updater code ************ */
  5909. //Function for displaying a confirmation message modal popup similar to the
  5910. //default javascript confirm() function
  5911. //but with the advantage being that it won't halt all other javascript being
  5912. //executed on the page.
  5913. //Original Author: Thomas Chapin (April 6, 2011)
  5914. function display_confirm(confirm_msg,ok_function,cancel_function){
  5915. if(!confirm_msg){confirm_msg="";}
  5916.  
  5917. var container_div = document.getElementById('modal_js_confirm');
  5918. var div;
  5919. if(!container_div) {
  5920. container_div=document.createElement('div');
  5921. container_div.id='modal_js_confirm';
  5922. container_div.style.position='absolute';
  5923. container_div.style.top='0px';
  5924. container_div.style.left='0px';
  5925. container_div.style.width='100%';
  5926. container_div.style.height='1px';
  5927. container_div.style.overflow='visible';
  5928. container_div.style.zIndex=2000005;
  5929.  
  5930. div=document.createElement('div');
  5931. div.id='modal_js_confirm_contents';
  5932. div.style.zIndex=2000005;
  5933. div.style.backgroundColor='#eee';
  5934. div.style.fontFamily='"lucida grande",tahoma,verdana,arial,sans-serif';
  5935. div.style.fontSize='11px';
  5936. div.style.textAlign='center';
  5937. div.style.color='#333333';
  5938. div.style.border='2px outset #666';
  5939. div.style.padding='10px';
  5940. div.style.position='relative';
  5941. div.style.width='300px';
  5942. div.style.height='100px';
  5943. div.style.margin='300px auto 0px auto';
  5944. div.style.display='block';
  5945.  
  5946. container_div.appendChild(div);
  5947. document.body.appendChild(container_div);
  5948.  
  5949. 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>';
  5950. var ok_button = document.getElementById('modal_js_confirm_ok_button');
  5951. ok_button.addEventListener('click',function() {
  5952. if(ok_function && typeof(ok_function) == "function"){
  5953. ok_function();
  5954. }
  5955. container_div.parentNode.removeChild(container_div);
  5956. },false);
  5957. var cancel_button = document.getElementById('modal_js_confirm_cancel_button');
  5958. cancel_button.addEventListener('click',function() {
  5959. if(cancel_function && typeof(cancel_function) == "function"){
  5960. cancel_function();
  5961. }
  5962. container_div.parentNode.removeChild(container_div);
  5963. },false);
  5964. }
  5965. }
  5966.  
  5967. //The following code is released under public domain.
  5968.  
  5969. var AutoUpdater_132329 = {
  5970. id: 132329,
  5971. days: 1, // check every 1 day
  5972. name: "KOC Throne Room Organizer",
  5973. version: Version,
  5974. time: new Date().getTime(),
  5975. call: function(response, secure) {
  5976. logit("checking version");
  5977. GM_xmlhttpRequest({
  5978. method: 'GET',
  5979. url: 'http'+(secure ? 's' : '')+'://userscripts.org/scripts/source/'+this.id+'.meta.js',
  5980. onload: function(xpr) {AutoUpdater_132329.compare(xpr, response);},
  5981. onerror: function(xpr) {if (secure) AutoUpdater_132329.call(response, false);}
  5982. });
  5983. },
  5984. enable: function() {
  5985. GM_registerMenuCommand("Enable "+this.name+" updates", function() {
  5986. GM_setValue('updated_132329', new Date().getTime()+'');
  5987. AutoUpdater_132329.call(true, true)
  5988. });
  5989. },
  5990. compareVersion: function(r_version, l_version) {
  5991. var r_parts = r_version.split(''),
  5992. l_parts = l_version.split(''),
  5993. r_len = r_parts.length,
  5994. l_len = l_parts.length,
  5995. r = l = 0;
  5996. for(var i = 0, len = (r_len > l_len ? r_len : l_len); i < len && r == l; ++i) {
  5997. r = +(r_parts[i] || '0');
  5998. l = +(l_parts[i] || '0');
  5999. }
  6000. return (r !== l) ? r > l : false;
  6001. },
  6002. compare: function(xpr,response) {
  6003. this.xversion=/\/\/\s*@version\s+(.+)\s*\n/i.exec(xpr.responseText);
  6004. this.xname=/\/\/\s*@name\s+(.+)\s*\n/i.exec(xpr.responseText);
  6005.  
  6006. if ( (this.xversion) && (this.xname[1] == this.name) ) {
  6007. this.xversion = this.xversion[1];
  6008. this.xname = this.xname[1];
  6009. } else {
  6010. if ( (xpr.responseText.match("the page you requested doesn't exist")) || (this.xname[1] != this.name) ) {
  6011. // GM_setValue('updated_132329', 'off');
  6012. }
  6013. return false;
  6014. }
  6015.  
  6016. var updated = this.compareVersion(this.xversion, this.version);
  6017.  
  6018. if ( updated ) {
  6019. display_confirm('A new version of '+this.xname+' is available.\nDo you wish to install the latest version?',
  6020. // Ok
  6021. function(){
  6022. try {
  6023. location.href = 'https://userscripts.org/scripts/source/132329.user.js';
  6024. } catch(e) {}
  6025. },
  6026. // Cancel
  6027. function(){
  6028. if ( AutoUpdater_132329.xversion ) {
  6029. if(confirm('Do you want to turn off auto updating for this script?')) {
  6030. // GM_setValue('updated_132329', 'off');
  6031. TRGlobalOptions.trUpdate = false;
  6032. GM_setValue ('TROptions_??', JSON2.stringify(TRGlobalOptions));
  6033. AutoUpdater_132329.enable();
  6034. alert('Automatic updates can be re-enabled for this script from the User Script Commands submenu.');
  6035. }
  6036. }
  6037. }
  6038. );
  6039.  
  6040. } else if (response){
  6041. alert('No updates available for '+this.name);
  6042. }
  6043. },
  6044. check: function(tf) {
  6045. if (!tf){
  6046. this.enable();
  6047. } else {
  6048. // convert days to milliseconds and compare
  6049. if (+this.time > (+GM_getValue('updated_132329', 0) + 1000*60*60*24*this.days)) {
  6050. GM_setValue('updated_132329', this.time+'');
  6051. this.call(false, true);
  6052. }
  6053. GM_registerMenuCommand("Check "+this.name+" for updates", function() {
  6054. GM_setValue('updated_132329', new Date().getTime()+'');
  6055. AutoUpdater_132329.call(true, true)
  6056. });
  6057. }
  6058. }
  6059. };
  6060.  
  6061. readTRGlobalOptions();
  6062.  
  6063. //even though Scriptish provides its own update mechanism (GM_updatingEnbled ==
  6064. //true), lets use this method.
  6065. if (typeof(GM_xmlhttpRequest) !== 'undefined' /*
  6066. * && typeof(GM_updatingEnabled)
  6067. * === 'undefined'
  6068. */) {
  6069. try {
  6070. if (unsafeWindow.frameElement === null) {
  6071. AutoUpdater_132329.check(TRGlobalOptions.trUpdate);
  6072. }
  6073. } catch(e) {
  6074. AutoUpdater_132329.check(TRGlobalOptions.trUpdate);
  6075. }
  6076. }
  6077.  
  6078. /** ******* End updater code ************ */
  6079.  
  6080. String.prototype.capitalize = function(){
  6081. return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
  6082. }
  6083.  
  6084. //****************************
  6085. //This is a new implementation of the CalterUwFunc class to modify a function of the 'unsafewWindow' object.
  6086. //For reverse compatibility this implementation operates like the original, but multiple CalterUwFunc objects can be created for the same function.
  6087. //Each CalterUwFunc can be enabled or diabled independently. (Of course, the repalcement strings must be compatibile with each other to work
  6088. //simulataneously).
  6089.  
  6090. //The implementation uses a worker class CalterFuncModifier. One and only one CalterFuncModifier is created for each uw function modified.
  6091. //CalterFuncModifier allows multiple modifier string pairs to be applied. For individual control of specific mods, access the 'modIndex'
  6092. //member to determine the index of the first mod and then directly call the operations of the 'funcModifier' member.
  6093.  
  6094. //This implementation creates/uses a registry of CalterFuncModifier's that is added to the unsafeWindow object so that changes
  6095. //to the same function in different scripts is possible.
  6096.  
  6097. //****************************
  6098.  
  6099.  
  6100. var CalterUwFunc = function (funcName, findReplace) {
  6101.  
  6102. this.isAvailable = isAvailable;
  6103. this.setEnable = setEnable;
  6104.  
  6105. this.funcName = funcName;
  6106. this.funcModifier = null;
  6107. this.modIndex = 0;
  6108. this.numberMods = 0;
  6109.  
  6110. // find an existing CalterUwFunc if it already exists
  6111. if (!unsafeWindow.calterRegistry) unsafeWindow.calterRegistry = {};
  6112. var calterF = null;
  6113.  
  6114. if (unsafeWindow.calterRegistry[funcName]) {
  6115. // use the existing function modifier
  6116. calterF = unsafeWindow.calterRegistry[funcName];
  6117. for (i=0; i< findReplace.length; i++) {
  6118. calterF.addModifier(findReplace[i]);
  6119. }
  6120. } else {
  6121. // create and register the new calter
  6122. calterF = new CalterFuncModifier(funcName, findReplace);
  6123. unsafeWindow.calterRegistry[funcName] = calterF;
  6124. }
  6125. this.funcModifier = calterF;
  6126.  
  6127. if (findReplace != null)
  6128. {
  6129. this.numberMods = findReplace.length;
  6130. this.modIndex = this.funcModifier.numModifiers()- this.numberMods;
  6131. }
  6132.  
  6133. function isAvailable() {
  6134. // check if any of the replace strings matched the original function
  6135. var avail = false;
  6136. for (i= this.modIndex; i < this.modIndex + this.numberMods; i++ )
  6137. {
  6138. if (this.funcModifier.testModifier(i)) avail= true;
  6139. }
  6140. return avail;
  6141. }
  6142.  
  6143. function setEnable(tf) {
  6144. this.funcModifier.enableModifier(this.modIndex, tf, this.numberMods);
  6145. }
  6146. }
  6147.  
  6148. var CalterFuncModifier = function (funcName, findReplace) {
  6149. // (second argument is now optional )
  6150.  
  6151. this.applyModifiers = applyModifiers;
  6152. this.addModifier = addModifier;
  6153. this.enableModifier = enableModifier;
  6154. this.testModifier = testModifier;
  6155. this.modEnabled = modEnabled;
  6156. this.numModifiers = numModifiers;
  6157.  
  6158. this.funcName = funcName;
  6159. this.funcOld = null;
  6160. this.funcOldString = null;
  6161. this.funcNew = null;
  6162. this.modifiers = [];
  6163. this.modsActive = [];
  6164.  
  6165. try {
  6166. var x = this.funcName.split('.');
  6167. var f = unsafeWindow;
  6168. for (var i=0; i<x.length; i++)
  6169. f = f[x[i]];
  6170. ft = f.toString();
  6171. this.funcOld = f;
  6172. this.funcOldString = ft.replace ('function '+ this.funcName, 'function');
  6173.  
  6174. if (findReplace) {
  6175. this.modifiers = findReplace;
  6176. this.modsActive = new Array(findReplace.length);
  6177. for (var i=0; i<findReplace.length; i++){
  6178. this.modsActive[i] = false;
  6179. }
  6180. }
  6181. } catch (err) {
  6182. logit("CalterFuncModifier "+ this.funcName+" "+err);
  6183. }
  6184.  
  6185. // test if this modifier works on the original function.
  6186. // true = match found / replace possible
  6187. // false = does not match
  6188. function testModifier(modNumber) {
  6189. x = this.funcOldString.replace(this.modifiers[modNumber][0], this.modifiers[modNumber][1]);
  6190. if (x != this.funcOldString)
  6191. {
  6192. return true;
  6193. }
  6194. return false;
  6195. }
  6196.  
  6197. // use the active modifiers to create/apply a new function
  6198. function applyModifiers() {
  6199. try {
  6200. var rt = this.funcOldString;
  6201. var active = false;
  6202.  
  6203. for (var i=0; i< this.modifiers.length; i++){
  6204. if ( !this.modsActive[i]) continue;
  6205.  
  6206. x = rt.replace(this.modifiers[i][0], this.modifiers[i][1]);
  6207. if (x == rt) // if not found
  6208. {
  6209. // print out an error message when the match fails.
  6210. // These messages get lost on a refresh, so wait a few seconds to put it in the error log.
  6211. setTimeout( function (fname, repStr, ftstr) {
  6212. return function () {
  6213. logit("Unable to replace string in function " + fname);
  6214. logit("Replacment string:" + repStr );
  6215. logit("Function listing: " + ftstr);
  6216. return;
  6217. }
  6218. }(this.funcName, this.modifiers[i][0], ft), 3000);
  6219. }
  6220. else {
  6221.  
  6222. }
  6223.  
  6224. rt = x;
  6225. active = true;
  6226. }
  6227.  
  6228. this.funcNew = rt;
  6229. if (active) {
  6230. // apply the new function
  6231. uW.uwuwuwFunc(this.funcName +' = '+ this.funcNew);
  6232. } else {
  6233. // set to the original function
  6234. var x1 = this.funcName.split('.');
  6235. var f1 = unsafeWindow;
  6236. for (var i=0; i<x1.length-1; i++)
  6237. f1 = f1[x1[i]];
  6238. f1[x1[x1.length-1]] = this.funcOld;
  6239. }
  6240. } catch (err) {
  6241. logit("CalterFuncModifier "+ this.funcName+" "+err);
  6242. }
  6243. }
  6244.  
  6245. // add additional modifiers. The index of the modifier is returned so the caller can enable/disable it specificially
  6246. function addModifier(fr) {
  6247. this.modifiers.push(fr);
  6248. this.modsActive.push(false);
  6249. // return the index of the newly added modifier
  6250. return this.modifiers.length-1;
  6251. }
  6252.  
  6253. // turn on/off some of the modifiers.
  6254. // 'len' allows setting consectutive modifiers to the same value.
  6255. // If len is null, 1 is used
  6256. function enableModifier(modNumber, value, len) {
  6257.  
  6258. if (len == null) len = 1;
  6259. for (i = modNumber; i < modNumber + len; i++) {
  6260. if ( i < this.modsActive.length) {
  6261. this.modsActive[i] = value;
  6262. }
  6263. }
  6264. this.applyModifiers();
  6265. }
  6266.  
  6267. function modEnabled(modNumber) {
  6268. if ( modNumber < this.modsActive.length)
  6269. return this.modsActive[modNumber];
  6270. }
  6271.  
  6272. function numModifiers() {
  6273. return this.modifiers.length;
  6274. }
  6275.  
  6276. };
  6277.  
  6278.  
  6279.  
  6280.  
  6281. //only run in the main iframe
  6282. if (document.location.toString().match('src/main_src.php') ) trStartup ();