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 = 20;   
  
ss_addEvent(window,"load",ss_fixAllLinks);
