/*

Original Version:
www.kryogenix.org

XHTML Adaptation:
www.sonspring.com

*/

var ss = {

	fixAllLinks: function() {

		// Get a list of all links in the page
		var allLinks = document.getElementsByTagName('a');

		// Walk through the list
		for (var i = 0; i < allLinks.length; i++) {

			var thisLink = allLinks[i];

			if ((thisLink.href && thisLink.href.indexOf('#') != -1) &&
			((thisLink.pathname == location.pathname) ||
			('/' + thisLink.pathname == location.pathname) ) &&
			(thisLink.search == location.search)) {

				// If the link is internal to the page (begins in #)
				// then attach the smoothScroll function as an onclick
				// event handler
				ss.addEvent(thisLink, 'click', ss.smoothScroll);

			}
		}
	},


	smoothScroll: function(e) {

		// This is an event handler; get the clicked on element,
		// in a cross-browser fashion
		if (window.event) {
			target = window.event.srcElement;
		} else if (e) {
			target = e.target;
		} else return;

		// Make sure that the target is an element, not a text node
		// within an element
		if (target.nodeName.toLowerCase() != 'a') {
			target = target.parentNode;
		}

		// Paranoia; check this is an A tag
		if (target.nodeName.toLowerCase() != 'a') return;

		// Find the ID corresponding to this href
		// First strip off the hash (first character)
		anchor = target.hash.substr(1);

		// Now loop all tags until we find one with that name
		var allLinks = document.getElementsByTagName('img');
		var destinationLink = null;
		for (var i = 0; i < allLinks.length; i++) {
			var thisLink = allLinks[i];
			if (thisLink.id && (thisLink.id == anchor)) {
				destinationLink = thisLink;
				break;
			}
		}

		// If we didn't find a destination, give up and let the browser do its thing
		if (!destinationLink) return true;

		// Find the destination's position
		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;
		}

		// Stop any current scrolling
		clearInterval(ss.INTERVAL);

		// Get current position of the page
		curPositionX = ss.getCurrentXPos();

		// Set stepsize
		ss_stepsize = parseInt((destX - curPositionX) / ss.STEPS);

		// Make interval function call
		ss.INTERVAL = setInterval('ss.scrollWindowX(' + ss_stepsize + ',' + destX + ',"' + anchor + '")',5);

		// And stop the actual click happening
		if (window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}

		if (e && e.preventDefault && e.stopPropagation) {
			e.preventDefault();
			e.stopPropagation();
		}

	},


	scrollWindowX: function(scrollAmount, dest, anchor) {

		oldXPosition = ss.getCurrentXPos();

		isAbove = (oldXPosition < dest);

		window.scrollTo(oldXPosition + scrollAmount, 0);

		newXPosition = ss.getCurrentXPos();

		isAboveNow = (newXPosition < dest);

		if ((isAbove != isAboveNow) || (oldXPosition == newXPosition)) {

			// if we've just scrolled past the destination, or
			// we haven't moved from the last scroll (i.e., we're at the
			// bottom of the page) then scroll exactly to the link
			window.scrollTo(dest, 0);

			// cancel the repeating timer
			clearInterval(ss.INTERVAL);

			// and jump to the link directly so the URL's right
			// location.hash = anchor;
		}
	},


	scrollWindowY: function(scrollAmount, dest, anchor) {

		oldYPosition = ss.getCurrentYPos();

		isAbove = (oldYPosition < dest);

		window.scrollTo(0, oldYPosition + scrollAmount);

		newYPosition = ss.getCurrentYPos();

		isAboveNow = (newYPosition < dest);

		if ((isAbove != isAboveNow) || (oldYPosition == newYPosition)) {

			// if we've just scrolled past the destination, or
			// we haven't moved from the last scroll (i.e., we're at the
			// bottom of the page) then scroll exactly to the link
			window.scrollTo(0, dest);

			// cancel the repeating timer
			clearInterval(ss.INTERVAL);

			// and jump to the link directly so the URL's right
			location.hash = anchor;
		}
	},


	getCurrentXPos: function() {
		if (document.body && document.body.scrollLeft)
			return document.body.scrollLeft;
		if (document.documentElement && document.documentElement.scrollLeft)
			return document.documentElement.scrollLeft;
		if (window.pageXOffset)
			return window.pageXOffset;
		return 0;
	},


	getCurrentYPos: function() {
	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;
	},


	addEvent: function(elm, evType, fn, useCapture) {
		// addEvent and removeEvent
		// cross-browser event handling for IE5+,  NS6 and Mozilla
		// By Scott Andrew
		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");
		}
	}
}

ss.STEPS = 25;

ss.addEvent(window,"load",ss.fixAllLinks);