/** * 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 ) }