// FIXME à mettre ailleurs...
// "Namespace" pour MEH
var MEH={};

// on teste d'abord l'existance du namespace MEH
if(typeof(MEH)=='undefined') throw new Error("Le namespace 'MEH' n'est pas défini!");

/**
 * Namespace "MEH.recherche" pour les recherches MEH
 */
MEH.Recherche={
	/**
	 * Permet de lancer la recherche à partir
	 * du jeu de critères courant de la session.
	 */
	startRecherche: function(){
		MEH.Recherche.startRechercheCommon();
		Classe.checkDefined("GetVilleDbMethod");
		Classe.checkDefined("LauncherMethod");
		// Ajout du timeline listener 'Lancement recherche'
		if(typeof(log)=='function') log("Démarrage recherche...", "debug");
		Context().getTimeline().addTimelineListener(new LauncherMethod(15000, Context().BASE_XML+"/lancementRecherche.jsp", MEH.Recherche.startStatusTimeline, 3));

		// Ajout du timeline listener 'Recup Ville en DB'
		if(typeof(log)=='function') log("Recup de la ville en DB...", "debug");
		Context().getTimeline().addTimelineListener(new GetVilleDbMethod(15000, Context().BASE_XML+"/getVilleBD.jsp", function(){ if(typeof(log)=='function') log("Infos Ville dispos", "info"); }, 3));
	},
	
	/**
	 * Permet de lancer la recherche à partir
	 * du jeu de critères courant de la session.
	 */
	startRechercheME1HWithCritere: function(_critere){
		MEH.Recherche.startRechercheCommon();
		
		// Ajout du timeline listener 'Lancement recherche'
		if(typeof(log)=='function') log("Démarrage recherche...", "debug");
		//Context().getTimeline().addTimelineListener(new LauncherMethod(15000, Context().BASE_XML+"/lancementRecherche.jsp", MEH.Recherche.startStatusTimelineME1H, 3));

		Context().getTimeline().addTimelineListener(new LaunchWithCritere(15000, Context().BASE_XML+"/launchWithCritere.jsp", _critere, MEH.Recherche.startStatusTimelineME1H, 3));


		// Ajout du timeline listener 'Recup Ville en DB'
		//if(typeof(log)=='function') log("Recup de la ville en DB...", "debug");
		//Context().getTimeline().addTimelineListener(new GetVilleDbMethod(15000, Context().BASE_XML+"/getVilleBD.jsp", function(){ if(typeof(log)=='function') log("Infos Ville dispos", "info"); }, 3));
	},
	
	/**
	 * Permet de lancer la recherche à partir
	 * du jeu de critères courant de la session.
	 */
	startRechercheCommon: function(){
		Classe.checkDefined("XHRTimeline");
		
		
	},
	
	/**
	 * Démarrage de la 'timeline Status'
	 */
	startStatusTimeline: function(){
		//MEH.Recherche.startStatusTimelineCommon();
		
		if(typeof(log)=='function') log("Recherche demarrée!", "info");
		setTimeout("Context().getTimeline().addTimelineListener(new GetFirstResults(15000,Context().BASE_XML +'/getFirstResults.jsp', function(){ if(typeof(log)=='function') log('first results', 'info'); }, 3))",1000);
		Classe.checkDefined("StatusTimelineListener");
		Classe.checkDefined("GetInfosHotelPartenaireMethod");
		if(typeof(log)=='function') log("Démarrage de la 'Timeline Status'...", "debug");
		// Timeline pour le status
		var statusTimeline = new Timeline(5000);
		// définition du listener
		var listener=new StatusTimelineListener(45000, Context().BASE_XML+"/getStatusRecherche.jsp", 3);
		listener.onPartenaireFinished=MEH.Recherche.retreiveResultatsPartenaire;
		statusTimeline.addTimelineListener(listener);
		// démarrage de la timeline de vérification de l'état de la recherche
		statusTimeline.start();
		
		var displayTimeline = new Timeline(1000);
		var displayListener = new DisplayTimelineListener(45000, display, listeResultats);
		displayTimeline.addTimelineListener(displayListener);
		displayTimeline.start();
	},
	
	/**
	 * Démarrage de la 'timeline Status' pour ME1H
	 */
	startStatusTimelineME1H: function(){
		//MEH.Recherche.startStatusTimelineCommon();
		
		if(typeof(log)=='function') log("Recherche demarrée!", "info");
		Classe.checkDefined("StatusTimelineListener");
		Classe.checkDefined("GetInfosHotelPartenaireMethod");
		if(typeof(log)=='function') log("Démarrage de la 'Timeline Status'...", "debug");
		// Timeline pour le status
		var statusTimeline = new Timeline(5000);
		// définition du listener
		var listener=new StatusTimelineListener(45000, Context().BASE_XML+"/getStatusRecherche.jsp", 3);
		listener.onPartenaireFinished=MEH.Recherche.retreiveResultatsPartenaireME1H;
		statusTimeline.addTimelineListener(listener);
		// démarrage de la timeline de vérification de l'état de la recherche
		statusTimeline.start();
		
		var displayTimeline = new Timeline(1000);
		var displayListener = new ME1HDisplayTimelineListener(45000, display, listeResultats);
		displayTimeline.addTimelineListener(displayListener);
		displayTimeline.start();
	},
	
	/**
	 * Démarrage de la 'timeline Status'
	 */
	/*startStatusTimelineCommon: function(){
		if(typeof(log)=='function') log("Recherche demarrée!", "info");
		setTimeout("Context().getTimeline().addTimelineListener(new GetFirstResults(15000,Context().BASE_XML +'/getFirstResults.jsp', function(){ if(typeof(log)=='function') log('first results', 'info'); }, 3))",1000);
		Classe.checkDefined("StatusTimelineListener");
		Classe.checkDefined("GetInfosHotelPartenaireMethod");
		if(typeof(log)=='function') log("Démarrage de la 'Timeline Status'...", "debug");
		// Timeline pour le status
		var statusTimeline = new Timeline(5000);
		// définition du listener
		var listener=new StatusTimelineListener(45000, Context().BASE_XML+"/getStatusRecherche.jsp", 3);
		listener.onPartenaireFinished=MEH.Recherche.retreiveResultatsPartenaire;
		statusTimeline.addTimelineListener(listener);
		// démarrage de la timeline de vérification de l'état de la recherche
		statusTimeline.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){
		Context().getTimeline().addTimelineListener(new GetInfosHotelPartenaireMethod(45000, Context().BASE_XML+"/getResultatsPartenaire.jsp?idPartenaire="+_idPartenaire, _idPartenaire, MEH.Recherche.afterResultatsReceived, 3));
	},

	/**
	 * 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){
		Context().getTimeline().addTimelineListener(new GetInfosHotelPartenaireMethod(45000, Context().BASE_XML+"/getResultatsPartenaireME1H.jsp?idPartenaire="+_idPartenaire, _idPartenaire, MEH.Recherche.afterResultatsReceived, 3));
	},
	
	/**
	 * 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
	},

	/**
	 * Permet de recuperer une liste de propositions de lieux en cas d'exception de critères
	 */
	getListeLieux: function(){
		Context().getTimeline().addTimelineListener(new GetPropositionsMethod(3000, Context().BASE_XML+"/getPropositions.jsp", MEH.Recherche.onLieuRetreived, 3));
	},

	/**
	 * 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", "MEH.Recherche.setLieuDataMEH();");
		
		for (var i = propsLieux.childNodes.length-1; i >=0 ; i--) {
			propsLieux.removeChild(propsLieux.childNodes[i]);
		}
		var nbPropositions = _lieux.listeLieux.length;
		if (nbPropositions > 0) {
			document.getElementById("exceptionsCriteres").style.display = "block";
			//Ajouter les nouvelles propositions
			for (i = 0; i < nbPropositions; i++) {
				var lieu = _lieux.listeLieux[i];
				
				var divLieu = document.createElement("option");
				divLieu.value = lieu.getNom() + "|" + lieu.getIataMEH();
				
				var nomLieu = document.createTextNode(lieu.getNom() + " (" + lieu.getPays() + ")");
				divLieu.appendChild(nomLieu);
				var propsLieux = document.getElementById("propsLieux");
				propsLieux.appendChild(divLieu);
			}
			

			var lieuMEH = _lieux.listeLieux[0].getNom();
			var lieuDataMEH = _lieux.listeLieux[0].getIataMEH();
			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);
			
			//alert("setLieuDataMEH  lieu = " + lieu + "  lieuDataMEH = " + lieuDataMEH);return;
			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;
		}
		
	}
};
