



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 && 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);
