// JavaScript Document



function seq (){
	this.sZoneId = new Array();
	this.sZone = new Array();
	this.sEffect = new Array();
	this.sActive = new Array();
	this.sLast_nr = 0;
	this.sLast_disp = 0;
	this.sTimer = '';
	this.sIntervalle = 10;
	this.sWaitEnd = false;
	this.sSingle = true;

	this.init = function(Intervalle, WaitEnd, Single){
		this.sIntervalle = Intervalle;
		this.sWaitEnd = WaitEnd;
		this.sSingle = Single;
		return false;
	}

	this.zone_add = function(nr,TagId,StartFunc){
		zId=this.sZone.length;
		this.sZoneId[nr]=zId;
		this.sZone[zId]= new zone(TagId,end_state(StartFunc));
		if (this.sEffect[StartFunc]) this.sEffect[StartFunc].run(this.sZone[zId].zTagId);
	}

	this.effect_add = function(id,func,delay,duration){
		this.sEffect[id] = new effect(func,delay,duration);
	}

}


function zone(zTagId,zState){
	this.zTagId = zTagId ;
	this.zDftState = zState;
	this.zState  = zState;//-1:show, -2 : hide,  n:function demandé
	this.zTDelay = 0;
	this.zTDura = 0;
	
}

function effect(func,delay,duration){
	this.eFunc  = func;
	this.eDelay  = parseFloat(delay); 
	this.eDuration  = parseFloat(duration); 

	this.run = function(TagId){
	
		var reg=new RegExp("(%id)");
		var Com = this.eFunc.replace(reg,TagId );
		var reg=new RegExp("(%du)");
		Com = Com.replace(reg,"{duration: " + this.eDuration + "}");
		try {
	//				alert('Comm : ' + commande);
			eval(Com);
		}
		catch (e) {
			alert('Erreur effect :' + Com);
		}
	}
}


function end_state(eId){ 
	return -( ((eId+3) % 2) + 1 ); // renvoi -2 pour chiffre pair -1 pour chiffre impaire (chiffre >=-2)
}

var fx_seq = new seq();

function aff(nr,eId){

	var zId = fx_seq.sZoneId[nr];
	var sZ = fx_seq.sZone[zId]; 
	f = end_state(eId); // effect demandé show or hide
	st = sZ.zState; // état actuel -1:on, -2:off, >=0 effet en cours
	g = end_state(st); // état actuel show or hide
	if(sZ.zTDura > 0){ // effect en cours mode fin complete
		if (f != g && st >= 0 ){// état final contradictoire et effet en attente
			sZ.zState = f; //-> on revient à l'état repos 
		} else { // pas d'effet en attente  ou type effet identique (show/hide)
			sZ.zState = eId; //-> on programme l'effet 
		}	
	} else { 
		if (sZ.zTDelay > 0) {
			if (f != g ){// état final contradictoire 
				sZ.zState = f; //-> on annule le dernier effet en attente 
				sZ.zTDelay = 0; // on annule le décompte
			} else sZ.zState = eId; //-> on programme l'effet 
					
		} else {
			fx_seq.sActive.push(fx_seq.sZone[zId]);// enregistrement dans la liste des actifs
			sZ.zTDelay = fx_seq.sEffect[eId].eDelay + fx_seq.sIntervalle; // délai d'attente fixé
			sZ.zState = eId; // effet enregistré
			if (fx_seq.sTimer == ''){
				fx_seq.sTimer = setInterval('run_seq()', fx_seq.sIntervalle); // lancement éventuel du timer
			}
		}
	}
	return false;
}

function run_seq(){

	var stillRun = false;
	var itermax = fx_seq.sActive.length;
	if (!itermax){  // plus de zone réellement active
		clearInterval(fx_seq.sTimer); 
		fx_seq.sTimer = ''; // arrête le timer
	} else {
		itermax = (fx_seq.sSingle)? 1 : itermax;
		for (var i=0 ;i<itermax; i++){ // on parcours toutes les zones
			var sZ = fx_seq.sActive[i]; 
			if(sZ.zTDura > 0){ // effect en cours 
				if (sZ.zTDura <= fx_seq.sIntervalle){ // l'effet se termine
					sZ.zTDura = 0; //  d'effet en cours terminé					
					if (sZ.zState >= 0)	{ // un autre effet en attente ou en cours -programme le délai d'attente
						sZ.zTDelay = fx_seq.sEffect[sZ.zState].eDelay + fx_seq.sIntervalle;;
					}
				} else sZ.zTDura -= fx_seq.sIntervalle; // on décrémente
			} else {
				if (sZ.zTDelay > 0) { // effet en attente
					if (sZ.zTDelay <= fx_seq.sIntervalle){ // temps d'attente terminé
						sZ.zTDelay = 0;  // remet le délay a 0
						if (fx_seq.sWaitEnd) {  // force le mode fin d'effet complet
							sZ.zTDura = fx_seq.sEffect[sZ.zState].eDuration * 1000 ; 
						}
						if (fx_seq.sEffect[sZ.zState]) fx_seq.sEffect[sZ.zState].run(sZ.zTagId); // lance l'effet
						sZ.zState = end_state(sZ.zState); // met la zone au repos (<0)
					} else {
						sZ.zTDelay -= fx_seq.sIntervalle;
					}
				} else { // plus de minuteurs :  l'effet est fini pour la zone
					fx_seq.sActive.splice(i,1);	// on le retire de la liste
				}
			}							
		}	
	}
}
