Fixed Scroller Anywhere

fixedscrollanywhere

  1. // ==UserScript==
  2. // @name Fixed Scroller Anywhere
  3. // @namespace http://userscripts.org/users/315214
  4. // @description fixedscrollanywhere
  5. // @version 0.1
  6. // @dtversion 110815001
  7. // @timestamp 1313348055082
  8. // @author tuxie.forte (http://userscripts.org/users/tuxieforte);
  9. // @license (CC) by-nc-sa 3.0
  10. // @include http://*
  11. // @include https://*
  12. //
  13. // ==/UserScript==
  14. //
  15. // This script contain adapted snippet from: google plus reply+,
  16. // Full credit left to original author: Mesak (http://userscripts.org/users/mesak)
  17. // uso: http://userscripts.org/scripts/show/106503
  18. // web: http://mesak.wablog.info
  19. // =================================
  20. //
  21. (function(){
  22.  
  23. // Initialize Global Variables
  24. var gvar=function() {};
  25. var IMG = {
  26. 'BT_ARROW_BOTTOM':'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAB3klEQVRYR+1XSy8DURidRS0bEo/Eb7C2YCXxO4hO25mhOxaIBGui9fwNHlGPRkM8qu20RESInSAhNqhHSKyP75QmmtA2XOlmFif35n7n3O98370z7WgAtHKirMlZuGPA6YDTAacDRTugaZrLNM01n88H3eOBpwjIIdeyrAvRVggK5ijFgNswDLy8vuE+84i7+4eCIIdcaiR3pQoDNX6//2ksOIGr6xvMzocFi5hbCOeBa4yRQ65oniV5rQoDVbJJo7Q+Mzg0jLPzCyytRBBeXs0D1xgjh1xqBNT++Qh4jvWCZl3XM729fTg+OUVkbR0rkWgWnHONMXLI/dQouQMsImeiyevVM93dPUjaaWxux7JI2ClwjTHhNn1NrqID3CPPhFR52xUIILq+kUWnZbHy2++SqzSQZ6K9re3Sq+sgOP8puQoDrpHRYDQ4PoWx0KRgCqGJaYQmZ2T8wPjnPMdhnBpJ7lJhwN0/MIiDwyOk9w9g7+0jmd5DIpVGPJnCbiKFWNzGdiyBrZ243Ind7EiNJHerMFDd4fHZhtkFv9FZEIbEyTOtAKiR5NUqDLCKBkGLoLVEkEuNkg7wHLkR32p1JYJcapTcgdxj+Oux0N/+oj9G//3N4BhwOuB0oOwdeAf11IjEeWJphQAAAABJRU5ErkJggg==',
  27. 'BT_ARROW_TOP':'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAB/UlEQVRYR+1XzU4TURidpLhsYgK48BVc+QZGE16grFudf2DV7gyBRZdiW7WvoQN0hCC09GcopCEmhLiAlKTtXuvCBzh+Z5yaiYYW0iFspsnJnTvfOff75sz9bqYKAOU+ca/J+eBxAbEDsQOxAxMdUBRl5s1Gcaf4roxC6cNfvC2+x3UolMqghlrB2Bw3KSD5enUdB7UG9qt1f6weNlGrt3DYaKHe8tD02mgdHcNrn6B90kHn9CuokdzJKAqYfflK9yx7Baa1DNNchuFjCbphB1jy5yOQR40kn42iAD7FE8EzwYsAC4uLKVfTVGiqilQq5cr9hVCcXGoicYDvkQvNCx4JHmcymYppmvgx/InvwyHW19aQTqcrjAUccqmJZA/QxdEvoWmak83l0Ov10Wh6qMs+GPQH4D3GhJgIC6J4BaHkqpPN5nDZvcK2u4OtymdsCnh90e2CMXkt/xUx7nvjJl3AAhKqqjr5fB5n59/gbLn4tOn6Y/iaMXLIDTsxbQEzuq67hWIJ7eOOn/ijsx2gIiPxZ84YOeRSE9UeSNq2JX3vYW+/ht0v1bEgh1xqouqCOdu2f1mWBcMwBPoEGCCXGilgLopN+FAWeSp4Hurz0Xlw3UguNdROfRQ/CBbiGXAbMDm1Uxfwb1vfej5VF9z1f4aJ50BcQOxA7MBdO/AbgVKBjSV0zikAAAAASUVORK5CYII=',
  28. 'BT_ARROW_DN':'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABcklEQVRYR+1Wy0rDQBQNqEvBRb/DRX/A38hrEwkJoa7soq7UH1DwK3xgtAZLRURMq2vFneii4sqqoILr45yQFCIxEZJSFzNwYLhzzr13Tm5gFADKJDHR4ry4bEA6IB2QDvx/BxRFmfE87922bSxaFqwCkEMuNdQK5F6y0AGhn3McBx+fXxi+vOF5+JoLcsilhtoqGqiZpnmxsbmFweMTtnd9gX3s7PkpMMYzcsilRhSvVdHArEgyr6pquLq2jrv7Bxy0A/iHRykwxjNyyKVGgNrSn2A6vkmdiVutFVzf3CI47qIddCJwzxjP4uL1WENt6QaYYyppQtO0sLncRK9/hdOz8whh/xKM8UzwkuLURCvvvfGXIUzyjJrQdS1sLDXQ6Z5EEBMPXdczi1fZQMoJwzB6ruuC4D7r5lU78NMJDtlCDO458SPbE3LVDiR5OVyccBYluI8GLmtVNQO/5S+Ml2pg3C/mwr9ANiAdkA5IB8btwDctkKsYa5cf8AAAAABJRU5ErkJggg==',
  29. 'BT_ARROW_UP':'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABX0lEQVRYR+1Wy0rDQBQNpC4LLor/4S/on+S9Tfd1kb36IWr6iIqKJdWi4E7EhVKh7V7rwg843hMrSEmblmmpiwkcZjJz7twzJzeTGACMdWKtyblxLUA7oB3QDvx/B4z8y/Q878hxHDiODdd1U6GVpnBnbrLQgZxFTdu2YxGAj9En3gV7tRosy4qFa+aJmPWtWVRAljysVtHvD9C56SLt3GI4GIJjnMsTsSwBktyKw7CK194bmskZGq1T1AXsv/R64Bw5kyKWIcCkxVEU4fHpGXEjwUk9ydq/fc6RM/k4VAWUpNiS/YND3N0/ZImP4+YYLWmJn3vOkUMuY34LU1VAOQh8tNMuLq7aOL+8nglyyGWMCCizKFUFVIIg+PJ9n6+bwCmAC3IZI7kryxCwKYtsC3YEu3OCXMYwVtmBjfFCW9IuAiZnrLKAaQfc3ONKNbDqP+bCk1AL0A5oB7QDq3bgG8rFqAcNi1mfAAAAAElFTkSuQmCC',
  30. 'BT_ARROW_BLACK':'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACQklEQVRYR+2XXWsTQRSGEyq9NCCk1/4BLwJCvLKCvyAfKLHJbnaTko9NrGlNTbUKSUgJbRNrrRJtruoPKAGvKtYPeuuFv+g4z5hIKm1qyZaCZOFlDue8Z867Z3ZmEo+IeC4Tl1qcF58ImHRg0oEzO+A5/njn5h7cMk3zSzKZlGHgI6bo3r9yRtY4j4Ap0zR2Hacg3W5XDg4+yddv3zWw8RGDowRMDYsYddD9q4ArauJeaXFRDj8fyrv3Xck7Rbl3P6aBjY8YHMXtDosYV4A3FArNFosF/abl5RUxTEssOy12al4DGx8xOHDD4fDtwXKMK2A6kUgc7e19kGqtIen5jGSyecnlC8eAjxgcuIZhHCkB0yzFuAJ8lmXJ/n5PFywUF+ThQulEEIMDlxxV2+eGAL9t27LztiOPSkuy9LissHwKypoDlxxV3O+GgJlUKiXrGy15UnkmlZXVkYADlxxVfMYVAel0Sp6/qCrU+iP2afjNIcctAf54PP6j8nRV6o2mVOtrIwEHLjluLYEvGAwmstmMNNc3FVqy1tw4EcTgwCXHrY+QrXQ9Go32HMeR9sttaW+9lpYaN9uvNLDxEYMDlxy3tiFn+1WFG5FI5GM2m5NavSHbOx1509nVwMZHDA7cfo6+F8Y9B5iDs/0aEwcCgVwsFvvJNrPVXtdQNj5i/eJw/9wHbggYiKATtPamwh2Fu31g4yMGx/XLCAE8tJRvghOOQ4Z9DrDxEbuw63gg4tzjWEtw0X9azvw9MBEw6cB/34Ff40MrIZhsiFAAAAAASUVORK5CYII=',
  31. 'BT_ARROW_TORIGHT':'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAYxJREFUWIXt1r1Kw2AUxvH/Sa2LpeqibtYOft6AuLuJtKK4ODVQimBvQ138GhRp7eSgFKxIL0AcxEvQResXqItaBLGmOQ4VB6cmpemSZwu8b84vJOe8EVWllTFaWt0H+AAfALTVu1BEAIJAx+++L+ATsP6vdTJb6gb8pgMYSKVSZ6Ahy6oWs9lsDKg6vM9fnL6CdqBbVUNz8wuMjI5NJRKJPBDwCgAgtm3z/V1hfHyCSCQSN033CJcfoWKr8vT8wnRshnC4K26apitEQ12ganN9fUNqcZFwZ6crRMNtqAqXl1ekl9IEAoF4Mpk88BAgiNTa7vbunuWVVWzbnvUQUItSQ+jflWcARRUMEaKRfrbW1xAxTj0EgAgMDQ+ysbXJw+NjIZPJTDrZ73QS/ituEI0OsLu9Q7n8XsjlcnM4nIouAYIhQl9vDyfHR5TLb4W9PefF3QLUMAyCwXYuLs4plUquntwtoAK8ishH/nA/ZFnVYiPFAaTeo7NZx7FTQF1pCqBZafkvmQ/wAS0H/ACra5W813uV0AAAAABJRU5ErkJggg==',
  32. 'BT_ARROW_TOLEFT':'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAaxJREFUWIXtlr9LHFEQxz+zexoEOU0Tz8J42mj0H5AU4h8gwRMOU1jt3iFJEdAmyb9hQI6DvSqNrLgS0tnLlYImdndnpzb+QBvP3ZfiQiqVfW+VS7FTz/vOh5l5MyNKKbppVlejpwApwP8AkNFxFpHYvnG/txbAIxp9wAvgDrgB2jqPk5hdKpWCTMaeB7muVCqzQBO4iCuQpAdsx3H8N1PT88WlZZRS/cBLoFdHxBTAdl3Hz+fzhZmZt7Tbt0RRBBC/SRIA2K7r+tnsYOHdwiInp2dESgFmO0UXIOM4jp8dGCisfPxAo9FEqcgo8D9BHedyubw7nMvNuW6J/YNDnmKRamVAqWju0+oajdYxkVJ0xoJ22c0BQBA6AylZWEMAy7K2vn75zOjrEUTkbwmS1UELoFqtvg/DMFj/ts7k5AQak/lpAIDQ87zi1eVlUNnYYHx8DJFk+8zkdQfi6iL4sbNNbugVlgimzWiKH3perdhqtYJ6fY+enl4sywKDhkiSv7BWqxWPfv/66W9+R0SugXPgVkdEdM7yB+6Be9dxXF0tgOewrp9kKUAKkAL8ARL2hevB3d/UAAAAAElFTkSuQmCC',
  33. };
  34. /*
  35. window.alert(new Date().getTime());
  36. */
  37. //========-=-=-=-=--=========
  38. gvar.__DEBUG__ = false; // development debug
  39. //========-=-=-=-=--=========
  40. if(window.top !== window.self) return;
  41.  
  42.  
  43. function init(){
  44.  
  45. // check for browser type
  46. ApiBrowserCheck();
  47. GM_addGlobalStyle( rSRC.css() );
  48. if(!ss) ss = {};
  49. ss.STEPS = 20; // scroll speed; smaller is faster
  50. gvar.LAST = 0;
  51. gvar.sITry_Over = null;
  52. gvar.isMoving = 0;
  53. // roll
  54. start_Main();
  55. }
  56.  
  57. function start_Main(){
  58. var par = document.body || getTag('body')[0];
  59. var el, els, pEl, highest;
  60. if(par){
  61. el = createEl('div', {}, rSRC.tpl() );
  62. Dom.add(el, par);
  63. els = $D('//div[@id="gpr_gotools"]//div', el);
  64. if(pEl = els.snapshotLength){
  65. for(var i=0; i<pEl; i++){
  66. el = els.snapshotItem(i);
  67. _o('click', el, function(e){
  68. e = e.target||e;
  69. if(e.nodeName!='DIV') e = e.parentNode;
  70. var op = e.id.replace('gpr_goto_','');
  71. pageMove(op);
  72. });
  73. }
  74. }
  75. // prep display container
  76. if(el = $D('#gpr_gotools')){
  77. _o('mouseout', el, function(){
  78. gvar.sITry_Over = window.setTimeout(function() {
  79. if($D('#gpr_gotools')) addClass('trsp', $D('#gpr_gotools'))
  80. if($D('#gpr_goto_hide')) addClass('invi', $D('#gpr_goto_hide'));
  81. }, 800);
  82. });
  83. _o('mousemove', el, function(){
  84. clearTimeout(gvar.sITry_Over);
  85. if($D('#gpr_gotools')) removeClass('trsp', $D('#gpr_gotools'))
  86. if($D('#gpr_goto_hide')) removeClass('invi', $D('#gpr_goto_hide'));
  87. });
  88. window.setTimeout(function() { removeClass('invi', $D('#gpr_gotools')) }, 500);
  89. highest = findHighestZIndex('*');
  90. if(highest > 1)
  91. el.style.setProperty('z-index', (highest+1) ,'');
  92. }
  93. //addClass
  94. }
  95. }
  96.  
  97. // handler of scroll seeker
  98. function pageMove(to){
  99. var move_scroll = 0, cs = ss.getCurrentYPos();
  100. gvar.isMoving = (gvar.isMoving < 1 ? gvar.isMoving+1 : 0);
  101. if(gvar.isMoving==0) return;
  102. switch(to){
  103. case "top": move_scroll = 0; break;
  104. case "up": move_scroll= cs-GetHeight();break;
  105. case "black":
  106. move_scroll= gvar.LAST;
  107. break;
  108. case "dn":move_scroll= cs+GetHeight();break;
  109. case "bottom": move_scroll = getDocumentHeight(); break;
  110. case "hide": move_scroll = false; break;
  111. case "show": move_scroll = true; break;
  112. }
  113. if(move_scroll===false){
  114. addClass('hide', $D('#gpr_main'));
  115. removeClass('hide', $D('#gpr_toggler'));
  116. return;
  117. }else if(move_scroll===true){
  118. removeClass('hide', $D('#gpr_main'));
  119. addClass('hide', $D('#gpr_toggler'));
  120. return;
  121. }
  122.  
  123. ss.smoothScroll( move_scroll, null );
  124. gvar.LAST = cs;
  125. }
  126.  
  127.  
  128.  
  129. function findHighestZIndex(elem){
  130. var ret=0, zindex, elems = document.getElementsByTagName(elem);
  131. for (var i = 0; i < elems.length; i++) {
  132. zindex=document.defaultView.getComputedStyle(elems[i],null).getPropertyValue("z-index");
  133. if ((zindex > ret) && (zindex != 'auto'))
  134. ret = zindex;
  135. }
  136. return ret;
  137. }
  138.  
  139.  
  140.  
  141.  
  142.  
  143. // static routine
  144. function isDefined(x) { return !(x == null && x !== null); }
  145. function isUndefined(x) { return x == null && x !== null; }
  146. function isString(x) { return (typeof(x)!='object' && typeof(x)!='function'); }
  147. function trimStr(x) { return (typeof(x)=='string' && x ? x.replace(/^\s+|\s+$/g,"") : '') };
  148.  
  149. function _o(m,e,f){Dom.Ev(e,m,function(e){typeof(f)=='function'?f(e):void(0)});}
  150. function GetHeight(){
  151. var y = 0;
  152. if (self.innerHeight){ // FF; Opera; Chrome
  153. y = self.innerHeight;
  154. } else if (document.documentElement && document.documentElement.clientHeight){
  155. y = document.documentElement.clientHeight;
  156. } else if (document.body){
  157. y = document.body.clientHeight;
  158. }
  159. return y;
  160. }
  161. function getDocumentHeight() {
  162. var D = document;
  163. return Math.max(
  164. Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
  165. Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
  166. Math.max(D.body.clientHeight, D.documentElement.clientHeight)
  167. );
  168. }
  169.  
  170. function createEl(type, attrArray, html){
  171. var node = document.createElement(type);
  172. for (var attr in attrArray)
  173. if (attrArray.hasOwnProperty(attr))
  174. node.setAttribute(attr, attrArray[attr]);
  175. if(html) Dom.setHTML(node, html);
  176. return node;
  177. }
  178. function createTextEl(txt){
  179. return document.createTextNode(txt);
  180. }
  181. function getTag(name, parent){
  182. var ret = (typeof(parent)!='object' ? document.getElementsByTagName(name) : parent.getElementsByTagName(name) );
  183. return (isDefined(ret[0]) ? ret : false);
  184. }
  185. function addClass(cName, Obj){
  186. if(cName=="") return;
  187. var neocls = (Obj.className ? Obj.className : '');
  188. if(neocls.indexOf(cName)!=-1) return;
  189. neocls+=(neocls!=''?' ':'')+cName;
  190. Obj.setAttribute('class', neocls);
  191. }
  192. function removeClass(cName, Obj){
  193. if(cName=="") return;
  194. var neocls = (Obj.className ? Obj.className : '');
  195. neocls = trimStr ( neocls.replace(cName,"") ); // replace and trim
  196. Obj.setAttribute('class', neocls);
  197. }
  198.  
  199. //=== BROWSER DETECTION / ADVANCED SETTING
  200. //=============snipet-authored-by:GI-Joe==//
  201. function ApiBrowserCheck() {
  202. //delete GM_log; delete GM_getValue; delete GM_setValue; delete GM_deleteValue; delete GM_xmlhttpRequest; delete GM_openInTab; delete GM_registerMenuCommand;
  203. if(typeof(unsafeWindow)=='undefined') { unsafeWindow=window; }
  204. if(typeof(GM_log)=='undefined') { GM_log=function(msg) { try { unsafeWindow.console.log('GM_log: '+msg); } catch(e) {} }; }
  205. var needApiUpgrade=false;
  206. if(window.navigator.appName.match(/^opera/i) && typeof(window.opera)!='undefined') {
  207. needApiUpgrade=true; gvar.isOpera=true; GM_log=window.opera.postError; clog('Opera detected...',0);
  208. }
  209. if(typeof(GM_setValue)!='undefined') {
  210. var gsv; try { gsv=GM_setValue.toString(); } catch(e) { gsv='.staticArgs.FF4.0'; }
  211. if(gsv.indexOf('staticArgs')>0) {
  212. gvar.isGreaseMonkey=true; gvar.isFF4=false;
  213. clog('GreaseMonkey Api detected'+( (gvar.isFF4=gsv.indexOf('FF4.0')>0) ?' >= FF4':'' )+'...',0);
  214. } // test GM_hitch
  215. else if(gsv.match(/not\s+supported/)) { needApiUpgrade=true; gvar.isBuggedChrome=true; clog('Bugged Chrome GM Api detected...',0); }
  216. } else { needApiUpgrade=true; clog('No GM Api detected...',0); }
  217.  
  218. gvar.noCrossDomain = (gvar.isOpera || gvar.isBuggedChrome);
  219. if(needApiUpgrade) {
  220. GM_isAddon=true; clog('Try to recreate needed GM Api...',0);
  221. //OPTIONS_BOX['FLASH_PLAYER_WMODE'][3]=2; OPTIONS_BOX['FLASH_PLAYER_WMODE_BCHAN'][3]=2; // Change Default wmode if there no greasemonkey installed
  222. var ws=null; try { ws=typeof(unsafeWindow.localStorage) } catch(e) { ws=null; } // Catch Security error
  223. if(ws=='object') {
  224. clog('Using localStorage for GM Api.',0);
  225. GM_getValue=function(name,defValue) { var value=unsafeWindow.localStorage.getItem(GMSTORAGE_PATH+name); if(value==null) { return defValue; } else { switch(value.substr(0,2)) { case 'S]': return value.substr(2); case 'N]': return parseInt(value.substr(2)); case 'B]': return value.substr(2)=='true'; } } return value; };
  226. GM_setValue=function(name,value) { switch (typeof(value)) { case 'string': unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'S]'+value); break; case 'number': if(value.toString().indexOf('.')<0) { unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'N]'+value); } break; case 'boolean': unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'B]'+value); break; } };
  227. GM_deleteValue=function(name) { unsafeWindow.localStorage.removeItem(GMSTORAGE_PATH+name); };
  228. } else if(!gvar.isOpera || typeof(GM_setValue)=='undefined') {
  229. clog('Using temporarilyStorage for GM Api.',0); gvar.temporarilyStorage=new Array();
  230. GM_getValue=function(name,defValue) { if(typeof(gvar.temporarilyStorage[GMSTORAGE_PATH+name])=='undefined') { return defValue; } else { return gvar.temporarilyStorage[GMSTORAGE_PATH+name]; } };
  231. GM_setValue=function(name,value) { switch (typeof(value)) { case "string": case "boolean": case "number": gvar.temporarilyStorage[GMSTORAGE_PATH+name]=value; } };
  232. GM_deleteValue=function(name) { delete gvar.temporarilyStorage[GMSTORAGE_PATH+name]; };
  233. }
  234. if(typeof(GM_openInTab)=='undefined') { GM_openInTab=function(url) { unsafeWindow.open(url,""); }; }
  235. if(typeof(GM_registerMenuCommand)=='undefined') { GM_registerMenuCommand=function(name,cmd) { GM_log("Notice: GM_registerMenuCommand is not supported."); }; } // Dummy
  236. if(!gvar.isOpera || typeof(GM_xmlhttpRequest)=='undefined') {
  237. clog('Using XMLHttpRequest for GM Api.',0);
  238. GM_xmlhttpRequest=function(obj) {
  239. var request=new XMLHttpRequest();
  240. request.onreadystatechange=function() { if(obj.onreadystatechange) { obj.onreadystatechange(request); }; if(request.readyState==4 && obj.onload) { obj.onload(request); } }
  241. request.onerror=function() { if(obj.onerror) { obj.onerror(request); } }
  242. try { request.open(obj.method,obj.url,true); } catch(e) { if(obj.onerror) { obj.onerror( {readyState:4,responseHeaders:'',responseText:'',responseXML:'',status:403,statusText:'Forbidden'} ); }; return; }
  243. if(obj.headers) { for(name in obj.headers) { request.setRequestHeader(name,obj.headers[name]); } }
  244. request.send(obj.data); return request;
  245. }; } } // end needApiUpgrade
  246. GM_getIntValue=function(name,defValue) { return parseInt(GM_getValue(name,defValue),10); };
  247. }
  248. // ----my ge-debug--------
  249. function show_alert(msg, force) {
  250. if(arguments.callee.counter) { arguments.callee.counter++; } else { arguments.callee.counter=1; }
  251. GM_log('('+arguments.callee.counter+') '+msg);
  252. if(force==0) { return; }
  253. }
  254. function clog(msg) {
  255. if(!gvar.__DEBUG__) return;
  256. show_alert(msg);
  257. }
  258. // -end static
  259. // -----------
  260.  
  261. var GM_addGlobalScript=function(script, id, tobody) { // Redefine GM_addGlobalScript with a better routine
  262. var sel=createEl('script',{type:'text/javascript'});
  263. if(isDefined(id) && isString(id)) sel.setAttribute('id', id);
  264. if(script.match(/^https?:\/\/.+/))
  265. sel.setAttribute('src', script);
  266. else
  267. sel.appendChild(createTextEl(script));
  268. if(isDefined(tobody) && tobody){
  269. document.body.insertBefore(sel,document.body.firstChild);
  270. }else{
  271. var hds = getTag('head');
  272. if( isDefined(hds[0]) && hds[0].nodeName=='HEAD' )
  273. window.setTimeout(function() { hds[0].appendChild(sel);}, 100);
  274. else
  275. document.body.insertBefore(sel, document.body.firstChild);
  276. }
  277. return sel;
  278. };
  279. var GM_addGlobalStyle=function(css, id, tobody) { // Redefine GM_addGlobalStyle with a better routine
  280. var sel=createEl('style',{type:'text/css'});
  281. if(isDefined(id) && isString(id)) sel.setAttribute('id', id);
  282. sel.appendChild(createTextEl(css));
  283. if(isDefined(tobody) && tobody){
  284. document.body.insertBefore(sel,document.body.firstChild);
  285. }else{
  286. var hds = getTag('head');
  287. if( isDefined(hds[0]) && hds[0].nodeName=='HEAD' )
  288. window.setTimeout(function() { hds[0].appendChild(sel); }, 100);
  289. else
  290. document.body.insertBefore(sel,document.body.firstChild);
  291. }
  292. return sel;
  293. };
  294.  
  295. // Get Elements
  296. var $D=function (q, root, single) {
  297. if (root && typeof root == 'string') {
  298. root = $D(root, null, true);
  299. if (!root) { return null; }
  300. }
  301. if( !q ) return false;
  302. if ( typeof q == 'object') return q;
  303. root = root || document;
  304. if (q[0]=='/' || (q[0]=='.' && q[1]=='/')) {
  305. if (single) { return document.evaluate(q, root, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; }
  306. return document.evaluate(q, root, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  307. }
  308. else if (q[0]=='.') { return root.getElementsByClassName(q.substr(1)); }
  309. else { return root.getElementById( (q[0]=='#' ? q.substr(1):q.substr(0)) ); }
  310. return root.getElementsByTagName(q);
  311. };
  312. // utk add - remove element
  313. var Dom = {
  314. g: function(el) {
  315. if(!el) return false;
  316. return ( isString(el) ? document.getElementById(el) : el );
  317. },
  318. add: function(el, dest) {
  319. var el = this.g(el);
  320. var dest = this.g(dest);
  321. if(el && dest) dest.appendChild(el);
  322. },
  323. remove: function(el) {
  324. var el = this.g(el);
  325. if(el && el.parentNode)
  326. el.parentNode.removeChild(el);
  327. },
  328. clearHTML: function(o){
  329. if(o) while(o.firstChild) o.removeChild(o.firstChild);
  330. },
  331. setHTML: function(o, html){
  332. if(!o || !html) return;
  333. var doc = Dom.stringToDOM(html);
  334. Dom.clearHTML(o);
  335. o.appendChild(doc);
  336. },
  337. getIner: function(o){ return Dom.DOMtoString(o) },
  338. stringToDOM: function(q){
  339.  
  340. var r = function (a) {
  341. a = a.replace(/\r/g, " ");
  342. a = a.replace(/\n/g, " ");
  343. return a
  344. };
  345. var s = function (a) {
  346. a = a.replace(/&amp;/g, "&");
  347. a = a.replace(/&gt;/g, ">");
  348. a = a.replace(/&lt;/g, "<");
  349. a = a.replace(/&nbsp;/g, " ");
  350. a = a.replace(/&quot;/g, '"');
  351. return a
  352. };
  353. var t = function (a) {
  354. a = a.replace(/ /g, "");
  355. return a
  356. };
  357. var r = function (a) {
  358. a = a.toString();
  359. clog('R\n'+a);
  360. a = a.replace(/<br>/gi, "<br/>");
  361. a = a.replace(/<hr>/gi, "<hr/>");
  362. a = a.replace(/&amp;\#(\d{3,});/gi, "&#$1;");
  363. a = a.replace(/<img\s([^>]+)./gi, function (a, b) {
  364. return b.substring(b.length - 1) == "/" ? a : "<img " + b + "/>"
  365. });
  366. a = a.replace(/<input\s([^>]+)./gi, function (a, b) {
  367. return b.substring(b.length - 1) == "/" ? a : "<input " + b + "/>"
  368. });
  369. a = a.replace(/<hr\s([^>]+)./gi, function (a, b) {
  370. return b.substring(b.length - 1) == "/" ? a : "<hr " + b + "/>"
  371. });
  372. return a
  373. };
  374. var u = function (a) {
  375. var b = document.createDocumentFragment();
  376. var c = a.indexOf(' ');
  377. if (c === -1) {
  378. var d = a.toLowerCase();
  379. b.appendChild(document.createElement(d))
  380. } else {
  381. d = t(a.substring(0, c)).toLowerCase();
  382. if (document.all && d === 'input') {
  383. b.appendChild(document.createElement('<' + a + '/>'));
  384. return b
  385. }
  386. a = a.substring(c + 1);
  387. b.appendChild(document.createElement(d));
  388. while (a.length > 0) {
  389. var e = a.indexOf('=');
  390. if (e >= 0) {
  391. var f = t(a.substring(0, e)).toLowerCase();
  392. var g = a.indexOf('"');
  393. a = a.substring(g + 1);
  394. g = a.indexOf('"');
  395. var h = s(a.substring(0, g));
  396. a = a.substring(g + 2);
  397. if (document.all && f === 'style') {
  398. b.lastChild.style.cssText = h
  399. } else {
  400. b.lastChild.setAttribute(f, h)
  401. }
  402. } else {
  403. break
  404. }
  405. }
  406. }
  407. return b
  408. };
  409. var v = function (a, b, c) {
  410. var d = a;
  411. var e = b;
  412. c = c.toLowerCase();
  413. var f = e.indexOf('</' + c + '>');
  414. d = d.concat(e.substring(0, f));
  415. e = e.substring(f);
  416. while (d.indexOf('<' + c) != -1) {
  417. d = d.substring(d.indexOf('<' + c));
  418. d = d.substring(d.indexOf('>') + 1);
  419. e = e.substring(e.indexOf('>') + 1);
  420. f = e.indexOf('</' + c + '>');
  421. d = d.concat(e.substring(0, f));
  422. e = e.substring(f)
  423. }
  424. return b.length - e.length
  425. };
  426. var w = function (a) {
  427. var b = document.createDocumentFragment();
  428. clog('auoo' + a);
  429. if(a) a = r(a);
  430. while (a && a.length > 0) {
  431. var c = a.indexOf("<");
  432. if (c === -1) {
  433. a = s(a);
  434. clog('createTextNode -1='+a)
  435. b.appendChild(document.createTextNode(a));
  436. a = null
  437. }
  438. if (c > 0) {
  439. var d = s(a.substring(0, c));
  440. clog('createTextNode > 0='+a)
  441. b.appendChild(document.createTextNode(d));
  442. a = a.substring(c)
  443. }
  444. if (c === 0) {
  445. var e = a.indexOf('<!--');
  446. if (e === 0) {
  447. var f = a.indexOf('-->');
  448. var g = a.substring(4, f);
  449. g = s(g);
  450. b.appendChild(document.createComment(g));
  451. a = a.substring(f + 3)
  452. } else {
  453. var h = a.indexOf('>');
  454. if (a.substring(h - 1, h) === '/') {
  455. var i = a.indexOf('/>');
  456. var j = a.substring(1, i);
  457. b.appendChild(u(j));
  458. a = a.substring(i + 2)
  459. } else {
  460. var k = a.indexOf('>');
  461. var l = a.substring(1, k);
  462. var m = document.createDocumentFragment();
  463. m.appendChild(u(l));
  464. a = a.substring(k + 1);
  465. var n = a.substring(0, a.indexOf('</'));
  466. a = a.substring(a.indexOf('</'));
  467. if (n.indexOf('<') != -1) {
  468. var o = m.lastChild.nodeName;
  469. var p = v(n, a, o);
  470. n = n.concat(a.substring(0, p));
  471. a = a.substring(p)
  472. }
  473. a = a.substring(a.indexOf('>') + 1);
  474. m.lastChild.appendChild(w(n));
  475. b.appendChild(m)
  476. }
  477. }
  478. }
  479. }
  480. return b
  481. };
  482. var x = w(q);
  483. return x
  484.  
  485. },
  486. DOMtoString: function(h){
  487. //a=a.replace(/&/g,"&amp;");
  488. var j=function(a){a=a.replace(/>/g,"&gt;");a=a.replace(/</g,"&lt;");a=a.replace(/\"/g,'&quot;');return a};var k=function(a){var b=a.childNodes;var c='';for(var i=0;i<b.length;i++){var d=b[i].nodeType;switch(d){case 1:var e=b[i].nodeName.toLowerCase();var f=b[i].attributes;c=c.concat('<'+e);if(f.length>0){for(var g=0;g<f.length;g++){if(document.all){if(f[g].nodeName&&f[g].nodeValue!==null&&f[g].nodeValue!=''&&(f[g].nodeName!='contentEditable'&&f[g].nodeValue!='inherit')&&(f[g].nodeName!='shape'&&f[g].nodeValue!='rect')){c=c.concat(' '+f[g].nodeName.toLowerCase()+'="'+j(f[g].nodeValue)+'"')}if(f[g].nodeName==='style'&&b[i].style.cssText!==null&&b[i].style.cssText.length!==0){c=c.concat(' style="'+b[i].style.cssText.toLowerCase()+';"')}}else{c=c.concat(' '+f[g].nodeName.toLowerCase()+'="'+j(f[g].nodeValue)+'"')}}}if(e==='meta'||e==='img'||e==='br'||e==='input'||e==='link'||e==='hr'){c=c.concat(' />')}else{c=c.concat('>'+k(b[i])+'</'+e+'>')}break;case 3:c=c.concat(j(b[i].nodeValue));break;case 8:c=c.concat('<!--'+j(b[i].nodeValue)+'-->');break}}return c};var l=k(h);return l
  489. },
  490. clearIner: function(o){
  491. if(o) while(o.firstChild) o.removeChild(o.firstChild);
  492. },
  493. Ev: function() {
  494. if (window.addEventListener) {
  495. return function(el, type, fn, ph) {
  496. if(typeof(el)=='object')
  497. this.g(el).addEventListener(type, function(e){fn(e);}, (isUndefined(ph) ? false : ph));
  498. };
  499. }else if (window.attachEvent) {
  500. return function(el, type, fn) {
  501. var f = function() { fn.call(this.g(el), window.event); };
  502. this.g(el).attachEvent('on' + type, f);
  503. };
  504. }
  505. }()
  506. };
  507. /* Modified Smooth scroller
  508. Todd Anglin 14 October 2006, sil, http://www.kryogenix.org/
  509. v1.1 2005-06-16 wrap it up in an object
  510. */
  511. var ss = {
  512. smoothScroll: function(anchor, cb) {
  513. var desty=0;;
  514. if(typeof(anchor)=='number'){
  515. desty = anchor;
  516. }else{
  517. var destinationLink = anchor;
  518. // If we didn't find a destination, give up and let the browser do its thing
  519. if (!destinationLink) return true;
  520. // Find the destination's position
  521. desty = destinationLink.offsetTop;
  522. var thisNode = destinationLink;
  523. while (thisNode.offsetParent && (thisNode.offsetParent != document.body)) {
  524. thisNode = thisNode.offsetParent;
  525. desty += thisNode.offsetTop + gvar.offsetTop;
  526. }
  527. }
  528. // Stop any current scrolling
  529. clearInterval(ss.INTERVAL);
  530. // check is there any callback
  531. ss.callback = (typeof(cb)=='function' ? cb:null);
  532. var cypos = ss.getCurrentYPos();
  533. var ss_stepsize = parseInt((desty-cypos)/ss.STEPS);
  534. ss.initPos = (cypos < desty);
  535. ss.INTERVAL = setInterval( function(){
  536. ss.scrollWindow(ss_stepsize,desty,anchor)
  537. }, 8);
  538. },
  539. scrollWindow: function(scramount,dest,anchor) {
  540. var wascypos = ss.getCurrentYPos();
  541. var isAbove = (wascypos < dest);
  542. window.scrollTo(0,wascypos + scramount);
  543. var iscypos = ss.getCurrentYPos();
  544. var isAboveNow = (iscypos < dest);
  545. //show_alert('wascypos:'+wascypos+'; '+'isAbove:'+isAbove+'; '+'iscypos:'+iscypos+'; '+'isAboveNow:'+isAboveNow);
  546. if ((isAbove != isAboveNow) || (wascypos == iscypos) || (isAbove == isAboveNow && (ss.initPos!=isAbove || ss.initPos!=isAboveNow)) ) {
  547. // if we've just scrolled past the destination, or
  548. // we haven't moved from the last scroll (i.e., we're at the
  549. // bottom of the page) then scroll exactly to the link
  550. // additional conditional if user scrolling will prevent of dead end scrollpage
  551. window.scrollTo(0,dest);
  552. // cancel the repeating timer
  553. clearInterval(ss.INTERVAL);
  554. // and jump to the link directly so the URL's right
  555. //if(isString(anchor)) location.hash = anchor;
  556. if(ss.callback) ss.callback();
  557. return;
  558. }
  559. },
  560. getCurrentYPos: function() {
  561. if (document.body && document.body.scrollTop)
  562. return document.body.scrollTop;
  563. if (document.documentElement && document.documentElement.scrollTop)
  564. return document.documentElement.scrollTop;
  565. if (window.pageYOffset)
  566. return window.pageYOffset;
  567. return 0;
  568. }
  569. };
  570.  
  571.  
  572. // main resource
  573. var rSRC = {
  574. css: function(){
  575. return(''
  576. +'#gpr_gotools {right:0;top:200px;position:fixed;z-index:1;}'
  577. +'#gpr_main {cursor:pointer; height:160px; width:32px;}'
  578. +'#gpr_toggler {cursor:pointer; height:32px; margin:64px -10px 0 0;}'
  579. +'.trsp {filter:alpha(opacity=55); opacity:.55;}'
  580. +'.invi {visibility:hidden;}'
  581. +'.hide {display:none;}'
  582. +'.abs {position:absolute;}'
  583. +'.inline {right:10px; margin:-2px 8px 0 0;}'
  584. );
  585. }
  586. ,tpl: function(){
  587. return(''
  588. +'<div id="gpr_gotools" class="invi trsp">'
  589. +'<div id="gpr_toggler" class="hide">'
  590. +'<div id="gpr_goto_show"><img src="'+IMG['BT_ARROW_TOLEFT']+'" /></div>'
  591. +'</div>'
  592. +'<div id="gpr_main">'
  593. +'<div id="gpr_goto_top"><img src="'+IMG['BT_ARROW_TOP']+'" /></div>'
  594. +'<div id="gpr_goto_up"><img src="'+IMG['BT_ARROW_UP']+'" /></div>'
  595.  
  596. +'<div id="gpr_goto_hide" class="abs inline invi"><img src="'+IMG['BT_ARROW_TORIGHT']+'" /></div>'
  597. +'<div id="gpr_goto_black" class="abs" style="height:32px; "><img src="'+IMG['BT_ARROW_BLACK']+'" /></div>'
  598. +'<div style="height:32px;">&nbsp;</div>'
  599.  
  600. +'<div id="gpr_goto_dn"><img src="'+IMG['BT_ARROW_DN']+'" /></div>'
  601. +'<div id="gpr_goto_bottom"><img src="'+IMG['BT_ARROW_BOTTOM']+'" /></div>'
  602. +'</div>' // #gpr_main
  603. +'</div>'
  604. );
  605. }
  606.  
  607. };
  608.  
  609. // =============== /END Global Var ===
  610.  
  611. init();
  612. //----
  613.  
  614. })()
  615. /* ~tuxie.forte. */