GoogleMonkeyR (modified by rampageX)

Google - Multiple columns of results, Remove "Sponsored Links", Number results, Auto-load more results, Remove web search dialogues, Open external links in a new tab, self updating and all configurable from a simple user dialogue.

  1. // ==UserScript==
  2. // @author rampageX
  3. // @version 1.7.3.23
  4. // @name GoogleMonkeyR (modified by rampageX)
  5. // @namespace http://www.monkeyr.com
  6. // @namespace https://greasyfork.org/zh-CN/scripts/378527-googlemonkeyr-modified-by-rampagex
  7. // @description Google - Multiple columns of results, Remove "Sponsored Links", Number results, Auto-load more results, Remove web search dialogues, Open external links in a new tab, self updating and all configurable from a simple user dialogue.
  8. // @include http*://www.google.*.*/webhp?*
  9. // @include http*://www.google.*.*/search?*
  10. // @include http*://www.google.*.*/ig?*
  11. // @include http*://www.google.*.*/
  12. // @include http*://www.google.*.*/#*
  13. // @include http*://www.google.*/webhp?*
  14. // @include http*://www.google.*/search?*
  15. // @include http*://www.google.*/ig?*
  16. // @include http*://www.google.*/
  17. // @include http*://www.google.*/#*
  18. // @include https://encrypted.google.*/webhp?*
  19. // @include https://encrypted.google.*/search?*
  20. // @include https://encrypted.google.*/ig?*
  21. // @include https://encrypted.google.*/
  22. // @include https://encrypted.google.*/#*
  23. // @grant GM_registerMenuCommand
  24. // @grant GM_addStyle
  25. // @grant GM_setValue
  26. // @grant GM_getValue
  27. // @grant GM_xmlhttpRequest
  28. // @icon https://www.google.com/favicon.ico
  29. // @uso:script 378527
  30. // @scriptsource https://greasyfork.org/zh-CN/scripts/378527-googlemonkeyr-modified-by-rampagex
  31. // @scriptsource https://greasyfork.org/zh-CN/scripts/378527-googlemonkeyr-modified-by-rampagex/code/GoogleMonkeyR%20(modified%20by%20rampagex).user.js
  32. /* StartHistory
  33. 1.7.3.23 by Izzy
  34. Google site changes:
  35. * #GTR -> #search
  36. * column count: add "#rso .srg { column-count … }" and "#cnt #center_col" w/o "#cnt.singleton" (plus "#cnt #foot" to adjust footer)
  37. * hiding related hid all results (".bkWMgd .kno-kp" instead of just ".bkWMgd" fixed that)
  38. * autoLoad, numResults still broken
  39.  
  40. 1.7.3.22 by rampageX
  41. hide new related search
  42.  
  43. 1.7.3.21 by Cook Wu
  44. Get the video and image thumbnail after autoloading back
  45.  
  46. 1.7.3.20 by Cook Wu
  47. try to fix bug images after autoloading again, may be only effective on chrome
  48.  
  49. 1.7.3.19 by Cook Wu
  50. fix bug images after autoloading page > 1, remove site preview and favicon for image search results
  51.  
  52. 1.7.3.18 by Cook Wu
  53. add the option to hide the extra search results like videos, images but not appbar
  54.  
  55. 1.7.3.17 by Cook Wu
  56. modify to show more hidden results
  57.  
  58. 1.7.3.16 by Cook Wu
  59. remove igoogle specific content
  60.  
  61. 1.7.3.15 by Cook Wu
  62. GoogleMonkeyR settings link is back
  63.  
  64. 1.7.3.14 by Cook Wu
  65. fix the bug of numbered list
  66.  
  67. 1.7.3.13 by Cook Wu
  68. fix the bug of open link in a new tab
  69.  
  70. EndHistory */
  71. // ==/UserScript==
  72.  
  73.  
  74.  
  75. /**
  76. * Processing of the current page.
  77. **/
  78. (function () {
  79. var UIL =
  80. {
  81. scriptName: "GoogleMonkeyR",
  82. scriptVersion: "v.1.7.3.23",
  83. scriptId: "373206",
  84. watching: false,
  85.  
  86. init: function () {
  87. var pageType = this.determineCurrentPageType();
  88. if (pageType !== null) {
  89. this.processPage(pageType);
  90. }
  91. else {
  92. var self = arguments.callee;
  93. setTimeout(self.bind(this), 100);
  94. }
  95. },
  96.  
  97. determineCurrentPageType: function () {
  98. var pageType = null;
  99. var loc = window.location.href.toLowerCase();
  100. if (loc.indexOf("tbm=isch") != -1) {
  101. pageType = "image";
  102. }
  103. else if (loc.indexOf("tbm=shop") != -1) {
  104. pageType = "shopping";
  105. }
  106. else if (loc.indexOf("/webhp?") != -1) {
  107. this.instant = true;
  108. pageType = "search";
  109. }
  110. else if ((loc.indexOf("/search?") != -1)) {
  111. this.instant = false;
  112. pageType = "search";
  113. }
  114. else if ((loc.indexOf(window.location.protocol + '//' + window.location.hostname + '/#') != -1)) {
  115. this.instant = true;
  116. pageType = "search";
  117. }
  118. else if (window.location.href == (window.location.protocol + '//' + window.location.hostname + '/')) {
  119. this.instant = true;
  120. pageType = "search";
  121. }
  122. return pageType;
  123. },
  124.  
  125. processPage: function (pageType) {
  126. if (pageType !== null) {
  127. var pageProcessor = pageType + "PageProcessor";
  128. if (typeof (this[pageProcessor]) == "function") {
  129. this.hideSearch = UIL.Config.getHideSearch();
  130. this.numResults = UIL.Config.getNumResults();
  131. this.numColumns = UIL.Config.getNumCol();
  132. this.newspaper = UIL.Config.getResultFlow() != "l2r";
  133. this.noSitePreview = UIL.Config.getNoSitePreview();
  134. this.autoLoad = UIL.Config.getAutoLoad();
  135. this.favIcon = UIL.Config.getFavIcon();
  136. this.externalLinksResults = UIL.Config.getExtLinkSearch();
  137. this.searchLinkTracking = UIL.Config.getSearchLinkTracking();
  138. this.showExtraResults = UIL.Config.getShowExtraResults();
  139. this.searchesRelatedTo = UIL.Config.getSearchesRelatedTo();
  140. this.imagePreview = UIL.Config.getImagePreview();
  141. this.remSponsor = UIL.Config.getRemSponsor();
  142. this.remRightPanel = UIL.Config.getRemRightPanel();
  143. this.resHue = UIL.Config.getResHue();
  144. this.bGBorder = UIL.Config.getBGBorder();
  145. this.backToTopLinkInsert = true;
  146. this.backToTopLinkShow = true;
  147. this.initialise = true;
  148.  
  149. this[pageProcessor]();
  150. }
  151. }
  152. },
  153.  
  154. searchPageProcessor: function () {
  155. var watch, that = this
  156. if (this.watching) {
  157. watch = document.querySelector(this.watching);
  158. watch.addEventListener("DOMNodeInserted", function (e) {
  159. monkeyr.log('inserted', e.target);
  160. that.whackTest('inserted', e);
  161. }, false);
  162. watch.addEventListener("DOMSubtreeModified", function (e) {
  163. monkeyr.log('subtree', e.target, e.attrName, e.newValue, e.prevValue, e)
  164. that.whackTest('subtree', e);
  165. }, false);
  166. watch.addEventListener("DOMAttrModified", function (e) {
  167. monkeyr.log('attribute', e.target, e.attrName, e.newValue, e.prevValue, e);
  168. that.whackTest('attribute', e);
  169. }, false);
  170. watch.addEventListener("DOMNodeRemoved", function (e) {
  171. monkeyr.log('removed', e.target);
  172. that.whackTest('removed', e);
  173. }, false);
  174. // var observer = new MutationObserver(function(mutations) {
  175. // mutations.forEach(function(e) {
  176. // if(e.type!='childList'){
  177. // if(e.target.getAttribute(e.attributeName) != e.oldValue){
  178. // monkeyr.log('mutation', e.type, e.target, e.attributeName, e.target.getAttribute(e.attributeName), e.oldValue);
  179. // }
  180. // }
  181. // else{
  182. // monkeyr.log('mutation', e.type, e.target, e.addedNodes, e.removedNodes);
  183. // }
  184. // that.whackTest('mutation', e);
  185. // });
  186. // });
  187. // observer.observe(watch, {
  188. // attributes: true,
  189. // childList: true,
  190. // characterData: true,
  191. // subtree: true,
  192. // attributeOldValue: true
  193. // });
  194. return;
  195. }
  196. else {
  197. watch = document.querySelector('#main');
  198. watch.addEventListener("DOMNodeInserted", this.DOMNodeInsertedWatcher.bind(this), false);
  199. watch.addEventListener("DOMNodeRemoved", this.DOMNodeRemovedWatcher.bind(this), false);
  200. watch.addEventListener("DOMSubtreeModified", this.DOMSubtreeModifiedWatcher.bind(this), false);
  201. watch.addEventListener("DOMAttrModified", this.DOMAttrModifiedWatcher.bind(this), false);
  202.  
  203. // if(typeof MutationObserver === 'function')
  204. // {
  205. // // Only firefox and chrome currently support MutationObserver
  206. // var observer = new MutationObserver(function(mutations) {
  207. // mutations.forEach(that.MutationObserver.bind(that))
  208. // });
  209. // observer.observe(watch, {
  210. // attributes: true,
  211. // childList: false,
  212. // characterData: true,
  213. // subtree: true,
  214. // attributeOldValue: true
  215. // });
  216. // }
  217. // else
  218. // {
  219. // // 4 opera
  220. // watch.addEventListener("DOMSubtreeModified", this.DOMSubtreeModifiedWatcher.bind(this), false);
  221. // watch.addEventListener("DOMAttrModified", this.DOMAttrModifiedWatcher.bind(this), false);
  222. // }
  223. }
  224.  
  225. if (!this.instant) {
  226. this.registerControls();
  227. this.whackDom();
  228. }
  229.  
  230. var style = ''
  231. style += ("#cnt.singleton #center_col, #cnt #center_col, #cnt.singleton #foot, #cnt #foot, .mw {width:auto !important; max-width:100% !important;} #rhs {left:auto !important; position:absolute}#botstuff .sp_cnt,#botstuff .ssp, #ires{display:none} .s{max-width:98%!important;} .vshid{display:inline} .ab_dropdown ul{list-style:none} #search *{white-space:normal!important} #search{border-spacing:5px} #rcnt .col:nth-of-type(3){width:100%!important} #rcnt .col:nth-of-type(4){float: none; right: 0px; top: -140px; width:100% !important}");
  232. style += ("div#scrollTop a {background:url(" + UIL.RES.TOP_PNG + ") transparent;border-radius: 10px 10px 10px 10px;bottom: 30px;height: 40px;position: fixed;right: 30px;width: 40px;z-index: 10000;}div#scrollTop a{-webkit-transition: opacity 1.0s ease;-moz-transition: opacity 1.0s ease;-o-transition: opacity 1.0s ease;0} div#scrollTop a.mh_show{opacity: 0.2} div#scrollTop a.mh_hide{opacity: 0}div#scrollTop a:hover{-webkit-transition: opacity .5s ease;-moz-transition: opacity .5s ease;-o-transition: opacity .5s ease;opacity: 0.5;}");
  233. style += ("div.col {width: 100% !important;} #rso .srg {column-count: " + this.numColumns +";}");
  234.  
  235. if (this.numColumns > 1) {
  236. var bkWMgdWidth = '';
  237. switch (this.numColumns) {
  238. case 2:
  239. bkWMgdWidth = '40vw';
  240. break;
  241.  
  242. case 3:
  243. bkWMgdWidth = '25vw';
  244. break;
  245.  
  246. case 4:
  247. bkWMgdWidth = '20vw';
  248. break;
  249. }
  250. bkWMgdWidth = 'auto'; /* Izzy */
  251. style += ("#cnt.singleton #center_col, #cnt.singleton #foot, #cnt #foot, .mw {margin-left:0 !important;}div.bkWMgd{max-width:" + bkWMgdWidth + " !important}");
  252. }
  253.  
  254. if (this.autoLoad) {
  255. style += ("#loadingimg {width:180px;height:34px;background-image:url(" + UIL.RES.LOADING_GIF + ");background-repeat:no-repeat;margin:2em auto auto auto;padding:10px;display:none;} #loadingimg p{font-size:130%;font-weight:bold;padding-left:40px;margin:0;float:left} #loadingimg a{text-align: left; float: left;margin: 2px 10px;}");
  256. }
  257.  
  258. if (this.hideSearch) {
  259. style += ("#ab_ctls,#ab_name,#resultStats{top:0} #gb,#gb.gbes,#gb.gbesi,#gb.gbem,#gb.gbemi{height:0!important}#gbx1,#gbx2{height:0!important}#gbq2[class='gbt'] #gbqfw{display:none;}#main{margin-top:44px!important}#gbu{margin-right:232px!important}");
  260. //document.getElementById('gbq').addEventListener("DOMAttrModified", this.resizeWatcher, false);
  261. //this.resizeWatcher(true);
  262. }
  263.  
  264. if (this.remSponsor) {
  265. style += ("#tvcap, #tads, #topstuff table.ts, #bottomads{display:none;}");
  266. }
  267.  
  268. // if(this.noSitePreview)
  269. // {
  270. // style += (".vspib {display:none}");
  271. // }
  272.  
  273. if (this.searchesRelatedTo) {
  274. style += (".bkWMgd .kno-kp {display:none;} #center_col #extrares.med{display:none;} #botstuff #brs{display:none;} #topstuff .tqref{display:none;}");
  275. }
  276.  
  277. // if(this.remRightPanel)
  278. // {
  279. // style += ("#rhs {display:none}");
  280. // }
  281.  
  282. if (this.numResults) {
  283. style += ("#res h3.r {display:inline}");
  284. }
  285.  
  286. var hue = this.resHue;
  287. if (hue.length == 0) {
  288. hue = "transparent";
  289. }
  290.  
  291. var BGBorder;
  292. if (this.bGBorder == 'background') {
  293. BGBorder = "background-color:";
  294. }
  295. else {
  296. BGBorder = "border: 1pt solid ";
  297. }
  298.  
  299. var imagePreview = "";
  300. if (this.imagePreview) {
  301. imagePreview = "min-height:102px;";
  302. }
  303.  
  304. // style += ("#side_tab a {color:#444;background-color:"+hue+";border: meduim none;box-shadow: 0 -1px 3px rgba(0, 0, 0, 0.2);-webkit-box-shadow: 0 -1px 3px rgba(0, 0, 0, 0.2);font-weight: bold;padding: 3px 14px;margin-top: 50px;text-decoration: none;border-radius: 6px 6px 0 0;transform: rotate(-90deg);-webkit-transform: rotate(-90deg);-moz-transform: rotate(-90deg);filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);position: absolute;}#side_tab{float: right;height: 100px;position: absolute;right: -50px;width: 100px;z-index:-10000000}#rhs_block{float:right;}");
  305. // style += (".side_out{-webkit-transform: translate(100%,0);-moz-transform: translate(100%,0);-o-transform: translate(100%,0);transition: all 2s ease-in-out;}#side_tab a:hover + .side_out{-webkit-transform: translate(-200%,0);-moz-transform: translate(-200%,0);-o-transform: translate(-100%,0);transition: all 2s ease-in-out;}");
  306.  
  307. style += ("#search li.g, #search div.g { margin-top: 0.15em !important; margin-right: 0.25em !important; margin-bottom: 0.15em !important; margin-left: 0.25em; -moz-border-radius: 10px; border-radius: 10px; " + BGBorder + " " + hue + " ! important; padding: 0.5em ! important; } li.g {list-style:none outside none;" + imagePreview + "};");
  308.  
  309. if (!this.watching) this.addStyle("@namespace url(http://www.w3.org/1999/xhtml); " + style);
  310.  
  311. if ((rhs = document.getElementById('rhs'))) {
  312. this.rightPanelAdjuster(rhs);
  313. }
  314.  
  315. // setInterval(this.watchTimer.bind(this),500);
  316. // //monkeyr.log('google.timers.load.t.prt')
  317. // monkeyr.log(window);
  318. },
  319.  
  320. imagePageProcessor: function () {
  321. this.registerControls();
  322. var style = '';
  323. style += ("div#scrollTop a {background:url(" + UIL.RES.TOP_PNG + ") transparent;border-radius: 10px 10px 10px 10px;bottom: 30px;height: 40px;position: fixed;right: 30px;width: 40px;z-index: 10000;}div#scrollTop a{-webkit-transition: opacity 1.0s ease;-moz-transition: opacity 1.0s ease;-o-transition: opacity 1.0s ease;0} div#scrollTop a.mh_show{opacity: 0.2} div#scrollTop a.mh_hide{opacity: 0}div#scrollTop a:hover{-webkit-transition: opacity .5s ease;-moz-transition: opacity .5s ease;-o-transition: opacity .5s ease;opacity: 0.5;}");
  324. this.showBackToTopLink(true);
  325. // style += ("#cnt #center_col, #cnt #foot, .mw {width:auto !important; max-width:100% !important;} #rhs {left:auto; !important}#botstuff .sp_cnt,#botstuff .ssp, #ires{display:none} .s{max-width:98%!important;} .vshid{display:inline} #res h3.r {white-space:normal}");
  326. if (this.hideSearch) {
  327. // style += ("#rcnt{margin-top:1em} #sfcnt,#sftr,#searchform{display:none!important;}#cnt{padding:0}#cnt .mw:first-child{position:absolute;top:4.5em;right:0}#rshdr .sfcc{position:absolute;top:2em;right:0}");
  328. style += ("#ab_ctls,#ab_name,#resultStats{top:0} #gb,#gb.gbes,#gb.gbesi,#gb.gbem,#gb.gbemi{height:0!important}#gbx1,#gbx2{height:0!important}#gbq2[class='gbt'] #gbqfw{display:none;}#main{margin-top:0!important}");
  329. // document.getElementById('gbq').addEventListener("DOMAttrModified", this.resizeWatcher, false);
  330. //this.resizeWatcher(true);
  331. }
  332.  
  333. if (this.remSponsor) {
  334. style += ("#center_col, #foot {margin-right: 0 !important;} #rhs, #tads, #topstuff table.ts, #bottomads{display:none;}");
  335. }
  336.  
  337. if (this.searchesRelatedTo) {
  338. style += (".bkWMgd{display:none;} #center_col #extrares.med{display:none;} #botstuff #brs{display:none;} #topstuff .tqref{display:none;}");
  339. }
  340.  
  341. if (this.showExtraResults) {
  342. style += ("#appbar{display:none !important;}");
  343. }
  344.  
  345. this.addStyle("@namespace url(http://www.w3.org/1999/xhtml); " + style);
  346. },
  347.  
  348. whackTest: function (from, e) {
  349. // if(from=='subtree' && e.target.id=='nyc' && e.target.className=='rhstc5'){
  350. // monkeyr.logA('whackTest TRIGGER')
  351. // return true;
  352. // }
  353. if (from == 'inserted' && e.target.id == 'navcnt') {
  354. monkeyr.logA('whackTest DOM TRIGGER');
  355. return 'dom';
  356. }
  357. // else if(from=='mutation' && e.target.id=='xfoot' && e.attributeName=='style' && e.target.style.visibility==''){
  358. // monkeyr.logA('whackTest img TRIGGER');
  359. // // return 'img';
  360. // }
  361. // else if(from=='attribute' && e.target.id=='pnnext' && e.attrName=='href'){
  362. // monkeyr.logA('whackTest lnk TRIGGER', this);
  363. // this.getAutoLoadParams();
  364. // }
  365. return false;
  366. },
  367.  
  368. DOMNodeInsertedWatcher: function (e) {
  369. monkeyr.logE('inserted', e.target)
  370. if (e.target.id == 'ab_ctls' || e.target.id == 'hdtb') {
  371. this.registerControls();
  372. }
  373. else if (e.target.id == 'rhs') {
  374. this.rightPanelAdjuster(e.target);
  375. }
  376. if (this.whackTest('inserted', e) == 'dom') this.whackDom();
  377. // if(this.whackTest('inserted', e)=='img') this.whackImages(document);
  378. },
  379.  
  380. MutationObserver: function (e) {
  381. if (e.type != 'childList') {
  382. if (e.target.getAttribute(e.attributeName) != e.oldValue) {
  383. monkeyr.logE('mutation', e.type, e.target, e.attributeName, e.target.getAttribute(e.attributeName), e.oldValue);
  384. }
  385. }
  386. else {
  387. monkeyr.logE('mutation', e.type, e.target, e.addedNodes, e.removedNodes);
  388. }
  389. if (this.whackTest('mutation', e) == 'dom') this.whackDom();
  390. // if(this.whackTest('mutation', e)=='img') this.whackImages(document);
  391. },
  392.  
  393. DOMSubtreeModifiedWatcher: function (e) {
  394. monkeyr.logE('subtree', e.target, e.attrName, e.newValue, e.prevValue, e)
  395. // monkeyr.logE('subtree', e.target, e.attributeName, e.target.getAttribute(e.attributeName), e.oldValue)
  396. // if(this.whackTest('subtree', e)) this.whackDom();
  397. if (this.whackTest('subtree', e) == 'dom') this.whackDom();
  398. // if(this.whackTest('subtree', e)=='img') this.whackImages(document);
  399. },
  400.  
  401. DOMAttrModifiedWatcher: function (e) {
  402. monkeyr.logE('attribute', e.target, e.attrName, e.newValue, e.prevValue, e)
  403. // monkeyr.logE('subtree', e.target, e.attributeName, e.target.getAttribute(e.attributeName), e.oldValue)
  404. // if(this.whackTest('subtree', e)) this.whackDom();
  405. if (this.whackTest('attribute', e) == 'dom') this.whackDom();
  406. // if(this.whackTest('attribute', e)=='img') this.whackImages(document);
  407. },
  408.  
  409. DOMNodeRemovedWatcher: function (e) {
  410. monkeyr.logE('removed', e.target)
  411. if (e.target.id == 'GTR') {
  412. monkeyr.log('GTR REMOVED')
  413. this.initialise = true;
  414. clearTimeout(this.watchForScrollTimer);
  415. }
  416. },
  417.  
  418.  
  419. whackDom: function () {
  420. if (!document.getElementById('GTR')) {
  421. clearTimeout(this.whackDomTimeOut);
  422. this.whackDomTimeOut = setTimeout(function () {
  423. var ires = document.getElementById('ires');
  424. if (ires) {
  425. monkeyr.log('!!!!! Whacking DOM !!!!!')
  426. var extrares = document.getElementById('extrares');
  427. var res = document.getElementById('res');
  428. monkeyr.log(extrares, res, this.autoLoad)
  429. if (extrares && res && this.autoLoad) {
  430. res.parentNode.insertBefore(extrares, res);
  431. }
  432. if (this.hideSearch) {
  433. // this.resizeWatcher(true);
  434. }
  435. if (!this.buildResultTable()) {
  436. return;
  437. }
  438. if (this.autoLoad) {
  439. if (this.getAutoLoadParams() && this.insertLoadingImage()) {
  440. //monkeyr.log('watchForScroll');
  441. this.watchForScroll.bind(this)();
  442. }
  443. }
  444.  
  445. this.processResults(document.getElementById('center_col'))
  446. ires.parentNode.removeChild(ires);
  447. this.initialise = false;
  448. }
  449. }.bind(this), 0);
  450. }
  451. },
  452.  
  453. resizeWatcher: function (e) {
  454. //monkeyr.log(e.target.id)
  455. if (e === true || (e.target && e.target.id == 'gbq')) {
  456. setTimeout(function () {
  457. //monkeyr.log('here')
  458. //left side
  459. var glogo = document.getElementById('gbq1');
  460. var ab_name = document.getElementById('ab_name');
  461. var ab_ctls = document.getElementById('ab_ctls');
  462. var resultStats = document.getElementById('resultStats');
  463. var gbu = document.getElementById('gbu');
  464. var appbar = document.getElementById('appbar');
  465.  
  466. var glogoPos = findPos(glogo);
  467. //monkeyr.log(glogoPos)
  468. lft = glogoPos[0] + glogo.offsetWidth + 20;
  469. ab_name.style.marginLeft = lft + 'px'
  470. resultStats.style.marginLeft = (lft + ab_name.offsetWidth + 50) + 'px'
  471.  
  472. //right side
  473. //monkeyr.log(getStyle(gbu, 'margin-right'))
  474. ab_ctls.style.right = (gbu.offsetWidth + getStyle(gbu, 'margin-right') + 10) + 'px';
  475.  
  476. //heights
  477. //monkeyr.log(gbu.offsetHeight)
  478. ab_ctls.style.marginTop = getStyle(gbu, 'padding-top') + 'px'
  479. ab_name.style.marginTop = (getStyle(gbu, 'padding-top') + 3) + 'px'
  480. resultStats.style.marginTop = (getStyle(gbu, 'padding-top') + 10) + 'px'
  481. appbar.style.height = (gbu.offsetHeight) + 'px'
  482.  
  483. }, 0);
  484.  
  485. }
  486. },
  487.  
  488. rightPanelAdjuster: function (el) {
  489. if (el && (center_col = document.getElementById('center_col')) && (foot = document.getElementById('foot'))) {
  490. monkeyr.log('----rhs stuff----', el, this.remSponsor, this.remRightPanel);
  491. if (this.remSponsor && (mbEnd = document.getElementById('mbEnd'))) {
  492. monkeyr.log('rem mbEnd', mbEnd);
  493. mbEnd.parentNode.removeChild(mbEnd);
  494. }
  495. if (this.remSponsor && (rhsvw = el.querySelector('div#rhs_block > div.rhsvw'))) {
  496. monkeyr.log('rem .rhsvw');
  497. rhsvw.parentNode.removeChild(rhsvw);
  498. }
  499. if (el.offsetHeight > 50) {
  500.  
  501. monkeyr.log('el.offsetWidth:', el.offsetWidth, 'el.offsetHeight', el.offsetHeight)
  502. var div = document.buildElement('div', { id: 'slideout_tab' }, 'more info'),
  503. width = el.offsetWidth,
  504. height = el.offsetHeight,
  505. css = "#slideout_tab{color:#444;border:meduim none;background-color: #fff;box-shadow:0 -1px 3px rgba(0,0,0,0.2);font-weight:bold;padding:3px 14px;margin:50px 0 0 -22px;text-decoration:none;width:65px;border-radius:6px 6px 0 0;transform:rotate(-90deg);-webkit-transform:rotate(-90deg);}.slideout{border-radius:5px 0 0 5px;right:0;padding:12px 0;position:absolute;text-align:center;top:140px;transition:all .5s ease-in-out;-webkit-transition:all .5s ease-in-out;width:35px;overflow:hidden;min-width:0!important;height:105px;}.slideout_inner{background-color:#fff;padding:0;position:absolute;text-align:left;top:0;width:0;margin-left:35px;width:" + width + "px!important;}.slideout:hover,.start_out{width:" + (width + 35) + "px!important;height:" + height + "px!important;}.start_in{transition:all 0s ease;-webkit-transition:all 0s ease;}";
  506.  
  507. var style = document.getElementById('side_tab_style');
  508. if (!style) {
  509. style = document.buildElement('style', { type: 'text/css', id: 'side_tab_style' });
  510. if (style.styleSheet) {
  511. style.styleSheet.cssText = css;
  512. } else {
  513. style.appendChild(document.createTextNode(css));
  514. }
  515. el.appendChild(style);
  516. }
  517. if (this.remRightPanel) {
  518. setTimeout(function () { el.className = el.className.replace(' start_in', ''); }, 500)
  519. el.className = el.className + ' start_in';
  520. }
  521. else {
  522. setTimeout(function () { el.className = el.className.replace(' start_out', ''); }, 2000)
  523. el.className = el.className + ' start_out';
  524. }
  525. el.className = el.className + ' slideout';
  526. var t = el.firstChild;
  527. el.insertBefore(div, el.firstChild);
  528. t.className = t.className + " slideout_inner";
  529.  
  530. center_col.style.marginRight = '0px';
  531. foot.style.marginRight = '0px';
  532. }
  533. else {
  534. center_col.style.marginRight = '0px';
  535. foot.style.marginRight = '0px';
  536. }
  537. }
  538. },
  539.  
  540. insertEndText: function () {
  541. //monkeyr.log('insertEndText');
  542. var elem = document.buildElement('table', {
  543. id: "endtext", width: "100%", cellspacing: "2", cellpadding: "0", border: "0", "class": "t bt",
  544. style: "font-weight:bold;text-decoration:blink"
  545. }, " End of the search results");
  546. var res = document.getElementById("res");
  547. res.parentNode.insertBefore(elem, res.nextSibling);
  548. return elem;
  549. },
  550.  
  551. reqMoreRes: function () {
  552. if (this.requested == this.startNumber) {
  553. return;
  554. }
  555. else {
  556. this.requested = this.startNumber;
  557. this.loadingImage.style.display = "block";
  558. var query = this.query.replace(/start=\d*/, "start=" + this.startNumber);
  559. this.nextLink.href = query;
  560. monkeyr.log('reqMoreRes ' + query);
  561. // monkeyr.log('reqMoreRes', this.startNumber, query);
  562. this.UI.getURL(query, this.processResults.bind(this));
  563. }
  564. },
  565.  
  566. remainingScroll: function () {
  567. var ret = (document.body.scrollHeight - window.pageYOffset - window.innerHeight);
  568. return ret;
  569. },
  570.  
  571. watchForScroll: function () {
  572. var self = arguments.callee;
  573. if (this.remainingScroll() < 300 && !this.requestingMoreResults && !this.initialise && document.getElementById('GTR')) {
  574. //monkeyr.log('watchForScroll', this.scrollHeight, document.body.scrollHeight, this.winInnerHeight, window.innerHeight, window.pageYOffset)
  575. // monkeyr.log('watchForScroll '+this.remainingScroll());
  576. this.requestingMoreResults = true;
  577. this.reqMoreRes();
  578. this.scrollHeight = document.body.scrollHeight;
  579. this.winInnerHeight = window.innerHeight;
  580. }
  581. else if (this.backToTopLinkInsert == window.pageYOffset > window.innerHeight * .5) {
  582. this.insertBackToTopLink(this.backToTopLinkInsert);
  583. }
  584. else if (this.backToTopLinkShow == window.pageYOffset > window.innerHeight * .75) {
  585. this.showBackToTopLink(this.backToTopLinkShow);
  586. }
  587. this.watchForScrollTimer = setTimeout(self.bind(this), 100);
  588. },
  589.  
  590. insertLoadingImage: function () {
  591. monkeyr.log('insertLoadingImage');
  592. var nextLink = document.getElementByXPath("//table[@id='nav']//td[last()]/a");
  593. var navbar = document.getElementByXPath("//table[@id='nav']//td/ancestor::table");
  594. var loadingimg = document.getElementById('loadingimg');
  595. if (navbar) {
  596. navbar.style.display = "none";
  597. if (!loadingimg) {
  598. var div = document.buildElement('div', { id: '' });
  599. var p = document.buildElement('p', {}, "");
  600. var a = document.buildElement('a', { href: nextLink.href }, '');
  601. div.appendChild(p);
  602. div.appendChild(a);
  603. this.nextLink = a;
  604. navbar.parentNode.insertBefore(div, navbar)
  605. this.loadingImage = div;
  606. }
  607. }
  608. if (!this.endText) {
  609. this.endText = this.insertEndText();
  610. }
  611. this.endText.style.display = nextLink && (nextLink.href.indexOf('start=') != -1) ? 'none' : 'block';
  612. //monkeyr.log('insertLoadingImage '+nextLink);
  613. return nextLink
  614. },
  615.  
  616. insertBackToTopLink: function (insert) {
  617. var a = document.querySelector('#scrollTop a');
  618. if (insert && !a) {
  619. var div = document.buildElement('div', { id: 'scrollTop' });
  620. a = document.buildElement('a', { href: '#top', 'class': 'mh_hide' }, '', 'click', function (e) {
  621. e.preventDefault();
  622. e.stopPropagation();
  623. document.querySelector("body").scrollIntoView();
  624. });
  625. div.appendChild(a);
  626. document.body.appendChild(div);
  627. }
  628. a.style.display = ((insert) ? "inline" : "none");
  629. this.backToTopLinkInsert = !insert;
  630. return a;
  631. },
  632.  
  633. showBackToTopLink: function (show) {
  634. var a = document.querySelector('#scrollTop a');
  635. if (!a) {
  636. a = this.insertBackToTopLink(true);
  637. }
  638. this.backToTopLinkShow = !show
  639. a.className = ((show) ? "mh_show" : "mh_hide");
  640. },
  641.  
  642. getAutoLoadParams: function () {
  643. // monkeyr.log('getAutoLoadParams');
  644. var nextLink = document.getElementByXPath("//table[@id='nav']//td[last()]/a[contains(@href,'start')]");
  645. if (nextLink) {
  646. var href = nextLink.href;
  647. this.startNumber = this._matchNum(href, /start=(\d+)/, 10);
  648. this.itemsQuantity = this._matchNum(href, /num=(\d+)/, 10);
  649. monkeyr.log('getAutoLoadParams', this.startNumber, this.itemsQuantity);
  650. this.query = href;
  651. this.resultStats = document.getElementById('resultStats');
  652. return true;
  653. }
  654. else {
  655. monkeyr.log('no more results');
  656. return false;
  657. }
  658. },
  659.  
  660. buildResultTable: function () {
  661. monkeyr.log('buildResultTable')
  662. var tab = document.getElementById('GTR');
  663. if (tab) {
  664. //monkeyr.log('del tab')
  665. tab.parentNode.removeChild(tab);
  666. }
  667.  
  668. var table = document.buildElement('table', { id: 'GTR' });
  669. this.resultsTable = table;
  670. var div = document.getElementByXPath("//div/div[@class='g']/parent::div | //div[@id='rso']/div/div | //div[@id='res']/span[@id='search'] | //g-section-with-header");
  671. if (div) {
  672. // monkeyr.log('init this')
  673. var start = window.location.search.match(/start=(\d+)/);
  674. this.startBase = (start && start[1].retNum()) || 0;
  675. this.lastI = 0;
  676. this.startNumber = 0;
  677. this.curRow = 0;
  678. this.nextRow = 0;
  679. this.requested = 0;
  680. this.requestingMoreResults = false;
  681. this.scrollHeight = 0;
  682. // this.winInnerHeight = 0;
  683.  
  684. document.getElementById('ires').parentNode.appendChild(table);
  685. if (this.showExtraResults) {
  686. if (document.getElementById('appbar')) {
  687. document.getElementById('appbar').outerHTML = "";
  688. }
  689. var list = document.getElementsByXPath("//div[@class='g' and not(@id='imagebox_bigimages')]");
  690. }
  691. else {
  692. var multipleCheck = document.getElementByXPath("//*[@id='rso']/div[2]");
  693. var list = multipleCheck ? document.getElementsByXPath("//*[@id='rso']/div/div[@class='srg']/div[@class='g'] | //*[@id='rso']/div[not(*[contains(@class, 'srg')])]") : document.getElementsByXPath("//div[@class='g']");
  694. }
  695.  
  696.  
  697. var length = list.length;
  698. if ((ires = document.getElementById('ires')) && (cnt = document.getElementById('cnt'))) {
  699. ires.style.display = ((length == 1) ? 'block' : 'none');
  700. cnt.className = ((length == 1) ? cnt.className.replace(' singleton', '') : cnt.className + ' singleton');
  701. if (length == 1) return false;
  702. }
  703. for (var i = 0; i < list.length; i++) {
  704. this.resultsToTable(list, i, length, true);
  705. }
  706. this.nextRow = this.curRow;
  707. this.paginationBoundry();
  708. this.lastI = i;
  709. return true;
  710. }
  711. },
  712.  
  713. paginationBoundry: function () {
  714. if (this.newspaper && this.autoLoad) {
  715. var row = this.nextRow++;
  716. this.resultsTable.insertRow(row);
  717. var cell = this.resultsTable.rows[row].insertCell(0);
  718. cell.setAttribute("valign", "top");
  719. cell.setAttribute("width", "100%");
  720. cell.setAttribute("colspan", this.numColumns);
  721. var hr = document.createElement('hr');
  722. cell.appendChild(hr);
  723. }
  724. },
  725.  
  726. resultsToTable: function (list, i, resLength, initial) {
  727. var link = list[i], div;
  728. // console.log(link);
  729. if (this.numResults && (div = document.getElementByXPath(".//div/div/a", link))) {
  730. // console.log(div)
  731. var str = document.buildElement('strong', null, (i + this.lastI + this.startBase + 1) + ' ');
  732. div.parentNode.insertBefore(str, div);
  733. }
  734. // if(this.noSitePreview){
  735. // var divs = document.getElementsByXPath(".//div[contains(@class,'vsc')]", link)
  736. // for (var j = 0; j < divs.length; j++)
  737. // {
  738. // divs[j].setAttribute('class', divs[j].getAttribute('class').replace('vsc',''));
  739. // }
  740. // }
  741. var col = 0, row = 0;
  742. if (this.newspaper) {
  743. var rowsPfetch = Math.ceil(resLength / this.numColumns);
  744. col = Math.floor(i / rowsPfetch);
  745. row = Math.floor(i - (col * rowsPfetch) + this.nextRow);
  746. this.curRow = ((this.curRow <= row) && (row + 1)) || this.curRow;
  747. }
  748. else {
  749. col = (i + this.lastI) % this.numColumns;
  750. row = Math.floor((i + this.lastI) / this.numColumns);
  751. }
  752. if (col == 0) {
  753. this.resultsTable.insertRow(row);
  754. }
  755. var a = document.getElementByXPath(".//div[contains(@class,'r')]/a", link);
  756. var imageboxBigimages = document.getElementByXPath(".//div[contains(@id, 'imagebox_bigimages')]", link);
  757. if (imageboxBigimages) {
  758. Array.from(document.getElementsByClassName('tHqoQ rg_meta notranslate', link)).forEach(function (element) {
  759. element.outerHTML = "";
  760. });
  761. Array.from(document.getElementsByClassName('vsqVBf rg_el ivg-i', link)).forEach(function (element) {
  762. element.style = "display:inline-block;width:auto !important;height:auto !important;margin-left:5px;margin-right:5px;";
  763. });
  764. Array.from(document.getElementsByTagName('g-img', link)).forEach(function (element) {
  765. element.style = "";
  766. });
  767. Array.from(document.getElementsByClassName('rISBZc M4dUYb', link)).forEach(function (element) {
  768. element.style = "";
  769. });
  770. }
  771. Array.from(document.getElementsByClassName('tHqoQ rg_meta notranslate', link)).forEach(function (element) {
  772. element.outerHTML = "";
  773. });
  774. Array.from(document.getElementsByClassName('vsqVBf rg_el ivg-i', link)).forEach(function (element) {
  775. element.style = "display:inline-block;width:auto !important;height:auto !important;margin-left:5px;margin-right:5px;";
  776. });
  777. Array.from(document.getElementsByTagName('g-img', link)).forEach(function (element) {
  778. element.style = "";
  779. });
  780. Array.from(document.getElementsByClassName('rISBZc M4dUYb', link)).forEach(function (element) {
  781. element.style = "";
  782. });
  783. if (a) {
  784. var isImage = a.className != "bia";
  785. if (this.externalLinksResults) {
  786. a.target = "_blank";
  787. }
  788. else {
  789. a.target = "_self";
  790. }
  791.  
  792. if (this.searchLinkTracking) {
  793. a.removeAttribute("onmousedown");
  794. }
  795.  
  796. if (this.favIcon) {
  797. var base = a.href.match(/http[s]?:\/\/([\w\.\-]+)[:\/]/);
  798. if (base && isImage) {
  799. var fav = document.buildElement('img', { width: '16', height: '16', style: 'margin-bottom:-3px;', src: window.location.protocol + '//www.google.com/s2/favicons?domain=' + encodeURIComponent(base[1]) });
  800. a.parentNode.insertBefore(fav, a);
  801. a.parentNode.insertBefore(document.createTextNode(' '), a);
  802. }
  803. }
  804.  
  805. if (this.imagePreview && isImage) {
  806. // monkeyr.log(this.imagePreview)
  807. var a2 = a.cloneNode(false);
  808. a2.removeAttribute('class');
  809. var sl = a.href.match(/:\/\/www.(\w)|:\/\/(\w)/);
  810. var bs = a.href.match(/(http:\/\/[\w\.\-:]+)\/|(ftp:\/\/[\w\.\-:]+)\/|(https:\/\/[\w\.\-:]+)\//);
  811. sl = sl[1] || sl[2];
  812. bs = bs[1] || bs[2] || bs[3];
  813. var img = document.buildElement('img', {
  814. align: 'left', src: window.location.protocol + "//" + sl + ".searchpreview.de/preview?s=" + bs + "&ra=1",
  815. style: 'border:1px solid #BBB;margin:2px 4px 5px 0px;width:111px;height:82px;'
  816. });
  817. a2.appendChild(img);
  818. a.parentNode.parentNode.insertBefore(a2, a.parentNode);
  819. }
  820. var ele = document.getElementByXPath(".//div[@class='f kv']/cite/parent::div", link);
  821.  
  822. if (!this.searchLinkTracking && ele) {
  823. var notrack = document.buildElement('a',
  824. { href: a.href, 'class': 'fl', title: 'Visit the link without Google tracking you' }, 'Trackless');
  825. if (this.externalLinksResults) {
  826. notrack.target = "_blank";
  827. }
  828. else {
  829. notrack.target = "_self";
  830. }
  831. ele.appendChild(notrack, ele.nextSibling);
  832. }
  833. }
  834. var sublinks = link.querySelectorAll('tr.mslg > a, span a.l');
  835. for (var m = 0; m < sublinks.length; m++) {
  836. var sublink = sublinks[m];
  837. if (this.searchLinkTracking) {
  838. sublink.removeAttribute("onmousedown");
  839. if (this.externalLinksResults) {
  840. sublink.target = "_blank";
  841. }
  842. else {
  843. sublink.target = "_self";
  844. }
  845. }
  846. else {
  847. var notrack = document.buildElement('a',
  848. { href: sublink.href, 'style': 'font-size:x-small', title: 'Visit the link without Google tracking you' }, 'Trackless');
  849. if (this.externalLinksResults) {
  850. notrack.target = "_blank";
  851. }
  852. else {
  853. notrack.target = "_self";
  854. }
  855. sublink.parentNode.appendChild(document.createTextNode(" - "), sublink.parentNode.nextSibling);
  856. sublink.parentNode.appendChild(notrack, sublink.parentNode.nextSibling);
  857. }
  858.  
  859. }
  860. var cell = this.resultsTable.rows[row].insertCell(col);
  861. cell.setAttribute("valign", "top");
  862. if (!initial) cell.setAttribute("class", "dyna");
  863. var cellWidth = Math.floor(100 / this.numColumns) + "%";
  864. cell.setAttribute("width", cellWidth);
  865. cell.appendChild(link);
  866. },
  867.  
  868. processResults: function (responseText) {
  869. // monkeyr.log('processResults')
  870. var i, img;
  871. //this.loadingImage.style.display = "none";
  872. var nextResult = document.buildElement('div', null, responseText);
  873.  
  874. // var imgs = document.getElementsByXPath(".//img[contains(@class,@id)]");
  875. // for (i = 0; (img = imgs[i++]);)
  876. // {
  877. // img.removeAttribute('id')
  878. // }
  879.  
  880. var imageRegex = /var _image_src='(\S+)';/gm;
  881. var imageIdRegex = /var _image_ids=\['(\S+)'\];/gm;
  882. var imageResult;
  883. var imageIdResult;
  884. while ((imageResult = imageRegex.exec(responseText)) !== null) {
  885. imageIdResult = imageIdRegex.exec(responseText);
  886.  
  887. if (imageResult.index === imageRegex.lastIndex) {
  888. imageRegex.lastIndex++;
  889. }
  890. if (imageIdResult.index === imageIdRegex.lastIndex) {
  891. imageIdRegex.lastIndex++;
  892. }
  893. var tempElement = document.getElementByXPath(".//img[@id='" + imageIdResult[1] + "']", nextResult);
  894. if (tempElement) {
  895. tempElement.src = eval('"' + imageResult[1] + '"');
  896. }
  897. }
  898.  
  899. var stats = document.getElementByXPath(".//div[@id='resultStats']", nextResult);
  900. if (this.resultStats && stats) {
  901. this.resultStats.innerHTML = stats.innerHTML;
  902. }
  903.  
  904. if (this.showExtraResults) {
  905. var list = document.getElementsByXPath("//div[@class='g' and not(@id='imagebox_bigimages')]", nextResult);
  906. if (document.getElementById('appbar', nextResult)) {
  907. document.getElementById('appbar', nextResult).outerHTML = "";
  908. }
  909. }
  910. else {
  911. var multipleCheck = document.getElementByXPath("//*[@id='rso']/div[2]", nextResult);
  912. var list = multipleCheck ? document.getElementsByXPath("//*[@id='rso']/div/div[@class='srg']/div[@class='g'] | //*[@id='rso']/div[not(*[contains(@class, 'srg')])]", nextResult) : document.getElementsByXPath("//div[@class='g']", nextResult);
  913. }
  914.  
  915.  
  916. var length = list.length;
  917. if ((ires = document.getElementById('ires')) && (cnt = document.getElementById('cnt'))) {
  918. ires.style.display = ((length == 1) ? 'block' : 'none');
  919. cnt.className = ((length == 1) ? cnt.className.replace(' g', '') : cnt.className + ' g');
  920. if (length == 1) return false;
  921. }
  922.  
  923. for (i = 0; i < list.length; i++) {
  924. this.resultsToTable(list, i, length, false);
  925. }
  926. this.nextRow = this.curRow;
  927. this.paginationBoundry();
  928. this.lastI += i;
  929. var isNextExist = document.getElementByXPath(".//table[@id='nav']//td[last()]/a[@href]", nextResult);
  930. if (isNextExist) {
  931. this.startNumber += this.itemsQuantity;
  932. }
  933. else {
  934. // this.endText.style.display = 'block';
  935. }
  936. this.requestingMoreResults = false;
  937. },
  938.  
  939. whackImages: function (whackie) {
  940. clearTimeout(this.whackImagesTimeOut);
  941. this.whackImagesTimeOut = setTimeout(function () {
  942. if (this.requestingMoreResults) return;
  943. monkeyr.log('!!!!! Whacking Img !!!!!')
  944. // fix for thumnail display from google image search on 2nd or greater autoloaded pages
  945. var xfoot = document.getElementByXPath(".//div[@id='xfoot']", whackie);
  946. var scrxpath = (xfoot) ? ".//div[@id='xfoot']/script" : "./script"; //results returned in Opera have no xfoot div. Weird!)
  947. var imgscrs = document.getElementsByXPath(scrxpath, whackie);
  948. // monkeyr.log(scrxpath +', '+imgscrs.length)
  949. if (imgscrs && imgscrs.length > 1) {
  950. for (i = 0; i < (imgscrs.length - 1); i++) {
  951. var scr = imgscrs[i] && imgscrs[i].innerHTML;
  952. if (scr.indexOf('data:image/') != -1) {
  953. // monkeyr.log(scr);
  954. eval(scr);
  955. }
  956. }
  957. }
  958. // monkeyr.log(whackie.nodeName)
  959. // fix for thumnail zoom from google image search on 2nd or greater autoloaded pages
  960. var xjsi = whackie.querySelector('#xjsi script');
  961. if (xjsi) {
  962. // monkeyr.log(xjsi.innerHTML);
  963. // commented out as it seems to fix the zoom on autoloaded results but breaks the "more" link
  964. // this.exec(xjsi.innerHTML);
  965. }
  966. // fix for auto load thumnails being overwritten
  967. var imgs = document.querySelectorAll('td.dyna div.th img[id]');
  968. for (var m = 0; m < imgs.length; m++) {
  969. // monkeyr.log('removeid', imgs[m].id);
  970. imgs[m].removeAttribute('id');
  971. }
  972. // Fix for image mouseover error
  973. var imgs = document.querySelectorAll('img.rg_hi:not([id])');
  974. for (var m = 0; m < imgs.length; m++) {
  975. // monkeyr.log('mouseover',imgs[m]);
  976. imgs[m].id = 'rg_hi';
  977. }
  978. }.bind(this), 0);
  979. },
  980.  
  981. exec: function (fn) {
  982. var script = document.buildElement('script', { 'type': 'application/javascript' });
  983. script.textContent = '(function(){' + fn + '})();';
  984. document.body.appendChild(script); // run the script
  985. document.body.removeChild(script); // clean up
  986. },
  987.  
  988. externalLinks: function (scope, blank) {
  989. var thisdomain = window.location.host;
  990. var links = scope.getElementsByTagName('a');
  991. for (var i = 0; i < links.length; i++) {
  992. var a = links[i];
  993. if (a.href && a.host && a.host != thisdomain) {
  994. a.target = (blank ? "_blank" : "_self");
  995. }
  996. }
  997. },
  998.  
  999. registerControls: function () {
  1000. monkeyr.log('registerControls');
  1001. var controls = document.getElementByXPath("//*[@id='ab_options']");
  1002. var liclass = 'hdtb-mitem';
  1003. var linkclass = (controls) ? 'ab_dropdownlnk' : 'gbmt';
  1004. var link = document.getElementById('GoogleMonkeyRLink');
  1005. if (controls && !link) {
  1006. monkeyr.log('registerControls Registered');
  1007. var parent = controls.parentNode;
  1008. var li = document.buildElement('g-header-menu', { 'class': liclass });
  1009. link = document.buildElement('a', { href: '#', id: 'GoogleMonkeyRLink', 'class': linkclass }, 'GoogleMonkeyR settings', 'click', UIL.UI.preferencesShow.bind(UIL.UI));
  1010. li.appendChild(link);
  1011. parent.insertBefore(li, controls);
  1012. }
  1013. if (typeof GM_registerMenuCommand !== "undefined") {
  1014. GM_registerMenuCommand("GoogleMonkeyR Preferences", UIL.UI.preferencesShow.bind(UIL.UI));
  1015. }
  1016. },
  1017.  
  1018. addStyle: function (css) {
  1019. if (typeof GM_addStyle != "undefined") {
  1020. GM_addStyle(css);
  1021. } else {
  1022. var heads = document.getElementsByTagName("head");
  1023. if (heads.length > 0) {
  1024. var node = document.createElement("style");
  1025. node.type = "text/css";
  1026. node.innerHTML = css;
  1027. heads[0].appendChild(node);
  1028. }
  1029. }
  1030. },
  1031.  
  1032. _matchNum: function (subject, test, def) {
  1033. var out = subject.match(test);
  1034. return (out ? +(out[1]) : (def || 0));
  1035. }
  1036.  
  1037. };
  1038.  
  1039. /**
  1040. * Configuration.
  1041. **/
  1042. UIL.Config =
  1043. {
  1044. getBGBorder: function () {
  1045. return this._getBooleanConfig("BGBorder", "background");
  1046. },
  1047.  
  1048. setBGBorder: function (BGBorder) {
  1049. GM_setValue("BGBorder", BGBorder);
  1050. },
  1051.  
  1052. getResHue: function () {
  1053. return this._getBooleanConfig("resHue", "#FAFAE6");
  1054. },
  1055.  
  1056. setResHue: function (resHue) {
  1057. resHue = resHue.toUpperCase();
  1058. if (!resHue.match(/^#[0-9A-F]{6}$/)) {
  1059. resHue = "";
  1060. }
  1061. GM_setValue("resHue", resHue);
  1062. },
  1063.  
  1064. getNumCol: function () {
  1065. return this._getBooleanConfig("numCol", 1);
  1066. },
  1067.  
  1068. setNumCol: function (numCol) {
  1069. GM_setValue("numCol", numCol);
  1070. },
  1071.  
  1072. getRemSponsor: function () {
  1073. return this._getBooleanConfig("remSponsor", false);
  1074. },
  1075.  
  1076. setRemSponsor: function (remSponsor) {
  1077. GM_setValue("remSponsor", remSponsor);
  1078. },
  1079.  
  1080. getRemRightPanel: function () {
  1081. return this._getBooleanConfig("remRightPanel", false);
  1082. },
  1083.  
  1084. setRemRightPanel: function (remRightPanel) {
  1085. GM_setValue("remRightPanel", remRightPanel);
  1086. },
  1087.  
  1088. getNumResults: function () {
  1089. return this._getBooleanConfig("numResults", false);
  1090. },
  1091.  
  1092. setNumResults: function (numResults) {
  1093. GM_setValue("numResults", numResults);
  1094. },
  1095.  
  1096. getAutoLoad: function () {
  1097. return this._getBooleanConfig("autoLoad", false);
  1098. },
  1099.  
  1100. setAutoLoad: function (autoLoad) {
  1101. GM_setValue("autoLoad", autoLoad);
  1102. },
  1103.  
  1104.  
  1105. getHideSearch: function () {
  1106. return this._getBooleanConfig("hideSearch", false);
  1107. },
  1108.  
  1109. setHideSearch: function (hideSearch) {
  1110. GM_setValue("hideSearch", hideSearch);
  1111. },
  1112.  
  1113. getExtLinkSearch: function () {
  1114. return this._getBooleanConfig("extLinkSearch", false);
  1115. },
  1116.  
  1117. setExtLinkSearch: function (extLinkSearch) {
  1118. GM_setValue("extLinkSearch", extLinkSearch);
  1119. },
  1120.  
  1121. getSearchLinkTracking: function () {
  1122. return this._getBooleanConfig("searchLinkTracking", false);
  1123. },
  1124.  
  1125. setSearchLinkTracking: function (searchLinkTracking) {
  1126. GM_setValue("searchLinkTracking", searchLinkTracking);
  1127. },
  1128.  
  1129. getShowExtraResults: function () {
  1130. return this._getBooleanConfig("showExtraResults", false);
  1131. },
  1132.  
  1133. setShowExtraResults: function (showExtraResults) {
  1134. GM_setValue("showExtraResults", showExtraResults);
  1135. },
  1136.  
  1137. getImagePreview: function () {
  1138. return this._getBooleanConfig("imagePreview", false);
  1139. },
  1140.  
  1141. setImagePreview: function (imagePreview) {
  1142. GM_setValue("imagePreview", imagePreview);
  1143. },
  1144.  
  1145. getFavIcon: function () {
  1146. return this._getBooleanConfig("favIcon", false);
  1147. },
  1148.  
  1149. setFavIcon: function (favIcon) {
  1150. GM_setValue("favIcon", favIcon);
  1151. },
  1152.  
  1153. getSearchesRelatedTo: function () {
  1154. return this._getBooleanConfig("hideSearchesRelatedTo", false);
  1155. },
  1156.  
  1157. setSearchesRelatedTo: function (hideSearchesRelatedTo) {
  1158. GM_setValue("hideSearchesRelatedTo", hideSearchesRelatedTo);
  1159. },
  1160.  
  1161. getResultFlow: function () {
  1162. return this._getBooleanConfig("resultFlow", "l2r");
  1163. },
  1164.  
  1165. setResultFlow: function (resultFlow) {
  1166. GM_setValue("resultFlow", resultFlow);
  1167. },
  1168.  
  1169. getNoSitePreview: function () {
  1170. return this._getBooleanConfig("noSitePreview", false);
  1171. },
  1172.  
  1173. setNoSitePreview: function (noSitePreview) {
  1174. GM_setValue("noSitePreview", noSitePreview);
  1175. },
  1176.  
  1177. _getBooleanConfig: function (configName, defaultValue) {
  1178. var config = GM_getValue(configName);
  1179. if (config === undefined) {
  1180. GM_setValue(configName, defaultValue);
  1181. config = defaultValue;
  1182. }
  1183. return config;
  1184. }
  1185. };
  1186.  
  1187. /**
  1188. * Preferences User Interface (UI).
  1189. **/
  1190. UIL.UI =
  1191. {
  1192. preferencesShow: function (e) {
  1193. if (e) {
  1194. e.preventDefault();
  1195. e.stopPropagation();
  1196. }
  1197.  
  1198. this._loadBlocker();
  1199. var prefs = document.buildElement('div',
  1200. {
  1201. id: 'uil_preferences', name: 'uil_preferences',
  1202. style: 'position:fixed;top:5%;left:0px;right:0px;border:none;height:100%;width:100%;overflow:hidden;z-index:10001;'
  1203. }
  1204. , this.Base64.decode(UIL.RES.PREFS_HTML));
  1205. document.body.appendChild(prefs);
  1206. this.preferencesDocumentLoadHandler();
  1207. this.prefs = prefs;
  1208. },
  1209.  
  1210. _loadBlocker: function () {
  1211. if (this.blocker == null) {
  1212. var blocker = document.buildElement('div',
  1213. {
  1214. id: 'uil_blocker',
  1215. style: 'position:fixed;top:0px;left:0px;right:0px;bottom:0px;background-color:#000;opacity:0.5;z-index:10000;'
  1216. });
  1217.  
  1218. this.blocker = blocker;
  1219. document.body.appendChild(blocker);
  1220. }
  1221. },
  1222.  
  1223. updateScript: function (e) {
  1224. if (e) {
  1225. e.preventDefault();
  1226. e.stopPropagation();
  1227. }
  1228.  
  1229. this._loadBlocker();
  1230.  
  1231. try {
  1232. window.location.replace("http://userscripts.org/scripts/source/" + UIL.scriptId + ".user.js");
  1233. }
  1234. catch (e) { }
  1235. if (this.prefs) document.body.removeChild(this.prefs);
  1236. if (this.history) document.body.removeChild(this.history);
  1237. GM_setValue('skipVersion', 0);
  1238. setTimeout(this.refreshShow.bind(this), 4000);
  1239.  
  1240. },
  1241.  
  1242. refreshShow: function () {
  1243. var refresh = document.buildElement('iframe',
  1244. {
  1245. style: 'position:fixed;top:20%;left:0px;right:0px;border:none;height:100%;width:100%;overflow:hidden;z-index:10001;',
  1246. src: UIL.RES.REFRESH_HTML
  1247. }, '', 'load', this.refreshDocumentLoadHandler.bind(this));
  1248.  
  1249. this.refresh = refresh;
  1250. document.body.appendChild(refresh);
  1251. },
  1252.  
  1253. refreshDocumentLoadHandler: function () {
  1254. this.refresh.contentDocument.getElementById("scriptName").innerHTML = UIL.scriptName;
  1255. },
  1256.  
  1257. hide: function () {
  1258. if (this.history) document.body.removeChild(this.history);
  1259. if (this.prefs) document.body.removeChild(this.prefs);
  1260. if (this.blocker) document.body.removeChild(this.blocker);
  1261. this.history = null;
  1262. this.prefs = null;
  1263. this.blocker = null;
  1264. },
  1265.  
  1266. preferencesDocumentLoadHandler: function () {
  1267. var form = document.getElementById("preferences");
  1268.  
  1269. // Set up form state
  1270. form.elements.namedItem("numcol" + UIL.Config.getNumCol()).checked = true;
  1271. form.elements.namedItem("remsponsor").checked = UIL.Config.getRemSponsor();
  1272. form.elements.namedItem("numresults").checked = UIL.Config.getNumResults();
  1273. form.elements.namedItem("remrightpanel").checked = UIL.Config.getRemRightPanel();
  1274. form.elements.namedItem("autoload").checked = UIL.Config.getAutoLoad();
  1275. form.elements.namedItem("hidesearch").checked = UIL.Config.getHideSearch();
  1276. form.elements.namedItem("noSitePreview").checked = UIL.Config.getNoSitePreview();
  1277. form.elements.namedItem("extlinksearch").checked = UIL.Config.getExtLinkSearch();
  1278. form.elements.namedItem("searchlinktracking").checked = UIL.Config.getSearchLinkTracking();
  1279. form.elements.namedItem("showextraresults").checked = UIL.Config.getShowExtraResults();
  1280. form.elements.namedItem("ResHuefield").value = UIL.Config.getResHue();
  1281. form.elements.namedItem("imagepreview").checked = UIL.Config.getImagePreview();
  1282. form.elements.namedItem("favicon").checked = UIL.Config.getFavIcon();
  1283. form.elements.namedItem("remsearchesrelatedto").checked = UIL.Config.getSearchesRelatedTo();
  1284. //this.prefs.contentDocument.getElementById("ResHue").style.color = UIL.Config.getResHue();
  1285. document.getElementById("ResHue").style.background = UIL.Config.getResHue();
  1286. document.getElementById("BGBorderlink").innerHTML = UIL.Config.getBGBorder();
  1287. document.getElementById("flowimg").className = UIL.Config.getResultFlow();
  1288.  
  1289. // Set up event handlers
  1290. form.elements.namedItem("close_button").addEventListener("click", this.hide.bind(this), false);
  1291. form.elements.namedItem("save_button").addEventListener("click", this.preferencesSaveConfigurationHandler.bind(this), false);
  1292. document.getElementById("ResHue").addEventListener("click", UIL.RES.colorPicker.pickColor.bind(UIL.RES.colorPicker), false);
  1293. document.getElementById("flowimg").addEventListener("click", UIL.RES.flowtog, false);
  1294. document.getElementById("BGBorderlink").addEventListener("click", UIL.RES.bgBordertog, false);
  1295. document.getElementById("ResHuefield").addEventListener("change", UIL.RES.colorPicker.relateColor('ResHue'), false);
  1296.  
  1297. document.getElementById("version").innerHTML = UIL.scriptVersion;
  1298. if (BrowserDetect.csQuery) {
  1299. this.getURL("http://userscripts.org/scripts/source/" + UIL.scriptId + ".meta.js", this.updateTestOnPreferences.bind(this));
  1300. }
  1301. else {
  1302. this.updateLink(false);
  1303. }
  1304. },
  1305.  
  1306. getURL: function (address, cb) {
  1307. GM_xmlhttpRequest({
  1308. method: "GET",
  1309. url: address,//+"?"+Math.random(),
  1310. onload: function (xhr) { cb(xhr.responseText); }
  1311. });
  1312. },
  1313.  
  1314. updateCheckRequest: function () {
  1315. if (!BrowserDetect.csQuery) return;
  1316. var lastCheck = GM_getValue('lastCheck', 0);
  1317. if (this._currentTime() > (lastCheck + 86400)) //24 hours after last check
  1318. {
  1319. GM_setValue('delayUpdate', false);
  1320. this.getURL("http://userscripts.org/scripts/source/" + UIL.scriptId + ".meta.js", this.updateTestOnPage.bind(this));
  1321. }
  1322. else {
  1323. this.onSiteVersion = GM_getValue('onSiteVersion', 0);
  1324. var delayUpdate = GM_getValue('delayUpdate', false);
  1325. var skipVersion = GM_getValue('skipVersion', 0);
  1326. if (this.versionCompare(UIL.scriptVersion, this.onSiteVersion)) {
  1327. if (this.versionCompare(skipVersion, this.onSiteVersion) && !delayUpdate) {
  1328. this.updateMessageShow();
  1329. }
  1330. }
  1331. }
  1332. },
  1333.  
  1334. updateTestOnPage: function (text) {
  1335. var skipVersion = GM_getValue('skipVersion', 0);
  1336.  
  1337. var onSiteVersion = text.match(/\/\/\s*@version\s*(\d.*)/);
  1338. this.onSiteVersion = (onSiteVersion === null) ? 0 : onSiteVersion[1];
  1339. GM_setValue('onSiteVersion', this.onSiteVersion);
  1340.  
  1341. var updateHistory = text.substring(text.search(/\/\*.*StartHistory/im));
  1342. updateHistory = updateHistory.substring(0, updateHistory.search(/EndHistory.*\*\//im))
  1343. GM_setValue('onSiteVersionHistory', encodeURI(updateHistory));
  1344.  
  1345. if (this.versionCompare(UIL.scriptVersion, this.onSiteVersion)) {
  1346. if (this.versionCompare(skipVersion, this.onSiteVersion)) {
  1347. this.updateMessageShow();
  1348. }
  1349. }
  1350. GM_setValue('lastCheck', this._currentTime());
  1351. },
  1352.  
  1353. updateLink: function (update) {
  1354. var link = document.getElementById("check_update");
  1355. link.setAttribute("target", "_top");
  1356.  
  1357. if (update) {
  1358. link.addEventListener("click", this.historyShow.bind(this), false);
  1359. link.setAttribute("title", " see what's new with GoogleMonkeyR... ");
  1360. link.style.textDecoration = "blink";
  1361. link.innerHTML = "v" + this.onSiteVersion + " available";
  1362. }
  1363. else {
  1364. if (BrowserDetect.csQuery) {
  1365. link.setAttribute("href", "#");
  1366. link.setAttribute("title", " the history of GoogleMonkeyR ");
  1367. link.innerHTML = "history";
  1368. link.addEventListener("click", this.historyShow.bind(this), false);
  1369. }
  1370. else {
  1371. link.setAttribute("href", "https://greasyfork.org/zh-TW/scripts/373206-googlemonkeyr-modified-by-cook-wu");
  1372. link.setAttribute("title", " check for the latest script version on the homepage ");
  1373. link.innerHTML = "script homepage";
  1374. }
  1375. link.parentNode.appendChild(document.createTextNode(" - "));
  1376.  
  1377. var link2 = document.buildElement('a', {
  1378. href: "http://" + location.hostname + "/preferences",
  1379. target: '_parent', title: ' your Google preferences '
  1380. }, 'prefs');
  1381.  
  1382. link.parentNode.appendChild(link2);
  1383. }
  1384. },
  1385.  
  1386. updateTestOnPreferences: function (text) {
  1387. var onSiteVersion = text.match(/\/\/\s*@version\s*(\d.*)/);
  1388. this.onSiteVersion = (onSiteVersion === null) ? 0 : onSiteVersion[1];
  1389. GM_setValue('onSiteVersion', this.onSiteVersion);
  1390.  
  1391. var updateHistory = text.substring(text.search(/\/\*/));
  1392. updateHistory = updateHistory.substring(0, updateHistory.search(/\*\//))
  1393. GM_setValue('onSiteVersionHistory', encodeURI(updateHistory));
  1394.  
  1395. this.updateLink(this.versionCompare(UIL.scriptVersion, this.onSiteVersion));
  1396.  
  1397. GM_setValue('lastCheck', this._currentTime());
  1398. },
  1399.  
  1400. versionCompare: function (ver1, ver2) {
  1401. var maxVersionPartTest = 5;
  1402. var ver1Arr = (ver1 + ('.0'.repeat(maxVersionPartTest))).split(".", maxVersionPartTest);
  1403. var ver2Arr = (ver2 + ('.0'.repeat(maxVersionPartTest))).split(".", maxVersionPartTest);
  1404.  
  1405. //alert(ver1Arr.join(',') + ' - ' +ver2Arr.join(','));
  1406.  
  1407. for (var i = 0; i < maxVersionPartTest; i++) {
  1408. //alert(ver1Arr[i].retNum() +' '+ ver2Arr[i].retNum());
  1409. if (ver1Arr[i].retNum() < ver2Arr[i].retNum()) {
  1410. break;
  1411. }
  1412. else if (ver1Arr[i].retNum() > ver2Arr[i].retNum()) {
  1413. i = maxVersionPartTest
  1414. break;
  1415. }
  1416. }
  1417. return (i < maxVersionPartTest);
  1418. },
  1419.  
  1420. updateMessageShow: function () {
  1421. UIL.addStyle("@namespace url(http://www.w3.org/1999/xhtml); .gbh{display: none !important;} #gm_update_alert {margin: 10px; background-color: #E5ECF9; text-align: center; -moz-border-radius: 5px; position: relative; z-index: 2000; border: 1px solid; } #gm_update_alert a:visited {color: #0000CC !important} #gm_update_alert p {padding: 5px}");
  1422. var div = document.buildElement("div", { id: 'gm_update_alert' });
  1423. var p = document.createElement("p");
  1424. var sn = document.buildElement("strong", {}, UIL.scriptName + "&nbsp;");
  1425. var sep = document.buildElement("span", {}, "&nbsp;&nbsp;-&nbsp;&nbsp;");
  1426. p.appendChild(sn);
  1427. p.appendChild(document.createTextNode(" update available v" + this.onSiteVersion + " (current v" + UIL.scriptVersion + ")"));
  1428. p.appendChild(sep.cloneNode(true));
  1429. p.appendChild(document.buildElement('a', { href: '#' }, "Ignore for 24 hours", 'click', UIL.UI.updateDelay.bind(UIL.UI)));
  1430. p.appendChild(sep.cloneNode(true));
  1431. p.appendChild(document.buildElement('a', { href: '#' }, "Wait for next version", 'click', UIL.UI.updateSkip.bind(UIL.UI)));
  1432. p.appendChild(sep.cloneNode(true));
  1433. var a = document.buildElement("a", { target: "_blank", href: "http://userscripts.org/scripts/show/" + UIL.scriptId }, "Script homepage");
  1434. p.appendChild(a);
  1435. p.appendChild(sep.cloneNode(true));
  1436. p.appendChild(document.buildElement('a', { href: '#' }, "What's new", 'click', UIL.UI.historyShow.bind(UIL.UI)));
  1437. p.appendChild(sep.cloneNode(true));
  1438. p.appendChild(document.buildElement('a', { href: '#' }, "Update", 'click', UIL.UI.updateScript.bind(UIL.UI)));
  1439. div.appendChild(p);
  1440. document.body.insertBefore(div, document.body.firstChild);
  1441. this.updateMessage = div
  1442. },
  1443.  
  1444. updateMessageHide: function () {
  1445. if (this.updateMessage) document.body.removeChild(this.updateMessage);
  1446. this.updateMessage = null;
  1447. },
  1448.  
  1449. updateDelay: function (e) {
  1450. if (e) {
  1451. e.preventDefault();
  1452. e.stopPropagation();
  1453. }
  1454. GM_setValue('delayUpdate', true);
  1455. alert("You will not be reminded about this update again for 24 hours.");
  1456. this.updateMessageHide();
  1457. },
  1458.  
  1459. updateSkip: function (e) {
  1460. if (e) {
  1461. e.preventDefault();
  1462. e.stopPropagation();
  1463. }
  1464. GM_setValue('skipVersion', this.onSiteVersion);
  1465. alert("You will not be reminded again until the next new version is released.");
  1466. this.updateMessageHide();
  1467. },
  1468.  
  1469. _currentTime: function () {
  1470. var d = new Date();
  1471. return Math.round(d.getTime() / 1000); // Unix time in seconds
  1472. },
  1473.  
  1474. historyShow: function (e) {
  1475. if (e) {
  1476. e.preventDefault();
  1477. e.stopPropagation();
  1478. }
  1479.  
  1480. this._loadBlocker();
  1481. if (this.prefs) document.body.removeChild(this.prefs);
  1482. this.prefs = null;
  1483.  
  1484. var history = document.buildElement("iframe", {
  1485. src: UIL.RES.HISTORY_HTML,
  1486. style: "position:fixed;top:5%;left:0px;right:0px;border:none;height:100%;width:100%;overflow:hidden;z-index:10001"
  1487. },
  1488. null, "load", this.historyDocumentLoadHandler.bind(this));
  1489. this.history = history;
  1490.  
  1491. document.body.appendChild(history);
  1492. },
  1493.  
  1494. historyDocumentLoadHandler: function () {
  1495. this.history.contentDocument.getElementById("version").innerHTML = UIL.scriptVersion;
  1496. this.history.contentDocument.getElementById("scriptName").innerHTML = UIL.scriptName;
  1497.  
  1498. var form = this.history.contentDocument.forms.namedItem("history");
  1499.  
  1500. // Set up form state
  1501. form.elements.namedItem("history_text").innerHTML = decodeURI(GM_getValue('onSiteVersionHistory', ''));
  1502.  
  1503. // Set up event handlers
  1504. form.elements.namedItem("install_button").addEventListener("click", this.updateScript.bind(this), false);
  1505. form.elements.namedItem("close_button").addEventListener("click", this.hide.bind(this), false);
  1506.  
  1507. },
  1508.  
  1509. preferencesSaveConfigurationHandler: function () {
  1510. var form = document.getElementById("preferences");
  1511. for (var i = 1; i <= 4; i++) {
  1512. if (form.elements.namedItem("numcol" + i).checked) {
  1513. UIL.Config.setNumCol(i);
  1514. break;
  1515. }
  1516. }
  1517. UIL.Config.setRemSponsor(form.elements.namedItem("remsponsor").checked);
  1518. UIL.Config.setNumResults(form.elements.namedItem("numresults").checked);
  1519. UIL.Config.setRemRightPanel(form.elements.namedItem("remrightpanel").checked);
  1520. UIL.Config.setAutoLoad(form.elements.namedItem("autoload").checked);
  1521. UIL.Config.setHideSearch(form.elements.namedItem("hidesearch").checked);
  1522. UIL.Config.setNoSitePreview(form.elements.namedItem("noSitePreview").checked);
  1523. UIL.Config.setExtLinkSearch(form.elements.namedItem("extlinksearch").checked);
  1524. UIL.Config.setSearchLinkTracking(form.elements.namedItem("searchlinktracking").checked);
  1525. UIL.Config.setShowExtraResults(form.elements.namedItem("showextraresults").checked);
  1526. UIL.Config.setResHue(form.elements.namedItem("ResHuefield").value);
  1527. UIL.Config.setBGBorder(document.getElementById("BGBorderlink").innerHTML);
  1528. UIL.Config.setImagePreview(form.elements.namedItem("imagepreview").checked);
  1529. UIL.Config.setFavIcon(form.elements.namedItem("favicon").checked);
  1530. UIL.Config.setSearchesRelatedTo(form.elements.namedItem("remsearchesrelatedto").checked);
  1531. UIL.Config.setResultFlow(document.getElementById("flowimg").className);
  1532. this.hide();
  1533. window.location.reload(true);
  1534. },
  1535. /**
  1536. *
  1537. * Base64 encode / decode
  1538. * http://www.webtoolkit.info/
  1539. *
  1540. **/
  1541. Base64: {
  1542.  
  1543. // private property
  1544. _keyStr:
  1545. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
  1546.  
  1547. // public method for encoding
  1548. encode: function (input, isBinaryData) {
  1549. var output = [];
  1550. var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
  1551. var i = 0;
  1552.  
  1553. input = isBinaryData ? String.fromCharCode.apply(null, input) :
  1554. this._utf8_encode(input);
  1555.  
  1556. var len = input.length;
  1557. while (i < len) {
  1558. chr1 = input.charCodeAt(i++);
  1559. chr2 = input.charCodeAt(i++);
  1560. chr3 = input.charCodeAt(i++);
  1561. enc1 = chr1 >> 2;
  1562. enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
  1563. enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
  1564. enc4 = chr3 & 63;
  1565. if (isNaN(chr2)) {
  1566. enc3 = enc4 = 64;
  1567. } else if (isNaN(chr3)) {
  1568. enc4 = 64;
  1569. }
  1570. output.push(
  1571. this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
  1572. this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4));
  1573. }
  1574.  
  1575. return output.join("");
  1576. },
  1577.  
  1578. // public method for decoding
  1579. decode: function (input) {
  1580. if (!input)
  1581. return "";
  1582. var output = [];
  1583. var chr1, chr2, chr3;
  1584. var enc1, enc2, enc3, enc4;
  1585. var i = 0;
  1586.  
  1587. input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
  1588.  
  1589. var len = input.length;
  1590. while (i < len) {
  1591. enc1 = this._keyStr.indexOf(input.charAt(i++));
  1592. enc2 = this._keyStr.indexOf(input.charAt(i++));
  1593. enc3 = this._keyStr.indexOf(input.charAt(i++));
  1594. enc4 = this._keyStr.indexOf(input.charAt(i++));
  1595. chr1 = (enc1 << 2) | (enc2 >> 4);
  1596. chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
  1597. chr3 = ((enc3 & 3) << 6) | enc4;
  1598. output.push(String.fromCharCode(chr1));
  1599. if (enc3 != 64) {
  1600. output.push(String.fromCharCode(chr2));
  1601. }
  1602. if (enc4 != 64) {
  1603. output.push(String.fromCharCode(chr3));
  1604. }
  1605. }
  1606.  
  1607. return this._utf8_decode(output.join(""));
  1608. },
  1609.  
  1610. // private method for UTF-8 encoding
  1611. _utf8_encode: function (string) {
  1612. string = string.replace(/\r\n/g, "\n");
  1613. var utftext = [];
  1614. var len = string.length;
  1615.  
  1616. for (var n = 0; n < len; n++) {
  1617.  
  1618. var c = string.charCodeAt(n);
  1619.  
  1620. if (c < 128) {
  1621. utftext.push(String.fromCharCode(c));
  1622. }
  1623. else if ((c > 127) & (c < 2048)) {
  1624. utftext.push(String.fromCharCode((c >> 6) | 192),
  1625. String.fromCharCode((c & 63) | 128));
  1626. }
  1627. else {
  1628. utftext.push(String.fromCharCode((c >> 12) | 224),
  1629. String.fromCharCode(((c >> 6) & 63) | 128),
  1630. String.fromCharCode((c & 63) | 128));
  1631. }
  1632.  
  1633. }
  1634.  
  1635. return utftext.join("");
  1636. },
  1637.  
  1638. // private method for UTF-8 decoding
  1639. _utf8_decode: function (utftext) {
  1640. var string = [];
  1641. var i = 0;
  1642. var c = c1 = c2 = 0;
  1643. var len = utftext.length;
  1644.  
  1645. while (i < len) {
  1646.  
  1647. c = utftext.charCodeAt(i);
  1648.  
  1649. if (c < 128) {
  1650. string.push(String.fromCharCode(c));
  1651. i++;
  1652. }
  1653. else if ((c > 191) & (c < 224)) {
  1654. c2 = utftext.charCodeAt(i + 1);
  1655. string.push(String.fromCharCode(((c & 31) << 6) | (c2 & 63)));
  1656. i += 2;
  1657. }
  1658. else {
  1659. c2 = utftext.charCodeAt(i + 1);
  1660. c3 = utftext.charCodeAt(i + 2);
  1661. string.push(String.fromCharCode(((c & 15) << 12) |
  1662. ((c2 & 63) << 6) | (c3 & 63)));
  1663. i += 3;
  1664. }
  1665.  
  1666. }
  1667.  
  1668. return string.join("");
  1669. }
  1670. }
  1671.  
  1672. };
  1673.  
  1674. /**
  1675. * Resource section (RES).
  1676. **/
  1677. UIL.RES =
  1678. {
  1679. PREFS_HTML: "PHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgIC5ib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC1mYW1pbHk6ICJMdWNpZGEgR3JhbmRlIiwgIkJpdHN0cmVhbSBWZXJhIFNhbnMiLCBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgICBjb2xvcjogIzMzMzsKICAgICAgICB3aWR0aDogNTUwcHg7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICB9CiAgICAjY29sb3JwaWNrZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3JkZXI6ICMwMDAwMDAgMXB4IHNvbGlkOwogICAgICAgIGJhY2tncm91bmQ6ICNGRkZGRkY7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB6LWluZGV4OiAxMDAwMjsKICAgIH0KICAgIC5tb2R1bGUgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICB9CiAgICAubW9kdWxlIGNhcHRpb24sCiAgICAubW9kdWxlIGgyIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMnB4IDVweCAzcHg7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGJhY2tncm91bmQ6ICNDQ0NDQ0MgdXJsKCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFXQU1RQUFNakt5c1hIeDklMkZoNGMlMkZSMGVQbDVjYkl5TlBWMWMzUHolMkJmcDZkN2g0ZTd3OE92dDdjdk56ZGZaMmVIajQ5dmQzZkR5OGdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNINUJBQUFBQUFBTEFBQUFBQUJBQllBQUFVU0lDUXFDMElJVDNNRUJjQU1Sdk1ramhNQ0FEcyUzRCIpIHRvcCBsZWZ0IHJlcGVhdC14OwogICAgICAgIGNvbG9yOiAjNjY2NjY2OwogICAgICAgIGJvcmRlci1ib3R0b206IDA7CiAgICB9CiAgICAuZm9ybS1yb3cgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgbWFyZ2luLXRvcDogM3B4OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZWVlOwogICAgfQogICAgLmZvcm0tcm93IGltZywKICAgIC5mb3JtLXJvdyBpbnB1dCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgfQogICAgLmFsaWduZWQgbGFiZWwgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDNweCAwOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHdpZHRoOiBhdXRvOwogICAgfQogICAgLmNoZWNrYm94LXJvdyBsYWJlbCB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBmbG9hdDogbm9uZTsKICAgICAgICB3aWR0aDogYXV0bzsKICAgIH0KICAgIC5ib2R5IGlucHV0LmJ0biB7CiAgICAgICAgcGFkZGluZzogMCAxMHB4OwogICAgICAgIGNvbG9yOiAjOTk5OTk5OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IFdoaXRlOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGJvcmRlcjogc29saWQgMXB4ICNDQ0NDQ0M7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIH0KICAgIC5ib2R5IGlucHV0LmJ0bjpob3ZlciB7CiAgICAgICAgcGFkZGluZzogMXB4IDExcHg7CiAgICAgICAgY29sb3I6ICMzMzMzMzM7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjNjY2NjY2OwogICAgfQogICAgLmJvZHkgYSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgY29sb3I6ICM5OTk5OTk7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIH0KICAgIC5ib2R5IGE6aG92ZXIgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGNvbG9yOiAjMzMzMzMzICFpbXBvcnRhbnQ7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgfQogICAgLmJvZHkgaW1nLmwyciB7CiAgICAgICAgYmFja2dyb3VuZDogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVpDQU1BQUFBYzlSNXZBQUFBQkdkQlRVRUFBSyUyRklOd1dLNlFBQUFCbDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdTVzFoWjJWU1pXRmtlWEhKWlR3QUFBQVlVRXhVUmY5N2UlMkYlMkZKeVRVQUFQODdPN29BQVA4QUFBQUFBUCUyRiUyRiUyRiUyQlZZRnU0QUFBQnlTVVJCVkhqYXJKRkxEb0F3Q0VUNXRkNyUyRnhpWjhySUEyTHB3VkdYZ3BUT0Y0RVd3YU01VEtMU0V1NXFpYzRGSEVRZFFHdFRkQWZXeGJvYyUyRlhyVkFmZzNZSHFTJTJGOURvNkZDaUZyUGhGNWZoRTZ6OVN5dWgyUUNISyUyRnBtdUhBVjV5Z2l5c0QlMkJrT0k2ajVZJTJGNzk1ODg2QlJnQSUyRjVzTjJIOHI5OVFBQUFBQVNVVk9SSzVDWUlJJTNEIikgbm8tcmVwZWF0IHRyYW5zcGFyZW50OwogICAgfQogICAgLmJvZHkgaW1nLnQyYiB7CiAgICAgICAgYmFja2dyb3VuZDogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVpDQU1BQUFBYzlSNXZBQUFBQkdkQlRVRUFBSyUyRklOd1dLNlFBQUFCbDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdTVzFoWjJWU1pXRmtlWEhKWlR3QUFBQU1VRXhVUmY5JTJGZiUyRjhBQUFBQUFQJTJGJTJGJTJGeUNaRklvQUFBQndTVVJCVkhqYWxOSkxEc0FnQ0FUUUdYdiUyRk96ZmxYOEVtWlVXUUZ4WEZkUWg4TEN5UFY2b0NCVnF1Z2t3aHVRbVEwVSUyRkxSVEFGT1lxbmZ4UlNINFRXdXdCbklYV2dDZSUyRmVoZmJuZmk0a3NIeSUyRkZIR2NTZGpZbW9qTGI4S20yMFFaN3pqZFhaUUhyT0w4NW4lMkIlMkJ6eTNBQUUlMkY2QlNqYUZCYWJBQUFBQUVsRlRrU3VRbUNDIikgbm8tcmVwZWF0IHRyYW5zcGFyZW50OwogICAgfQo8L3N0eWxlPgo8ZGl2IGNsYXNzPSJib2R5Ij4KICAgIDxmb3JtIG5hbWU9InByZWZlcmVuY2VzIiBpZD0icHJlZmVyZW5jZXMiIGNsYXNzPSJhbGlnbmVkIj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2R1bGUiIGlkPSJyb290Ij4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+R29vZ2xlTW9ua2V5UiA6OiB2PHNwYW4gaWQ9InZlcnNpb24iPjEuMC4wPC9zcGFuPjwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cubW9ua2V5ci5jb20vIiB0YXJnZXQ9Il90b3AiPk1vbmtleVIuY29tPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1yb3cgY2hlY2tib3gtcm93Ij4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Im51bWNvbDEiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJudW1jb2wiIHZhbHVlPSIxIiBpZD0ibnVtY29sMSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgIDEgY29sdW1uCiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJudW1jb2wyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0ibnVtY29sIiB2YWx1ZT0iMiIgaWQ9Im51bWNvbDIiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAyIGNvbHVtbnM8L2xhYmVsPgogICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJudW1jb2wzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0ibnVtY29sIiB2YWx1ZT0iMyIgaWQ9Im51bWNvbDMiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAzIGNvbHVtbnM8L2xhYmVsPgogICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJudW1jb2w0Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0ibnVtY29sIiB2YWx1ZT0iNCIgaWQ9Im51bWNvbDQiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICA0IGNvbHVtbnM8L2xhYmVsPgogICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7KCBvZiByZXN1bHRzICkmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSJqYXZhc2NyaXB0OjsiPjxpbWcgaWQ9ImZsb3dpbWciIG5hbWU9ImZsb3dpbWciIGNsYXNzPSJsMnIiIHRpdGxlPSIgZmxvdyBvZiByZXN1bHRzICIgYm9yZGVyPSIwIiBzdHlsZT0id2lkdGg6MjRweDsJaGVpZ2h0OjI1cHg7CW1hcmdpbi10b3A6LTRweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCZ0FBQUFaQ0FNQUFBQWM5UjV2QUFBQUJHZEJUVUVBQUslMkZJTndXSzZRQUFBQmwwUlZoMFUyOW1kSGRoY21VQVFXUnZZbVVnU1cxaFoyVlNaV0ZrZVhISlpUd0FBQUFHVUV4VVJmJTJGJTJGJTJGd0FBQUZYQzAzNEFBQUFCZEZKT1V3QkE1dGhtQUFBQUVVbEVRVlI0Mm1KZ0dBV2pnSTRBSU1BQUFuRUFBZldnYXJrQUFBQUFTVVZPUks1Q1lJSSUzRCI+PC9hPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1yb3cgY2hlY2tib3gtcm93Ij4KICAgICAgICAgICAgICAgIFJlbW92ZTo8YnI+PGJyPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0icmVtc2VhcmNoZXNyZWxhdGVkdG8iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJyZW1zZWFyY2hlc3JlbGF0ZWR0byIgaWQ9InJlbXNlYXJjaGVzcmVsYXRlZHRvIiB0eXBlPSJjaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgIlJlbGF0ZWQgU2VhcmNoZXMiPC9sYWJlbD4KICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0icmVtc3BvbnNvciI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InJlbXNwb25zb3IiIGlkPSJyZW1zcG9uc29yIiB0eXBlPSJjaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgIlNwb25zb3JlZCBMaW5rcyI8L2xhYmVsPgogICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJyZW1yaWdodHBhbmVsIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0icmVtcmlnaHRwYW5lbCIgaWQ9InJlbXJpZ2h0cGFuZWwiIHR5cGU9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAiUmlnaHQgUGFuZWwiPC9sYWJlbD4KICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibm9TaXRlUHJldmlldyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9Im5vU2l0ZVByZXZpZXciIGlkPSJub1NpdGVQcmV2aWV3IiB0eXBlPSJjaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgIlNpdGUgUHJldmlldyI8L2xhYmVsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1yb3cgY2hlY2tib3gtcm93Ij4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Im51bXJlc3VsdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJudW1yZXN1bHRzIiBpZD0ibnVtcmVzdWx0cyIgdHlwZT0iY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgIE51bWJlciByZXN1bHRzICggMSwgMiwgMy4uLiBldGMuICk8L2xhYmVsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1yb3cgY2hlY2tib3gtcm93Ij4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImF1dG9sb2FkIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iYXV0b2xvYWQiIGlkPSJhdXRvbG9hZCIgdHlwZT0iY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgIEF1dG8gbG9hZCBtb3JlIHJlc3VsdHM8L2xhYmVsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1yb3cgY2hlY2tib3gtcm93Ij4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImhpZGVzZWFyY2giPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJoaWRlc2VhcmNoIiBpZD0iaGlkZXNlYXJjaCIgdHlwZT0iY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgIERvbid0IGRpc3BsYXkgdGhlIEdvb2dsZSB3ZWIgc2VhcmNoIGRpYWxvZ3VlcyAoIEkgdXNlIHRoZSBHb29nbGUgdG9vbGJhciBpbnN0ZWFkISApPC9sYWJlbD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tcm93IGNoZWNrYm94LXJvdyI+CiAgICAgICAgICAgICAgICBTZWxlY3QgdGhlCiAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OjsiIG5hbWU9IkJHQm9yZGVybGluayIgaWQ9IkJHQm9yZGVybGluayIgdGl0bGU9IiB0b2dnbGUgYmV0d2VlbiBhIGJhY2tncm91bmQgb3IgYm9yZGVyIGh1ZSAiPmJhY2tncm91bmQ8L2E+CiAgICAgICAgICAgICAgICBjb2xvciAoIGh1ZSApIGZvciB5b3VyIHNlYXJjaCByZXN1bHRzJm5ic3A7Jm5ic3A7Jm5ic3A7CiAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OjsiIGlkPSJSZXNIdWUiIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHg7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvYT4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iUmVzSHVlZmllbGQiIHNpemU9IjciIG1heGxlbmd0aD0iNyI+CiAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSJodHRwOi8vd3d3LmZsb29ibGUuY29tL3NjcmlwdHMvY29sb3JwaWNrZXIucGhwIiB0YXJnZXQ9Il9ibGFuayIgdGl0bGU9IiBmbG9vYmxlIGNvbG9yIHBpY2tlciBzY3JpcHQgIiBzdHlsZT0iZm9udC1zaXplOiA4cHg7Ij5mbG9vYmxlPC9hPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1yb3cgY2hlY2tib3gtcm93Ij4KICAgICAgICAgICAgICAgIE1ha2UgbXkgR29vZ2xlIGxpbmtzIG9wZW4gaW4gYSBuZXcgdGFyZ2V0ICZuYnNwOwogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZXh0bGlua3NlYXJjaCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9ImV4dGxpbmtzZWFyY2giIGlkPSJleHRsaW5rc2VhcmNoIiB0eXBlPSJjaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgZm9yIHNlYXJjaCByZXN1bHRzPC9sYWJlbD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tcm93IGNoZWNrYm94LXJvdyI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzZWFyY2hsaW5rdHJhY2tpbmciPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJzZWFyY2hsaW5rdHJhY2tpbmciIGlkPSJzZWFyY2hsaW5rdHJhY2tpbmciIHR5cGU9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICBEaXNhYmxlIEdvb2dsZSB0cmFja2luZyBteSBzZWFyY2ggcmVzdWx0cwogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tcm93IGNoZWNrYm94LXJvdyI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzaG93ZXh0cmFyZXN1bHRzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0ic2hvd2V4dHJhcmVzdWx0cyIgaWQ9InNob3dleHRyYXJlc3VsdHMiIHR5cGU9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICBEaXNhYmxlIEdvb2dsZSBzaG93aW5nIGV4dHJhIHNlYXJjaCByZXN1bHRzIGxpa2UgdmlkZW9zLCBpbWFnZXMsIGV0Yy4KICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLXJvdyBjaGVja2JveC1yb3ciPgogICAgICAgICAgICAgICAgRm9yIGVhY2ggcmVzdWx0IHNob3cgJm5ic3A7CiAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iZmF2aWNvbiIgaWQ9ImZhdmljb24iIHR5cGU9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImZhdmljb24iPgogICAgICAgICAgICAgICAgICAgIGZhdmljb25zPC9sYWJlbD4KICAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOwogICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9ImltYWdlcHJldmlldyIgaWQ9ImltYWdlcHJldmlldyIgdHlwZT0iY2hlY2tib3giPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iaW1hZ2VwcmV2aWV3Ij4KICAgICAgICAgICAgICAgICAgICBHb29nbGVQcmV2aWV3IGltYWdlczwvbGFiZWw+CiAgICAgICAgICAgICAgICAmbmJzcDsgJm5ic3A7Jm5ic3A7PGEgaHJlZj0iaHR0cDovL3d3dy5nb29nbGVwcmV2aWV3LmNvbS8iIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0iIEdvb2dsZVByZXZpZXcgIiBzdHlsZT0iZm9udC1zaXplOiA4cHg7Ij5Hb29nbGVQcmV2aWV3PC9hPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2R1bGUiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgICA8dHIgaGVpZ2h0PSIzMCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJtaWRkbGUiPiZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiMiIG5hbWU9ImNoZWNrX3VwZGF0ZSIgaWQ9ImNoZWNrX3VwZGF0ZSI+Y2hlY2tpbmcgZm9yIHVwZGF0ZS4uLjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiB3aWR0aD0iNzIiPjxpbnB1dCB2YWx1ZT0iQ2xvc2UiIG5hbWU9ImNsb3NlX2J1dHRvbiIgaWQ9ImNsb3NlX2J1dHRvbiIgY2xhc3M9ImJ0biIgdHlwZT0iYnV0dG9uIj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSIxNjUiPjxpbnB1dCB2YWx1ZT0iU2F2ZSBQcmVmZXJlbmNlcyIgbmFtZT0ic2F2ZV9idXR0b24iIGlkPSJzYXZlX2J1dHRvbiIgY2xhc3M9ImJ0biIgdHlwZT0iYnV0dG9uIj48L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgPC9mb3JtPgo8L2Rpdj4=",
  1680.  
  1681. HISTORY_HTML: "data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VO" +
  1682. "IiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI%2BDQo8aHRtbD48aGVhZD4NCjxtZXRhIGh0dHAtZXF1aX" +
  1683. "Y9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4NCjxtZXRhIG5hbWU9IkF1dGhvciIgY2" +
  1684. "9udGVudD0ibXVuZ3VzaHVtZSI%2BDQo8bWV0YSBuYW1lPSJDb3B5cmlnaHQiIGNvbnRlbnQ9IsKpIDIwMDcsIE1vbmtleVIuY29t" +
  1685. "Ij4NCjxtZXRhIG5hbWU9Ik9yaWdpbmFsQXV0aG9yIiBjb250ZW50PSJKb25hdGhhbiBCdWNoYW5hbiI%2BDQo8bWV0YSBuYW1lPS" +
  1686. "JPcmlnaW5hbENvcHlyaWdodCIgY29udGVudD0iwqkgMjAwNiwgSm9uYXRoYW4gQnVjaGFuYW4iPg0KPHN0eWxlIHR5cGU9InRleH" +
  1687. "QvY3NzIj4NCmJvZHkgeyBtYXJnaW46MDsgcGFkZGluZzowOyBmb250LXNpemU6MTJweDsgZm9udC1mYW1pbHk6Ikx1Y2lkYSBHcm" +
  1688. "FuZGUiLCJCaXRzdHJlYW0gVmVyYSBTYW5zIixWZXJkYW5hLEFyaWFsLHNhbnMtc2VyaWY7IGNvbG9yOiMzMzM7IHdpZHRoOiA2OD" +
  1689. "ZweDsgbWFyZ2luOiAwIGF1dG87IH0NCi5tb2R1bGUgeyBib3JkZXI6IDFweCBzb2xpZCAjY2NjOyBtYXJnaW4tYm90dG9tOiA1cH" +
  1690. "g7IGJhY2tncm91bmQtY29sb3I6ICNmZmY7IH0NCi5tb2R1bGUgaDIsIC5tb2R1bGUgY2FwdGlvbiB7IG1hcmdpbjogMDsgcGFkZG" +
  1691. "luZzogMnB4IDVweCAzcHggNXB4OyBmb250LXNpemU6IDExcHg7IGZvbnQtd2VpZ2h0OiBib2xkOyBiYWNrZ3JvdW5kOiAjQ0NDQ0" +
  1692. "NDIHVybCgiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBV0FNUUFBTWpLeXNYSHg5JTJGaDRjJTJGUjBlUGw1Y2JJeU" +
  1693. "5QVjFjM1B6JTJCZnA2ZDdoNGU3dzhPdnQ3Y3ZOemRmWjJlSGo0OXZkM2ZEeThnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU" +
  1694. "FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSDVCQUFBQUFBQUxBQUFBQUFCQUJZQUFBVVNJQ1FxQzBJSVQzTUVCY0FNUn" +
  1695. "ZNa2poTUNBRHMlM0QiKSB0b3AgbGVmdCByZXBlYXQteDsgY29sb3I6ICM2NjY2NjY7IGJvcmRlci1ib3R0b206IDA7IH0NCi5mb3" +
  1696. "JtLXJvdyB7IG92ZXJmbG93OiBoaWRkZW47IHBhZGRpbmc6IDhweCA4cHg7IGZvbnQtc2l6ZTogMTFweDsgYm9yZGVyLWJvdHRvbT" +
  1697. "ogMXB4IHNvbGlkICNlZWU7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlZWU7IH0NCi5mb3JtLXJvdyBpbWcsIC5mb3JtLXJvdy" +
  1698. "BpbnB1dCB7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IH0NCmlucHV0LmJ0biB7CXBhZGRpbmc6IDBweCAxMHB4IDBweCAxMHB4Oy" +
  1699. "Bjb2xvcjogIzk5OTk5OTsgYmFja2dyb3VuZC1jb2xvcjogV2hpdGU7IGZvbnQtd2VpZ2h0OiBib2xkOyBib3JkZXI6IHNvbGlkID" +
  1700. "FweCAjQ0NDQ0NDOyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0NCmlucHV0LmJ0bjpob3ZlciB7CXBhZGRpbmc6IDFweCAxMXB4IDFweC" +
  1701. "AxMXB4OyBjb2xvcjogIzMzMzMzMzsgYm9yZGVyLWNvbG9yOiAjNjY2NjY2OyB9DQphIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG" +
  1702. "9yOiAjOTk5OTk5OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGN1cnNvcjogcG9pbnRlcjsgfQ0KYTpob3ZlciB7CWZvbnQtd2VpZ2" +
  1703. "h0OiBib2xkOyBjb2xvcjogIzMzMzMzMzsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9DQo8L3N0eWxlPg0KPC9oZWFkPjxib2R5IG" +
  1704. "9uTG9hZD0iIj4NCjxmb3JtIG5hbWU9Imhpc3RvcnkiIGlkPSJoaXN0b3J5IiBjbGFzcz0iYWxpZ25lZCI%2BDQogIDxkaXYgY2xh" +
  1705. "c3M9Im1vZHVsZSIgaWQ9InJvb3QiPg0KDQogICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5n" +
  1706. "PSIwIiB3aWR0aD0iMTAwJSI%2BDQogICAgICA8dGJvZHk%2BPHRyPg0KICAgICAgICA8dGQ%2BPGgyPjxzcGFuIGlkPSJzY3JpcH" +
  1707. "ROYW1lIj5zY3JpcHROYW1lPC9zcGFuPiA6OiB2PHNwYW4gaWQ9InZlcnNpb24iPjEuMC4wPC9zcGFuPiA6OiBoaXN0b3J5PC9oMj" +
  1708. "48L3RkPg0KICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48aDI%2BPGEgaHJlZj0iaHR0cDovL3d3dy5tb25rZXlyLmNvbS8iIHRh" +
  1709. "cmdldD0iX3RvcCI%2BTW9ua2V5Ui5jb208L2E%2BPC9oMj48L3RkPg0KICAgICAgPC90cj4NCiAgICA8L3Rib2R5PjwvdGFibGU%" +
  1710. "2BDQogICAgPGRpdiBjbGFzcz0iZm9ybS1yb3ciPg0KICAgICAgPGRpdiBhbGlnbj0iY2VudGVyIj4NCiAgICAgICAgPHRleHRhcm" +
  1711. "VhIGlkPSJoaXN0b3J5X3RleHQiIG5hbWU9Imhpc3RvcnlfdGV4dCIgY29scz0iODAiIHJvd3M9IjE1Ij4mbmJzcDs8L3RleHRhcm" +
  1712. "VhPg0KICAgICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCiAgPC9kaXY%2BDQogIDxkaXYgY2xhc3M9Im1vZHVsZSI%2BDQogICAgPH" +
  1713. "RhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI%2BDQogICAgICA8dGJv" +
  1714. "ZHk%2BPHRyIGhlaWdodD0iMzAiPg0KICAgICAgICA8dGQgd2lkdGg9IjUxNCIgYWxpZ249ImxlZnQiIHZhbGlnbj0ibWlkZGxlIj" +
  1715. "4mbmJzcDs8L3RkPg0KICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSI4NSI%2BPGlucHV0" +
  1716. "IHZhbHVlPSJJbnN0YWxsIiBuYW1lPSJpbnN0YWxsX2J1dHRvbiIgaWQ9Imluc3RhbGxfYnV0dG9uIiBjbGFzcz0iYnRuIiB0eXBl" +
  1717. "PSJidXR0b24iPg0KICAgICAgICA8L3RkPg0KICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRo" +
  1718. "PSI4NSI%2BPGlucHV0IHZhbHVlPSJDbG9zZSIgbmFtZT0iY2xvc2VfYnV0dG9uIiBpZD0iY2xvc2VfYnV0dG9uIiBjbGFzcz0iYn" +
  1719. "RuIiB0eXBlPSJidXR0b24iPg0KICAgICAgICA8L3RkPg0KICAgICAgPC90cj4NCiAgICA8L3Rib2R5PjwvdGFibGU%2BDQogIDwv" +
  1720. "ZGl2Pg0KPC9mb3JtPg0KPC9ib2R5PjwvaHRtbD4%3D",
  1721.  
  1722. REFRESH_HTML: "data:text/html;base64,PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAiaHR0cDovL3" +
  1723. "d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI%2BDQo8aHRtbD48aGVhZD48dGl0bGU%2BR29vZ2xlTW9ua2V5UiBVcGRhdG" +
  1724. "U8L3RpdGxlPg0KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLT" +
  1725. "giPg0KPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJtdW5ndXNodW1lIj4NCjxtZXRhIG5hbWU9IkNvcHlyaWdodCIgY29udG" +
  1726. "VudD0iwqkgMjAwNywgTW9ua2V5Ui5jb20iPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCmJvZHkgeyBtYXJnaW46MDsgcGFkZG" +
  1727. "luZzowOyBmb250LXNpemU6MTJweDsgZm9udC1mYW1pbHk6Ikx1Y2lkYSBHcmFuZGUiLCJCaXRzdHJlYW0gVmVyYSBTYW5zIixWZX" +
  1728. "JkYW5hLEFyaWFsLHNhbnMtc2VyaWY7IGNvbG9yOiMzMzM7IHdpZHRoOiAzMDBweDsgbWFyZ2luOiAwIGF1dG87IH0NCi5tb2R1bG" +
  1729. "UgeyBib3JkZXI6IDFweCBzb2xpZCAjY2NjOyBtYXJnaW4tYm90dG9tOiA1cHg7IGJhY2tncm91bmQtY29sb3I6ICNmZmY7IH0NCi" +
  1730. "5tb2R1bGUgaDIgeyBtYXJnaW46IDA7IHBhZGRpbmc6IDJweCA1cHggM3B4IDVweDsgZm9udC1zaXplOiAxMXB4OyBmb250LXdlaW" +
  1731. "dodDogYm9sZDsgYmFja2dyb3VuZDogI0NDQ0NDQyB1cmwoImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQVdBTVFBQU" +
  1732. "1qS3lzWEh4OSUyRmg0YyUyRlIwZVBsNWNiSXlOUFYxYzNQeiUyQmZwNmQ3aDRlN3c4T3Z0N2N2TnpkZloyZUhqNDl2ZDNmRHk4Z0" +
  1733. "FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0g1QkFBQUFBQUFMQUFBQU" +
  1734. "FBQkFCWUFBQVVTSUNRcUMwSUlUM01FQmNBTVJ2TWtqaE1DQURzJTNEIikgdG9wIGxlZnQgcmVwZWF0LXg7IGNvbG9yOiAjNjY2Nj" +
  1735. "Y2OyBib3JkZXItYm90dG9tOiAwOyB9DQouZm9ybS1yb3cgeyBvdmVyZmxvdzogaGlkZGVuOyBwYWRkaW5nOiAxMnB4IDEycHg7IG" +
  1736. "ZvbnQtc2l6ZTogMTFweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlZW" +
  1737. "U7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTsgdGV4dC1hbGlnbjpjZW50ZXI7IH0NCmlucHV0LmJ0biB7CXBhZGRpbmc6IDBweCAxMH" +
  1738. "B4IDBweCAxMHB4OyBjb2xvcjogIzk5OTk5OTsgYmFja2dyb3VuZC1jb2xvcjogV2hpdGU7IGZvbnQtd2VpZ2h0OiBib2xkOyBib3" +
  1739. "JkZXI6IHNvbGlkIDFweCAjQ0NDQ0NDOyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0NCmlucHV0LmJ0bjpob3ZlciB7CXBhZGRpbmc6ID" +
  1740. "FweCAxMXB4IDFweCAxMXB4OyBjb2xvcjogIzMzMzMzMzsgYm9yZGVyLWNvbG9yOiAjNjY2NjY2OyB9DQphIHsgZm9udC13ZWlnaH" +
  1741. "Q6IGJvbGQ7IGNvbG9yOiAjOTk5OTk5OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGN1cnNvcjogcG9pbnRlcjsgfQ0KYTpob3Zlci" +
  1742. "B7CWZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzMzMzMzMzsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9DQo8L3N0eWxlPjwvaG" +
  1743. "VhZD48Ym9keSBvbkxvYWQ9IiI%2BDQo8Zm9ybSBuYW1lPSJ1cGRhdGUiIGlkPSJ1cGRhdGUiIGNsYXNzPSJhbGlnbmVkIj4NCiAg" +
  1744. "PGRpdiBjbGFzcz0ibW9kdWxlIj4NCiAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAi" +
  1745. "IHdpZHRoPSIxMDAlIj4NCg0KICAgICAgPHRib2R5Pjx0cj4NCiAgICAgICAgPHRkPjxoMj48c3BhbiBpZD0ic2NyaXB0TmFtZSI%" +
  1746. "2Bc2NyaXB0TmFtZTwvc3Bhbj48L2gyPjwvdGQ%2BDQogICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjxoMj48YSBocmVmPSJodHRw" +
  1747. "Oi8vd3d3Lm1vbmtleXIuY29tLyIgdGFyZ2V0PSJfdG9wIj5Nb25rZXlSLmNvbTwvYT48L2gyPjwvdGQ%2BDQogICAgICA8L3RyPg" +
  1748. "0KICAgIDwvdGJvZHk%2BPC90YWJsZT4NCiAgICA8ZGl2IGNsYXNzPSJmb3JtLXJvdyI%2BDQoJPHRhYmxlIGJvcmRlcj0iMCIgY2" +
  1749. "VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI%2BDQoJPHRib2R5Pjx0cj48dGQgYWxpZ249ImNlbnRl" +
  1750. "ciIgaGVpZ2h0PSI0MCIgdmFsaWduPSJtaWRkbGUiPlJlZnJlc2ggeW91ciBicm93c2VyIHRvIGNvbnRpbnVlLjwvdGQ%2BPC90cj" +
  1751. "4NCg0KCTx0cj48dGQgYWxpZ249ImNlbnRlciIgaGVpZ2h0PSI0MCIgdmFsaWduPSJtaWRkbGUiPjxpbnB1dCBuYW1lPSJidXR0b2" +
  1752. "4iIGNsYXNzPSJidG4iIG9uQ2xpY2s9ImphdmFzY3JpcHQ6dG9wLmxvY2F0aW9uLnJlbG9hZCh0cnVlKTsiIHZhbHVlPSJSZWZyZX" +
  1753. "NoIiB0eXBlPSJidXR0b24iPjwvdGQ%2BPC90cj4NCgk8L3Rib2R5PjwvdGFibGU%2BPC9kaXY%2BDQogIDwvZGl2Pg0KPC9mb3Jt" +
  1754. "Pg0KPC9ib2R5PjwvaHRtbD4%3D",
  1755.  
  1756. TOP_PNG: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM%2FrhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK" +
  1757. "T2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUE" +
  1758. "G8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEK" +
  1759. "JHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZT" +
  1760. "AKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDO" +
  1761. "EAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKB" +
  1762. "NA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRo" +
  1763. "XgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjg" +
  1764. "wsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuR" +
  1765. "LahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTB" +
  1766. "GCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgT" +
  1767. "YSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRG" +
  1768. "ogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXA" +
  1769. "CTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpF" +
  1770. "TSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOa" +
  1771. "Ut2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmb" +
  1772. "GAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnU" +
  1773. "lqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27" +
  1774. "iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ" +
  1775. "5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDF" +
  1776. "gGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TD" +
  1777. "tMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZn" +
  1778. "w7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzx" +
  1779. "DP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWT" +
  1780. "Nz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yL" +
  1781. "fLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQ" +
  1782. "rSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8" +
  1783. "YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCn" +
  1784. "nCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5m" +
  1785. "Z2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pY" +
  1786. "ZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1Yf" +
  1787. "qGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7" +
  1788. "g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqu" +
  1789. "n4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7" +
  1790. "rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32" +
  1791. "oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L" +
  1792. "158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhY" +
  1793. "PP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA" +
  1794. "6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAei" +
  1795. "UAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAAAcRJREFUeNrs2b1OFFEUwPEfMIWJGAsQAlqL8A4UiFQYsbS2tB" +
  1796. "MJIbBBxIgxxvgOWixEG03o1HexsrKwhGyCzTHZbGbG3WWWvdE51eR83X%2Fux5lzZ0Zur9z9jqs4k5aM4FeGCVyWpmSjaElXWqMS" +
  1797. "lxrwnwfMKsx1iE%2FxvIYHKQG%2BxXoH7A88TmGJ33TA%2FZH1sA0V8DU2Suwb4TMUwFfY7MJvM3wvFPAltnrw34qYCwF8ge0%2B" +
  1798. "4rYjdqCAz9E4x7ZoRI6BAD7DbgWnfjdyVQr4FHsFtisYz9GPhy1P9iJnJYAN7BfYJvEOczm2ubBNFsTud7NdygDPsFOysSfQxH2c" +
  1799. "5NhPwtYM36IDt1PWzZcBvsdBycw1cQenJTlOw6dZMpMHMVbPgB8K9NfiXbvSNtNlqyB8DyO2l7FKAWdzdFM4wnIfp3c5Yqe6HOuv" +
  1800. "gE86Nv8CPmLpHCVmKXIstOluxVg9t1s38QWfcQmrmK6gDi7iG47jwraK6%2F32gzfwaACN8jQe1neSGvB%2FAmx1qRsKYFZQaGer" +
  1801. "uDVWATgW7dNMm24mdGOp3IsX8TWKOtzDfGpfFuargqrLTA2YGmCWMF%2BW4WdU%2FSR%2FQ%2FweACo1SBSU%2Bf00AAAAAElFTk" +
  1802. "SuQmCC",
  1803.  
  1804. LOADING_GIF: "data:image/gif;base64,R0lGODlhIgAiAPQAADk5OVJSUlpaWmtra3t7e4SEhIyMjJSUlJycnKWlpa2trbW1tb29vcbGxs7Ozt" +
  1805. "bW1t7e3ufn5%2B%2Fv7%2Ff39%2F%2F%2F%2FwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAgFAAAAIf8LTkVU" +
  1806. "U0NBUEUyLjADAQAAACwAAAAAIgAiAAAFhiAljmRJLYmprqx4AG1cBgb5yjjVCDacxxKBYnT7lQoI0mBA9BlHEOToIYC4nE9RNCUa" +
  1807. "1CjFLLTAdQQmYKyYshUJkodAVhFBQwkpB2OtSygYEVMFVnwjDSh0hSwSDX6EiioOj5CUJRIPEJiamJATERESn6CflaWmp6ipqqus" +
  1808. "ra6vsLGys6ohACH5BAgFAAAALAAAAAAiACIAhCEhISkpKVpaWmNjY2tra3Nzc4SEhIyMjJSUlKWlpa2trbW1tb29vcbGxs7OztbW" +
  1809. "1t7e3ufn5%2B%2Fv7%2Ff39%2F%2F%2F%2FwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWTICWOZElJiqmuZkMqAi" +
  1810. "urUPHG4wNEM2ukIsWAJAj0SBPSwzASjiQA15HyUCRFEoPUKSIApqNF4kpBALkUwAIctoqWSW4BQGYv3BTDmhs4sEsKQAx%2BCjYJ" +
  1811. "ABBTDg91EwprKCQJBGwQixIjjg5%2FLBAPDhF1nCwRDw%2BJoz0SmKmtrq%2BwsbKztLW2t7i5uru8vb6%2FwL4hACH5BAgFAAAA" +
  1812. "LAAAAAAiACIAhCEhISkpKTk5OUJCQkpKSlJSUlpaWmNjY3Nzc4SEhIyMjJSUlJycnK2trbW1tb29vcbGxs7OztbW1t7e3ufn5%2B" +
  1813. "%2Fv7%2Ff39%2F%2F%2F%2FwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWT4CWOZCk6ZqqaFAkha5xSjJuQiiHHTTRCt1FBsltNGj" +
  1814. "%2BYaKEriiQTUoXRugBHB%2BSoEpBFoiMHRPQSPQqVEQUg2H3VNWswobxMAIOiBTrqXR43FQU%2BdnhOFxZvFxFIEAsXDE0SAASH" +
  1815. "IntRFYRmPpMFliOJVSkAn6BOQaeqq6ytrq%2BwsbKztLW2t7i5uru8vb6%2FwIchACH5BAgFAAAALAAAAAAiACIAhCEhIUJCQlJS" +
  1816. "UlpaWnNzc4SEhIyMjJSUlJycnKWlpa2trbW1tb29vcbGxs7OztbW1t7e3ufn5%2B%2Fv7%2Ff39%2F%2F%2F%2FwAAAAAAAAAAAA" +
  1817. "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWVICWOZCk2Zqqu4qOwcDk55JOQShGvTzS6JMNrl3o8frdWwUc0TR6T1pCCMJAag2YL0k" +
  1818. "pKCtyTYEqUHClASm6kGBy0I4fPJiqcGQOyFnKEvBYFUW0IcCQTTCIONHiEJBIMhSUSAo0iDAEAABKRJEwSCpkBBJwmDgKZBIikJA" +
  1819. "UBOquwsbKztLW2t7i5uru8vb6%2FwMHCsCEAIfkECAUAAAAsAAAAACIAIgCEISEhKSkpQkJCWlpaY2Nja2tre3t7hISEjIyMlJSU" +
  1820. "nJycra2ttbW1vb29xsbGzs7O1tbW3t7e5%2Bfn7%2B%2Fv9%2Ff3%2F%2F%2F%2FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +
  1821. "AAAABYlgJY5kKU5mqq7nw76vBJGRAt%2FV5I4Ng8OyEWUh%2Bb0mM5FjQaIcjKWgSFE8GRJQkk70YJ4O2OxISrXaxKNJpNKlVCSH" +
  1822. "M7oUcbzjpQdhPsKfHAMDT3wVDVwGgQluhCIQBAMFcowiDAlrk5g4CZucnIt8AgEAogClAAiZqaqrrK2ur7CxsrO0tbavIQAh%2BQ" +
  1823. "QIBQAAACwAAAAAIgAiAIQhISEpKSlKSkpra2t7e3uEhISMjIyUlJScnJylpaWtra21tbW9vb3GxsbOzs7W1tbe3t7n5%2Bfv7%2B" +
  1824. "%2F39%2Ff%2F%2F%2F8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFjCAljmRpnmiqriwbPW1cOpJsS7AtQxA5KbqU" +
  1825. "YzL6LYInSI4iURyRpkeN6YSaIg6RJMGwmiTEZte3tHJJkAOh4BVlmY8CIVH2QhCFArBdYiQafIE6BwaFBgSIBGNehAYIj48Lb4KU" +
  1826. "IgkElSQKAAADPZkUCgEAAgagFAwCnAOnEQsARKeys7S1tre4uYEhACH5BAgFAAAALAAAAAAiACIAhCEhIUJCQkpKSlJSUlpaWmNj" +
  1827. "Y2tra4yMjJSUlJycnK2trbW1tb29vcbGxs7OztbW1t7e3ufn5%2B%2Fv7%2Ff39%2F%2F%2F%2FwAAAAAAAAAAAAAAAAAAAAAAAA" +
  1828. "AAAAAAAAAAAAAAAAAAAAWEICWOZGmeaKqubOu%2BcCzP6EOvk2Pf6PRAvN4vePIBiSVjMkIcjiILRYIoEU0gUsaRGGEkFI4JcvRg" +
  1829. "7MboVYOxbrjd1WDiQK%2FTGen8ArFNPwoDBVNoYhQPCQQDCExBCgANIzmJBkQEAA4lEINBlph5IgMAZ3mhfWkCAKZoAQCfrq%2Bw" +
  1830. "sS8hACH5BAgFAAAALAAAAAAiACIAhCEhIUJCQkpKSlJSUlpaWnNzc4SEhIyMjJSUlJycnKWlpa2trbW1tb29vcbGxs7OztbW1t7e" +
  1831. "3ufn5%2B%2Fv7%2Ff39%2F%2F%2F%2FwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCYCWOZGmeaKqubOu%2BcCzPdG3f" +
  1832. "eK7T1D5SkcfDN4E8IhId0Jj0SZC%2BaCoCqVqrucVCse0qHNLdgxGuPAwFxoQoghgMCUhOMmiMIgjDYVEzgBMDfCMTDQY1AQMiCQ" +
  1833. "R2OggAaxWLgjkAlAuBOgUAJIAIcwCNIgsEOgIBZZuRUqFlPWUsIQAh%2BQQIBQAAACwAAAAAIgAiAIQxMTFSUlJaWlpjY2Nzc3OE" +
  1834. "hISMjIyUlJScnJylpaWtra21tbW9vb3GxsbOzs7W1tbe3t7n5%2Bfv7%2B%2F39%2Ff%2F%2F%2F8AAAAAAAAAAAAAAAAAAAAAAA" +
  1835. "AAAAAAAAAAAAAAAAAAAAAFgSAljmRpnmiqrmzrvnAsz3Rt33iu73zv%2F8DgSRIhGosTHOTBbDIjwhvEAYQkFI2kD6JIMCA5BwEq" +
  1836. "iiwU2BqDmiiARxKrLHCgHAQiRIFsA9QlAVQUenw0fiIFBCN6En11FA4BfAgEWjOHIgMIJHo1mHYCljefFIE6pAZ4OaQ8B28uIQAh" +
  1837. "%2BQQIBQAAACwAAAAAIgAiAIQhISEpKSlCQkJSUlJaWlpjY2Nra2tzc3N7e3uEhISMjIyUlJScnJylpaWtra21tbW9vb3GxsbW1t" +
  1838. "be3t7n5%2Bfv7%2B%2F39%2Ff%2F%2F%2F8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFkOAljmRpnmiqrmzrvnAsz3Rt33iu73zv" +
  1839. "%2F8CgcEgcVShAS0QyqfwskigSR2k4RRaKJDJtRRqkyOQCcXSxkhfgcHEg2gpR%2BSqDAJAOw2WSmEKsMwIDInkiCg4jfxYxEwAP" +
  1840. "hAUiDwmLkg6VLgwBIw6RIglpIw9gamyQnAk1diSdIxYJYzMBnoQEJAsLOg62T4gvIQAh%2BQQIBQAAACwAAAAAIgAiAIQhISFaWl" +
  1841. "pjY2Nzc3N7e3uEhISMjIycnJylpaWtra21tbW9vb3GxsbOzs7W1tbe3t7n5%2Bfv7%2B%2F39%2Ff%2F%2F%2F8AAAAAAAAAAAAA" +
  1842. "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFkeAkjmRpnmiqrmzrvnAsz3Rt33iu73zv%2F8CgcEgs2hpAAiCCkjQkM6Vi4kiQHJ" +
  1843. "DJw8GEDQDWycAwSSwmjKm20W19DyJIAHmYPhLdbVv1Hi0CIgdnZQ4jD2wrXwgkAXATCGoNYSJ6KgCOIg0BUBOCIwhZhkgvAgWfkw" +
  1844. "yTMhEBg2WuEqA0miQIqgqjOAquPQy5LSEAIfkECAUAAAAsAAAAACIAIgCEISEhMTExOTk5SkpKWlpaY2Nja2trc3Nze3t7hISEjI" +
  1845. "yMnJycra2ttbW1vb29xsbGzs7O1tbW3t7e5%2Bfn7%2B%2Fv9%2Ff3%2F%2F%2F%2FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +
  1846. "AABY%2BgJY5kaZ5oqq5s675wLM90bd94ru987%2F%2FAoHCIexgWPUQAIHjoJgYAoAARVXADaeMqigwit2ZJQkhYJNURhTuTDMyW" +
  1847. "RMPiAEvAs0m5m7gywBURbC8TAwgjC0gWDXgREzEUBAdqCXh%2FIhNpL5IkEHCLeBYRFDYJDCOXInc1EocjjJ2DMAqnqKFntzapPo" +
  1848. "IwIQAh%2BQQIBQAAACwAAAAAIgAiAIQ5OTlSUlJaWlpra2t7e3uEhISMjIyUlJScnJylpaWtra29vb3GxsbOzs7W1tbe3t7n5%2B" +
  1849. "fv7%2B%2F39%2Ff%2F%2F%2F8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFguAkjmRpnmiqrmzrvnAsz3Rt33" +
  1850. "iu73zv%2F0DYAUAsEgO4xWHJZAaDEsSi9zAEBI7dYRAYNEQPnEEgIGRFiYLkJmhESOnsI6xLEOiK7%2BNtQxToDwkiDhB9fyMKDG" +
  1851. "CFNH50ExAKfA58M4cjCwojlDoSeZuMOBCCIw%2BhN4kknD%2BrPhGVLSEAIfkECAUAAAAsAAAAACIAIgCEISEhKSkpQkJCWlpaY2" +
  1852. "Nja2trc3Nze3t7hISEjIyMlJSUpaWlra2ttbW1vb29xsbG1tbW3t7e5%2Bfn7%2B%2Fv9%2Ff3%2F%2F%2F%2FAAAAAAAAAAAAAA" +
  1853. "AAAAAAAAAAAAAAAAAAAAAAAAAABYRgJY5kaZ5oqq5s675wLM90bd94HgMOpZcEAAAB%2BZEMAYDAYRw9BkJmszI5LKY%2FCmPL5e" +
  1854. "IYA4K4QC4ksOhRhCH9NRIIRUQ3YSAQDIloflPciyMODDhyJYJ6FBM%2FDguKFRB6OQ0MjhMPOow%2Be3w3k5oVFBCONwyfFRKAUw" +
  1855. "%2BRTaFoq2mxNyEAIfkECAUAAAAsAAAAACIAIgCEISEhWlpaY2Njc3Nze3t7hISEjIyMnJycpaWlra2ttbW1vb29xsbGzs7O1tbW" +
  1856. "3t7e5%2Bfn7%2B%2Fv9%2Ff3%2F%2F%2F%2FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYLgJI5kaZ5oqq5s" +
  1857. "675wLJPAMLdIfbOHvqsK3w%2B1ABCGokakFBQgAwFBgxRkIBcF6AIiWiJFEoMgMHB8TQ1D4swmOQ4IBFyOWA8bi8RCwc8v2oApDw" +
  1858. "xmbQ0JCQpcXxIMdQ5eEkiICYsiD4U%2FSiWYXm2dgaCAmJKjkIETDpaorK2ur4AhACH5BAgFAAAALAAAAAAiACIAhCEhITExMTk5" +
  1859. "OVJSUlpaWmNjY2tra3Nzc3t7e4SEhIyMjJycnKWlpa2trbW1tb29vcbGxs7OztbW1t7e3ufn5%2B%2Fv7%2Ff39%2F%2F%2F%2Fw" +
  1860. "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWM4CWOZGmeaKqurDCw8PkAVWyPgHGrRD06gF3qMKCMKgCEEHUgGEWFwBKFKIoggMj0VJ" +
  1861. "2IArqpwktKDCQXiGLLSCQivkuCYNmSGu4FOm03QdoJZH0mFQ5ag4gnEg4ODYyODQ%2BDFhKVlpaJmTAWFHGJFJaefRMSEROidqQR" +
  1862. "dZoXEqytsbKztLW2t7i5tCEAOw%3D%3D",
  1863.  
  1864. // Color Picker Script from Flooble.com
  1865. // For more information, visit
  1866. // http://www.flooble.com/scripts/colorpicker.php
  1867. // Copyright 2003 Animus Pactum Consulting inc.
  1868.  
  1869. // You may use and distribute this code freely, as long as
  1870. // you keep this copyright notice and the link to flooble.com
  1871. // if you chose to remove them, you must link to the page
  1872. // listed above from every web page where you use the color
  1873. // picker code.
  1874. //---------------------------------------------------------
  1875. colorPicker: {
  1876. perline: 5,
  1877. divSet: false,
  1878. curId: null,
  1879. colorLevels: Array('A', 'B', 'C', 'D', 'E', 'F'),
  1880. colorArray: Array(),
  1881.  
  1882. addColor: function (r, g, b) {
  1883. this.colorArray[this.colorArray.length] = '#' + this.colorLevels[r] + this.colorLevels[r] + this.colorLevels[g] + this.colorLevels[g] + this.colorLevels[b] + this.colorLevels[b];
  1884. },
  1885.  
  1886. setColor: function (color) {
  1887. var that = this;
  1888. return function () {
  1889. var link = document.getElementById(that.curId);
  1890. var field = document.getElementById(that.curId + 'field');
  1891. var picker = document.getElementById('colorpicker');
  1892. field.value = color;
  1893. if (color == '') {
  1894. link.style.background = 'none';
  1895. link.style.color = 'none';
  1896. color = 'none';
  1897. } else {
  1898. link.style.background = color;
  1899. link.style.color = color;
  1900. }
  1901. picker.style.display = 'none';
  1902. eval(document.getElementById(that.curId + 'field').title);
  1903. }.bind(this)
  1904. },
  1905.  
  1906. setDiv: function (id) {
  1907. if (!document.createElement) { return; }
  1908. this.genColors();
  1909.  
  1910. var div = document.buildElement('div', { id: 'colorpicker' });
  1911. var spn = document.buildElement('span', { style: "font-family:Verdana; font-size:11px;" });
  1912. var a = document.buildElement('a', { href: "javascript:;" }, 'No color', 'click', this.setColor(''));
  1913. spn.appendChild(a);
  1914. spn.appendChild(this.getColorTable());
  1915. div.appendChild(spn);
  1916. document.body.appendChild(div);
  1917. this.divSet = true;
  1918. },
  1919.  
  1920. pickColor: function (id) {
  1921. id = 'ResHue';
  1922. if (!this.divSet) { this.setDiv(id); }
  1923. var picker = document.getElementById('colorpicker');
  1924. if (id == this.curId && picker.style.display == 'block') {
  1925. picker.style.display = 'none';
  1926. return;
  1927. }
  1928. this.curId = id;
  1929. var thelink = document.getElementById(id);
  1930. picker.style.top = (this.getAbsoluteOffsetTop(thelink) + 20) + "px";
  1931. picker.style.left = this.getAbsoluteOffsetLeft(thelink) + "px";
  1932. picker.style.display = 'block';
  1933. },
  1934.  
  1935. genColors: function () {
  1936. for (a = 0; a < this.colorLevels.length - 1; a++)
  1937. this.addColor(a, a, 5);
  1938.  
  1939. for (a = 0; a < this.colorLevels.length - 1; a++)
  1940. this.addColor(a, 5, a);
  1941.  
  1942. for (a = 0; a < this.colorLevels.length - 1; a++)
  1943. this.addColor(5, a, a);
  1944.  
  1945. for (a = 0; a < this.colorLevels.length - 1; a++)
  1946. this.addColor(5, 5, a);
  1947.  
  1948. for (a = 0; a < this.colorLevels.length - 1; a++)
  1949. this.addColor(a, 5, 5);
  1950.  
  1951. for (a = 0; a < this.colorLevels.length - 1; a++)
  1952. this.addColor(5, a, 5);
  1953.  
  1954. this.colorArray[this.colorArray.length] = "#E5ECF9";
  1955. this.colorArray[this.colorArray.length] = "#FAFAE6";
  1956.  
  1957. return this.colorArray;
  1958. },
  1959. getColorTable: function () {
  1960. var colors = this.colorArray;
  1961. var tab = document.buildElement('table', { border: "0", cellspacing: "1", cellpadding: "1" });
  1962.  
  1963. for (var i = 0; i < colors.length; i++) {
  1964. if (i % this.perline == 0) { var tr = document.buildElement('tr'); tab.appendChild(tr) }
  1965. var td = document.buildElement('td', { bgcolor: colors[i] });
  1966. var a = document.buildElement('a', { style: "outline: 1px solid #000000; color:" + colors[i] + "; background: ' + colors[i] + ';font-size: 11px;", title: colors[i], href: "javascript:;" }, "&nbsp;&nbsp;&nbsp;&nbsp;", 'click', this.setColor(colors[i]));
  1967. td.appendChild(a);
  1968. tr.appendChild(td)
  1969. }
  1970. return tab;
  1971. },
  1972. getColorTable2: function () {
  1973. var colors = this.colorArray;
  1974. var tableCode = '';
  1975. tableCode += '<table border="0" cellspacing="1" cellpadding="1">';
  1976. for (i = 0; i < colors.length; i++) {
  1977. if (i % this.perline == 0) { tableCode += '<tr>'; }
  1978. tableCode += '<td bgcolor="#000000"><a style="outline: 1px solid #000000; color: '
  1979. + colors[i] + '; background: ' + colors[i] + ';font-size: 11px;" title="'
  1980. + colors[i] + '" href="javascript:setColor(\'' + colors[i] + '\');">&nbsp;&nbsp;&nbsp;&nbsp;</a></td>';
  1981. if (i % this.perline == this.perline - 1) { tableCode += '</tr>'; }
  1982. }
  1983. if (i % this.perline != 0) { tableCode += '</tr>'; }
  1984. tableCode += '</table>';
  1985. return tableCode;
  1986. },
  1987. relateColor: function (id) {
  1988.  
  1989. return function (e) {
  1990.  
  1991. var color = (e.srcElement.value)
  1992. var link = document.getElementById(id);
  1993. if (color == '') {
  1994. link.style.background = 'none';
  1995. link.style.color = 'none';
  1996. color = 'none';
  1997. } else {
  1998. link.style.background = color;
  1999. link.style.color = color;
  2000. }
  2001. eval(document.getElementById(id + 'field').title);
  2002. }.bind(this)
  2003. },
  2004. getAbsoluteOffsetTop: function (obj) {
  2005. var top = obj.offsetTop;
  2006. var parent = obj.offsetParent;
  2007. while (parent != document.body && parent !== null) {
  2008. top += parent.offsetTop;
  2009. parent = parent.offsetParent;
  2010. }
  2011. return top;
  2012. },
  2013.  
  2014. getAbsoluteOffsetLeft: function (obj) {
  2015. var left = obj.offsetLeft;
  2016. var parent = obj.offsetParent;
  2017. while (parent != document.body && parent !== null) {
  2018. left += parent.offsetLeft;
  2019. parent = parent.offsetParent;
  2020. }
  2021. return left;
  2022. }
  2023. },
  2024. bgBordertog: function () {
  2025. var e = document.getElementById('BGBorderlink');
  2026. e.innerHTML = (e.innerHTML == 'background') ? 'border' : 'background';
  2027. },
  2028. flowtog: function () {
  2029. var e = document.getElementById('flowimg');
  2030. e.className = (e.className == 'l2r') ? 't2b' : 'l2r';
  2031. }
  2032.  
  2033. };
  2034.  
  2035. /* Prototypes and additional document functions */
  2036. document.getElementByXPath = function (XPath, contextNode) {
  2037. var a = this.evaluate(XPath, (contextNode || this), null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  2038. return (a.snapshotLength ? a.snapshotItem(0) : null);
  2039. };
  2040.  
  2041. document.getElementsByXPath = function (XPath, contextNode) {
  2042. var ret = [], i = 0;
  2043. var a = this.evaluate(XPath, (contextNode || this), null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  2044. while (a.snapshotItem(i)) {
  2045. ret.push(a.snapshotItem(i++));
  2046. }
  2047. return ret;
  2048. };
  2049.  
  2050. document.buildElement = function (type, atArr, inner, action, listen) {
  2051. var e = document.createElement(type);
  2052. for (var at in atArr) {
  2053. if (atArr.hasOwnProperty(at)) {
  2054. e.setAttribute(at, atArr[at]);
  2055. }
  2056. }
  2057. if (action && listen) {
  2058. e.addEventListener(action, listen, false);
  2059. }
  2060. if (inner) {
  2061. e.innerHTML = inner;
  2062. }
  2063. return e;
  2064. };
  2065.  
  2066. Function.prototype.bind = function (object) {
  2067. var __method = this;
  2068. return function () {
  2069. __method.apply(object, arguments);
  2070. }
  2071. };
  2072.  
  2073. String.prototype.repeat = function (l) {
  2074. return new Array(l + 1).join(this);
  2075. };
  2076.  
  2077. String.prototype.retNum = function () {
  2078. return (isNaN(this) ? 0 : (+this));
  2079. };
  2080.  
  2081. if (typeof GM_getValue === "undefined" || GM_getValue("a", "b") === undefined) {
  2082. if (typeof window.localStorage == "object") {
  2083. GM_setValue = function (key, value) {
  2084. window.localStorage.setItem(key, value);
  2085. }
  2086. }
  2087. else {
  2088. function getRecoverableString(oVar, notFirst) {
  2089. var oType = typeof (oVar);
  2090. if ((oType == 'null') || (oType == 'object' && !oVar)) {
  2091. //most browsers say that the typeof for null is 'object', but unlike a real
  2092. //object, it will not have any overall value
  2093. return 'null';
  2094. }
  2095. if (oType == 'undefined') { return 'window.uDfXZ0_d'; }
  2096. if (oType == 'object') {
  2097. //Safari throws errors when comparing non-objects with window/document/etc
  2098. if (oVar == window) { return 'window'; }
  2099. if (oVar == document) { return 'document'; }
  2100. if (oVar == document.body) { return 'document.body'; }
  2101. if (oVar == document.documentElement) { return 'document.documentElement'; }
  2102. }
  2103. if (oVar.nodeType && (oVar.childNodes || oVar.ownerElement)) { return '{error:\'DOM node\'}'; }
  2104. if (!notFirst) {
  2105. Object.prototype.toRecoverableString = function (oBn) {
  2106. if (this.tempLockIgnoreMe) { return '{\'LoopBack\'}'; }
  2107. this.tempLockIgnoreMe = true;
  2108. var retVal = '{', sepChar = '', j;
  2109. for (var i in this) {
  2110. if (i == 'toRecoverableString' || i == 'tempLockIgnoreMe' || i == 'prototype' || i == 'constructor') { continue; }
  2111. if (oBn && (i == 'index' || i == 'input' || i == 'length' || i == 'toRecoverableObString')) { continue; }
  2112. j = this[i];
  2113. if (!i.match(basicObPropNameValStr)) {
  2114. //for some reason, you cannot use unescape when defining peoperty names inline
  2115. for (var x = 0; x < cleanStrFromAr.length; x++) {
  2116. i = i.replace(cleanStrFromAr[x], cleanStrToAr[x]);
  2117. }
  2118. i = '\'' + i + '\'';
  2119. } else if (window.ActiveXObject && navigator.userAgent.indexOf('Mac') + 1 && !navigator.__ice_version && window.ScriptEngine && ScriptEngine() == 'JScript' && i.match(/^\d+$/)) {
  2120. //IE mac does not allow numerical property names to be used unless they are quoted
  2121. i = '\'' + i + '\'';
  2122. }
  2123. retVal += sepChar + i + ':' + getRecoverableString(j, true);
  2124. sepChar = ',';
  2125. }
  2126. retVal += '}';
  2127. this.tempLockIgnoreMe = false;
  2128. return retVal;
  2129. };
  2130. Array.prototype.toRecoverableObString = Object.prototype.toRecoverableString;
  2131. Array.prototype.toRecoverableString = function () {
  2132. if (this.tempLock) { return '[\'LoopBack\']'; }
  2133. if (!this.length) {
  2134. var oCountProp = 0;
  2135. for (var i in this) { if (i != 'toRecoverableString' && i != 'toRecoverableObString' && i != 'tempLockIgnoreMe' && i != 'prototype' && i != 'constructor' && i != 'index' && i != 'input' && i != 'length') { oCountProp++; } }
  2136. if (oCountProp) { return this.toRecoverableObString(true); }
  2137. }
  2138. this.tempLock = true;
  2139. var retVal = '[';
  2140. for (var i = 0; i < this.length; i++) {
  2141. retVal += (i ? ',' : '') + getRecoverableString(this[i], true);
  2142. }
  2143. retVal += ']';
  2144. delete this.tempLock;
  2145. return retVal;
  2146. };
  2147. Boolean.prototype.toRecoverableString = function () {
  2148. return '' + this + '';
  2149. };
  2150. Date.prototype.toRecoverableString = function () {
  2151. return 'new Date(' + this.getTime() + ')';
  2152. };
  2153. Function.prototype.toRecoverableString = function () {
  2154. return this.toString().replace(/^\s+|\s+$/g, '').replace(/^function\s*\w*\([^\)]*\)\s*\{\s*\[native\s+code\]\s*\}$/i, 'function () {[\'native code\'];}');
  2155. };
  2156. Number.prototype.toRecoverableString = function () {
  2157. if (isNaN(this)) { return 'Number.NaN'; }
  2158. if (this == Number.POSITIVE_INFINITY) { return 'Number.POSITIVE_INFINITY'; }
  2159. if (this == Number.NEGATIVE_INFINITY) { return 'Number.NEGATIVE_INFINITY'; }
  2160. return '' + this + '';
  2161. };
  2162. RegExp.prototype.toRecoverableString = function () {
  2163. return '\/' + this.source + '\/' + (this.global ? 'g' : '') + (this.ignoreCase ? 'i' : '');
  2164. };
  2165. String.prototype.toRecoverableString = function () {
  2166. var oTmp = escape(this);
  2167. if (oTmp == this) { return '\'' + this + '\''; }
  2168. return 'unescape(\'' + oTmp + '\')';
  2169. };
  2170. }
  2171. if (!oVar.toRecoverableString) { return '{error:\'internal object\'}'; }
  2172. var oTmp = oVar.toRecoverableString();
  2173. if (!notFirst) {
  2174. //prevent it from changing for...in loops that the page may be using
  2175. delete Object.prototype.toRecoverableString;
  2176. delete Array.prototype.toRecoverableObString;
  2177. delete Array.prototype.toRecoverableString;
  2178. delete Boolean.prototype.toRecoverableString;
  2179. delete Date.prototype.toRecoverableString;
  2180. delete Function.prototype.toRecoverableString;
  2181. delete Number.prototype.toRecoverableString;
  2182. delete RegExp.prototype.toRecoverableString;
  2183. delete String.prototype.toRecoverableString;
  2184. }
  2185. return oTmp;
  2186. }
  2187.  
  2188. GM_setValue = function (cookieName, cookieValue, lifeTime) {
  2189. if (!cookieName) { return; }
  2190. if (lifeTime == "delete") { lifeTime = -10; } else { lifeTime = 31536000; }
  2191. document.cookie = escape(cookieName) + "=" + escape(getRecoverableString(cookieValue)) +
  2192. ";expires=" + (new Date((new Date()).getTime() + (1000 * lifeTime))).toGMTString() + ";path=/";
  2193. }
  2194. }
  2195. }
  2196. if (typeof GM_getValue === "undefined" || GM_getValue("a", "b") === undefined) {
  2197. if (typeof window.localStorage == "object") {
  2198. GM_getValue = function (key, defaultValue) {
  2199. var value = window.localStorage.getItem(key);
  2200. if (value == null) value = defaultValue;
  2201. else if (value == 'true') value = true;
  2202. else if (value == 'false') value = false;
  2203. return value;
  2204. }
  2205. }
  2206. else {
  2207. GM_getValue = function (cookieName, oDefault) {
  2208. var cookieJar = document.cookie.split("; ");
  2209. for (var x = 0; x < cookieJar.length; x++) {
  2210. var oneCookie = cookieJar[x].split("=");
  2211. if (oneCookie[0] == escape(cookieName)) {
  2212. try {
  2213. eval('var footm = ' + unescape(oneCookie[1]));
  2214. } catch (e) { return oDefault; }
  2215. return footm;
  2216. }
  2217. }
  2218. return oDefault;
  2219. }
  2220. }
  2221. }
  2222. if (typeof GM_xmlhttpRequest === "undefined") {
  2223. GM_xmlhttpRequest = function (details) {
  2224. var xmlhttp = new XMLHttpRequest();
  2225. xmlhttp.onreadystatechange = function () {
  2226. var responseState = {
  2227. responseXML: (xmlhttp.readyState == 4 ? xmlhttp.responseXML : ''),
  2228. responseText: (xmlhttp.readyState == 4 ? xmlhttp.responseText : ''),
  2229. readyState: xmlhttp.readyState,
  2230. responseHeaders: (xmlhttp.readyState == 4 ? xmlhttp.getAllResponseHeaders() : ''),
  2231. status: (xmlhttp.readyState == 4 ? xmlhttp.status : 0),
  2232. statusText: (xmlhttp.readyState == 4 ? xmlhttp.statusText : '')
  2233. }
  2234. if (details["onreadystatechange"]) {
  2235. details["onreadystatechange"](responseState);
  2236. }
  2237. if (xmlhttp.readyState == 4) {
  2238. if (details["onload"] && xmlhttp.status >= 200 && xmlhttp.status < 300) {
  2239. details["onload"](responseState);
  2240. }
  2241. if (details["onerror"] && (xmlhttp.status < 200 || xmlhttp.status >= 300)) {
  2242. details["onerror"](responseState);
  2243. }
  2244. }
  2245. }
  2246. try {
  2247. //cannot do cross domain
  2248. xmlhttp.open(details.method, details.url);
  2249. // alert(details.method +':'+ details.url)
  2250. } catch (e) {
  2251. if (details["onerror"]) {
  2252. //simulate a real error
  2253. details["onerror"]({ responseXML: '', responseText: '', readyState: 4, responseHeaders: '', status: 403, statusText: 'Forbidden' });
  2254. }
  2255. return;
  2256. }
  2257. if (details.headers) {
  2258. for (var prop in details.headers) {
  2259. xmlhttp.setRequestHeader(prop, details.headers[prop]);
  2260. }
  2261. }
  2262. xmlhttp.send((typeof (details.data) != 'undefined') ? details.data : null);
  2263. }
  2264. }
  2265.  
  2266. // Browser detect
  2267. // http://www.quirksmode.org/js/detect.html
  2268. // A useful but often overrated JavaScript function is the browser detect.
  2269. // Sometimes you want to give specific instructions or load a new page in case the viewer uses, for instance, Safari.
  2270. var BrowserDetect = {
  2271. init: function () {
  2272. this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
  2273. this.version = this.searchVersion(navigator.userAgent)
  2274. || this.searchVersion(navigator.appVersion)
  2275. || "an unknown version";
  2276. this.OS = this.searchString(this.dataOS) || "an unknown OS";
  2277. this.csQuery = this.searchCSQuery(this.dataBrowser) || false;
  2278. return (this.browser != "An unknown browser");
  2279. },
  2280. searchString: function (data) {
  2281. for (var i = 0; i < data.length; i++) {
  2282. var dataString = data[i].string;
  2283. var dataProp = data[i].prop;
  2284. this.versionSearchString = data[i].versionSearch || data[i].identity;
  2285. if (dataString) {
  2286. if (dataString.indexOf(data[i].subString) != -1)
  2287. return data[i].identity;
  2288. }
  2289. else if (dataProp)
  2290. return data[i].identity;
  2291. }
  2292. },
  2293. searchCSQuery: function (data) {
  2294. for (var i = 0; i < data.length; i++) {
  2295. var dataString = data[i].string;
  2296. var dataProp = data[i].prop;
  2297. this.versionSearchString = data[i].versionSearch || data[i].identity;
  2298. if (dataString) {
  2299. if (dataString.indexOf(data[i].subString) != -1)
  2300. return data[i].csQuery;
  2301. }
  2302. else if (dataProp)
  2303. return data[i].csQuery;
  2304. }
  2305. },
  2306. searchVersion: function (dataString) {
  2307. var index = dataString.indexOf(this.versionSearchString);
  2308. if (index == -1) return;
  2309. return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
  2310. },
  2311. dataBrowser: [
  2312. {
  2313. string: navigator.userAgent,
  2314. subString: "Chrome",
  2315. identity: "Chrome",
  2316. csQuery: false
  2317. },
  2318. {
  2319. string: navigator.userAgent,
  2320. subString: "OmniWeb",
  2321. versionSearch: "OmniWeb/",
  2322. identity: "OmniWeb",
  2323. csQuery: false
  2324. },
  2325. {
  2326. string: navigator.vendor,
  2327. subString: "Apple",
  2328. identity: "Safari",
  2329. versionSearch: "Version",
  2330. csQuery: false
  2331. },
  2332. {
  2333. prop: window.opera,
  2334. identity: "Opera",
  2335. csQuery: false
  2336. },
  2337. {
  2338. string: navigator.vendor,
  2339. subString: "iCab",
  2340. identity: "iCab",
  2341. csQuery: false
  2342. },
  2343. {
  2344. string: navigator.vendor,
  2345. subString: "KDE",
  2346. identity: "Konqueror",
  2347. csQuery: false
  2348. },
  2349. {
  2350. string: navigator.userAgent,
  2351. subString: "Firefox",
  2352. identity: "Firefox",
  2353. csQuery: true
  2354. },
  2355. {
  2356. string: navigator.vendor,
  2357. subString: "Camino",
  2358. identity: "Camino",
  2359. csQuery: false
  2360. },
  2361. { // for newer Netscapes (6+)
  2362. string: navigator.userAgent,
  2363. subString: "Netscape",
  2364. identity: "Netscape",
  2365. csQuery: false
  2366. },
  2367. {
  2368. string: navigator.userAgent,
  2369. subString: "MSIE",
  2370. identity: "Explorer",
  2371. versionSearch: "MSIE",
  2372. csQuery: false
  2373. },
  2374. {
  2375. string: navigator.userAgent,
  2376. subString: "Gecko",
  2377. identity: "Mozilla",
  2378. versionSearch: "rv",
  2379. csQuery: false
  2380. },
  2381. { // for older Netscapes (4-)
  2382. string: navigator.userAgent,
  2383. subString: "Mozilla",
  2384. identity: "Netscape",
  2385. versionSearch: "Mozilla",
  2386. csQuery: false
  2387. }
  2388. ],
  2389. dataOS: [
  2390. {
  2391. string: navigator.platform,
  2392. subString: "Win",
  2393. identity: "Windows"
  2394. },
  2395. {
  2396. string: navigator.platform,
  2397. subString: "Mac",
  2398. identity: "Mac"
  2399. },
  2400. {
  2401. string: navigator.userAgent,
  2402. subString: "iPhone",
  2403. identity: "iPhone/iPod"
  2404. },
  2405. {
  2406. string: navigator.platform,
  2407. subString: "Linux",
  2408. identity: "Linux"
  2409. }
  2410. ]
  2411.  
  2412. };
  2413. function findPos(obj) {
  2414. var curleft = curtop = 0;
  2415. if (obj.offsetParent) {
  2416. do {
  2417. curleft += obj.offsetLeft;
  2418. curtop += obj.offsetTop;
  2419. } while ((obj = obj.offsetParent));
  2420. }
  2421. return [curleft, curtop];
  2422. }
  2423. function getStyle(el, styleProp) {
  2424. if (el.currentStyle)
  2425. var y = el.currentStyle[styleProp];
  2426. else if (window.getComputedStyle)
  2427. var y = document.defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
  2428. if ((match = y.match(/^(\d+)px$/))) y = +match[1];
  2429. return y;
  2430. }
  2431. var monkeyr = {
  2432. toLog: false,
  2433. toLogE: false,
  2434. log: function () {
  2435. if (!this.toLog) return;
  2436. this._log.apply(this, arguments);
  2437. },
  2438. logE: function () {
  2439. if (!this.toLogE) return;
  2440. this._log.apply(this, arguments);
  2441. },
  2442. logA: function () {
  2443. if (!this.toLog && !this.toLogE) return;
  2444. this._log.apply(this, arguments);
  2445. },
  2446. _log: function () {
  2447. if (window.console) {
  2448. if (arguments.length == 1) {
  2449. console.log(arguments[0]);
  2450. }
  2451. else {
  2452. console.log(Array.prototype.slice.call(arguments));
  2453. }
  2454. }
  2455. }
  2456. }
  2457. // monkeyr.toLog = true;
  2458. // monkeyr.toLogE = true;
  2459. // UIL.watching = '#main';
  2460. /* Run the browser detect script */
  2461. BrowserDetect.init();
  2462. /* Run the update check */
  2463. UIL.UI.updateCheckRequest();
  2464. /* Run the script */
  2465. UIL.init();
  2466. })();