/************************************************************************************************************************************************************************

GESTIONNAIRE DES EVENEMENTS

*************************************************************************************************************************************************************************/
/*

Le gestionnaire d'évènements conserve dans "oListEvents" uniquement que les évènements qui sont :
- en cours de chargement : EVENT_STATE_ONLOAD

et supprime l'évènement si il y a arret : EVENT_STATE_CANCEL
²			ou si réussi : EVENT_STATE_SUCCESS;

*/
/*====================== ETAT D'AVANCEMENT D'UN EVENEMENT =========================**/
EVENT_STATE_ONLOAD = 1;
EVENT_STATE_ALREADY_EXEC = 2;
EVENT_STATE_APPLI_LOCKED = 3;
EVENT_STATE_SUCCESS = 4;
EVENT_STATE_ERROR = 5;
EVENT_STATE_CANCEL = 6;
EVENT_STATE_TIMEOUT = 7;//A faire!!!!!

function ApplicationEventHandler(  )
{
	this.oListEvents = new Array(  );
}
ApplicationEventHandler.prototype.attachEvent = function( p_oEventApplication )
{	
	//alert( this.oListEvents.length );
	//Evenement déjà en cours d'execution
	var oCurrentEvent = this.getEvent( p_oEventApplication, { url:true } );
	
	if( oCurrentEvent )	
		return EVENT_STATE_ALREADY_EXEC;
	
	//autre évènement en cours d'exécution
	if( this.oListEvents.length != 0 )
		return EVENT_STATE_APPLI_LOCKED;
	
	//Evenement accept
	this.oListEvents.push( p_oEventApplication );
	return EVENT_STATE_ONLOAD;
}
ApplicationEventHandler.prototype.responseEvent = function( p_oEventApplication, p_iGlobalStateEvent )
{
	if( p_iGlobalStateEvent == EVENT_STATE_ERROR )	return p_iGlobalStateEvent;
	
	this.removeLastEvent( p_oEventApplication, { id:true } );
	return p_iGlobalStateEvent;
}



//Permet de récupérer le dernier Evenement identique à "p_oEventApplication" selon les criteres de comparaison "compare"
//p1 = p_oEventApplication  : evenement recherché
//p2 = compare : object = {
//				url : boolean,
//				whereLoading : boolean
//			}
ApplicationEventHandler.prototype.getEvent = function( p_oEventApplication, compare )
{
	for( var i=this.oListEvents.length -1 ; i>= 0; i-- )
	{
		var oCurrentEvent =  this.oListEvents[ i ];
		if ( this.compareEvents( p_oEventApplication, oCurrentEvent, compare ) ) return oCurrentEvent;
	}
	return null;	
}

//Permet de supprimer le dernier Evenement identique à "p_oEventApplication" selon les criteres de comparaison "compare"
//p1 = p_oEventApplication  : evenement recherché
//p2 = compare : object = {
//				url : boolean,
//				whereLoading : boolean
//			}
ApplicationEventHandler.prototype.removeLastEvent = function( p_oEventApplication, compare )
{
	var iIndex = null;
	for( var i=this.oListEvents.length; i>0; i-- )
	{
		var oCurrentEvent =  this.oListEvents[ i-1 ];
		if ( this.compareEvents( p_oEventApplication, oCurrentEvent, compare ) )	
		{
			iIndex = i-1;
			i=0;
		}
	}
	
	var aTmp = new Array();
	for( var i=0; i<this.oListEvents.length;i++ )
	{
		if( i != iIndex )
			aTmp[ aTmp.length ] = this.oListEvents[ i ];
	}
	this.oListEvents = aTmp;
}
//compre les deux évènements selon les criteres de comparaison "compare"
//p1 = p_oEventApplication1  : evenement 1
//p1 = p_oEventApplication2  : evenement 2
//p2 = compare : object = {
//				url : boolean,
//				whereLoading : boolean
//			}
ApplicationEventHandler.prototype.compareEvents = function( p_oEventApplication1, p_oEventApplication2, compare )
{
	if( compare == null || typeof compare == "undefined" )												return true;
	
	if(  compare.id && ( p_oEventApplication1.id != p_oEventApplication2.id ) )	 								return false;
	if(  compare.url && ( p_oEventApplication1.url != p_oEventApplication2.url ) )	 								return false;
	if(  compare.whereLoading && ( $( p_oEventApplication1.whereLoading).attr( 'id' ) != $( p_oEventApplication2.whereLoading).attr( 'id' ) ) )	 return false;
	return true;
}




	
