var ss_STEPS = 50; 
var ss_TIMER_STEPS = 15;
var ss_INTERVAL;

var scrollStart = 0;
var totalDistance = 0;

function smoothScrollTo(elementId)
{	
	element = document.getElementById(elementId);
	if (element == null) {
		return;
	}
	// Stop any current scrolling
	clearInterval(ss_INTERVAL);
	var desty = locate(element)[1];
	scrollStart = getCurrentYPos();
	totalDistance = parseInt(desty-scrollStart);
	//console.log ("Start : "+scrollStart+"\nEnd : "+desty+"\nDistance : " + totalDistance);
	ss_INTERVAL = setTimeout('scrollWindow('+desty+', 1)', ss_TIMER_STEPS); 
}


function scrollWindow(desty, step) {
	var finished = step >= ss_STEPS;
	//console.log("Step : "+step);
	var val = parseFloat(step / ss_STEPS);
	var scramount = -1.0 * Math.pow((1.0-val),4) + 1;
	if (finished) {
		scramount = 1;
	}
	scrollSize = Math.ceil(scramount * Math.abs(totalDistance)) * (totalDistance >= 0?1:-1);
	//console.log("factor : " +scramount + "\nnew Y : "+ (scrollStart+scrollSize) + "("+scrollSize+")");
	
	window.scrollTo(0, scrollStart + scrollSize);
	
	if (!finished)
	{
		setTimeout('scrollWindow('+desty+', '+(step+1)+')', ss_TIMER_STEPS);
	}
}

function getCurrentYPos() 
{
	if (document.body && document.body.scrollTop)
		return document.body.scrollTop;
	if (document.documentElement && document.documentElement.scrollTop)
		return document.documentElement.scrollTop;
	if (window.pageYOffset)
		return window.pageYOffset;
	return 0;
}

function locate(element)
{
	var x = element.offsetLeft;  
	var y = element.offsetTop;
	var thisNode = element;
	while (thisNode.offsetParent && (thisNode.offsetParent != document.body)) 
	{
		thisNode = thisNode.offsetParent;
		x += thisNode.offsetLeft;
		y += thisNode.offsetTop;
	}
	var result = new Array(x, y);
	return result;
}
