/*  Place this in the head of your document to apply effect: <script src="smoothscroll.js" type="text/javascript"></script> */

//  #### 
//  SMOOTHSCROLL, v1.0
//  ####
//  From: http://www.sitepoint.com/article/1261
//  Your document internal links will scroll to their destination, allowing your users to retain an awareness 
//  of where the browser is located within the document, and how far they are from their starting point. 
//  The code has been tested and works in Mozilla (Mac & PC), IE (PC Only), and Opera; it doesn't work in Konqueror (Safari), 
//  and is assumed to not work in other browsers. 


function ss_fixAllLinks() { 

// 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 lnk = allLinks[i]; 
if ((lnk.href.indexOf('#') != -1) &&
( (lnk.pathname == location.pathname) || 
('/'+lnk.pathname == location.pathname) ) &&
(lnk.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(lnk,'click',smoothScroll); 
} 
} 
}

function smoothScroll(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.nodeType == 3) { 
target = target.parentNode; 
} 
// Paranoia; check this is an A tag 
if (target.nodeName.toLowerCase() != 'a') return; 

// Find the <a name> tag corresponding to this href 
// First strip off the hash (first character) 
anchor = target.hash.substr(1); 
// Now loop all A tags until we find one with that name 
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 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);
cypos = ss_getCurrentYPos();
ss_stepsize = parseInt((desty-cypos)/ss_STEPS);
ss_INTERVAL = setInterval('ss_scrollWindow('+ss_stepsize+','+desty+',"'+anchor+'")',10); 
// 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(); 
	} 
	}

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)) { 
// 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; 
} 
}

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) 
// 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; 
} 
}
var ss_INTERVAL; 
var ss_STEPS = 25; 

ss_addEvent(window,"load",ss_fixAllLinks); 

// ### END SMOOTHSCROLL ###############################