// Funcions de creacio dels "keyframes"

// lin: Crea un array que fa el gradient linial de ini a fi en nSamples+1 passes.
function lin(ini, fi, nSamples)
{
	return linGeneric(ini, fi, nSamples, 1, "", "", false);
}

// lin: Crea un array que fa el gradient linial de ini a fi en nSamples+1 passes. A mes a mes, escala els valors (scale) i al resultat hi prependa i appenda strings arbitraries.
function linGeneric(ini, fi, nSamples, scale, prepend, append, round)
{
	if (nSamples<=0)
		return null;
		
	var res=new Array(nSamples+1);
	var i=0;
	var inc=(fi-ini)/nSamples;
	
	res[0]=""+prepend+(round?Math.round(ini*scale):(ini*scale))+append;
	
	for (i=1; i<=nSamples; i++)
		res[i]=""+prepend+(round?Math.round((ini+inc*i)*scale):((ini+inc*i)*scale))+append;
		
	return res;
}

// Array que fa un gradient sin(-90) a sin(90), escalat :P
function sinGradient(ini, fi, nSamples)
{
	return sinGradientGeneric(ini, fi, nSamples, 1, "", "", false);
}

// Array que fa un gradient sin(-90) a sin(90), escalat :P
function sinGradientGeneric(ini, fi, nSamples, scale, prepend, append, round)
{
	if (nSamples<=0)
		return null;
		
	var res=new Array(nSamples+1);
	var i=0;
	var inc=Math.PI/nSamples;
	
	res[0]=""+prepend+(round?Math.round(ini*scale):(ini*scale))+append;

	for (i=1; i<=nSamples; i++)
	{
		var value=(ini+(fi-ini)*((Math.sin(-(Math.PI/2)+inc*i)+1)/2))*scale;
		res[i]=""+prepend+(round?Math.round(value):value)+append;
	}
	
	return res;
}

// Array que fa un gradient sin(0)^2 a sin(90)^2, escalat :P
function sin2Gradient(ini, fi, nSamples)
{
	return sin2GradientGeneric(ini, fi, nSamples, 1, "", "", false);
}

// Array que fa un gradient sin(0)^2 a sin(90)^2, escalat :P
function sin2GradientGeneric(ini, fi, nSamples, scale, prepend, append, round)
{
	if (nSamples<=0)
		return null;
		
	var res=new Array(nSamples+1);
	var i=0;
	var inc=Math.PI/(nSamples*2);
	
	res[0]=""+prepend+(round?Math.round(ini*scale):(ini*scale))+append;

	for (i=1; i<=nSamples; i++)
	{
		var value=(ini+(fi-ini)*(Math.sin(inc*i)*Math.sin(inc*i)))*scale;
		res[i]=""+prepend+(round?Math.round(value):value)+append;
	}
	
	return res;
}

function animClear(tout)
{
	clearTimeout(tout);
	tout=null;
}

// Variables importants d'animacio
var simpleAnimateTimer=null;
var dateIni=null, dateFi=null;

function animating()
{
	return (simpleAnimateTimer!=null);
}

// Funcions d'execucio de l'animacio
function simpleAnimate(objId, property, values, nValues, remainingTime, totalTime)
{
	if (remainingTime==totalTime)
		dIni=null;
	
	dFi=new Date();
	if (dIni!=null)
		remainingTime-=dFi.getTime()-dIni.getTime()-1;
	dIni=new Date();

	if (remainingTime<0)
		remainingTime=0;
		
	var step=Math.round(nValues*((totalTime-remainingTime)/totalTime));

	eval("getObj(\""+objId+"\")"+property+"=\""+values[step]+"\";");
	
	if (remainingTime>0)
	{
		var expr="simpleAnimate(\""+objId+"\", \""+property+"\", new Array(";

		// Ho fem aixi per si son strings.		
		var i=0; 
		expr+="\""+values[0]+"\""
		for (i=1; i<values.length; i++)
			expr+=", \""+values[i]+"\"";

		expr+="), "+nValues+", "+(remainingTime-1)+", "+totalTime+")";
		
		simpleAnimateTimer=setTimeout(expr, 10);
	}
	else
		simpleAnimateTimer=null;
}

function multipleSimpleAnimate(objIds, property, values, nValues, remainingTime, totalTime)
{
	if (remainingTime<0 && totalTime<0)
	{
		for (var o=0; o<objIds.length; o++)
		{
			eval("getObj(\""+objIds[o]+"\")"+property+"=\""+values[o][nValues-1]+"\";");
		}
		return;
	}
		
	if (remainingTime==totalTime)
		dIni=null;
	
	dFi=new Date();
	if (dIni!=null)
		remainingTime-=dFi.getTime()-dIni.getTime()-1;
	dIni=new Date();

	if (remainingTime<0)
		remainingTime=0;
		
	var step=Math.round(nValues*((totalTime-remainingTime)/totalTime));

	if (step>=nValues)
		step=nValues-1;

	for (var o=0; o<objIds.length; o++)
	{
		eval("getObj(\""+objIds[o]+"\")"+property+"=\""+values[o][step]+"\";");
	}
	
	if (remainingTime>0)
	{
		var expr="multipleSimpleAnimate(new Array(";

		var i=0; 
		expr+="\""+objIds[0]+"\""
		for (i=1; i<objIds.length; i++)
			expr+=", \""+objIds[i]+"\"";
		
		expr+="), \""+property+"\", new Array(";

		// Ho fem aixi per si son strings.		
		var j=0;
		for (j=0; j<objIds.length; j++)
		{
			expr+="new Array(";
		
			i=0; 
			expr+="\""+values[j][0]+"\""
			for (i=1; i<values[j].length; i++)
				expr+=", \""+values[j][i]+"\"";
	
			if (j!=objIds.length-1)
				expr+="), ";
			else
				expr+=")";
		}

		expr+="), "+nValues+", "+(remainingTime-1)+", "+totalTime+")";
		
		simpleAnimateTimer=setTimeout(expr, 10);
	}
	else
		simpleAnimateTimer=null
}

function simpleAnimateMultipleProperties(objId, properties, values, nValues, remainingTime, totalTime)
{
	if (remainingTime==totalTime)
		dIni=null;
	
	dFi=new Date();
	if (dIni!=null)
		remainingTime-=dFi.getTime()-dIni.getTime()-1;
	dIni=new Date();

	if (remainingTime<0)
		remainingTime=0;

	var step=Math.round(nValues*((totalTime-remainingTime)/totalTime));

	for (var p=0; p<properties.length; p++)
	{
		eval("getObj(\""+objId+"\")"+properties[p]+"=\""+values[p][step]+"\";");
	}
	
	if (remainingTime>0)
	{
		var expr="simpleAnimateMultipleProperties(\""+objId+"\", new Array(";
		
		// Ho fem aixi per si son strings.		
		var i=0; 
		expr+="\""+properties[0]+"\""
		for (i=1; i<properties.length; i++)
			expr+=", \""+properties[i]+"\"";

		expr+="), new Array(";

		// Ho fem aixi per si son strings.		
		var j=0;
		for (j=0; j<properties.length; j++)
		{
			expr+="new Array(";
		
			i=0; 
			expr+="\""+values[j][0]+"\""
			for (i=1; i<values[j].length; i++)
				expr+=", \""+values[j][i]+"\"";
	
			if (j!=properties.length-1)
				expr+="), ";
			else
				expr+=")";
		}

		expr+="), "+nValues+", "+(remainingTime-1)+", "+totalTime+")";
		
		simpleAnimateTimer=setTimeout(expr, 10);
	}
	else
		simpleAnimateTimer=null;
}


function animOpacity(obj, start, stop, time)
{
	var anim=null;
	var prop=".style.opacity";

	animClear(simpleAnimateTimer);

	if (BrowserDetect.browser=="Explorer")
	{
		anim=linGeneric(start, stop, 25, 100, "alpha(opacity=", ")", true);
		prop=".style.filter";
	}
	else
	{
		anim=lin(start, stop, 25);
	}
	
	simpleAnimate(obj.getAttribute("id"), prop, anim, 25, time, time);
}

function animOpacityEx(obj, start, stop, time, timerClear)
{
	var anim=null;
	var prop=".style.opacity";

	if (timerClear)
		animClear(simpleAnimateTimer);

	if (BrowserDetect.browser=="Explorer")
	{
		anim=linGeneric(start, stop, 25, 100, "alpha(opacity=", ")", true);
		prop=".style.filter";
	}
	else
	{
		anim=lin(start, stop, 25);
	}
	
	simpleAnimate(obj.getAttribute("id"), prop, anim, 25, time, time);
}

function animXTranslateWithAcceleration(obj, start, stop, time, timerClear)
{
	var anim=null;
	var prop=".style.left";

	if (timerClear)
		animClear(simpleAnimateTimer);

	anim=sin2GradientGeneric(start, stop, 50, 1, "", "px", true);
	
	simpleAnimate(obj.getAttribute("id"), prop, anim, 50, time, time);
}
