(function(){
	// Si les namespaces/classes nécessaires ne sont pas chargées : exception
	if(!window.ev){throw new Error("Le namespace 'ev' doit exister");}
	if(!ev.rjs){throw new Error("Le namespace 'ev.rjs' doit exister");}
	// On s'assure que le namespace ev.meh existe
	if(!ev.meh){ ev.meh={}; }
	//Si la classe ev.meh.StatusTimelineListener est définie on sort
	if(ev.meh.StatusTimelineListener){return;}

	/**
	 * Auditeur de la timeline du status
	 * @param {Object} _statusTimeline
	 * @param {Object} _url
	 * 
	 */
	ev.meh.StatusTimelineListener=function(_statusTimeline, _url) {
	
		
		var timeout=15000;
		var timestamp=new Date().getTime();
		
		var thisStatus=this;


		function callback(r){
			if(r.exception){
				var time = new Date().getTime();
				if(time-timestamp>=timeout){
					ev.log.error("TimeoutException after "+timeout/1000+" seconds !");
					_statusTimeline.removeTimelineListener(thisStatus);
				}
			}			
			else if (r && r.statusTab) {
				// On regarde si tous les partenaires ont finis leur recherche 
				// On parcourt la liste des partenaires et si tous les partenaires ont finis (isSearching=0), 
				// On met la variable finished a 1 (true)
				var statusTab = r.statusTab, finished=1;
				if (!statusTab||statusTab.constructor!==Array){
					ev.log.warn('ev.meh.StatusTimelineListener > onRJSEvent('+!!_e+')> NOT Good : '+statusTab);
					return;
				}
				//FIXME à adapter a l'hotel avant d'enlever les commentaire
//				if(!statusTab.length){
//					ev.log.error("ev.meh.StatusTimelineListener: La requete etat.rjs a retourné un statusTab vide => on relance demarrer.rjs");
//					// on arrete l'interogation automatique de la page d'état de recherche
//					// (cela sera remis en route après le redémarrage de la recherche)
//					_statusTimeline.removeTimelineListener(thisStatus);
//					// on redémarre la recherche à partir du contexte
//					// FIXME à supprimer dés que le listener est bien configuré (le status n'est pas censé connaitre 'ev.mev')
//					ev.meh.Context.lancerRecherche();
//					// on envoi un evenement indiquant l'echec de lecture du Status
//					// (il faut surement relancer la recherche sur cet evenement)
//					fireEvent(thisStatus, listeners, ev.tools.extend({type: ev.me.StatusEventType.READ_ERROR}, ev.me.StatusEvent));
//					return;
//				}
				display.nbPartenairesTotal = statusTab.length;
				for (var i = 0; i < statusTab.length; i++) {
					var idPartenaire = statusTab[i].id;
					var isSearching = statusTab[i].status;					
					if (isSearching) {
						// Au moins un partenaire n'a pas fini sa recherche
						//finished = false;
						finished=0;
						break;
					}
				}
				
				if (finished) {
					// Si la recherche est terminee pour tous les partenaires 
					// alors on arrete le l'interogation automatique de la page getStatusRecherche.jsp qui nous renseigne sur l'etat de la recherche
					_statusTimeline.removeTimelineListener(thisStatus);
					//_statusTimeline.stop();
				}
				
				// Pour chacun des partenaires, on regarde si la recherche est terminee, si c'est le cas, on recupere la liste d'hotel du partenaire
				for (var i = 0; i < statusTab.length; i++) {
					var idPartenaire = statusTab[i].id;
					var isSearching = statusTab[i].status;
					
					//si la recherche pour le partenaire est terminee alors on va recuperer ses resultats
					if (!isSearching) {
						// Si le partenaire est un partenaire qui vient de repondre alors on va recuperer ses resultats
						if (!thisStatus.listePartenairesRepondus["id_" + idPartenaire]) {
							// On stocke l'id du partenaire pour ne pas recuperer une nouvelle fois ces hotels ainsi que le prix le plus bas
							thisStatus.listePartenairesRepondus["id_" + idPartenaire] = 1;  //true
							
							//FIXME inutile car methode surchargée dans recherche.js
							// on lance l'évènement partenaire terminé
							thisStatus.onPartenaireFinished(idPartenaire);
						}
					}
				}
			}
		}
		
		this.listePartenairesRepondus = new Array();
		
		this.throwTimelineEvent = function(timelineEvent){
			ev.requestManager.invokeEra(ev.meh.Context().getRjsLocator(), _url, callback, true);
		};
		
		/**
		 * Méthode à surcharger permettant d'effectuer une tâche
		 * dés qu'un partenaire a renvoyé une réponse.
		 *
		 * @param {Integer} _idPartenaire : identifiant numérique du partenaire
		 */
		this.onPartenaireFinished = function(_idPartenaire){
			// par défaut, rien à faire
		};
		
		_statusTimeline.addTimelineListener(this);
		
	};
	
	// déclaration de l'héritage
	Classe.extend(ev.meh.StatusTimelineListener, ev.time.TimelineListener);
	ev.log.info("ev/meh/StatusTimelineListener.js ok");

})();