Template:H4Z-Hangzhou/js/lib/smoothscroll.js

// SmoothScroll v0.9.9 // Licensed under the terms of the MIT license.

// People involved // - Balazs Galambosi: maintainer (CHANGELOG.txt) // - Patrick Brunner (patrickb1991@gmail.com) // - Michael Herf: ssc_pulse Algorithm

function ssc_init() {

   if (!document.body) return;
   var e = document.body;
   var t = document.documentElement;
   var n = window.innerHeight;
   var r = e.scrollHeight;
   ssc_root = document.compatMode.indexOf("CSS") >= 0 ? t : e;
   ssc_activeElement = e;
   ssc_initdone = true;
   if (top != self) {
       ssc_frame = true
   } else if (r > n && (e.offsetHeight <= n || t.offsetHeight <= n)) {
       ssc_root.style.height = "auto";
       if (ssc_root.offsetHeight <= n) {
           var i = document.createElement("div");
           i.style.clear = "both";
           e.appendChild(i)
       }
   }
   if (!ssc_fixedback) {
       e.style.backgroundAttachment = "scroll";
       t.style.backgroundAttachment = "scroll"
   }
   if (ssc_keyboardsupport) {
       ssc_addEvent("keydown", ssc_keydown)
   }

}

function ssc_scrollArray(e, t, n, r) {

   r || (r = 1e3);
   ssc_directionCheck(t, n);
   ssc_que.push({
       x: t,
       y: n,
       lastX: t < 0 ? .99 : -.99,
       lastY: n < 0 ? .99 : -.99,
       start: +(new Date)
   });
   if (ssc_pending) {
       return
   }
   var i = function () {
       var s = +(new Date);
       var o = 0;
       var u = 0;
       for (var a = 0; a < ssc_que.length; a++) {
           var f = ssc_que[a];
           var l = s - f.start;
           var c = l >= ssc_animtime;
           var h = c ? 1 : l / ssc_animtime;
           if (ssc_pulseAlgorithm) {
               h = ssc_pulse(h)
           }
           var p = f.x * h - f.lastX >> 0;
           var d = f.y * h - f.lastY >> 0;
           o += p;
           u += d;
           f.lastX += p;
           f.lastY += d;
           if (c) {
               ssc_que.splice(a, 1);
               a--
           }
       }
       if (t) {
           var v = e.scrollLeft;
           e.scrollLeft += o;
           if (o && e.scrollLeft === v) {
               t = 0
           }
       }
       if (n) {
           var m = e.scrollTop;
           e.scrollTop += u;
           if (u && e.scrollTop === m) {
               n = 0
           }
       }
       if (!t && !n) {
           ssc_que = []
       }
       if (ssc_que.length) {
           setTimeout(i, r / ssc_framerate + 1)
       } else {
           ssc_pending = false
       }
   };
   setTimeout(i, 0);
   ssc_pending = true

}

function ssc_wheel(e) {

   if (!ssc_initdone) {
       ssc_init()
   }
   var t = e.target;
   var n = ssc_overflowingAncestor(t);
   if (!n || e.defaultPrevented || ssc_isNodeName(ssc_activeElement, "embed") || ssc_isNodeName(t, "embed") && /\.pdf/i.test(t.src)) {
       return true
   }
   var r = e.wheelDeltaX || 0;
   var i = e.wheelDeltaY || 0;
   if (!r && !i) {
       i = e.wheelDelta || 0
   }
   if (Math.abs(r) > 1.2) {
       r *= ssc_stepsize / 120
   }
   if (Math.abs(i) > 1.2) {
       i *= ssc_stepsize / 120
   }
   ssc_scrollArray(n, -r, -i);
   e.preventDefault()

}

function ssc_keydown(e) {

   var t = e.target;
   var n = e.ctrlKey || e.altKey || e.metaKey;
   if (/input|textarea|embed/i.test(t.nodeName) || t.isContentEditable || e.defaultPrevented || n) {
       return true
   }
   if (ssc_isNodeName(t, "button") && e.keyCode === ssc_key.spacebar) {
       return true
   }
   var r, i = 0,
       s = 0;
   var o = ssc_overflowingAncestor(ssc_activeElement);
   var u = o.clientHeight;
   if (o == document.body) {
       u = window.innerHeight
   }
   switch (e.keyCode) {
   case ssc_key.up:
       s = -ssc_arrowscroll;
       break;
   case ssc_key.down:
       s = ssc_arrowscroll;
       break;
   case ssc_key.spacebar:
       r = e.shiftKey ? 1 : -1;
       s = -r * u * .9;
       break;
   case ssc_key.pageup:
       s = -u * .9;
       break;
   case ssc_key.pagedown:
       s = u * .9;
       break;
   case ssc_key.home:
       s = -o.scrollTop;
       break;
   case ssc_key.end:
       var a = o.scrollHeight - o.scrollTop - u;
       s = a > 0 ? a + 10 : 0;
       break;
   case ssc_key.left:
       i = -ssc_arrowscroll;
       break;
   case ssc_key.right:
       i = ssc_arrowscroll;
       break;
   default:
       return true
   }
   ssc_scrollArray(o, i, s);
   e.preventDefault()

}

function ssc_mousedown(e) {

   ssc_activeElement = e.target

}

function ssc_setCache(e, t) {

   for (var n = e.length; n--;) ssc_cache[ssc_uniqueID(e[n])] = t;
   return t

}

function ssc_overflowingAncestor(e) {

   var t = [];
   var n = ssc_root.scrollHeight;
   do {
       var r = ssc_cache[ssc_uniqueID(e)];
       if (r) {
           return ssc_setCache(t, r)
       }
       t.push(e);
       if (n === e.scrollHeight) {
           if (!ssc_frame || ssc_root.clientHeight + 10 < n) {
               return ssc_setCache(t, document.body)
           }
       } else if (e.clientHeight + 10 < e.scrollHeight) {
           overflow = getComputedStyle(e, "").getPropertyValue("overflow");
           if (overflow === "scroll" || overflow === "auto") {
               return ssc_setCache(t, e)
           }
       }
   } while (e = e.parentNode)

}

function ssc_addEvent(e, t, n) {

   window.addEventListener(e, t, n || false)

}

function ssc_removeEvent(e, t, n) {

   window.removeEventListener(e, t, n || false)

}

function ssc_isNodeName(e, t) {

   return e.nodeName.toLowerCase() === t.toLowerCase()

}

function ssc_directionCheck(e, t) {

   e = e > 0 ? 1 : -1;
   t = t > 0 ? 1 : -1;
   if (ssc_direction.x !== e || ssc_direction.y !== t) {
       ssc_direction.x = e;
       ssc_direction.y = t;
       ssc_que = []
   }

}

function ssc_pulse_(e) {

   var t, n, r;
   e = e * ssc_pulseScale;
   if (e < 1) {
       t = e - (1 - Math.exp(-e))
   } else {
       n = Math.exp(-1);
       e -= 1;
       r = 1 - Math.exp(-e);
       t = n + r * (1 - n)
   }
   return t * ssc_pulseNormalize

}

function ssc_pulse(e) {

   if (e >= 1) return 1;
   if (e <= 0) return 0;
   if (ssc_pulseNormalize == 1) {
       ssc_pulseNormalize /= ssc_pulse_(1)
   }
   return ssc_pulse_(e)

}

var ssc_framerate = 150; var ssc_animtime = 500; var ssc_stepsize = 150; var ssc_pulseAlgorithm = true; var ssc_pulseScale = 6; var ssc_pulseNormalize = 1; var ssc_keyboardsupport = true; var ssc_arrowscroll = 50; var ssc_frame = false; var ssc_direction = {

   x: 0,
   y: 0

};

var ssc_initdone = false; var ssc_fixedback = true; var ssc_root = document.documentElement; var ssc_activeElement; var ssc_key = {

   left: 37,
   up: 38,
   right: 39,
   down: 40,
   spacebar: 32,
   pageup: 33,
   pagedown: 34,
   end: 35,
   home: 36

};

var ssc_que = []; var ssc_pending = false; var ssc_cache = {};

setInterval(function () {

   ssc_cache = {}

}, 10 * 1e3);

var ssc_uniqueID = function () {

   var e = 0;
   return function (t) {
       return t.ssc_uniqueID || (t.ssc_uniqueID = e++)
   }

}();

var ischrome = /chrome/.test(navigator.userAgent.toLowerCase());

if (ischrome) {

   ssc_addEvent("mousedown", ssc_mousedown);
   ssc_addEvent("mousewheel", ssc_wheel);
   ssc_addEvent("load", ssc_init)

}