Smoothscroll

Smooth scrolling on pages using javascript and jquery

当前为 2016-06-01 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Smoothscroll
  3. // @include http*
  4. // @author Creec Winceptor
  5. // @description Smooth scrolling on pages using javascript and jquery
  6. // @namespace https://greasyfork.org/users/3167
  7. // @run-at document-load
  8. // @grant none
  9. // @grant GM_getValue
  10. // @grant GM_setValue
  11. // @grant GM_registerMenuCommand
  12. // @version 1.0.3
  13. // ==/UserScript==
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21. //DEFAULT SETTINGS HERE
  22. //DO NOT CHANGE ANYTHING HERE ANYMORE, USE SCRIPT COMMANDS -> CONFIGURE SMOOTHSCROLL
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29. //Smoothness factor value (how strong the smoothing effect is)
  30. //values: 1-(infinite) (default = 30)
  31. var smoothness = 20;
  32.  
  33. //Scroll sensitivity
  34. //values: anything? (default 1.00)
  35. var sensitivity = 1;
  36.  
  37. //Acceleration sensitivity
  38. //values: anything? (default 1.50)
  39. var acceleration = 1;
  40.  
  41. //Refreshrate setting
  42. //values: 30-144 (default = 60/72/120/144 = same as your monitor hz)
  43. var baserefreshrate = 60;
  44.  
  45.  
  46. //Alternative scrolling multiplier
  47. //values: true/false (try to set this to true if scrolling is too slow/doesn't work)
  48. var alternative_sesitivity_multiplier = false;
  49.  
  50.  
  51. //CODE STARTS HERE
  52.  
  53. var minimal_jquery_version = 200;
  54.  
  55. //max retries
  56. var jquery_retry_max = 10;
  57. var jquery_retry_count = 0;
  58.  
  59.  
  60. var DEBUG = false;
  61.  
  62. var WEBKIT = false;
  63.  
  64. //this.$ = this.jQuery = jQuery.noConflict(true);
  65.  
  66. if (window.top != window.self) //don't run on frames or iframes
  67. return;
  68.  
  69.  
  70.  
  71. if (smoothness>100)
  72. {
  73. smoothness = 100;
  74. }
  75.  
  76. if (baserefreshrate <= 30 || baserefreshrate>144)
  77. {
  78. baserefreshrate = 144;
  79. }
  80. refreshrate = baserefreshrate;
  81.  
  82. var animationduration = Math.round(1000/refreshrate);
  83. //var relativeratio = Math.round(51-smoothness/2)/100;
  84. var relativeratio = Math.round(1/(1+smoothness)*100)/100;
  85. //var relativeratio = relativeratio;
  86.  
  87.  
  88.  
  89. var lastLoop = new Date;
  90. //var lastrefreshrate = 0;
  91. function gameLoop() {
  92. var thisLoop = new Date;
  93. var refreshrate0 = 1000 / (thisLoop - lastLoop + 1);
  94. lastLoop = thisLoop;
  95. refreshrate = refreshrate + (refreshrate0-refreshrate)*0.01;
  96. refreshrate = Math.round(refreshrate);
  97. if (DEBUG)
  98. {
  99. console.log(refreshrate);
  100. }
  101. animationduration = Math.round(1000/(refreshrate));
  102. //var relativeratio = Math.round(51-smoothness/2)/100;
  103. relativeratio = Math.round(1/(1+smoothness*refreshrate/baserefreshrate)*100)/100;
  104. }
  105. gameLoop();
  106.  
  107.  
  108. function InitSmoothscroll()
  109. {
  110. LoadConfig();
  111.  
  112. InitConfigmenu();
  113.  
  114. var startposition = false;
  115. var targetposition = 0;
  116. var position = 0;
  117.  
  118. var scrollfocus = ss$('body');
  119. function hasScrollBarVisible(element)
  120. {
  121. //return (document.documentElement.scrollHeight !== document.documentElement.clientHeight);
  122. // Get the computed style of the body element
  123. var cStyle = element.currentStyle||window.getComputedStyle(element, "");
  124. // Check the overflow and overflowY properties for "auto" and "visible" values
  125. var scrollbar1 = cStyle.overflow == "scroll" || cStyle.overflowY == "scroll";
  126.  
  127. var scrollbar2 = cStyle.overflow == "auto" || cStyle.overflowY == "auto";
  128. var scrollbar = scrollbar1 || scrollbar2;
  129. return scrollbar;
  130. }
  131.  
  132.  
  133. function hasscrollbars(scrollfocus)
  134. {
  135. var hasvisiblescrollbars = hasScrollBarVisible(scrollfocus);
  136. var parentelement = ss$(scrollfocus).parent();
  137. if ( ss$(parentelement))
  138. {
  139. //if (ss$(parentelement).is("textarea") || ss$(scrollfocus).is("textarea"))
  140. if (ss$(parentelement).is("textarea") || ss$(scrollfocus).is("textarea") || ss$(parentelement).is("article") || ss$(parentelement).is("article"))
  141. {
  142. return true;
  143. }
  144. else
  145. {
  146. if (ss$(parentelement).hasClass( "yt-scrollbar" ) || ss$(scrollfocus).hasClass( "yt-scrollbar" ))
  147. {
  148. return true;
  149. }
  150. return hasvisiblescrollbars;
  151. }
  152. }
  153. else
  154. {
  155. //scrollfocus = ss$('body');
  156. //maxposition = ss$(scrollfocus).height();
  157. return hasvisiblescrollbars;
  158. }
  159. return false;
  160. }
  161.  
  162. function UpdatePosition(element)
  163. {
  164. gameLoop();
  165. var positiondelta = ss$(element)[0].getAttribute( "positiondelta" );
  166. //var smoothdelta = Math.sqrt(positiondelta*positiondelta*relativeratio);
  167. var smoothdelta = Math.sqrt(positiondelta*positiondelta*relativeratio);
  168. if (positiondelta<0)
  169. {
  170. smoothdelta = smoothdelta*(-1);
  171. }
  172. //var relative = position - ss$(element).scrollTop();
  173. //console.log("smoothdelta:" + smoothdelta);
  174. if (Math.abs( (positiondelta-smoothdelta)) <= 1 )
  175. {
  176. ss$(element).stop();
  177. ss$(element).animate({
  178. scrollTop: '+=' + Math.round(positiondelta)
  179. }, animationduration, "linear", function() {
  180. ss$(element).attr( "positiondelta",0 );
  181. ss$(element)[0].setAttribute( "positiondelta",0 );
  182. if (DEBUG)
  183. {
  184. ss$(element).css( "border", "1px solid red" );
  185. }
  186. });
  187. }
  188. else
  189. {
  190. ss$(element).stop();
  191. ss$(element).animate({
  192. scrollTop: '+=' + Math.round(smoothdelta)
  193. }, animationduration, "linear", function() {
  194. ss$(element).attr( "positiondelta",positiondelta-smoothdelta );
  195. ss$(element)[0].setAttribute("positiondelta",positiondelta-smoothdelta );
  196. UpdatePosition(element);
  197. if (DEBUG)
  198. {
  199. ss$(element).css( "border", "1px solid red" );
  200. }
  201. });
  202. }
  203. }
  204.  
  205.  
  206. function MouseScroll (x,y,e) {
  207. scrollfocus = UpdateFocus(x,y);
  208. var positiondelta = 0;
  209. var lastscrolltop = 0;
  210.  
  211. var parentelement = ss$(scrollfocus).parent();
  212. if ( ss$(parentelement))
  213. {
  214. if (ss$(parentelement).is("textarea") || ss$(scrollfocus).is("textarea"))
  215. {
  216. //return true;
  217. }
  218. else
  219. {
  220. if ( ss$(parentelement).height() < ss$(scrollfocus).height())
  221. {
  222. //maxposition = ss$(scrollfocus).height() - ss$(parentelement).height();
  223. }
  224. else
  225. {
  226. if (ss$(scrollfocus).height()==0)
  227. {
  228. //scrollfocus = ss$('body');
  229. //maxposition = ss$(scrollfocus).height();
  230. }
  231.  
  232. //scrollfocus = ss$('body');
  233. //return MouseScroll (event);
  234. //return true;
  235. }
  236. }
  237. }
  238. else
  239. {
  240. //scrollfocus = ss$('html');
  241. //maxposition = ss$(scrollfocus).height();
  242. }
  243. var rolled = y;
  244. //console.log("rolled: " + rolled);
  245. //if (ss$(scrollfocus).data("positiondelta" )==undefined)
  246. //$embellishment.data("embellishmentid",1)
  247. var lastscrolltop = ss$(scrollfocus).scrollTop();
  248. ss$(scrollfocus).scrollTop(lastscrolltop+rolled);
  249. if (ss$(scrollfocus).scrollTop()==lastscrolltop)
  250. {
  251. if (!ss$(scrollfocus).is("html"))
  252. {
  253. focus = parentelement;
  254. //focus = UpdateFocus(event);
  255. //return MouseScroll (event);
  256. //console.log("false");
  257. //return false;
  258. }
  259. else
  260. {
  261. //console.log("true");
  262. //return false;
  263. }
  264. }
  265. else
  266. {
  267. e.preventDefault();
  268. }
  269. ss$(scrollfocus).scrollTop(lastscrolltop);
  270. //console.log(scrollfocus);
  271. if (ss$(scrollfocus)[0].getAttribute("positiondelta")==undefined)
  272. {
  273. positiondelta = 0;
  274. //console.log("positiondelta: undefined");
  275. }
  276. else
  277. {
  278. positiondelta = ss$(scrollfocus)[0].getAttribute("positiondelta");
  279. //console.log("positiondelta: " + positiondelta);
  280. }
  281. positiondelta = positiondelta*1;
  282. var direction = rolled/Math.abs(rolled);
  283. //var positiondeltadelta = rolled*sensitivity + Math.sqrt(Math.abs(positiondelta/rolled))*acceleration*rolled;
  284. //var positiondeltadelta = rolled*(sensitivity+Math.sqrt(Math.abs(positiondelta))*acceleration);
  285. //
  286. var positiondeltadelta = Math.round(rolled*sensitivity + Math.sqrt(Math.abs(positiondelta-rolled*sensitivity))*acceleration*rolled*0.03/sensitivity);
  287. positiondelta = positiondelta + positiondeltadelta;
  288. ss$(scrollfocus)[0].setAttribute("positiondelta",positiondelta );
  289. UpdatePosition(ss$(scrollfocus));
  290. //element.innerHTML = "";
  291. //console.log("pos:" + position);
  292. //event.preventDefault();
  293. return true;
  294. }
  295.  
  296. function canscroll(element, dir)
  297. {
  298. var scrollable = ss$(element);
  299. var lastscrolltop = ss$(scrollable).scrollTop();
  300. ss$(scrollable).scrollTop(lastscrolltop+dir);
  301. if (ss$(scrollable).scrollTop()==lastscrolltop)
  302. {
  303. ss$(scrollable).scrollTop(lastscrolltop);
  304. return false;
  305. }
  306. else
  307. {
  308. ss$(scrollable).scrollTop(lastscrolltop);
  309. return true;
  310. }
  311. }
  312.  
  313. function UpdateFocus(x,y) {
  314. /*var dir = 0;
  315. if ('wheelDelta' in event) {
  316. dir = event.wheelDelta;
  317. }
  318. else { // Firefox
  319. // The measurement units of the detail and wheelDelta properties are different.
  320. dir = event.detail*(-120);
  321. }*/
  322. var dir = y;
  323. //console.log(dir);
  324. //dir = dir*(-1);
  325. //
  326. var nodelist = document.querySelectorAll( ":hover" );
  327. ss$(nodelist).stop();
  328. //console.log(nodelist);
  329. if (WEBKIT)
  330. {
  331. scrollfocus = ss$('body');
  332. }
  333. else
  334. {
  335. scrollfocus = ss$('html');
  336. }
  337. for (var i = nodelist.length-1; i >= 0; i--) {
  338. //var parent = nodelist[i-1];
  339. var newfocus = nodelist[i];
  340. if (DEBUG)
  341. {
  342. ss$(newfocus).css( "border", "1px solid blue" );
  343. //var debugtimer = setTimeout(function(){ ss$(newfocus).css( "border", "0px solid white" ); }, 1000);
  344. }
  345. //if (ss$(newfocus).hasScrollBar3() && hasScrollBarVisible(newfocus) && canscroll(newfocus, dir) && hasscrollbars(newfocus))
  346. if (canscroll(newfocus, dir) && hasscrollbars(newfocus))
  347. {
  348. scrollfocus = ss$(newfocus);
  349. return newfocus;
  350. }
  351. }
  352.  
  353. return scrollfocus;
  354. }
  355. ss$('body').bind({
  356. /*
  357. mousewheel: function(e) {
  358. if (DEBUG)
  359. {
  360. console.log(scrollfocus);
  361. }
  362. console.log("scrolling");
  363. MouseScroll(e.originalEvent);
  364. },
  365. */
  366. mousedown: function(e) {
  367. if (DEBUG)
  368. {
  369. console.log(scrollfocus);
  370. }
  371. if (scrollfocus)
  372. {
  373. ss$(scrollfocus)[0].setAttribute( "positiondelta",0 );
  374. ss$(scrollfocus).stop();
  375. }
  376. //scrollfocus = UpdateFocus(e.originalEvent);
  377. //console.log("click");
  378. }
  379. });
  380. //Init(window);
  381.  
  382. (function(window,document) {
  383.  
  384. var prefix = "", _addEventListener, onwheel, support;
  385.  
  386. // detect event model
  387. if ( window.addEventListener ) {
  388. _addEventListener = "addEventListener";
  389. } else {
  390. _addEventListener = "attachEvent";
  391. prefix = "on";
  392. }
  393.  
  394. // detect available wheel event
  395. support = "onwheel" in document.createElement("div") ? "wheel" : // Modern browsers support "wheel"
  396. document.onmousewheel !== undefined ? "mousewheel" : // Webkit and IE support at least "mousewheel"
  397. "DOMMouseScroll"; // let's assume that remaining browsers are older Firefox
  398.  
  399. window.addWheelListener = function( elem, callback, useCapture ) {
  400. _addWheelListener( elem, support, callback, useCapture );
  401.  
  402. // handle MozMousePixelScroll in older Firefox
  403. if( support == "DOMMouseScroll" ) {
  404. _addWheelListener( elem, "MozMousePixelScroll", callback, useCapture );
  405. }
  406. };
  407.  
  408. function _addWheelListener( elem, eventName, callback, useCapture ) {
  409. elem[ _addEventListener ]( prefix + eventName, support == "wheel" ? callback : function( originalEvent ) {
  410. !originalEvent && ( originalEvent = window.event );
  411.  
  412. // create a normalized event object
  413. var event = {
  414. // keep a ref to the original event object
  415. originalEvent: originalEvent,
  416. target: originalEvent.target || originalEvent.srcElement,
  417. type: "wheel",
  418. deltaMode: originalEvent.type == "MozMousePixelScroll" ? 0 : 1,
  419. deltaX: 0,
  420. deltaZ: 0,
  421. preventDefault: function() {
  422. originalEvent.preventDefault ?
  423. originalEvent.preventDefault() :
  424. originalEvent.returnValue = false;
  425. }
  426. };
  427. // calculate deltaY (and deltaX) according to the event
  428. if ( support == "mousewheel" ) {
  429. event.deltaY = - 1/40 * originalEvent.wheelDelta;
  430. // Webkit also support wheelDeltaX
  431. originalEvent.wheelDeltaX && ( event.deltaX = - 1/40 * originalEvent.wheelDeltaX );
  432. } else {
  433. event.deltaY = originalEvent.detail;
  434. }
  435.  
  436. // it's time to fire the callback
  437. return callback( event );
  438.  
  439. }, useCapture || false );
  440. }
  441.  
  442. })(window,document);
  443. addWheelListener( window, function( e ) {
  444. var mul = 1;
  445. if (!WEBKIT || alternative_sesitivity_multiplier)
  446. mul = 40;
  447. //console.log( e.deltaY );
  448. MouseScroll(e.deltaX*mul,e.deltaY*mul, e);
  449. });
  450.  
  451. /*var oldpos = ss$('body').scrollTop();
  452. ss$('body').scrollTop(1);
  453. var iswebkit = ss$('body').scrollTop()>0;
  454. ss$('body').scrollTop(oldpos);*/
  455.  
  456. //WEBKIT = 'webkitRequestAnimationFrame' in window;
  457. WEBKIT = document.compatMode == 'CSS1Compat'
  458. //console.log("window: " + window);
  459. console.log("Smoothscroll initiated! Webkit: " + WEBKIT);
  460. }
  461.  
  462. var JQUERY = false;
  463. var OWNJQUERY = false;
  464. var OLDJQUERY = false;
  465.  
  466. var old$;
  467. var oldjQuery;
  468.  
  469. var ss$;
  470.  
  471. function jQueryVersion(temp$)
  472. {
  473. if (typeof temp$ == 'undefined' || typeof temp$.fn == 'undefined' || typeof temp$.fn.jquery == 'undefined')
  474. {
  475. return 0;
  476. }
  477.  
  478. var versiontable = temp$.fn.jquery.split('.');
  479. var version = 0;
  480. for (var i = versiontable.length-1; i >= 0; i--) {
  481. var power = versiontable.length-i;
  482. version += Math.pow(10,power-1)*versiontable[i];
  483. }
  484. return version;
  485. }
  486.  
  487. /*
  488. function OldInit(LEGACYWORKAROUND) {
  489. //if (typeof jQuery == 'function') {
  490. //if (typeof jQuery == 'undefined' || typeof $ == 'undefined' )
  491. JQUERY = true;
  492. if (typeof $ == 'undefined')
  493. {
  494. JQUERY = false;
  495. }
  496. else
  497. {
  498. if (typeof old$ == 'undefined') {
  499. old$ = $;
  500. }
  501. }
  502. if (typeof jQuery == 'undefined' )
  503. {
  504. JQUERY = false;
  505. }
  506. else
  507. {
  508. if (typeof oldjQuery == 'undefined') {
  509. oldjQuery = jQuery;
  510. }
  511. }
  512. OWNJQUERY = true;
  513. if (typeof ss$ == 'undefined' )
  514. {
  515. OWNJQUERY = false;
  516. }
  517. if (!OWNJQUERY){
  518. if (JQUERY) {
  519. var versiontable = $.fn.jquery.split('.');
  520. var version = 0;
  521. for (var i = versiontable.length-1; i >= 0; i--) {
  522. var power = versiontable.length-i;
  523. version += Math.pow(10,power-1)*versiontable[i];
  524. }
  525.  
  526. if (version<=minimal_jquery_version && LEGACYWORKAROUND)
  527. {
  528. console.log("Page jQuery OLD! Version: " + version);
  529. OLDJQUERY = true;
  530. }
  531. else
  532. {
  533. ss$ = $;
  534. OWNJQUERY = true;
  535. }
  536. }
  537. else
  538. {
  539. console.log("Page jQuery Missing!");
  540. }
  541. }
  542. if (!OWNJQUERY && LEGACYWORKAROUND)
  543. {
  544. console.log("Loading new jQuery...");
  545.  
  546. //this.$ = this.jQuery = jQuery.noConflict(true);
  547. //var $ = jQuery.noConflict();
  548.  
  549. //this.$ = this.jQuery = jQuery.noConflict(true);
  550.  
  551.  
  552. var filename = "https://code.jquery.com/jquery-2.2.3.js";
  553. var fileref = document.createElement('script');
  554. fileref.setAttribute("type","text/javascript");
  555. fileref.setAttribute("src", filename);
  556.  
  557. if (typeof fileref!="undefined")
  558. {
  559. var scriptparent = document.getElementsByTagName("head")[0];
  560.  
  561. if (typeof scriptparent=="undefined")
  562. {
  563. var scriptparent = document.createElement('head');
  564. document.getElementsByTagName("html")[0].appendChild(scriptparent);
  565. }
  566. scriptparent.appendChild(fileref);
  567. }
  568.  
  569. if (r_count<r_max)
  570. {
  571. setTimeout(function() {
  572. Init(LEGACYWORKAROUND);
  573. }, 300);
  574. return 0;
  575. }
  576. else
  577. {
  578. console.log("Failed to load smoothscroll!");
  579. }
  580. r_count++;
  581. }
  582. if (OWNJQUERY) {
  583. var versiontable = ss$.fn.jquery.split('.');
  584. var version = 0;
  585. for (var i = versiontable.length-1; i >= 0; i--) {
  586. var power = versiontable.length-i;
  587. version += Math.pow(10,power-1)*versiontable[i];
  588. }
  589.  
  590. console.log("Script jQuery OK! Version: " + version);
  591. InitSmoothscroll();
  592. }
  593. if (LEGACYWORKAROUND) {
  594. console.log("Restoring original jQuery...");
  595. if (typeof old$ != 'undefined') {
  596. $ = old$;
  597. }
  598. if (typeof oldjQuery != 'undefined') {
  599. jQuery = oldjQuery;
  600. }
  601. if (OLDJQUERY)
  602. {
  603. var versiontable = $.fn.jquery.split('.');
  604. var version = 0;
  605. for (var i = versiontable.length-1; i >= 0; i--) {
  606. var power = versiontable.length-i;
  607. version += Math.pow(10,power-1)*versiontable[i];
  608. }
  609.  
  610. console.log("Page jQuery OK! Version: " + version);
  611. }
  612. }
  613.  
  614. console.log("Finished loading smoothscroll!");
  615. }*/
  616.  
  617. function LoadConfig()
  618. {
  619. smoothness = GM_getValue( 'smoothness', smoothness );
  620. sensitivity = GM_getValue( 'sensitivity', sensitivity );
  621. acceleration = GM_getValue( 'acceleration', acceleration );
  622. baserefreshrate = GM_getValue( 'baserefreshrate', baserefreshrate );
  623. //alternative_sesitivity_multiplier = GM_getValue( 'alternative_sesitivity_multiplier', alternative_sesitivity_multiplier );
  624. console.log("Config for smoothscroll loaded!")
  625. }
  626.  
  627. function SaveConfig()
  628. {
  629. GM_setValue( 'smoothness', document.getElementById('ss-smoothness').value)
  630. GM_setValue( 'sensitivity', document.getElementById('ss-sensitivity').value)
  631. GM_setValue( 'acceleration', document.getElementById('ss-acceleration').value)
  632. GM_setValue( 'baserefreshrate', document.getElementById('ss-baserefreshrate').value)
  633. //console.log(document.getElementById('ss-alternative_sesitivity_multiplier').checked)
  634. console.log("Config for smoothscroll saved!")
  635. }
  636.  
  637. function InitConfigmenu()
  638. {
  639. var configbar = document.createElement('div');
  640. configbar.setAttribute("id","ss-configbar");
  641. configbar.innerHTML = '<div style="display:block; width: 100%; height: auto; border: 0px solid #aaaaaa; background-color: grey;">Config page for smoothscroll (refresh page for changes to apply!) Made by: Creec Winceptor</div><div id="ss-config" style="margin:3px; display:block; width: auto; height: auto; border: 0px solid #554433;"><table style="width:auto;"><tr><td>Smoothness</td><td><input type="number" id="ss-smoothness" min="0" max="100" value="' + smoothness + '"></td><td> Smoothness factor value (how strong the smoothing effect is)</td></tr><tr><td>Sensitivity</td><td><input type="number" id="ss-sensitivity" min="0" max="100" value="' + sensitivity + '"></td><td> Scroll sensitivity (duh)</td></tr><tr><td>Acceleration</td><td><input type="number" id="ss-acceleration" min="0" max="100" value="' + acceleration + '"></td><td> Acceleration of continuous scroll action (saves your finger)</td></tr><tr><td>Refreshrate</td><td><input type="number" id="ss-baserefreshrate" min="1" max="100" value="' + baserefreshrate + '"></td><td>Refreshrate of scrollanimation (60Hz default)</td></tr></table></div><div style="width: 100%; height: auto; text-align: center; background-color: grey;"><input id="ss-save" type="button" value="Save config" style="width: 44%; height: auto; border: 0px solid #aaaaaa; margin: 3px"/><input id="ss-close" type="button" value="Close config" style="width: 44%; height: auto; border: 0px solid #aaaaaa; margin: 3px"/><div>';
  642. var configparent = document.getElementsByTagName("body")[0];
  643. configbar.style.width = '100%';
  644. configbar.style.display = 'none';
  645. configbar.style.position = 'absolute';
  646. configbar.style.zIndex = '99';
  647. configbar.style.backgroundColor = 'white';
  648. configparent.insertBefore(configbar, configparent.childNodes[0]);
  649. ss$("#ss-close").click(function() {
  650. //ss$("#ss-config").animate({
  651. // height: '0'
  652. //}, 100);
  653. ss$("#ss-configbar").hide("slow");
  654. });
  655. ss$("#ss-save").click(function() {
  656. SaveConfig();
  657. });
  658. //ss$("#ss-configbar").hide();
  659. }
  660.  
  661. function ConfigSmoothscroll()
  662. {
  663. if (typeof ss$ == 'undefined'){
  664. alert("Smoothscroll is not running properly on this page!");
  665. return;
  666. }
  667. //ss$("#ss-config").animate({
  668. // height: '100px'
  669. //}, 100);
  670. ss$("#ss-configbar").show("slow");
  671. ss$("html, body").animate({ scrollTop: 0 }, "slow");
  672. }
  673.  
  674. GM_registerMenuCommand("Configurate smoothscroll", ConfigSmoothscroll);
  675.  
  676.  
  677. function LoadjQuery(loading)
  678. {
  679. if (loading)
  680. {
  681. if (typeof $ == 'undefined' || typeof jQuery == 'undefined' || jQueryVersion($)<minimal_jquery_version)
  682. {
  683. if (jquery_retry_count<jquery_retry_max)
  684. {
  685. jquery_retry_count++;
  686. setTimeout(function() {
  687. LoadjQuery(true);
  688. }, 100);
  689. }
  690. else
  691. {
  692. console.log("Failed to load smoothscroll!");
  693. if (typeof old$ != 'undefined') {
  694. $ = old$;
  695. }
  696. if (typeof oldjQuery != 'undefined') {
  697. jQuery = oldjQuery;
  698. }
  699. }
  700. }
  701. else
  702. {
  703. ss$ = $;
  704. ssjQuery = jQuery;
  705. console.log("jQuery loaded!");
  706. if (typeof old$ != 'undefined') {
  707. $ = old$;
  708. }
  709. if (typeof oldjQuery != 'undefined') {
  710. jQuery = oldjQuery;
  711. }
  712. console.log("Page jQuery version: " + jQueryVersion(old$));
  713. console.log("Script jQuery version: " + jQueryVersion(ss$));
  714. InitSmoothscroll();
  715. }
  716. }
  717. else
  718. {
  719. console.log("Loading own jQuery...");
  720. jquery_retry_count = 0;
  721. var filename = "https://code.jquery.com/jquery-2.2.3.js";
  722. var fileref = document.createElement('script');
  723. fileref.setAttribute("type","text/javascript");
  724. fileref.setAttribute("src", filename);
  725.  
  726. if (typeof fileref!="undefined")
  727. {
  728. var scriptparent = document.getElementsByTagName("head")[0];
  729.  
  730. if (typeof scriptparent=="undefined")
  731. {
  732. var scriptparent = document.createElement('head');
  733. document.getElementsByTagName("html")[0].appendChild(scriptparent);
  734. }
  735. scriptparent.appendChild(fileref);
  736. }
  737. LoadjQuery(true);
  738. }
  739. }
  740.  
  741.  
  742. function Init()
  743. {
  744.  
  745. if (typeof ss$ == 'undefined' )
  746. {
  747. var sitejquery = !(typeof $ == 'undefined' || typeof jQuery == 'undefined');
  748. if (sitejquery && jQueryVersion($)>=minimal_jquery_version)
  749. {
  750. ss$ = $;
  751. ssjQuery = jQuery;
  752. console.log("Reusing page jQuery...");
  753. console.log("Page jQuery version: " + jQueryVersion($));
  754. InitSmoothscroll();
  755. }
  756. else
  757. {
  758. if (typeof $ != 'undefined' && typeof old$ == 'undefined')
  759. {
  760. old$ = $;
  761. }
  762. if (typeof jQuery != 'undefined' && typeof oldjQuery == 'undefined')
  763. {
  764. oldjQuery = jQuery;
  765. }
  766. LoadjQuery(false);
  767. }
  768. }
  769. }
  770.  
  771.  
  772. console.log("Loading smoothscroll...");
  773. Init();
  774. //InitSmoothscroll();