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