function ss_fixAllLinks() {
	var allLinks = document.getElementsByTagName('a');
	for (var i = 0; i < allLinks.length; i++) {
		var lnk = allLinks[i];
		if ((lnk.href && lnk.href.indexOf('#') != -1) &&
			((lnk.pathname == location.pathname) || ('/'+lnk.pathname == location.pathname)) &&
			(lnk.search == location.search)) { ss_addEvent(lnk,'click',smoothScroll); }
	}
}

function smoothScroll(e) {
	if (window.event) {
		target = window.event.srcElement;
	} else if (e) {
		target = e.target;
	} else return;
	
	if (target.nodeType == 3) { target = target.parentNode; }
	if (target.nodeName.toLowerCase() != 'a') return;
	
	anchor = target.hash.substr(1);
	var allLinks = document.getElementsByTagName('a');
	var destinationLink = null;
	for (var i = 0; i < allLinks.length; i++) {
		var lnk = allLinks[i];
		if (lnk.name && (lnk.name == anchor)) {
			destinationLink = lnk;
			break;
		}
	}
	
	if (!destinationLink) return true;
	
	var destx = destinationLink.offsetLeft;
	var desty = destinationLink.offsetTop;
	var thisNode = destinationLink;
	while (thisNode.offsetParent && (thisNode.offsetParent != document.body)) {
		thisNode = thisNode.offsetParent;
		destx += thisNode.offsetLeft;
		desty += thisNode.offsetTop;
	}
	
	clearInterval(ss_INTERVAL);
	cypos = ss_getCurrentYPos();
	
	ss_stepsize = parseInt((desty-cypos)/ss_STEPS);
	ss_INTERVAL = setInterval('ss_scrollWindow('+ss_stepsize+','+desty+',"'+anchor+'")',10);
	
	if (window.event) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	
	if (e && e.preventDefault && e.stopPropagation) {
		e.preventDefault();
		e.stopPropagation();
	}
}

function ss_scrollWindow(scramount,dest,anchor) {
	wascypos = ss_getCurrentYPos();
	isAbove = (wascypos < dest);
	window.scrollTo(0,wascypos + scramount);
	iscypos = ss_getCurrentYPos();
	isAboveNow = (iscypos < dest);
	
	if ((isAbove != isAboveNow) || (wascypos == iscypos)) {
		window.scrollTo(0,dest);
		clearInterval(ss_INTERVAL);
		location.hash = anchor;
	}
}

function ss_getCurrentYPos() {
	if (document.body && document.body.scrollTop)
		return document.body.scrollTop;
	
	if (document.documentElement && document.documentElement.scrollTop)
		return document.documentElement.scrollTop;
		
	if (window.pageYOffset)
		return window.pageYOffset;
	return 0;
}

function ss_addEvent(elm, evType, fn, useCapture) {
	if (elm.addEventListener) {
		elm.addEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.attachEvent) {
		var r = elm.attachEvent("on"+evType, fn);
		return r;
	}
}  

var ss_INTERVAL;
var ss_STEPS = 25;

ss_addEvent(window,"load",ss_fixAllLinks);