/** | |
* @module SmoothScroll | |
* @author Balazs Galambosi, Patrick Brunner, Michael Herf | |
* @license MIT license | |
* @version v0.9.9 | |
*/ | |
function ssc_init() { | |
if (document.body) { | |
var a = document.body, b = document.documentElement, c = window.innerHeight, d = a.scrollHeight; | |
(ssc_root = 0 <= document.compatMode.indexOf("CSS") ? b : a, ssc_activeElement = a, ssc_initdone = !0, top != self) ? ssc_frame = !0 : d > c && (a.offsetHeight <= c || b.offsetHeight <= c) && (ssc_root.style.height = "auto", ssc_root.offsetHeight <= c) && (c = document.createElement("div"), c.style.clear = "both", a.appendChild(c)); | |
ssc_fixedback || (a.style.backgroundAttachment = "scroll", b.style.backgroundAttachment = "scroll"); | |
ssc_keyboardsupport && ssc_addEvent("keydown", ssc_keydown) | |
} | |
} | |
function ssc_scrollArray(a, b, c, d) { | |
if (d || (d = 1E3), ssc_directionCheck(b, c), ssc_que.push({ | |
x: b, | |
y: c, | |
lastX: 0 > b ? .99 : -.99, | |
lastY: 0 > c ? .99 : -.99, | |
start: +new Date | |
}), !ssc_pending) { | |
var e = function () { | |
for (var n = +new Date, h = 0, m = 0, k = 0; k < ssc_que.length; k++) { | |
var f = ssc_que[k], l = n - f.start, p = l >= ssc_animtime, g = p ? 1 : l / ssc_animtime; | |
ssc_pulseAlgorithm && (g = ssc_pulse(g)); | |
l = f.x * g - f.lastX >> 0; | |
g = f.y * g - f.lastY >> 0; | |
h += l; | |
m += g; | |
f.lastX += l; | |
f.lastY += g; | |
p && (ssc_que.splice(k, 1), k--) | |
} | |
b && (n = a.scrollLeft, a.scrollLeft += h, h && a.scrollLeft === n && (b = 0)); | |
c && (h = a.scrollTop, a.scrollTop += m, m && a.scrollTop === h && (c = 0)); | |
b || c || (ssc_que = []); | |
ssc_que.length ? setTimeout(e, d / ssc_framerate + 1) : ssc_pending = !1 | |
}; | |
setTimeout(e, 0); | |
ssc_pending = !0 | |
} | |
} | |
function ssc_wheel(a) { | |
ssc_initdone || ssc_init(); | |
var b = a.target, c = ssc_overflowingAncestor(b); | |
if (!c || a.defaultPrevented || ssc_isNodeName(ssc_activeElement, "embed") || ssc_isNodeName(b, "embed") && /\.pdf/i.test(b.src))return !0; | |
var b = a.wheelDeltaX || 0, d = a.wheelDeltaY || 0; | |
b || d || (d = a.wheelDelta || 0); | |
1.2 < Math.abs(b) && (b *= ssc_stepsize / 120); | |
1.2 < Math.abs(d) && (d *= ssc_stepsize / 120); | |
ssc_scrollArray(c, -b, -d); | |
a.preventDefault() | |
} | |
function ssc_keydown(a) { | |
var b = a.target, c = a.ctrlKey || a.altKey || a.metaKey; | |
if (/input|textarea|embed/i.test(b.nodeName) || b.isContentEditable || a.defaultPrevented || c || ssc_isNodeName(b, "button") && a.keyCode === ssc_key.spacebar)return !0; | |
var d; | |
d = b = 0; | |
var c = ssc_overflowingAncestor(ssc_activeElement), e = c.clientHeight; | |
switch (c == document.body && (e = window.innerHeight), a.keyCode) { | |
case ssc_key.up: | |
d = -ssc_arrowscroll; | |
break; | |
case ssc_key.down: | |
d = ssc_arrowscroll; | |
break; | |
case ssc_key.spacebar: | |
d = a.shiftKey ? 1 : -1; | |
d = -d * e * .9; | |
break; | |
case ssc_key.pageup: | |
d = .9 * -e; | |
break; | |
case ssc_key.pagedown: | |
d = .9 * e; | |
break; | |
case ssc_key.home: | |
d = -c.scrollTop; | |
break; | |
case ssc_key.end: | |
e = c.scrollHeight - c.scrollTop - e; | |
d = 0 < e ? e + 10 : 0; | |
break; | |
case ssc_key.left: | |
b = -ssc_arrowscroll; | |
break; | |
case ssc_key.right: | |
b = ssc_arrowscroll; | |
break; | |
default: | |
return !0 | |
} | |
ssc_scrollArray(c, b, d); | |
a.preventDefault() | |
} | |
function ssc_mousedown(a) { | |
ssc_activeElement = a.target | |
} | |
function ssc_setCache(a, b) { | |
for (var c = a.length; c--;)ssc_cache[ssc_uniqueID(a[c])] = b; | |
return b | |
} | |
function ssc_overflowingAncestor(a) { | |
var b = [], c = ssc_root.scrollHeight; | |
do { | |
var d = ssc_cache[ssc_uniqueID(a)]; | |
if (d)return ssc_setCache(b, d); | |
if (b.push(a), c === a.scrollHeight) { | |
if (!ssc_frame || ssc_root.clientHeight + 10 < c)return ssc_setCache(b, document.body) | |
} else if (a.clientHeight + 10 < a.scrollHeight && (overflow = getComputedStyle(a, "").getPropertyValue("overflow"), "scroll" === overflow || "auto" === overflow))return ssc_setCache(b, a) | |
} while (a = a.parentNode) | |
} | |
function ssc_addEvent(a, b, c) { | |
window.addEventListener(a, b, c || !1) | |
} | |
function ssc_removeEvent(a, b, c) { | |
window.removeEventListener(a, b, c || !1) | |
} | |
function ssc_isNodeName(a, b) { | |
return a.nodeName.toLowerCase() === b.toLowerCase() | |
} | |
function ssc_directionCheck(a, b) { | |
a = 0 < a ? 1 : -1; | |
b = 0 < b ? 1 : -1; | |
(ssc_direction.x !== a || ssc_direction.y !== b) && (ssc_direction.x = a, ssc_direction.y = b, ssc_que = []) | |
} | |
function ssc_pulse_(a) { | |
var b, c, d; | |
return a *= ssc_pulseScale, 1 > a ? b = a - (1 - Math.exp(-a)) : (c = Math.exp(-1), --a, d = 1 - Math.exp(-a), b = c + d * (1 - c)), b * ssc_pulseNormalize | |
} | |
function ssc_pulse(a) { | |
return 1 <= a ? 1 : 0 >= a ? 0 : (1 == ssc_pulseNormalize && (ssc_pulseNormalize /= ssc_pulse_(1)), ssc_pulse_(a)) | |
} | |
if (-1 === navigator.platform.toUpperCase().indexOf("MAC") && !navigator.userAgent.match(/(Android|iPod|iPhone|iPad|IEMobile|Opera Mini|BlackBerry)/)) { | |
var ssc_framerate = 150, ssc_animtime = 700, ssc_stepsize = 100, ssc_pulseAlgorithm = !0, ssc_pulseScale = 8, ssc_pulseNormalize = 1, ssc_keyboardsupport = !0, ssc_arrowscroll = 50, ssc_frame = !1, ssc_direction = { | |
x: 0, | |
y: 0 | |
}, ssc_initdone = !1, ssc_fixedback = !0, ssc_root = document.documentElement, ssc_activeElement, ssc_key = { | |
left: 37, up: 38, right: 39, down: 40, spacebar: 32, pageup: 33, pagedown: 34, end: 35, | |
home: 36 | |
}, ssc_que = [], ssc_pending = !1, ssc_cache = {}; | |
setInterval(function () { | |
ssc_cache = {} | |
}, 1E4); | |
var ssc_uniqueID = function () { | |
var a = 0; | |
return function (b) { | |
return b.ssc_uniqueID || (b.ssc_uniqueID = a++) | |
} | |
}(), ischrome = /chrome/.test(navigator.userAgent.toLowerCase()); | |
ischrome && (ssc_addEvent("mousedown", ssc_mousedown), ssc_addEvent("mousewheel", ssc_wheel), ssc_addEvent("load", ssc_init)) | |
} | |
; |