var nowY=0;
var ss = {fixAllLinks: function() 
	{ 
		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',ss.smoothScroll);
		}
    }
},
smoothScroll: function(e) 
{
    if (window.event) 
	{
    	target = window.event.srcElement;
    }
	else if (e) 
	{
		target = e.target;
    } 
	else return;
	
    if (target.nodeName.toLowerCase() != 'a') 
	{
		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) destinationLink = document.getElementById(anchor);

    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);
    
	nowY= ss.getCurrentYPos();
	ss.INTERVAL = setInterval('ss.scrollWindow('+desty+',"'+anchor+'")',1);

    if (window.event) 
	{
		  window.event.cancelBubble = true;
		  window.event.returnValue = false;
    }
    if (e && e.preventDefault && e.stopPropagation) 
	{
		e.preventDefault();
		e.stopPropagation();
    }
},
scrollWindow: function(dest,anchor) 
{
	wascypos = ss.getCurrentYPos();
	isAbove = (wascypos < dest);
   	nowY += (dest-nowY)*0.1;

	window.scrollTo(0,Math.round(nowY));
    iscypos = ss.getCurrentYPos();
   	isAboveNow = (iscypos < dest);


	if(Math.abs(dest-nowY)<0.1)
	{
		clearInterval(ss.INTERVAL);
		location.hash = anchor;
		window.scrollTo(0,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;
	}
	*/
},
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);