//****  need 'DOCTYPE' ****
//<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

var SmoothScroll = {
 speed : 20,      //set here the scroll speed: when this value increase, the speed decrease. 
 maxStep: 200,  //set here the "uniform motion" step for long distances
 brakeK: 3,   //set here the coefficient of slowing down

 hash:null,
 currentBlock:null,
 requestedY:0,
 init: function() {
  var lnks = document.getElementsByTagName('a');
  for(var i = 0, lnk; lnk = lnks[i]; i++) {
   if ((lnk.href && lnk.href.indexOf('#') != -1) &&  ( (lnk.pathname == location.pathname) || ('/'+lnk.pathname == location.pathname) ) && (lnk.search == location.search)) {
   lnk.onclick = SmoothScroll.initScroll;
   }
  }
 },
 getElementYpos: function(el){
  var y = 0;
  while(el.offsetParent){
   y += el.offsetTop
   el = el.offsetParent;
  } return y;
 },
 getScrollTop: function(){
  if(document.all) return (document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop;
  else return window.pageYOffset;
 },
 getWindowHeight: function(){
  if (window.innerHeight) return window.innerHeight;
  if(document.documentElement && document.documentElement.clientHeight) return document.documentElement.clientHeight;
 },
 getDocumentHeight: function(){
  if (document.height) return document.height;
  if(document.body.offsetHeight) return document.body.offsetHeight;
 },
 initScroll: function(e){
  var targ;  
  if (!e) var e = window.event;
  if (e.target) targ = e.target;
  else if (e.srcElement) targ = e.srcElement;
  SmoothScroll.hash = targ.href.substr(targ.href.indexOf('#')+1,targ.href.length); 
  SmoothScroll.currentBlock = document.getElementById(SmoothScroll.hash);
  if(!SmoothScroll.currentBlock) return;
  SmoothScroll.requestedY = SmoothScroll.getElementYpos(SmoothScroll.currentBlock);
  SmoothScroll.scroll();
  return false;
 },
 scroll: function(){
  var top  = SmoothScroll.getScrollTop();
  if(SmoothScroll.requestedY > top) {
   var endDistance = Math.round((SmoothScroll.getDocumentHeight() - (top + SmoothScroll.getWindowHeight())) / SmoothScroll.brakeK);
   endDistance = Math.min(Math.round((SmoothScroll.requestedY-top)/ SmoothScroll.brakeK), endDistance);
   var offset = Math.max(2, Math.min(endDistance, SmoothScroll.maxStep));
  } else { var offset = - Math.min(Math.abs(Math.round((SmoothScroll.requestedY-top)/ SmoothScroll.brakeK)), SmoothScroll.maxStep);
  } window.scrollTo(0, top + offset);
  if(Math.abs(top-SmoothScroll.requestedY) <= 1 || SmoothScroll.getScrollTop() == top) {
   window.scrollTo(0, SmoothScroll.requestedY);
   if(!document.all || window.opera) location.hash = SmoothScroll.hash;
   SmoothScroll.hash = null;
  } else  setTimeout(SmoothScroll.scroll,SmoothScroll.speed);
 }
}
