/**
*
* Smooth Scroll Script beta 1
*
* @License Public Domain
* @description Smooth Scroll
*
* Supported browser
*  1.Opera 9.5+
*  2.Google Chrome 5.0+
*  3.Firefox 3.5+
*  4.Safari 4.0+
*  5.IE 6.0+
*
* ==
* HTML Sample
* ==
* <a href="#target">go to target</a>
* ( Any content ... )
* <div id="#target">contents</div>
*
*/
(function(doc,win){

  var dh,wh;  //global

  //entry point
  load();

  function load(){
    //modern browser
    if( "addEventListener" in doc ){
      doc.addEventListener('DOMContentLoaded', function(){ init(); }, false );
    }else{  //IE
      try{
        doc.documentElement.doScroll('left');
      }catch( error ){
        win.setTimeout( arguments.callee, 0 );
        return;
      }
      init();
    }
  }

  function init(){

    //get document height and window height
    dh = doc.documentElement.scrollHeight;
    wh = win.innerHeight || doc.documentElement.clientHeight;

    //add atag event
    var aTag = doc.links;
    for( var len = aTag.length; len-- > 0; )(function(node){
      if( node.href.indexOf('#') > 0 ){
        node.onclick = function(e){ scroll(node.href.replace(/^.+#/,''),e); };
      }
    })(aTag[len]);
  }

  function scroll(id,event){
    var target = doc.getElementById(id);
    if( !target ) return;

    event = win.event || event;

    if( "preventDefault" in event ){
      event.preventDefault(); //cancel default event
    }else{
      event.returnValue = false;
    }

    var firstStart = win.pageOffset || doc.documentElement.scrollTop || doc.body.scrollTop || 0; 
    var firstEnd   = ( dh-wh < target.offsetTop ) ? dh-wh : target.offsetTop;

    var remain = firstEnd < firstStart ? -1 : 1; //up : down
    
    var speed = 10;
    
    function smooth(start,end){
      if( (remain<0 && start >= end) || (remain>0 && start <= end) ){
        start = ((speed - 1)*start+end)/speed + remain; //It's Cool! :)
        win.scrollTo(0,start);
        win.setTimeout( function(){ smooth(start,end); }, 10 );
      }else{
        win.scrollTo(0,end);
        return;
      }
    }
    smooth(firstStart,firstEnd);
  }
})(document,window);

