(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.Recherche est définie on sort
	if(ev.meh.Recherche){return;}
	
	//ev.meh.Recherche=function(){
	ev.meh.Recherche={
		/**
		 * Permet de lancer la recherche à partir
		 * du jeu de critères courant de la session.
		 */
		startRecherche: function(){
			Classe.checkDefined("ev.meh.GetVilleDbMethod");
			Classe.checkDefined("ev.meh.LauncherMethod");
			// Ajout du timeline listener 'Lancement recherche'
			ev.log.debug("Démarrage recherche...");
			new ev.meh.LauncherMethod(ev.meh.Context().getEraPath_recherche("/demarrer.rjs"), ev.meh.Recherche.startStatusTimeline);
	
			// Ajout du timeline listener 'Recup Ville en DB'
			ev.log.debug("Recup de la ville et de ses POI en DB...");
			new ev.meh.GetVilleDbMethod("/hotels/geo/poi.rjs?idVille="+ev.meh.Context().getIdVille(ev.meh.Context().getCriteres()), function(){ ev.log.info("Infos Ville et Poi dispos"); });
		},
		
		/**
		 * Permet de lancer la recherche à partir
		 * du jeu de critères courant de la session.
		 */
		startRechercheME1HWithCritere: function(_critere){
			// Ajout du timeline listener 'Lancement recherche'
			ev.log.debug("Démarrage recherche...");
			new ev.meh.LaunchWithCritere(ev.meh.Context().getEraPath_recherche("/demarrerME1H.rjs?"+_critere.inUrlParams()), ev.meh.Recherche.startStatusTimelineME1H);
		},
		
		/**
		 * Permet de lancer la recherche à partir
		 * du jeu de critères passé en parametres.
		 */
		startRechercheWithCritere: function(_critere){
			// Ajout du timeline listener 'Lancement recherche'
			ev.log.debug("Démarrage recherche...");
			new ev.meh.LaunchWithCritere(ev.meh.Context().getEraPath_recherche("/demarrerME1H.rjs?"+_critere.inUrlParams()), ev.meh.Recherche.startStatusTimelineME1H);
			
			if(ev.tools.getParameter("dateDebut")){
				_critere.dateDebut = Date.convertStringFrToDate(ev.tools.getParameter("dateDebut"));
				_critere.dateFin = Date.convertStringFrToDate(ev.tools.getParameter("dateFin"));
			}else{
				var now=new Date();
				var day=now.getDay();
				var delta=5-day;
				if(delta<=1) delta+=7;
				var dateDebut=new Date();
				dateDebut.setTime(now.getTime()+delta*JOUR);
				var dateFin=new Date();
				dateFin.setTime(dateDebut.getTime()+1*JOUR);
				_critere.dateDebut = dateDebut;
				_critere.dateFin = dateFin;
			}
			// Ajout du timeline listener 'Recup Ville en DB'
			ev.log.debug("Recup de la ville et de ses POI en DB...");
			new ev.meh.GetVilleDbMethod("/hotels/geo/poi.rjs?idVille="+ev.meh.Context().getIdVille(ev.meh.Context().getCriteres()), function(){ ev.log.info("Infos Ville et Poi dispos"); });
		},
		
		/**
		 * Démarrage de la 'timeline Status'
		 */
		startStatusTimeline: function(){
			ev.log.info("Recherche demarrée !");
			setTimeout("new ev.meh.GetFirstResults(ev.meh.Context().getEraPath_recherche('/firstResults.rjs'), function(){ ev.log.info('FIN first results'); })",1000);
			
			Classe.checkDefined("ev.meh.StatusTimelineListener");
			Classe.checkDefined("ev.meh.GetInfosHotelPartenaireMethod");
			ev.log.debug("Démarrage de la 'Timeline Status'...");
			// Timeline pour le status
			var statusTimeline = new ev.time.Timeline(5000);
			// définition du listener
			var listener=new ev.meh.StatusTimelineListener(statusTimeline, ev.meh.Context().getEraPath_recherche("/etat.rjs"));
			
			listener.onPartenaireFinished=ev.meh.Recherche.retreiveResultatsPartenaire;
			// démarrage de la timeline de vérification de l'état de la recherche
			statusTimeline.start();
			
			var displayTimeline = new ev.time.Timeline(1000);
			var displayListener = new ev.meh.DisplayTimelineListener(45000, display, listeResultats);
			displayTimeline.addTimelineListener(displayListener);
			displayTimeline.start();
		},
		
		/**
		 * Démarrage de la 'timeline Status' pour ME1H
		 */
		startStatusTimelineME1H: function(){
			ev.log.info("Recherche demarrée!");
			Classe.checkDefined("ev.meh.StatusTimelineListener");
			Classe.checkDefined("ev.meh.GetInfosHotelPartenaireMethod");
			ev.log.debug("Démarrage de la 'Timeline Status'...");
			// Timeline pour le status
			var statusTimeline = new ev.time.Timeline(5000);
			// définition du listener
			var listener=new ev.meh.StatusTimelineListener(statusTimeline, ev.meh.Context().getEraPath_recherche("/etat.rjs"));
						
			listener.onPartenaireFinished=ev.meh.Recherche.retreiveResultatsPartenaireME1H;
			// démarrage de la timeline de vérification de l'état de la recherche
			statusTimeline.start();
			
			var displayTimeline = new ev.time.Timeline(1000);
			var displayListener = new ev.meh.ME1HDisplayTimelineListener(45000, display, listeResultats);
			displayTimeline.addTimelineListener(displayListener);
			displayTimeline.start();
		},
			
		/**
		 * Méthode permettant de récupérer les résultats du partenaire donné.
		 *
		 * @param {Integer} _idPartenaire : identifiant numérique du partenaire
		 */
		retreiveResultatsPartenaire: function(_idPartenaire){
			var rjsID='Partenaire'+_idPartenaire;
			new ev.meh.GetInfosHotelPartenaireMethod(ev.meh.Context().getEraPath_recherche("/resultats."+_idPartenaire+".rjs?id="+rjsID), _idPartenaire, ev.meh.Recherche.afterResultatsReceived);
		},
	
		/**
		 * Méthode permettant de récupérer les résultats du partenaire donné pour ME1H
		 *
		 * @param {Integer} _idPartenaire : identifiant numérique du partenaire
		 */
		retreiveResultatsPartenaireME1H: function(_idPartenaire){
// FIXME implementer (en java) un resultatsME1H qui permet de ne récuperer que le necessaire
			var rjsID='Partenaire'+_idPartenaire;
			new ev.meh.GetInfosHotelPartenaireMethod(ev.meh.Context().getEraPath_recherche("/resultats."+_idPartenaire+".rjs?id="+rjsID), _idPartenaire, ev.meh.Recherche.afterResultatsReceived);
		},
		
		/**
		 * Méthode permettant d'effectuer un traitement
		 * après réception des résultats d'un partenaire.
		 *
		 * @param {Integer} _partenaire : identifiant numérique du partenaire ayant renvoyer des résultats
		 * @param {Integer} _nbResultats : nombre de résultats retournés
		 */
		afterResultatsReceived: function(_partenaire, _nbResultats){
			display.nbPartenairesFinis++;// on incrémente le nb de partenaires ayant répondu
			//ev.log.info('Résultat du partenaire n°'+_partenaire+' reçus! ['+display.nbPartenairesFinis+']');
		},
	
		/**
		 * Permet de recuperer une liste de propositions de lieux en cas d'exception de critères
		 */
		getListeLieux: function(){
			Classe.checkDefined("ev.meh.GetPropositionsMethod");
			new ev.meh.GetPropositionsMethod(ev.meh.Context().getEraPath_recherche("/criteres/propositions.rjs"), ev.meh.Recherche.onLieuRetreived);
		},
	
		/**
		 * Fonction s'executant à la fin de la récupération des lieux.
		 *
		 * @param {Object} _lieux : objet Lieux construit au retour de la requete
		 */
		onLieuRetreived: function(_lieux){
			//Effacer la liste precedente de propositions
			var propsLieux = document.getElementById("propsLieux");
			
			addJavascriptToAttribute(propsLieux, "onchange", "ev.meh.Recherche.setLieuDataMEH();");
			
			for (var i = propsLieux.childNodes.length-1; i >=0 ; i--) {
				propsLieux.removeChild(propsLieux.childNodes[i]);
			}
			var nbPropositions = _lieux.lieux.length;
			if (nbPropositions > 0) {
				document.getElementById("exceptionsCriteres").style.display = "block";
				//Ajouter les nouvelles propositions
				for (i = 0; i < nbPropositions; i++) {
					var lieu = _lieux.lieux[i];
					
					var divLieu = document.createElement("option");
					divLieu.value = lieu.getNom() + "|" + lieu.getData();
					
					var nomLieu = document.createTextNode(lieu.getNom() + " (" + lieu.getPays() + ")");
					divLieu.appendChild(nomLieu);
					var propsLieux = document.getElementById("propsLieux");
					propsLieux.appendChild(divLieu);
				}
				
	
				var lieuMEH = _lieux.lieux[0].getNom();
				var lieuDataMEH = _lieux.lieux[0].getData();
				var eltLieuMEH=document.getElementById("lieuMEH");
				if(!eltLieuMEH) throw new Error('Element introuvable : lieuMEH');
				eltLieuMEH.value=lieuMEH;
				var eltLieuDataMEH=document.getElementById("lieuDataMEH");
				if(!eltLieuDataMEH){//support ancienne version du champ de formulaire (iata)
					eltLieuDataMEH=document.getElementById("lieuIataMEH");
				}
				if(!eltLieuDataMEH) throw new Error('Element introuvable : lieuDataMEH');
				eltLieuDataMEH.value=lieuDataMEH;
	
			}
			else {
				document.getElementById("exceptionsCriteres").style.display = "none";
			}
		},
	
		/**
		 * Mise à jour du formulaire
		 *
		 */
		setLieuDataMEH: function(){
			if(document.getElementById("propsLieux") != null){
				var valeur = document.getElementById("propsLieux").value
				var lieuMEH = valeur.substring(0,valeur.indexOf("|"));
				var lieuDataMEH = valeur.substring(valeur.indexOf("|")+1,valeur.length);
				
				var eltLieuMEH=document.getElementById("lieuMEH");
				if(!eltLieuMEH) throw new Error('Element introuvable : lieuMEH');
				eltLieuMEH.value=lieuMEH;
				var eltLieuDataMEH=document.getElementById("lieuDataMEH");
				//FIXME 4 lignes à supprimer si c'est migré
				if(!eltLieuDataMEH){
					//support ancienne version du champ de formulaire (iata)
					eltLieuDataMEH=document.getElementById("lieuIataMEH");
				}
				if(!eltLieuDataMEH) throw new Error('Element introuvable : lieuDataMEH');
				eltLieuDataMEH.value=lieuDataMEH;
			}
			
		}
		
	};
	
})();