// JavaScript Document// Komaeleon, Florian Schoenberger (f.schoenberger@komaeleon.com) with help from Sitepoint.com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);
