// ==================================================
// smooth scroll
// charset=UTF-8
// ==================================================


/* smooth scroll JS
---------------------------------------------------*/
var SmScr = new function(){

	var MAX = 1.3;     // max time(sec)
	var MIN = 0.7;     // min time(sec)
	var FPS = 30;      // frame rate
	var FITTING = -10; // scroll potision pluse(px)

	var timer;
	/* main fanc */
	this.start = function(base){
		var pickup = (base+'').match(/#(.*?)$/g);
		var targId = RegExp.$1;

		if(!document.getElementById(targId)){return;}
		clearInterval(timer);

		var targ = document.getElementById(targId);
		var bodyHeight = document.body.scrollHeight || document.documentElement.scrollHeight;
		var winHeight  = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
		var scr = {
			Top  : document.body.scrollTop  || document.documentElement.scrollTop,
			Left : document.body.scrollLeft || document.documentElement.scrollLeft
		};

		// get postion
		base.pos = getPos(base);
		targ.pos = getPos(targ);
		var move = targ.pos.y + FITTING;	// move position
		if(move > (bodyHeight-winHeight) ){ move = (bodyHeight-winHeight);}
		if(move < 0){ move = 0; }
		var start = getStart(base.pos.y, move, scr.Top)	// start position

		if(start==move){return;}	// cancel
		var sec = setScrTime(start, move);
		scrollPlay(start, move, sec, scr.Left);	

	};

	/* get absolute position by page top */
	function getPos(elem){
		var position = {
			x : elem.offsetLeft,
			y : elem.offsetTop
		};
		// get parent elm
		while(elem.offsetParent) {
				elem = elem.offsetParent;
				position.x += elem.offsetLeft;
				position.y += elem.offsetTop;
		}
		return position;
	};

	/* get start position */
	function getStart(y0, y1, scr){
		if( (y1-y0) == 0 ){
			return scr;
		}else if( (y1-y0) > 0 ){ //bottom
			if( y1<=scr ){
				return scr;
			}else{
				if( scr > y0 ){return scr;}
				else {return y0;}
			}		
		}else{                   //top
			if( y1>=scr){
				return scr;
			}else{
				if( scr < y0 ){return scr;}
				else{return y0;}
			}
		}
	};

	/* animation time */
	function setScrTime(y0, y1){
		var t = Math.abs( (y1-y0)/1000 );
		if(t<MIN){t = MIN;}	
		if(t>MAX){t = MAX;}
		return t;		
	};

	/* scroll animation */
	function scrollPlay(start, end, time, left){
		var frame = 0;
		var tFrame = Math.floor( (time * 1000) / Math.floor(1000/FPS) );

		timer = setInterval( function(){
			var top = Math.floor(scrCalc( frame, start, (end-start), tFrame) );
			if(top+1==end){top=end;}	// 1px pluse
			parent.scrollTo(left, top);
			if(frame++ == tFrame){ clearInterval(timer); }
		}, Math.floor(1000/FPS) );		
	}

	/* position calc */
	function scrCalc(t, b, c, d){
		return -c * ((t=t/d-1) * t * t * t - 1) + b;
	}
};

/* event set */
new function(){
	var ptn = /^#/;
	var URL = location.href.split('#');
	for(i=0; i<document.links.length; i++){
		var targ = document.links[i].href.split(URL[0]);
		if( ptn.test(targ[1]) == true){
			var thisLink = document.links[i];
			thisLink.onclick = function(){
				SmScr.start(this);
				return false;
			}
		}
	}
};

