function scrollIntoView( nTop, nBottom )
{  //  Set shortcut variables
	var nBodyHeight   = document.body.clientHeight || window.innerHeight;
	var nWindowHeight = typeof window.innerHeight == "number" ? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body && document.body.clientHeight ? document.body.clientHeight : 0;
	var nViewHeight   = nBottom - nTop;
	var nCurrentTop   = document.documentElement && document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body && document.body.scrollTop ? document.body.scrollTop : window.pageYOffset ? window.pageYOffset : 0;
	var nEndTop       = ( nViewHeight < nWindowHeight ? ( nCurrentTop > nTop ? nTop : nBottom - nWindowHeight ) : nTop );
	var aScrollStep   = new Array();
	var nStep         = typeof arguments[ 2 ] == "number" ? arguments[ 2 ] : 30;

	// Don't move if the provided positions are within view already
	if ( nTop >= nCurrentTop && nBottom <= nCurrentTop + nWindowHeight )
		return;

	//  Pre-calculate scroll steps
	for ( var i = 0; i < nStep; ++i )
		aScrollStep[ aScrollStep.length ] = Math.round( ( nEndTop - nCurrentTop ) / 2 * ( ( j = i / ( nStep / 2 ) ) < 1 ? Math.pow( j, 3     ) : ( ( j -= 2 ) * Math.pow( j, 2 ) + 2 ) ) + nCurrentTop );
	aScrollStep[ aScrollStep.length ] = nEndTop;

	//  Create scrollfunction and assign steps to global scope
	window[ "klof_scrolltimer" ] = null;
	window[ "klof_scrollstep" ]  = aScrollStep;
	if ( typeof window[ "klof_pagescroll" ] != "function" )
		window[ "klof_pagescroll" ]  = function()
		{
			clearTimeout( window[ "klof_scrolltimer" ] );
			var nScrollY = window[ "klof_scrollstep" ].shift();
			window.scrollTo( 0, nScrollY );

			if ( window[ "klof_scrollstep" ].length > 0 )
			window[ "klof_scrolltimer" ] = setTimeout( "window[ 'klof_pagescroll' ]();", 100 );
		}
	window[ "klof_pagescroll" ]();
}
