(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 du "Status" 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');

})();

