//-----( Global functions )-------------------------------------------------
//event handler
function addEventToObject(obj,evt,func) {
	var oldhandler = obj[evt];
	obj[evt] = (typeof obj[evt] != 'function') ? func : function(ev){oldhandler(ev);func(ev);};
}

// stop default action of an event
function stopDefaultAction(ev) {
	if (!ev) ev = window.event;
	(ev.stopPropagation) ? ev.stopPropagation() : ev.cancelBubble = true;
	(ev.preventDefault) ? ev.preventDefault() : ev.returnValue = false;
	return false;
}
//-----( END )-------------------------------------------------

//-----( @scroll )-------------------------------------------------
// DESCRIPTION: smoothly scrolls between in-page links
// URL EG: /help/faq/
var SmoothScroll = {
	interval: null,
	init : function()
		{
		var s = SmoothScroll;
		if (!document.getElementById) return true;
		if (!document.getElementsByTagName) return true;
		var hrefs = document.getElementsByTagName('a');
		for (var i=0;i<hrefs.length;i++)
			{
			var oLink = hrefs[i];
			if ((oLink.href && oLink.href.indexOf('#') != -1) && ( (oLink.pathname == location.pathname) || ('/'+oLink.pathname == location.pathname) ) && (oLink.search == location.search))
				{
				addEventToObject(oLink,'onclick',s.click);
				}
			}
		},
	click : function(ev)
		{
		var s = SmoothScroll;
		if (!ev) ev = window.event;
		var eventElement = (window.event) ? window.event.srcElement : ev.target;
		while (eventElement.nodeName.toLowerCase() != 'a') {eventElement = eventElement.parentNode;}
		var sAnchor = eventElement.hash.substr(1);
		var oDest = document.getElementById(sAnchor);
		if (!oDest) return true;
		var iDestY = oDest.offsetTop;
		var iDestX = oDest.offsetLeft;
		// IE fix
		var oThisNode = oDest;
		while (oThisNode.offsetParent && (oThisNode.offsetParent != document.body)) 
			{
			oThisNode = oThisNode.offsetParent;
			iDestY += oThisNode.offsetTop;
			iDestX += oThisNode.offsetLeft;
			}
		clearInterval(s.interval);
		var iCurrentY = s.calcY();
		var iStepSize = parseInt((iDestY - iCurrentY)/15);
		s.interval = setInterval(function(){s.scroll(iStepSize,iDestY,sAnchor)},10);
		stopDefaultAction(ev);
		return false;
		},
	calcY : function()
		{
		if (document.body && document.body.scrollTop) {return document.body.scrollTop;} // ie5 and ie5.5
		if (document.documentElement && document.documentElement.scrollTop) {return document.documentElement.scrollTop;} // ie6
		if (window.pageYOffset) {return window.pageYOffset;} // netscape etc
		return 0;
		},
	scroll : function(iStepSize,iDestY,sAnchor)
		{
		var s = SmoothScroll;
		var iStartY = s.calcY();
		var bIsAbove = (iStartY < iDestY);
		window.scrollTo(0,iStartY + iStepSize);
		var iNowY = s.calcY();
		var bIsAboveNow = (iNowY < iDestY);
		if ((bIsAbove != bIsAboveNow) || (iStartY == iNowY))
			{
			window.scrollTo(0,iDestY);
			clearInterval(s.interval);
			var newDate = new Date();
			var uniqueHash = newDate.getTime();
			location.hash = uniqueHash;
			s.interval = setTimeout(function(){s.update(sAnchor)},0);
			}
		},
	update : function(sAnchor)
		{
		var s = SmoothScroll;
		location.hash = sAnchor;
		clearTimeout(s.interval);	
		}
	};
//-----( END )-------------------------------------------------

addEventToObject(window,'onload',SmoothScroll.init);