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


