/* Smooth scrolling
   Changes links that link to other parts of this page to scroll
   smoothly to those links rather than jump to them directly, which
   can be a little disorienting.
   
   sil, http://www.kryogenix.org/
   
   v1.0 2003-11-11
*/

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
	} else
		alert("Handler could not be removed")
} 

var ss_INTERVAL
var ss_STEPS = 25
ss_addEvent(window,"load",ss_fixAllLinks)