(function (window, undefined) {
	var prevY = 0;
	var sY = 0; tY = 0;
	var scrollTimeout = null;

	(function (obj, type, fn)
	{
		if (obj.attachEvent)
		{
			obj['e' + type + fn] = fn;
			obj[type + fn] = function() { obj['e' + type + fn](window.event); }
			obj.attachEvent('on' + type, obj[type + fn]);
		}
		else
		{
			obj.addEventListener(type, fn, false);
		}
	})(window, 'scroll', function () {
		if (!document.getElementById('sideBoxesContent')) { return; }
		var y = (pageOffset().top - getAbsPos(document.getElementById('sideBoxes')).y) + 8;
		var innerHeight = window.innerHeight ? window.innerHeight : ((window.document.compatMode && window.document.compatMode == "CSS1Compat") ? window.document.documentElement : window.document.body).clientHeight;
		if ((document.getElementById('sideBoxesContent').offsetHeight < innerHeight) || (y < prevY))
		{
			if (scrollTimeout != null) { clearTimeout(scrollTimeout); scrollTimeout = null; }
			tY = (y < 0 ? 0 : y);
			if (document.getElementById('mainContent')) {
				if (tY + document.getElementById('sideBoxesContent').offsetHeight > document.getElementById('mainContent').offsetHeight) {
					tY = (document.getElementById('mainContent').offsetHeight - document.getElementById('sideBoxesContent').offsetHeight) - 35;
				}
			}
			if (sY == 0) { sY = tY; }
			scrollTimeout = setTimeout(smoothScroll, 100);
			prevY = y;
		}
	});

	/*
		function smoothScroll()
		{
			sY = tY;
			document.getElementById('sideBoxes').style.paddingTop = sY + 'px';
		}
	*/
	function smoothScroll()
	{
		scrollTimeout = null;
		if (sY < tY)
		{
			sY += (Math.round((tY - sY) / 6) + 1);
			if (sY > tY) { sY = tY; }
		}
		else if (sY > tY)
		{
			sY -= (Math.round((sY - tY) / 6) + 1);
			if (sY < tY) { sY = tY; }
		}
		document.getElementById('sideBoxes').style.paddingTop = sY + 'px';
		if (sY != tY) { scrollTimeout = setTimeout(smoothScroll, 30); }
	}

	function getAbsPos(elem)
	{
		var pos = { x:0, y:0, level:0 };
		while (elem != null)
		{
			pos.x += elem.offsetLeft;
			pos.y += elem.offsetTop;
			pos.level++;
			elem = elem.offsetParent;
		}
		return pos;
	}

	function pageOffset()
	{
	    var pos = {left:0, top:0};

	    if(typeof window.pageXOffset != 'undefined')
	    {
		    // Mozilla/Netscape
		    pos.left = window.pageXOffset;
		    pos.top = window.pageYOffset;
	    }
	    else
	    {
		    var obj = (window.document.compatMode && window.document.compatMode == "CSS1Compat") ?
		    window.document.documentElement : window.document.body || null;

		    pos.left = obj.scrollLeft;
		    pos.top = obj.scrollTop;
	    }
	    return pos;
	}
})(window);
