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); 
 ss_INTERVAL = setInterval('ss_scrollWindow('+cypos+','+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(); 
 } 
} 

var idx = 0;
function ss_scrollWindow(srcy,desty,anchor) {
// use 0 - pi/2 of sine curve to scroll
var y = srcy+(Math.sin((idx/ss_STEPS)*0.5*Math.PI)*(desty-srcy));
window.scrollTo(0, y);
idx++;
if (idx == ss_STEPS) {
window.scrollTo(0,desty);
// cancel the repeating timer
clearInterval(ss_INTERVAL);
// and jump to the link directly so the URL's right
location.hash = anchor;
idx = 0;
}
}

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);
