/**
 * @author Kelly
 */
var AnimationStack=new Array();
var AnimationEngineHandler;
var EngineActive=false;
var UniqueIDCounter=0;
var m_FPS=30;

function AnimationObj(handler,ID,Data)
{
	this.handler=handler; //by using this. we are making these objects public.
	this.ID=ID;	  //using var would make them private...
	this.Data=Data;
}


function AnimationClass(bool_DoNotStart)
{
	var AnimationStack=new Array();
	var AnimationEngineHandler;
	var EngineActive=false;
	var UniqueIDCounter=0;
	var m_FPS=30;

	this.getFPS=function(){return m_FPS;};
	this.ChangeFPS=ChangeFPS;
	this.InitAnimationEngine=InitAnimationEngine;
	this.KillAnimationEngine=KillAnimationEngine;
	var newID=newID;
	
	this.AddAnimationItem=AddAnimationItem;
	this.RemoveAnimationItem=RemoveAnimationItem;
	this.RemoveAnimationStackItem=RemoveAnimationStackItem;
	this.RunAnimationEngine=RunAnimationEngine;	
	
	if (bool_DoNotStart==null || bool_DoNotStart=="undefined" || bool_DoNotStart==false)
	{
		this.InitAnimationEngine(m_FPS);
	}
}

function ChangeFPS(fps)
{
	KillAnimationEngine();
	InitAnimationEngine(fps);
}

function InitAnimationEngine(fps)
{
	if (EngineActive==true)
		KillAnimationEngine();
	var FPS=parseInt(fps);
	var time=1000;//1000  milliseconds per second
	if (!isNaN(FPS))
		time=1000/fps;
	AnimationEngineHandler=setInterval("RunAnimationEngine()",time);
	EngineActive=true;
}

function KillAnimationEngine()
{
	clearInterval(AnimationEngineHandler);
	EngineActive=false;
}

function newID()
{
	UniqueIDCounter++;
	return UniqueIDCounter;
}

function AddAnimationItem(AnimationItem,Data)
{
	var obj=new AnimationObj(AnimationItem,newID(),Data);
	//obj.handler=AnimationItem;
	//obj.ID=newID();
	//obj.Data=Data;
	AnimationStack.push(obj);
	return obj;
}

function RemoveAnimationItem(AnimationItem)
{
	var Found=0;
	for (var i=0;i < AnimationStack.length;++i)
	{
		if (AnimationItem==null)
			return 0;
		if (AnimationStack[i].ID==AnimationItem.ID)
		{
			Found++;
			RemoveAnimationStackItem(i);
		}
	}
	return Found;
}

function RemoveAnimationStackItem(index)
{
	if (AnimationStack.length==1 && index==0)
		AnimationStack=new Array();
	AnimationStack.splice(index,1);
}

function RunAnimationEngine()
{
	for (var i=0;i < AnimationStack.length;++i)
	{
		try
		{
			AnimationStack[i].handler(AnimationStack[i].Data);
		}
		catch(e)
		{
			KillAnimationEngine();
			//alert(e);
			
		}
	}
}


