(function(){
	// Si les namespaces/classes nécessaires ne sont pas chargées : exception
	if(!window.ev){throw new Error("Le namespace 'ev' doit exister");}
	// On s'assure que le namespace ev.meh existe
	if(!ev.meh){ ev.meh={}; }
	
	/**
	 * Surcharge de la methode de soumission de formulaire.
	 * @param f : formulaire a soumettre
	 *
	 * Convertir les valeurs du formulaire en criteres de recherche
	 * Puis lancer une timeline setCritere (qui lance la recherche)
	 */
	ev.meh.doSubmitFormMEH3=function(f){
		ev.log.info("Définition des criteres...");
		// définition des criteres de recherche
		var criteres=ev.meh.Context().getCriteres();
		var urlPageResultats="?";
		if(document.getElementById("lieuIataMEH").value!=null && document.getElementById("lieuIataMEH").value!=""){
			criteres.ville=document.getElementById("lieuIataMEH").value;
			urlPageResultats=urlPageResultats+"ville="+document.getElementById("lieuIataMEH").value;
		}
		else{
			criteres.ville=document.getElementById("lieuMEH").value;
			urlPageResultats=urlPageResultats+"ville="+document.getElementById("lieuMEH").value;

		}
		criteres.dateDebut=Date.convertSelectorToStringFr("jourDebutMEH", "moisDebutMEH");
		criteres.dateFin=Date.convertSelectorToStringFr("jourFinMEH", "moisFinMEH");
	
		criteres.chambres=document.getElementById("chambres").value;
		
		
		var eltPaxMEHAdultes=document.getElementById("paxMEHAdultes")||document.getElementById("paxAdultes"),
		eltPaxMEHEnfants=document.getElementById("paxMEHEnfants")||document.getElementById("paxEnfants");
		criteres.paxAdultes=eltPaxMEHAdultes.value;
		criteres.paxEnfants=eltPaxMEHEnfants.value;
		//criteres.paxAdultes=document.getElementById("paxAdultes").value;
		//criteres.paxEnfants=document.getElementById("paxEnfants").value;
		
		criteres.etoiles=document.getElementById("etoiles").value;
	
		urlPageResultats=urlPageResultats+"&dateDebut="+Date.convertSelectorToStringFr("jourDebutMEH", "moisDebutMEH");
		urlPageResultats=urlPageResultats+"&dateFin="+Date.convertSelectorToStringFr("jourFinMEH", "moisFinMEH");
		urlPageResultats=urlPageResultats+"&chambres="+document.getElementById("chambres").value;
		urlPageResultats=urlPageResultats+"&paxAdultes="+eltPaxMEHAdultes.value;
		urlPageResultats=urlPageResultats+"&paxEnfants="+eltPaxMEHEnfants.value;
		urlPageResultats=urlPageResultats+"&etoiles="+document.getElementById("etoiles").value;
		
		//ligne çi dessous à décommenter pour atteindre la page de résultats par url sans mettre les critères dans la sessions
		//window.location='resultsMeh3.jsp'+url;
		
		ev.meh.Context().setCriteres();
	}	
	
	ev.meh.launchSearchWithParams=function(dateDebut, dateFin, ville, paxAdultes, paxEnfants) {
		// définition des criteres de recherche
		var criteres=ev.meh.Context().getCriteres();
		criteres.ville=ville;
		criteres.paxAdultes=paxAdultes;
		criteres.paxEnfants=paxEnfants;
		criteres.dateDebut=dateDebut;
		criteres.dateFin=dateFin;
		ev.meh.Context().setCriteres();
	}	
	

	/**
	 * Initialise une pile de formulaire pour la placer sur le formulaire MEH
	 * Et préparer la soumission du formulaire
	 */
	ev.meh.setFormMEH=function(){
		/**
		 * Surcharge de la méthode de soumission de formulaire.
		 * @param f : formulaire à soumettre
		 */
		doSubmitFormMEH=function(f){
			ev.meh.doSubmitFormMEH3(f);
			return false;
		}
		ev.log.info("Formulaire MEH3 pret !");
	}
	
	/**
	 * expression rationnelle pour extraire le contenu d'une balise XML prï¿½fixï¿½e par CDATA
	 */
	ev.meh.stripCDATA=function(expression){
		var regex = new RegExp(/<!\[CDATA\[([^\]]*)\]\]>/);
		var content = regex.exec(expression);
		return content == null ? expression : content[1];			
	}
	
	
	/**
	* permet d'initailaiser les petits formulaire de ME1H
	**/
	ev.meh.initFormME1H=function(_idItem){
		var formMEH=document.getElementById("formMEH_"+_idItem);
		if(genericNavigator.navigator.id==MSIE) addJavascriptToAttribute(formMEH,"onsubmit","cancelIEEvent();submitFormMEH();");
	    else addJavascriptToAttribute(formMEH,"onsubmit","submitFormMEH();return false;");
		// Ajout des calendriers dynamiques (si les icones sont présentes)
		var jourDebutMEH=document.getElementById("jourDebutMEH_"+_idItem);
		var moisDebutMEH=document.getElementById("moisDebutMEH_"+_idItem);
		var jourFinMEH=document.getElementById("jourFinMEH_"+_idItem);
		var moisFinMEH=document.getElementById("moisFinMEH_"+_idItem);
		var calendrierMEHDebutIcon=document.getElementById("calendrierMEHDebutIcon_"+_idItem);
		var calendrierMEHFinIcon=document.getElementById("calendrierMEHFinIcon_"+_idItem);
		var calendrierMEHDebut=document.getElementById("calendrierMEHDebut_"+_idItem);
		var calendrierMEHFin=document.getElementById("calendrierMEHFin_"+_idItem);
		initJours(jourDebutMEH);
		initMois(moisDebutMEH);
		initJours(jourFinMEH);
		initMois(moisFinMEH);
		if(jourDebutMEH!=undefined&&moisDebutMEH!=undefined&&calendrierMEHDebutIcon!=undefined&&calendrierMEHDebut!=undefined) {
			try{
				var calendarMEHdebut=new Calendar(jourDebutMEH,moisDebutMEH,calendrierMEHDebut);
				addJavascriptToAttribute(calendrierMEHDebutIcon,"onclick","calendarPool.get("+calendarMEHdebut.poolIndex+").show(this);");
			}
			catch(e){
			}
		}
		if(jourFinMEH!=undefined&&moisFinMEH!=undefined&&calendrierMEHFinIcon!=undefined&&calendrierMEHFin!=undefined) {
			try{
				var calendarMEHFin=new Calendar(jourFinMEH,moisFinMEH,calendrierMEHFin);
				addJavascriptToAttribute(calendrierMEHFinIcon,"onclick","calendarPool.get("+calendarMEHFin.poolIndex+").show(this);");
			}
			catch(e){
			}
		}
	
		ev.meh.initME1HDates(_idItem);
		ev.meh.verifyFormME1H(_idItem);
	}
	
	
	/**
	* Initialise les dates par défaut en utilisant l'horloge du client, la règle est la suivante pour la date début: c'est le
	* prochain vendredi jusqu'au mercredi, et le vendredi en 8 à partir du jeudi. La date de fin est le jour suivant
	* la date de début (par défaut on a une nuit).
	* On faire abstraction des dates par défaut précédentes et fixer les dates aller et retour en les passant en paramètre 
	* au format jj/mm/aaaa
	**/
	var JOUR=24*60*60*1000;
	ev.meh.initME1HDates=function(_idItem,dateDebutTexte,dateFinTexte) {
		var jourDebutMEH=document.getElementById("jourDebutMEH_"+_idItem);
		var moisDebutMEH=document.getElementById("moisDebutMEH_"+_idItem);
		var jourFinMEH=document.getElementById("jourFinMEH_"+_idItem);
		var moisFinMEH=document.getElementById("moisFinMEH_"+_idItem);
		if(jourDebutMEH==undefined||moisDebutMEH==undefined||jourFinMEH==undefined||moisFinMEH==undefined) return;
		
		var jourDebut;
		var moisDebut;
		var anneeDebut;
		var jourFin;
		var moisFin;
		var anneeFin;
	
		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);
	
		if(dateDebutTexte!=undefined&&dateDebutTexte.match(/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/)){
			jourDebut=dateDebutTexte.replace(/\/[0-9]{2}\/[0-9]{4}$/,"");
			moisDebut=dateDebutTexte.replace(/^[0-9]{2}\//,"");
		}
		else{
			jourDebut=""+dateDebut.getDate();
			if(dateDebut.getDate()<10) jourDebut="0"+dateDebut.getDate();
			moisDebut=""+(dateDebut.getMonth()+1);
			if(dateDebut.getMonth()<9) moisDebut="0"+(dateDebut.getMonth()+1);
			moisDebut+="/"+dateDebut.getFullYear();
		}
		
		if(dateFinTexte!=undefined&&dateFinTexte.match(/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/)){
			jourFin=dateFinTexte.replace(/\/[0-9]{2}\/[0-9]{4}$/,"");
			moisFin=dateFinTexte.replace(/^[0-9]{2}\//,"");
		}
		else{
			jourFin=""+dateFin.getDate();
			if(dateFin.getDate()<10) jourFin="0"+dateFin.getDate();
			moisFin=""+(dateFin.getMonth()+1);
			if(dateFin.getMonth()<9) moisFin="0"+(dateFin.getMonth()+1);
			moisFin+="/"+dateFin.getFullYear();
		}
		
		jourDebutMEH.value=jourDebut;
		moisDebutMEH.value=moisDebut;
		jourFinMEH.value=jourFin;
		moisFinMEH.value=moisFin;
	}
	
	/**
	* Cette fonction vérifie la cohérence des données du formulaire MEH et active éventuellement les messages d'erreur.
	* Cette fonction retourne aussi un booléen qui indique si le formulaire est sans erreur, donc retourne true si aucune
	* erreur n'est présente, false dans le cas contraire
	**/
	ev.meh.verifyFormME1H=function(_idItem){
		var error=false;
		var errorMEHDateDebutErronee=document.getElementById("errorMEHDateDebutErronee_"+_idItem);
		var jourDebutMEH=document.getElementById("jourDebutMEH_"+_idItem).value;
		var moisDebutMEH=document.getElementById("moisDebutMEH_"+_idItem).value.replace(/\/[0-9]{4}$/,"");
		var anDebutMEH=document.getElementById("moisDebutMEH_"+_idItem).value.replace(/^[0-9]{2}\//,"");
		if(isValidDate(jourDebutMEH,moisDebutMEH,anDebutMEH)){
			if(errorMEHDateDebutErronee!=undefined) errorMEHDateDebutErronee.style.display="none";
		}
		else{
			if(errorMEHDateDebutErronee!=undefined) errorMEHDateDebutErronee.style.display="";
			error=true;
		}
		var errorMEHDateFinErronee=document.getElementById("errorMEHDateFinErronee_"+_idItem);
		var jourFinMEH=document.getElementById("jourFinMEH_"+_idItem).value;
		var moisFinMEH=document.getElementById("moisFinMEH_"+_idItem).value.replace(/\/[0-9]{4}$/,"");
		var anFinMEH=document.getElementById("moisFinMEH_"+_idItem).value.replace(/^[0-9]{2}\//,"");
		if(isValidDate(jourFinMEH,moisFinMEH,anFinMEH)){
			if(errorMEHDateFinErronee!=undefined) errorMEHDateFinErronee.style.display="none";
		}
		else{
			if(errorMEHDateFinErronee!=undefined) errorMEHDateFinErronee.style.display="";
			error=true;
		}
		var errorMEHDatesInversees=document.getElementById("errorMEHDatesInversees_"+_idItem);
		if(!error){
			var dateDebutMEH=createDate(jourDebutMEH,moisDebutMEH,anDebutMEH);
			var dateFinMEH=createDate(jourFinMEH,moisFinMEH,anFinMEH);
			if(dateDebutMEH.getTime()<dateFinMEH.getTime()){
				if(errorMEHDatesInversees!=undefined) errorMEHDatesInversees.style.display="none";
			}
			else{
				if(errorMEHDatesInversees!=undefined) errorMEHDatesInversees.style.display="";
				error=true;
			}
		}
		else{
			if(errorMEHDatesInversees!=undefined) errorMEHDatesInversees.style.display="none";
		}
		
		return !error;
	}

	
	/*
	 *
	 *
	 **/
	
	/**
	 *function urlToIndexedArray() 
	 *converti une URL de la forme xxx.domaine.aaa?param_1=valeur_1&param_i=valeur_i
	 *en un tableau à deux dimension [[param_1, valeur_1], ...,[param_i, valeur_i]]
	 */
	ev.meh.urlToIndexedArray=function(){
		if(window.location.search.substring(1)!=0){
			var url = window.location.search.substring(1).split("&");
			//insuffisant : il faut tester la validité de l'url et "échapper" les variables pour ne pas y insérer du code javascript
			//tester la longueur de l'url, le nombre de paramètre ... avant de faire le traitement çi dessous
			var i = url.length;
			if (i > 7) {//on fixe une limite du nombre de paramètre dans l'url
				return false;
				} // on teste que la table ne soit pas d'une longueur démesurée avant de la traiter
			else {
				var paramIndexedHashMap = new Array();
				while (i--) {
					var attribut = (url[i].split("="))[0];//la valeur a gauche du signe '=' est la clé
					var valeur = (url[i].split("="))[1];//la valeur a droite du signe '=' est la valeur
					paramIndexedHashMap[i] = new Array(attribut, valeur);
				}
				return paramIndexedHashMap;
			}
		}
		else return false;
	};
	
	/**
	 *function indexedArrayToAssociativeArray(paramHashMap) 
	 *transforme un tableau indexé [[param_1, valeur_1], ...,[param_i, valeur_i]] en un tableau associatif {clé : valeur} ou clé = param_i et valeur = valeur_i
	 *les paramètres doublons sont supprimés selon leur ordre d'apparition dans le tableau indexé : seul le doublon à l'index le plus faible est conservé
	 */
	ev.meh.indexedArrayToAssociativeArray=function(paramHashMap){
		if (paramHashMap) {
			var i = paramHashMap.length;
			var uniqueHashMap = new Array();
			while (i--) {
				uniqueHashMap[paramHashMap[i][0]] = paramHashMap[i][1];
				ev.log.info('paramHashMap[i][0] : '+paramHashMap[i][0]+" | paramHashMap[i][1] : "+paramHashMap[i][1]);			}
			return (uniqueHashMap);
		}
		 else {
			 return false;
		 }
	};
	
	/**
	 *function urlToAssociativeArray()
	 *converti une URL de la forme xxx.domaine.aaa?param_1=valeur_1&param_i=valeur_i 
	 *en un tableau associatif {clé : valeur} ou clé = param_i et valeur = valeur_i
	 *les paramètres doublons sont supprimés selon leur ordre d'apparition dans l'url : seul le doublon apparaissant en premier dans l'url est conservé
	 */
	ev.meh.urlToAssociativeArray=function(){
		return ev.meh.indexedArrayToAssociativeArray(ev.meh.urlToIndexedArray());
	};

	
	/**
	 *function testIndexedArray(paramHashMap) 
	 *effectue une série de tests sur les valeurs d'un tableau à deux dimensions [[param_1, valeur_1], ...,[param_i, valeur_i]]
	 *les tests sont appliqués à toutes les valeurs du tableaux, même si il existe des doublons dans les paramètres (par exemple : 
	 *[['param_1', 'hello'],['param_1', 'world']]
	 */
	ev.meh.testUrlMEH=function(paramHashMap){
		if (paramHashMap) {
			var indicesErreur = new Array();
			//une date de fin dans l'URL implique qu'il y ait une date de début :
			if(paramHashMap['dateFin']&&!paramHashMap['dateDebut'])
			{
				indicesErreur.push("date de debut manquante");
			}
			//une date de début dans l'URL implique qu'il y ait une date de fin :
			else if(paramHashMap['dateDebut']&&!paramHashMap['dateFin'])
			{
				indicesErreur.push("date de fin manquante");
			}
			else{
				for (var cle in paramHashMap) {
					switch (cle) {
					case 'lieu':
						//insérer ici les instructions de test sur le champ "ville"
						break;
					case 'paxAdultes':
						//insérer ici les instructions de test sur le champ "paxAdultes"
						break;
					case 'paxEnfants':
						//insérer ici les instructions de test sur le champs "paxEnfants"
						break;
					case 'chambres':
						//insérer ici les instructions de test sur le champ "chambres"
						break;
					case 'etoiles':
						//insérer ici les instructions de test sur le champ "etoiles"
						break;
					case 'dateDebut':
						//insérer ici les instructions de test sur le champ "dateDebut"
						break;
					case 'dateFin':
						//insérer ici les instructions de test sur le champ "dateFin"
						break; 
					default:
						indicesErreur.push("le paramètre "+cle+" n'est pas géré");//si un parametre de l'url n'est pas dans les cas ci dessus alors elle est incorrecte
						break;
					}
				}
			}
			if (indicesErreur.length > 0) {
				ev.log.error(indicesErreur);// si un test n'a pas été effectué avec succès ...
				return false;
			} else {//si tous les tests sont OK ...
				return true;
			}
		}
		else {
			return false;
		}
	};
	

	/**
	 * cette methode va permettre de lancer un recherche a partir des paramètre de l'url
	 */
	ev.meh.launchSearchWithUrlParams=function() {
		
		var urlAssociativeArray = ev.meh.urlToAssociativeArray();
		if(ev.meh.testUrlMEH(urlAssociativeArray))//si l'URL est correcte on créé l'objet critere associé
		{
			var criteres = ev.meh.Context().getCriteres();
			//TODO bloc ci dessous à remplacer par une fonction associativeArrayToCritere()
			criteres.ville = urlAssociativeArray['lieu'];//on passera ici directement l'id de la ville
			criteres.paxAdultes = urlAssociativeArray['paxAdultes'];
			criteres.paxEnfants = urlAssociativeArray['paxEnfants'];
			criteres.chambres = urlAssociativeArray['chambres'];
			criteres.etoiles = urlAssociativeArray['etoiles'];
			
			criteres.dateDebut = urlAssociativeArray['dateDebut'];
			criteres.dateFin = urlAssociativeArray['dateFin'];

			new ev.meh.SetCriteresMethod(ev.meh.Context().getEraPath_recherche('')+"/criteres/creer.rjs?"+criteres.inUrlParams(), criteres, function(){}); // une fois le critère généré on l'injecte  dans la session

			return true;
		}
		else{ //sinon on renvoie une 404
		return false;
		}
	}

	
})();
