﻿var Scroller = {
	speed : 1,      //Tiempo entre pasos. 
	maxStep: 5,	 //Máximo desplazamiento por paso
	brakeK: 2,		 //Frenado
	requestedY:0,
	
	scrollTo: function(_y){
		Scroller.requestedY = _y;
		Scroller.scroll();
	},
	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;
	},
	scroll: function(){
			var top  = Scroller.getScrollTop();
			if(Scroller.requestedY > top){  
				var endDistance = Math.round((Scroller.getDocumentHeight() - (top + Scroller.getWindowHeight())) / Scroller.brakeK);
				endDistance = Math.min(Math.round((Scroller.requestedY-top)/ Scroller.brakeK), endDistance);
				var offset = Math.max(2, Math.min(endDistance, Scroller.maxStep));
			}
			else { var offset = - Math.min(Math.abs(Math.round((Scroller.requestedY-top)/ Scroller.brakeK)), Scroller.maxStep);
			}
			
			window.scrollTo(0, top + offset);  
			if(Math.abs(top-Scroller.requestedY) <= 1 || Scroller.getScrollTop() == top) {
				window.scrollTo(0, Scroller.requestedY);
				if(Scroller.callback){
					window[Scroller.callback]();
				}
			}
			else{ 	
				setTimeout(Scroller.scroll,Scroller.speed);
			}
	}		
}