

(function () {
	var window = this,
			document = window.document,
			ev = window.ev,
			Date = window.Date,
			addJavascriptToAttribute = window.addJavascriptToAttribute;

	if (!ev) { throw 'mev.searchHistoryManager#<init>: Needs ev.core module!'; }
	if (!ev.rjs) { throw "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() {
			window.Classe.checkDefined('ev.meh.GetVilleDbMethod');
			window.Classe.checkDefined('ev.meh.LauncherMethod');
			// Ajout du timeline listener 'Lancement recherche'
			ev.log.debug('Démarrage recherche...');
			// FIXME LauncherMethod() devrait être une méthode et pas un contructeur
			var launcherMethod = 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...');
			// FIXME GetVilleDbMethod() devrait être une méthode et pas un contructeur
			var getVilleDbMethod = 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...');
			// FIXME LaunchWithCritere() devrait être une méthode et pas un contructeur
			var launchWithCritere = 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...');
			// FIXME LaunchWithCritere() devrait être une méthode et pas un contructeur
			var launchWithCrit = 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 * window.JOUR);
				var dateFin = new Date();
				dateFin.setTime(dateDebut.getTime() + window.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...');
			// FIXME GetVilleDbMethod() devrait être une méthode et pas un contructeur
			var getVilleDbMethod = 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 !');
			window.setTimeout("new ev.meh.GetFirstResults(ev.meh.Context().getEraPath_recherche('/firstResults.rjs'), function(){ ev.log.info('FIN first results'); })", 1000);

			window.Classe.checkDefined('ev.meh.StatusTimelineListener');
			window.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, window.display, window.listeResultats);
			displayTimeline.addTimelineListener(displayListener);
			displayTimeline.start();
		},

		/**
		 * Démarrage de la 'timeline Status' pour ME1H
		 */
		startStatusTimelineME1H: function() {
			ev.log.info('Recherche demarrée!');
			window.Classe.checkDefined('ev.meh.StatusTimelineListener');
			window.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, window.display, window.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,
					// FIXME GetInfosHotelPartenaireMethod() devrait être une méthode et pas un contructeur
					getInfosHotelPartenaireMethod = 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;
			// FIXME GetInfosHotelPartenaireMethod() devrait être une méthode et pas un contructeur
			var getInfosHotelPartenaireMethod = 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) {
			window.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() {
			try {
				window.Classe.checkDefined('ev.meh.GetPropositionsMethod');
				// FIXME GetPropositionsMethod() devrait être une méthode et pas un contructeur
				var getPropositionsMethod = new ev.meh.GetPropositionsMethod(ev.meh.Context().getEraPath_recherche('/criteres/propositions.rjs'), ev.meh.Recherche.onLieuRetreived);
			}
			catch (errorOnGetProps) {
				ev.log.error('meh.recherche#getListeLieux(): Erreur sur récupération de propositions : ' + errorOnGetProps);
			}
		},

		/**
		 * 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
			// FIXME supprimer la compatibilité dés que possible
			var propsLieux = document.getElementById('propsLieuxMEH') || document.getElementById('propsLieux'), i;

			addJavascriptToAttribute(propsLieux, 'onchange', 'ev.meh.Recherche.setLieuDataMEH();');

			for (i = propsLieux.childNodes.length - 1; i >= 0; i--) {
				propsLieux.removeChild(propsLieux.childNodes[i]);
			}
			var nbPropositions = _lieux.lieux.length;
			if (nbPropositions > 0) {
				// FIXME supprimer la compatibilité dés que possible
				(document.getElementById('exceptionsCriteresMEH') || 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);
					propsLieux.appendChild(divLieu);
				}


				var lieuMEH = _lieux.lieux[0].getNom();
				var lieuDataMEH = _lieux.lieux[0].getData();
				var eltLieuMEH = document.getElementById('lieuMEH');
				if (!eltLieuMEH) { throw '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 'Element introuvable : lieuDataMEH'; }
				eltLieuDataMEH.value = lieuDataMEH;

			}
			else {
				// FIXME supprimer la compatibilité dés que possible
				(document.getElementById('exceptionsCriteresMEH') || document.getElementById('exceptionsCriteres')).style.display = 'none';
			}
		},

		/**
		 * Mise à jour du formulaire
		 *
		 */
		setLieuDataMEH: function() {
			// FIXME supprimer la compatibilité dés que possible
			var propsLieux = document.getElementById('propsLieuxMEH') || document.getElementById('propsLieux');
			if (propsLieux) {
				var valeur = 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 '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 'Element introuvable : lieuDataMEH'; }
				eltLieuDataMEH.value = lieuDataMEH;
			}

		}

	};
}());

