var AnimElementArr = new Array();
var frame_interval = 25; // 1000/fps

function animData(element,styletype,from,to,duration,delay)
{
	var self = this;

	this.animEle = element;
	this.styletype = styletype;
	this.subframe = -1;
	time = new Date();
	this.starttime = time.getTime();

	steps = Math.round(duration/frame_interval);
	initSteps = 0;

	this.values = new Array();
	
	if(typeof(delay) != 'undefined') {
		initSteps = Math.round(delay/frame_interval);
		steps += initSteps;
		for(s = 0; s <= initSteps; s++)
			this.values[s] = '';
		this.values[0] = from;
	}

	if(styletype=='opacity')
	{
		for(s = initSteps; s <= steps; s++)
			this.values[s] = from + ((to - from) * s / steps);
	} else if(styletype=='visibility') {
		for(s = initSteps; s < steps; s++)
			this.values[s] = from;
		this.values[steps] = to;
	} else {
		for(s = initSteps; s <= steps; s++)
			this.values[s] = Math.round(from + ((to - from) * s / steps));
	}
	
	this.get_curr_value = function()
	{
		time = new Date();
		self.subframe = Math.floor((time.getTime() - self.starttime)/frame_interval);

		if(typeof(self.values[self.subframe])=='undefined')
			self.subframe = self.values.length-1;

		return self.values[self.subframe];
	}
	
	this.animationDone = function()
	{
		if(typeof(self.values[self.subframe+1])=='undefined')
			return true;
		return false;
	}
}

function animate(AnimElement,styletype,from,to,duration,delay)
{
	var time = new Date();
	idNum = AnimElementArr.length;
	if(typeof(time_factor)!='undefined')
		duration *= time_factor;

	AnimElementArr[idNum] = new animData(AnimElement,styletype,from,to,duration,delay);
	animFrame(idNum);
}

function animFrame(objid)
{
	objdata = AnimElementArr[objid];
	
	ojvalue = objdata.get_curr_value();
	if(ojvalue === '') {
		window.setTimeout("animFrame("+objid+");",frame_interval);
		return;
	}
	

	if(objdata.styletype != 'opacity')
	{
		switch(objdata.styletype)
		{
			case 'top':
			case 'left':
			case 'width':
			case 'height':
				value = ojvalue + 'px';
				break;
			default:
				value = ojvalue;
				break;
		}
		objdata.animEle.style[objdata.styletype] = value;
	}
	else
	{
		if(objdata.animEle.style.filter)
		{
			objdata.animEle.style.filter='progid:DXImageTransform.Microsoft.Alpha(opacity=' + Math.round(ojvalue*100) + ')';
			for(var c = 0; c < objdata.animEle.childNodes.length; c++)
				if(objdata.animEle.childNodes[c].style)
					objdata.animEle.childNodes[c].style.filter='progid:DXImageTransform.Microsoft.Alpha(opacity=' + Math.round(ojvalue*100) + ')';
		}
		else
			objdata.animEle.style.opacity = ojvalue;
	}
	
	if(!objdata.animationDone())
		window.setTimeout("animFrame("+objid+");",frame_interval);
	else
	{
		delete objdata;
		delete AnimElementArr[objid];
	}
}
