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