// Default length of an animation in ms
var SS_DefaultAnimationDuration=1000;

// Default number of steps per animation... more looks smoother, less performs better
var SS_DefaultAnimationSteps=20;


// Arrays to handle working animation data
var SS_AnimationTimer=new Array();
var SS_AnimationStartTime=new Array();
var SS_AnimationEndTime=new Array();
var SS_AnimationInterval=new Array();
var SS_AnimationCurrX=new Array();
var SS_AnimationCurrY=new Array();
var SS_AnimationXIncrement=new Array();
var SS_AnimationYIncrement=new Array();
var SS_AnimationCurrW=new Array();
var SS_AnimationCurrH=new Array();
var SS_AnimationWIncrement=new Array();
var SS_AnimationHIncrement=new Array();
var SS_AnimationCurrOpacity=new Array();
var SS_AnimationOpacityIncrement=new Array();




// Orchestrate the given script
// Pass an array of items
// Each item is an array(MS, JS) where MS=time in ms before executing the JS code
function SS_AnimatePlayScript(Script){
	if (Script==null){
		return;
	}
	var LoopVar=0;
	for (LoopVar=0; LoopVar<Script.length; LoopVar++){
		setTimeout(Script[LoopVar][1], Script[LoopVar][0]);
	}
}



// Move the given element to the desired spot over time
// The element must have an ID
function SS_AnimateElementPosition(Element, NewX, NewY, Duration, Steps, ChildProcess){
	Element=SS_GetElement(Element);
	if (Element!=null){
		if (Element.id!=null){
			var NowDate=new Date();
			var AnimationID="MOVE_"+Element.id;
			if (ChildProcess==null){
				if (Duration==null){
					Duration=SS_DefaultAnimationDuration;
				}
				if (Steps==null){
					Steps=SS_DefaultAnimationSteps;
				}
				if (SS_AnimationTimer[AnimationID]!=null){
					clearTimeout(SS_AnimationTimer[AnimationID]);
				}
				SS_AnimationStartTime[AnimationID]=NowDate.getTime();
				SS_AnimationEndTime[AnimationID]=SS_AnimationStartTime[AnimationID]+Duration;
				SS_AnimationCurrX[AnimationID]=SS_GetElementX(Element);
				SS_AnimationCurrY[AnimationID]=SS_GetElementY(Element);
				SS_AnimationXIncrement[AnimationID]=(NewX-SS_AnimationCurrX[AnimationID])/Steps;
				SS_AnimationYIncrement[AnimationID]=(NewY-SS_AnimationCurrY[AnimationID])/Steps;
				SS_AnimationInterval[AnimationID]=Duration/Steps;
			} else {
				SS_AnimationCurrX[AnimationID]+=SS_AnimationXIncrement[AnimationID];
				SS_AnimationCurrY[AnimationID]+=SS_AnimationYIncrement[AnimationID];
				SS_SetElementX(Element, SS_AnimationCurrX[AnimationID]);
				SS_SetElementY(Element, SS_AnimationCurrY[AnimationID]);
			}
			if (Steps>0 && SS_AnimationStartTime[AnimationID]<SS_AnimationEndTime[AnimationID]){
					SS_AnimationTimer[AnimationID]=setTimeout("SS_AnimateElementPosition('"+Element.id+"', "+NewX+", "+NewY+", "+Duration+", "+(Steps-1)+", true);", SS_AnimationInterval[AnimationID]);
			} else {
				SS_SetElementX(Element, NewX);
				SS_SetElementY(Element, NewY);
			}
		}
	}
}



// Resize the given element to the desired size over time
// The element must have an ID
function SS_AnimateElementSize(Element, NewW, NewH, Duration, Steps, ChildProcess){
	Element=SS_GetElement(Element);
	if (Element!=null){
		if (Element.id!=null){
			var NowDate=new Date();
			var AnimationID="SIZE_"+Element.id;
			if (ChildProcess==null){
				if (Duration==null){
					Duration=SS_DefaultAnimationDuration;
				}
				if (Steps==null){
					Steps=SS_DefaultAnimationSteps;
				}
				if (SS_AnimationTimer[AnimationID]!=null){
					clearTimeout(SS_AnimationTimer[AnimationID]);
				}
				SS_AnimationStartTime[AnimationID]=NowDate.getTime();
				SS_AnimationEndTime[AnimationID]=SS_AnimationStartTime[AnimationID]+Duration;
				SS_AnimationCurrW[AnimationID]=SS_GetElementW(Element);
				SS_AnimationCurrH[AnimationID]=SS_GetElementH(Element);
				SS_AnimationWIncrement[AnimationID]=(NewW-SS_AnimationCurrW[AnimationID])/Steps;
				SS_AnimationHIncrement[AnimationID]=(NewH-SS_AnimationCurrH[AnimationID])/Steps;
				SS_AnimationInterval[AnimationID]=Duration/Steps;
			} else {
				SS_AnimationCurrW[AnimationID]+=SS_AnimationWIncrement[AnimationID];
				SS_AnimationCurrH[AnimationID]+=SS_AnimationHIncrement[AnimationID];
				SS_SetElementW(Element, SS_AnimationCurrW[AnimationID]);
				SS_SetElementH(Element, SS_AnimationCurrH[AnimationID]);
			}
			if (Steps>0 && SS_AnimationStartTime[AnimationID]<SS_AnimationEndTime[AnimationID]){
					SS_AnimationTimer[AnimationID]=setTimeout("SS_AnimateElementSize('"+Element.id+"', "+NewW+", "+NewH+", "+Duration+", "+(Steps-1)+", true);", SS_AnimationInterval[AnimationID]);
			} else {
				SS_SetElementW(Element, NewW);
				SS_SetElementH(Element, NewH);
			}
		}
	}
}



// Change the opacity of the given element to the desired opacity over time
// The element must have an ID
function SS_AnimateElementOpacity(Element, NewOpacity, Duration, Steps, ChildProcess){
	Element=SS_GetElement(Element);
	if (Element!=null){
		if (Element.id!=null){
			var NowDate=new Date();
			var AnimationID="OPACITY_"+Element.id;
			if (ChildProcess==null){
				if (Duration==null){
					Duration=SS_DefaultAnimationDuration;
				}
				if (Steps==null){
					Steps=SS_DefaultAnimationSteps;
				}
				if (SS_AnimationTimer[AnimationID]!=null){
					clearTimeout(SS_AnimationTimer[AnimationID]);
				}
				SS_AnimationStartTime[AnimationID]=NowDate.getTime();
				SS_AnimationEndTime[AnimationID]=SS_AnimationStartTime[AnimationID]+Duration;
				SS_AnimationCurrOpacity[AnimationID]=SS_GetElementOpacity(Element);
				SS_AnimationOpacityIncrement[AnimationID]=(NewOpacity-SS_AnimationCurrOpacity[AnimationID])/Steps;
				SS_AnimationInterval[AnimationID]=Duration/Steps;
			} else {
				SS_AnimationCurrOpacity[AnimationID]+=SS_AnimationOpacityIncrement[AnimationID];
				SS_SetElementOpacity(Element, SS_AnimationCurrOpacity[AnimationID]);
			}
			if (Steps>0 && SS_AnimationStartTime[AnimationID]<SS_AnimationEndTime[AnimationID]){
					SS_AnimationTimer[AnimationID]=setTimeout("SS_AnimateElementOpacity('"+Element.id+"', "+NewOpacity+", "+Duration+", "+(Steps-1)+", true);", SS_AnimationInterval[AnimationID]);
			} else {
				SS_SetElementOpacity(Element, NewOpacity);
			}
		}
	}
}
