/**
* Ce fichier fait parti d'un package, toute modification doit entrainer la génération
* d'un nouveau package pour être pris en compte.
* voir l'objet ObjFichierPackage pour connaitre la marche à suivre pour regénérer un package
* @since 20/05/2009 Olivier REYT <reyt@benchmark.fr>
*/

if(typeof benchmark == "undefined") var benchmark = new Object();
if(typeof benchmark.framework == "undefined") benchmark.framework = new Object();
if(typeof benchmark.framework.util == "undefined") benchmark.framework.util = new Object();

/**
 *  EventDispatcher est un gestionnaire d'evenemnt librement inspiré de la classe
 *	éponyme en Actionscript 3 qui elle même est normaliser ECMA
 *  Elle permet de créer et distribuer des evenements personnalisés.
 *
 * @note ATTENTION ! :  22/05/09 Damien BENOIT <benoit@benchmark.fr>
 * l'utilisation de cet objet necessite la déclaration dans l'objet fils d'une propriété
 * this._listeEvenenement = {};
 * sans quoi cette liste est mutualisée entre toutes les instances des objets fils resultants
 * ce qui apporte de nombreux bugs possibles, notamment avec l'objPopupFabrique (corrigé en ce sens)
 * il n'y a malheureusement, pour l'instant, aucune meilleur solution que celle-ci.
 */

/**
 * Definition de la classe d'évènement (un bean)
 */
benchmark.framework.util.Event = function(pType) {
	this.type = pType;
	this.id = '';
};

benchmark.framework.util.Event.prototype = {
	type:null,
	target:null,
	currentTarget:null
};

/**
 * la classe EventDispatcher
 */
benchmark.framework.util.EventDispatcher = function() {
	this._listeEvenenement = {};
};

benchmark.framework.util.EventDispatcher.prototype = {

	//_listeEvenenement : {},

	/**
	 * permet d'ajouter un ecouteur pour un evenement donnée au gestionnaire d'evenement
	 * @param pEventType string le type d'evenement ecouté
	 * @param pFunction function l'ecouteur
	 * @return boolean true si l'ecouteur n'est pas déja present et est bien ajouté, false sinon
	 */
	addEventListener:function(pEventType,pFunction){
		if(!this._listeEvenenement[pEventType])this._listeEvenenement[pEventType] = new Array();
		if(!this.hasEventListener(pEventType,pFunction)){
			this._listeEvenenement[pEventType].push(pFunction);
			return true;
		}
		return false;
	},

	/**
	 * permet de supprimer un ecouteur pour un evenement donnée au gestionnaire d'evenement
	 * @param pEventType string le type d'evenement ecouté
	 * @param pFunction (optionnel) function l'ecouteur
	 * @return boolean true si l'ecouteur a bien été supprimé
	 */
	removeEventListener:function(pEventType,pFunction){
		if(this._listeEvenenement[pEventType]){
			if(pFunction){
				var nbElem = this._listeEvenenement[pEventType].length;
				for(var i = 0; i< nbElem; i++){
					if(this._listeEvenenement[pEventType][i]==pFunction){
						this._listeEvenenement[pEventType].slice(i,1);
						return true;
					}
				}
			}else{
				this._listeEvenenement[pEventType] = new Array();
			}
		}else{
			return false;
		}
	},

	/**
	 * permet de diffuser un evenement
	 * @param pEvent Event l'objet Evenement a diffuser
	 */
	dispatchEvent:function(pEvent){
		pEvent.target = this;
		var liste_ecouteur = this._listeEvenenement[pEvent.type];
		if(liste_ecouteur){
			var nbElem = liste_ecouteur.length;
			var next = null;
			for(var i = 0; i< nbElem; i++){
				next = liste_ecouteur[i];
				if(typeof(next)=='function')next.apply(this,[pEvent]);
			}
		}
	},

	/**
	 * permet de verifier la presence d'ecouteur pour un evenement donnée
	 * si pFunction est renseigné, on verifie si l'ecouteur pFunction ecoute l'evenement pEventType
	 * @param pEventType string le type d'evenement ecouté
	 * @param pFunction function (optionnel) l'ecouteur
	 * @return boolean true si il y a des ecouteurs ou si l'ecouteur ecoute effectivement sur l'evenement
	 */
	hasEventListener:function(pEventType,pFunction){
		var liste_ecouteur = this._listeEvenenement[pEventType];
		if(liste_ecouteur && pFunction){
			var nbElem = liste_ecouteur.length;
			for(var i = 0; i< nbElem; i++){
				if(liste_ecouteur[i]==pFunction){
					return true;
				}
			}
		}else{
			return liste_ecouteur && liste_ecouteur.length > 0;
		}
		return false;

	}

};


