// class declaration
function divSlider(){}

// editable variables
divSlider.acceleration=.25; // determines acceleration of the slide motion
divSlider.maxSpeed=-1; // speed at which not to accellerate anymore. -1 for unlimited
divSlider.minSpeed=.5; // speed at which not to allow. MUST be greater than 0

// shared variable declarations
divSlider.container; // element with id divSliderContainer
divSlider.items; // all elements with class divSliderItem
divSlider.height; // height of the container, thus height of all items
divSlider.top; // current relative position of all the items
divSlider.interval; // interval for the motion
divSlider.speed; // current speed at which the motion is going
divSlider.halfTop; // position at which deceleration starts
divSlider.finalTop; // final position all items are going to
divSlider.direction; // currently sliding up or down? true is up, false is down
divSlider.isPassedHalf; // has it passed halfway yet?

// initialize all values and calculate div positions
divSlider.initialize=function()
{
	// set all class variables
	divSlider.container=document.getElementById('divSliderContainer');
	divSlider.container.style.overflow="hidden";
	if(divSlider.container.getElementsByClassName!=null)
		divSlider.items=divSlider.container.getElementsByClassName('divSliderItem');
	else
		divSlider.items=getElementsByClassName(divSlider.container,'divSliderItem');
	divSlider.height=divSlider.container.offsetHeight;
	divSlider.speed=0;
	
	// set all styles for items
	divSlider.top=0;
	for(var i=0;i<divSlider.items.length;i++)
	{
		divSlider.items[i].style.position="relative";
		divSlider.items[i].style.height=divSlider.height+"px";
		divSlider.items[i].style.left="0px";
		divSlider.items[i].style.top="0px";
	}
}

// starts the motion off
divSlider.slideTo=function(i)
{
	// clear old motion
	clearInterval(divSlider.interval);
	
	// start motion
	divSlider.finalTop=-(i*divSlider.height);
	divSlider.halfTop=(divSlider.finalTop+divSlider.top)/2;
	divSlider.isPassedHalf=false;
	divSlider.direction=divSlider.top>divSlider.finalTop;
	divSlider.interval=setInterval("divSlider.slideToStep()",1);
}

// step function for the motion
divSlider.slideToStep=function()
{

	// calculate new speed
	divSlider.speed+=divSlider.acceleration*(divSlider.direction?-1:1);
	//alert("top"+divSlider.top+", speed="+divSlider.speed+", direction="+divSlider.direction);
			
	// check if speed is going right direction
	if(divSlider.isPassedHalf&&divSlider.speed*(divSlider.direction?1:-1)<divSlider.minSpeed)
		divSlider.speed=divSlider.minSpeed*(divSlider.direction?1:-1);

	// calculate new top (put max speed into consideration)
	if(divSlider.maxSpeed>0&&Math.abs(divSlider.speed)>divSlider.maxSpeed)
		divSlider.top+=divSlider.maxSpeed*(divSlider.direction?-1:1)*(divSlider.isPassedHalf?-1:1);
	else
		divSlider.top+=divSlider.speed;

	// set each item's position
	for(var i=0;i<divSlider.items.length;i++)
		divSlider.items[i].style.top=divSlider.top+"px";

	// check if passed halfway
	if(!divSlider.isPassedHalf&&(divSlider.direction?divSlider.top<divSlider.halfTop:divSlider.top>divSlider.halfTop))
	{
		divSlider.direction=!divSlider.direction;
		divSlider.isPassedHalf=true;
	}
		
	// check if done
	if(divSlider.isPassedHalf&&(divSlider.direction?divSlider.top>divSlider.finalTop:divSlider.top<divSlider.finalTop))
	{
		divSlider.top=divSlider.finalTop;
		
		// set each item's position again
		for(var i=0;i<divSlider.items.length;i++)
			divSlider.items[i].style.top=divSlider.top+"px";
			
		divSlider.speed=0;
		clearInterval(divSlider.interval);
	}
}

// prototype for getElementByClassName // IE doesn't work
try
{
	HTMLElement.prototype.getElementsByClassName=function(className)
	{
		var elements = new Array();
		var children = this.getElementsByTagName('*');
		var i=0;
		for(var j=0 ; j<children.length ; j++)
		{
			if(children.item(j).className==className)
				elements[i++]=children.item(j);
		}
				
		return elements;
	}
}
catch(e)
{
	getElementsByClassName=function(node,className)
	{
		var elements = new Array();
		var children = node.getElementsByTagName('*');
		var i=0;
		for(var j=0 ; j<children.length ; j++)
		{
			if(children.item(j).className==className)
				elements[i++]=children.item(j);
		}
				
		return elements;
	}
}