
window.onload = function() {
	tinyScrolling.init();
}



var tinyScrolling = {
		speed : 10,      //set here the scroll speed: when this value increase, the speed decrease. 
		maxStep: 100,	 //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 = tinyScrolling.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;
				tinyScrolling.hash = targ.href.substr(targ.href.indexOf('#')+1,targ.href.length); 
				tinyScrolling.currentBlock = document.getElementById(tinyScrolling.hash);   
				if(!tinyScrolling.currentBlock) return;
				tinyScrolling.requestedY = tinyScrolling.getElementYpos(tinyScrolling.currentBlock); 
				tinyScrolling.scroll();  
				return false;
		},
		scroll: function(){
				var top  = tinyScrolling.getScrollTop();
				if(tinyScrolling.requestedY > top) {  
						var endDistance = Math.round((tinyScrolling.getDocumentHeight() - (top + tinyScrolling.getWindowHeight())) / tinyScrolling.brakeK);
							var distanceA=endDistance;
						endDistance = Math.min(Math.round((tinyScrolling.requestedY-top)/ tinyScrolling.brakeK), endDistance);
							var distanceB=Math.round((tinyScrolling.requestedY-top)/ tinyScrolling.brakeK);
							var lastSlowdown=2,
								maxStepDistance=tinyScrolling.maxStep;
						var offset = Math.max(2, Math.min(endDistance, tinyScrolling.maxStep));
				} else {
							var distanceA = -Math.abs(Math.round((tinyScrolling.requestedY-top)/ tinyScrolling.brakeK)),maxStepDistance = -tinyScrolling.maxStep;
							var offset = - Math.min(Math.abs(Math.round((tinyScrolling.requestedY-top)/ tinyScrolling.brakeK)), tinyScrolling.maxStep);
				}
				window.scrollTo(0, top + offset);
				if(Math.abs(top-tinyScrolling.requestedY) <= 1 || tinyScrolling.getScrollTop() == top) {
						window.scrollTo(0, tinyScrolling.requestedY);
						if(!document.all || window.opera) location.hash = tinyScrolling.hash;
						tinyScrolling.hash = null;
						document.body.style.backgroundColor = "#ffffff";
				} else {
						setTimeout(tinyScrolling.scroll,tinyScrolling.speed);
				}
		}		
}
