﻿var SmoothScroll = {};
SmoothScroll = {
targetScrollTop : 0,	// we're gonna make the $(parentid).scrollTop -> targetScrollTop
dist : 0,
timer : 0,
count : 0,
parentid : 0,
lastDist : 0,
//speedStore : [],		// for debug
options : {},
defaultOptions : {
time : 1*1000,	// [ms]
unit : 50			// [ms]
},
scrollTo : function( element, parent, options ){
this.options.time = this.defaultOptions.time;
this.options.unit = this.defaultOptions.unit;
if( options ){
this.options.time = ( options.time ) ? options.time : this.options.time;
this.options.unit = ( options.unit ) ? options.unit : this.options.unit;
}
clearInterval( this.timer );
this.parentid = parent;
this.scrollTopMax = this.$(parent).scrollHeight - this.$(parent).offsetHeight + parseInt(this.$(parent).style.borderTopWidth) + parseInt(this.$(parent).style.borderBottomWidth);
if( navigator.userAgent.match( "MSIE" ) ){
this.targetScrollTop = ( element ) ? this.$(element).offsetTop : 0;
}else{
var targetOffsetTop = ( element ) ? this.$(element).offsetTop : this.$(parent).offsetTop;
this.targetScrollTop = targetOffsetTop - this.$(parent).offsetTop;
}
this.targetScrollTop = ( this.targetScrollTop > this.scrollTopMax ) ? this.scrollTopMax : this.targetScrollTop;
this.dist = this.targetScrollTop - this.$(parent).scrollTop;
this.lastDist = 0;
this.timer = setInterval('SmoothScroll.update()', this.options.unit );
this.count = 0;
//this.speedStore = [];
this.update();
},
update : function(){
var dist = this.targetScrollTop - this.$(this.parentid).scrollTop;
var speed = 2 * dist * this.options.unit / ( this.options.time - this.options.unit * this.count );
//this.speedStore.push( speed );
speed = ( speed > 0 ) ? Math.ceil( speed ) : Math.floor( speed );
if( Math.abs(dist) <= Math.abs(speed) ){
// got there
clearInterval( this.timer );
this.$(this.parentid).scrollTop = this.targetScrollTop;
return;
}else if( this.lastDist == dist ){
// stuck
clearInterval( this.timer );
this.$(this.parentid).scrollTop = this.targetScrollTop;
return;
}
var scrollTop = this.$(this.parentid).scrollTop + speed;
this.$(this.parentid).scrollTop = scrollTop;
this.lastDist = dist;
this.count++;
if( this.count == this.options.time / this.options.unit ){
// timeout
clearInterval( this.timer );
this.$(this.parentid).scrollTop = this.targetScrollTop;
}
},
$ : function(id) {
return document.getElementById(id);
}
}

