/* Common function to animate objects

   To use:

   1.  Register item with animate (one time only)
       _animate.registerItem(objToAnimate,iSpeed,fnStartAnimation,fnStopAnimation)

   2.  To animate, set destination Position, then call _animate.startAnimation(objToAnimate)

       Example:
         if (menuTbl.offsetLeft==0)
            menuTbl.anim_destX=-110;
         else
            menuTbl.anim_destX=0;

         _animate.startAnimation(menuTbl)

   3.  Handle callback if necessary (object animating is returned to function)

* Note item must have style of position:absolute

*/

function Animation()
{
	var m_noAnimation=false;   // Set this flag to skip any animations and 'jump' to destination
	var m_isAnimating=false;   // This is set while animation is in progress
	var m_animateItems = new Array();   // Array of registered items to animate

	this.registerItem = function(objItem, iSpeed, fnStartCallback, fnStopCallback)
		{
			var strMsg="";
			if (objItem==null)
				alert("Error: invalid item registered with animation.");
			if (this.getAnimateItemIndex(objItem)>=0)
				strMsg="Error: object with id '"+objItem.id+"' has already been registered with Animation.";
			// if (_util.getCurrentStyle(objItem,"position")!="absolute")
			//	strMsg="Error: object with id '"+objItem.id+"' must have style='position:absolute' in order to animate.";
			if ( (fnStartCallback && typeof(fnStartCallback)!="function") || (fnStopCallback && typeof(fnStopCallback)!="function") )
				strMsg="Error: object with id '"+objItem.id+"' must have callback function of type 'function'";
			
			if (strMsg!="")
			{
				alert(strMsg);
				return;
			}

			if (iSpeed==null)
			   iSpeed=5;
			
			objItem.anim_speed=iSpeed;   
			
			var objAni=new Object();
			objAni.obj=objItem;
			objAni.fnStartCallback=fnStartCallback;
			objAni.fnStopCallback=fnStopCallback;
			m_animateItems[m_animateItems.length]=objAni;  // Add animation to registered list			
			
			objItem.objAni=objAni;
			
		}

	this.deregisterItem = function(objItem)
		{
			var iIndex=this.getAnimateItemIndex(objItem);
			if (iIndex >= 0)
				m_animateItems.pop(iIndex);
		}

	// This function will return the index of the item in the given array or -1 if not found
	this.getAnimateItemIndex=function(oItem)
	{
		for (var i=0; i<m_animateItems.length; i++)
		{
			if (m_animateItems[i].obj==oItem)
				return i;
		}
    
		return -1;
	}

	this.animateItems=function()
		{
			for (var i=0; i<m_animateItems.length; i++)
			{
				var iSpeed=m_animateItems[i].obj.anim_speed;
				var bMoveLeft=m_animateItems[i].obj.anim_moveleft;
				var currLeft=m_animateItems[i].obj.offsetLeft;
				var bMoveUp=m_animateItems[i].obj.anim_moveup;
				var currTop=m_animateItems[i].obj.offsetTop;

				var iTargetPosX=m_animateItems[i].obj.anim_destX;
				if (iTargetPosX!=null)
				{
					if ((bMoveLeft==true && currLeft-iSpeed<iTargetPosX) || (bMoveLeft==false && currLeft+iSpeed>iTargetPosX)) 
					{
						m_animateItems[i].obj.style.left=iTargetPosX+"px";
						m_animateItems[i].obj.isAnimating=false;
						if (m_animateItems[i].fnStopCallback)
						   m_animateItems[i].fnStopCallback(m_animateItems[i].obj);
					}
					else
					{
						var iMove=(bMoveLeft)?-iSpeed:iSpeed;
						m_animateItems[i].obj.style.left=currLeft+iMove+"px";
						m_animateItems[i].obj.isAnimating=true;
					}
				}
				
				var iTargetPosY=m_animateItems[i].obj.anim_destY;
				if (iTargetPosY!=null)
				{
					if ((bMoveUp==true && currTop-iSpeed<iTargetPosY) || (bMoveUp==false && currTop+iSpeed>iTargetPosY)) 
					{
						m_animateItems[i].obj.style.top=iTargetPosY+"px";
						m_animateItems[i].obj.isAnimating=false;
						if (m_animateItems[i].fnStopCallback)
						   m_animateItems[i].fnStopCallback(m_animateItems[i].obj);
					}
					else
					{
						var iMove=(bMoveUp)?-iSpeed:iSpeed;
						m_animateItems[i].obj.style.top=currTop+iMove+"px";
						m_animateItems[i].obj.isAnimating=true;
					}
				}
				
			}
	
			bAnimating=false;
	
			for (var i=0; i<m_animateItems.length; i++)		
			{
		        if (m_animateItems[i].obj.isAnimating==true)
	  			{
					bAnimating=true;
	  				break;
	  			}
	  		}
	
	
			if (bAnimating)  			 	
			{
				m_isAnimating=true;
				// window.status="ANIMATING";
				setTimeout("_animation.animateItems()",1);
				return;
	
			}
			else
			{
				m_isAnimating=false;
				// window.status="NOT ANIMATING";

			    var tblMenu=document.getElementById("console_tblMenu")
				if (tblMenu!=null)
				{
					var menu=document.getElementById("console_imgMenu");
					if (tblMenu.offsetLeft==0)
					   menu.src=menu.getAttribute("menuin");
					else
					   menu.src=menu.getAttribute("menuout");
				}				
			    
				return;
			}
	
		}

	this.startAnimation=function(obj)
		{
			if (obj!=null)
			{
				if (obj.anim_destX < obj.offsetLeft)
				   obj.anim_moveleft=true;
				else
				   obj.anim_moveleft=false;

				if (obj.anim_destY < obj.offsetTop)
				   obj.anim_moveup=true;
				else
				   obj.anim_moveup=false;
			}
			
			if (m_isAnimating==true)
				return;
	
			if (obj!=null && obj.objAni!=null && obj.objAni.fnStartCallback)
			   obj.objAni.fnStartCallback(obj);
			   
			this.animateItems();
		}

}