

/**
* Fonctions utilisées par le formulaire MEV, ce script est invoqué par form.js
* L'utilisation des calendriers impose aussi l'utilisation de calendar.js et calendar.css
* L'utilisation de la completion impose l'utilisation de completionMEV.js et completionMEV.css
*
* Le formulaire MEV doit contenir imérativement les éléments suivant:
* ATTENTION: Il ne faut pas modifier les id de ces éléments.
*
*   <!-- Les trois input de sélection de type de parcours -->
*   <input id="typeMEVAS" type="radio" value="0" name="type" />
*   <!-- on peut affecter l'attribut checked à n'importe quel de ces trois éléments radio, cela définit le type de parcours choisi par défaut -->
*   <input id="typeMEVAR" type="radio" value="1" name="type" checked="checked" />
*   <input id="typeMEVPC" type="radio" value="2" name="type" />
*
*   <!-- les input de saisie de lieux pour les quatres lieux possibles, un départ et une arrivée, pour l'aller et pour le retour. Chaque
*        champ texte doit être accompagné d'un conteneur de positionnement, et un champ hidden pour la valeur 'data' correspondant au choix de l'internaute.
*   -->
*   <input id="lieuMEVDepartAller" type="text" name="departAller" />
*   <input id="dataMEVDepartAller" type="hidden" name="departAllerData">
*   <div id="propositionsMEVDepartAller"></div>
*   <input id="lieuMEVArriveeAller" type="text" name="arriveeAller" />
*   <input id="dataMEVArriveeAller" type="hidden" name="arriveeAllerData" />
*   <div id="propositionsMEVArriveeAller"></div>
*   <input id="lieuMEVDepartRetour" type="text" name="departRetour" />
*   <input id="dataMEVDepartRetour" type="hidden" name="departRetourData" />
*   <div id="propositionsMEVDepartRetour"></div>
*   <input id="lieuMEVArriveeRetour" type="text" name="arriveeRetour" />
*   <input id="dataMEVArriveeRetour" type="hidden" name="arriveeRetourData" />
*   <div id="propositionsMEVArriveeRetour"></div>
*
*   <!-- les sélecteurs de dates pour l'aller et le retour avec leur icone calendrier associée. Les sélecteurs sont vides (ils ne contiennent qu'une
*        seule option vide, car ils sont calculés pour tenir compte de la date client.
*   -->
*   <select id="jourMEVAller" name="jourAller"><option></option></select>
*   <select id="moisMEVAller" name="moisAller"><option></option></select>
*   <img id="calendrierMEVAllerIcon" src="img/calendar.gif" alt="calendrier" />
*   <select id="jourMEVRetour" name="jourRetour"><option></option></select>
*   <select id="moisMEVRetour" name="moisRetour"><option></option></select>
*   <img id="calendrierMEVRetourIcon" src="img/calendar.gif" alt="calendrier" />
*   <!-- Il faut aussi disposer où l'on souhaite les div contenant les messages d'erreur associés aux sélecteurs de dates.
*        Leur présence est optionnelle, mais préférable si on veut informer l'utilisateur de ses erreurs de manip.
*        Ces messages sont affichés au moment de la validation du formulaire.
*   -->
*   <div id="errorMEVDateAllerErronee" class="errorMessage">La date aller que vous avez d&eacute;finie est erron&eacute;e</div>
*   <div id="errorMEVDateRetourErronee" class="errorMessage">La date retour que vous avez d&eacute;finie est erron&eacute;e</div>
*   <div id="errorMEVDatesInversees" class="errorMessage">La date retour est ant&eacute;rieure &agrave; la date d'aller</div>
*
*   <!-- Les sélecteurs de pax -->
*   <select id="paxMEVAdultes" name="paxAdultes">options de 1 à 9</select>
*   <select id="paxMEVEnfants" name="paxEnfants">options de 0 à 9</select>
*   <select id="paxMEVBebes" name="paxBebes">options de 0 à 9</select>
*   <!-- et le message d'erreur associé -->
*   <div id="errorMEVNbBebes" class="errorMessage">Le nombre de b&eacute;b&eacute;s ne doit pas &ecirc;tre sup&eacute;rieur au nombre d'adultes</div>
*
*   <!-- Et finalement les radio boutons por choisir la classe. Celui qui porte l'attribut checked="checked" indique la classe par défaut -->
*   <input id="classeMEVEco" type="radio" value="1" name="classe" checked="checked" />
*   <input id="classeMEVAff" type="radio" value="3" name="classe" />
*   <input id="classeMEVPre" type="radio" value="2" name="classe" />
*
*   <!-- Pour valider le formulaire il faut un bouton -->
*   <input id="submitMEV" type="submit" value="Valider"/>
*
 * Encapsulation de variables locales (privées).
 */
(function() {
	// Raccourci vers window
	var WIN = this,
			// Raccourci vers window.ev
			EASY = WIN.ev,
			// Raccourci vers window.ev.log
			LOG = EASY && EASY.log, warnMsg = LOG && LOG.warn,
			// Raccourci vers window.ev.dom
			DOM = EASY && EASY.dom,
			// Raccourci vers window.ev.forms.util
			FORMS = EASY && EASY.forms && EASY.forms.util,
			// Raccourci vers fonctions utiles
			getElementById = DOM && DOM.element,
			addClass = DOM && DOM.addClass,
			removeClass = DOM && DOM.removeClass,
			setFieldStyleError = FORMS && FORMS.setFieldError,
			resetFieldStyleError = FORMS && FORMS.resetFieldError,
			capTextField = FORMS && FORMS.capTextField,
			enableInput = WIN.enableInput,
			disableInput = WIN.disableInput,
			isValidDate = WIN.isValidDate,
			createDate = WIN.createDate,
			initJours = WIN.initJours,
			initMois = WIN.initMois,
			addJavascriptToAttribute = WIN.addJavascriptToAttribute,
			autoFillLieuFromUrl = EASY.forms.autoFillLieuFromUrl,
			genericNavigator = WIN.genericNavigator,
			MSIE = WIN.MSIE,
			submitValueSubmitME = WIN.submitValueSubmitME,
			waitValueSubmitME = WIN.waitValueSubmitME,
			// Indique si le formulaire MEV a déjà été setté
			flagInitFormMEV = false,
			allerMEV,
			retourMEV,
			/**
	 * Indique si le formulaire est erronnée.
	 */
			errorMEV,
			errorDestinationsMEV,
			errorDatesMEV,
			JOUR = 24 * 60 * 60 * 1000;

	if (!EASY || !DOM) { throw 'Needs ev.core and ev.dom modules!'; }

	/**
	 * Désactive les options du sélecteur en fonction d'une date de référence.
	 * @param {!{d: !Element, m: !Element}} mySelect groupe de Sélecteurs choisi ("allerMEC" ou "retourMEC").
	 * @param {!Date} myDate Date du selecteur.
	 * @param {!Date} refDate Date minimum.
	 * @param {Boolean} forceClean Optionel, oblige le repositionnement des sélecteurs, utile à l'INIT et pour IE.
	 * @private
	 */
	function limitDateChoices(mySelect,myDate,refDate,forceClean) {
		//console.info("LIMIT",mySelect,myDate,refDate);
		var now = new Date();
		refDate = refDate || now;
		forceClean = forceClean || false;
		var refY = refDate.getFullYear(), refM = refDate.getMonth(), daysForm, monthsForm;
		if (mySelect === allerMEV || mySelect === retourMEV) {
			daysForm = mySelect.d;
			monthsForm = mySelect.m;
		}
		else {return;}
		//if(mySelect===allerMEV){LOG.info(">limitDateChoicesMEV ALLER");}
		//if(mySelect===retourMEV){LOG.info(">limitDateChoicesMEV RETOUR");}
		//LOG.info(">>limitDateChoicesMEV "+myDate.getDate()+" "+myDate.getMonth());
		var cleanSel = false, // supprime les paramètres "disabled", si aucun élément de la liste ne doit être bloqué.
				currentTestedSelectMonth = 0,
				currentTestedSelectYear = 0,
				currentTestedSelectDay = 0,
				currentSelectedOptionMonth,
				currentSelectedOptionDay,
				i, k;
		if (myDate.getMonth() < 9) {currentSelectedOptionMonth = '0' + (myDate.getMonth() + 1) + '/' + myDate.getFullYear();}
		else {currentSelectedOptionMonth = (myDate.getMonth() + 1) + '/' + myDate.getFullYear();}
		if (myDate.getDate() < 10) {currentSelectedOptionDay = '0' + myDate.getDate();}
		else {currentSelectedOptionDay = myDate.getDate() + '';}
		//LOG.info(">>>limitDateChoicesMEV "+currentSelectedOptionDay+" "+currentSelectedOptionMonth+" ");
		for (i = 0; i < monthsForm.options.length; i++)
		{
			monthsForm.options[i].disabled = false;
			removeClass(monthsForm.options[i], 'disabled');
			if (forceClean && monthsForm.options[i].value === currentSelectedOptionMonth) {
				monthsForm.selectedIndex = i;
				//LOG.info(">>>>limitDateChoicesMEV MONTH ok!"+i);
			}
			currentTestedSelectMonth = parseInt(monthsForm.options[i].value.replace(/\/[0-9]{4}$/, ''), 10) - 1;
			currentTestedSelectYear = parseInt(monthsForm.options[i].value.replace(/^[0-9]{2}\//, ''), 10);
			if (currentTestedSelectYear < refY || currentTestedSelectYear === refY && currentTestedSelectMonth < refM)// CURRENT IT YEAR < REF YEAR || CURRENT IT YEAR = REF YEAR & CURRENT IT MONTH < REF MONTH : on cache le mois inaccessible
			{
				monthsForm.options[i].disabled = true;
				addClass(monthsForm.options[i], 'disabled');
				cleanSel = false;
			}
			else if (currentTestedSelectYear === refY && myDate.getFullYear() === refY)// CURRENTYEARSelect = REFYEAR, and ,MYYEAR = REFYEAR
			{
				if (currentTestedSelectMonth === myDate.getMonth() && currentTestedSelectMonth === refM)// CURRENTMONTHSelect == MYMONTH, and ,CURRENTMONTHSelect == REFMONTH
				{
					for (k = 0; k < daysForm.options.length; k++)
					{
						daysForm.options[k].disabled = false;
						removeClass(daysForm.options[k], 'disabled');
						currentTestedSelectDay = parseInt(daysForm.options[k].value, 10);
						if (forceClean && daysForm.options[k].value === currentSelectedOptionDay) {
							daysForm.selectedIndex = k;
							//LOG.info(">>>>>limitDateChoicesMEV DAY ok!"+i);
						}
						if (currentTestedSelectDay === now.getDate() && currentTestedSelectDay <= refDate.getDate() || currentTestedSelectDay < refDate.getDate())// J-0 si RefDate==now, sinon J-1 meme.
						{
							daysForm.options[k].disabled = true;
							addClass(daysForm.options[k], 'disabled');
						}
						cleanSel = true;
					}
				}
			}
		}
		if (!cleanSel)
		{
			for (i = 0; i < daysForm.options.length; i++)
			{
				if (forceClean && daysForm.options[i].value === currentSelectedOptionDay) {
					daysForm.selectedIndex = i;
					//LOG.info(">>>>>limitDateChoicesMEV DAY ok!"+i);
				}
				daysForm.options[i].disabled = false;
				removeClass(daysForm.options[i], 'disabled');
			}
		}
	}

	/**
	 * Initialise les dates par défaut en utilisant l'horloge du client, la règle est la suivante pour la date aller: c'est le
	 * prochain vendredi jusqu'au mercredi, et le vendredi en 8 à partir du jeudi. La date retour est le vendredi suivant
	 * la date aller.
	 * 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
	 *
	 * @param {string=} dateDepartText date aller sous forme de texte (optionnelle ; par défaut new Date()).
	 * @param {string=} dateReturnText date retour (optionnelle).
	 **/
	function initDates(dateDepartText,dateReturnText) {
		//LOG.info("FORM MEV initDates Aller:"+dateDepartText+", Return:"+dateReturnText);
		var jourMEVAller,
				moisMEVAller,
				jourMEVRetour,
				moisMEVRetour,
				jourAller,
				moisAller,
				anneeAller,
				jourRetour,
				moisRetour,
				anneeRetour,
				dateAller,
				dateRetour;
		if (getElementById('jourMEVAller')) {jourMEVAller = getElementById('jourMEVAller');}
		if (getElementById('moisMEVAller')) {moisMEVAller = getElementById('moisMEVAller');}
		if (getElementById('jourMEVRetour')) {jourMEVRetour = getElementById('jourMEVRetour');}
		if (getElementById('moisMEVRetour')) {moisMEVRetour = getElementById('moisMEVRetour');}
		if (!(jourMEVAller && moisMEVAller && jourMEVRetour && moisMEVRetour)) {return;}

		/*Gestion du delta*/
		var now = new Date(),
				day = now.getDay(),
				delta = 5 - day;
		if (delta <= 1) {delta += 7;}

		/* -------------------------------- */
		/* ALLER */
		if (dateDepartText && dateDepartText.match(/[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}/)) {
			jourAller = dateDepartText.replace(/\/[0-9]{1,2}\/[0-9]{4}$/, '');
			moisAller = dateDepartText.replace(/^[0-9]{1,2}\/|\/[0-9]{4}$/g, '');
			anneeAller = dateDepartText.replace(/[0-9]{1,2}\//g, '');
			dateAller = new Date(parseInt(anneeAller, 10), parseInt(moisAller, 10) - 1, parseInt(jourAller, 10));
		}
		else {
			dateAller = new Date();
			dateAller.setTime(now.getTime() + delta * JOUR);
			jourAller = '' + dateAller.getDate();
			if (dateAller.getDate() < 10) {jourAller = '0' + dateAller.getDate();}
			moisAller = '' + (dateAller.getMonth() + 1);
			if (dateAller.getMonth() < 9) {moisAller = '0' + (dateAller.getMonth() + 1);}
			moisAller += '/' + dateAller.getFullYear();
		}
		jourMEVAller.value = jourAller;
		moisMEVAller.value = moisAller;
		allerMEV = {d: jourMEVAller, m: moisMEVAller};
		limitDateChoices(allerMEV, dateAller, now, true);

		/* -------------------------------- */
		/* DERNIER JOUR POSSIBLE DU FORMULAIRE */

		var lastDayOfFormMEV = jourMEVRetour.options[jourMEVRetour.options.length - 1].value,
				lastMonthOfFormMEV = moisMEVRetour.options[moisMEVRetour.options.length - 1].value,
				lMValue = lastMonthOfFormMEV.replace(/\/[0-9]{4}$/g, ''),
				lYValue = lastMonthOfFormMEV.replace(/^[0-9]{1,2}\//g, ''),
				lD = parseInt((lastDayOfFormMEV), 10),
				lM = parseInt((lMValue - 1), 10),
				lY = parseInt(lYValue, 10),
				lastDateOfFormMEV = new Date(lY, lM, lD);

		/* -------------------------------- */
		/* RETOUR */
		if (dateReturnText && dateReturnText.match(/[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}/)) {
			jourRetour = dateReturnText.replace(/\/[0-9]{1,2}\/[0-9]{4}$/, '');
			moisRetour = dateReturnText.replace(/^[0-9]{1,2}\/|\/[0-9]{4}$/g, '');
			anneeRetour = dateReturnText.replace(/[0-9]{1,2}\//g, '');
			dateRetour = new Date(parseInt(anneeRetour, 10), parseInt(moisRetour, 10) - 1, parseInt(jourRetour, 10));
		}
		else {
			dateRetour = new Date();
			dateRetour.setTime(dateAller.getTime() + 7 * JOUR);
			while ((lastDateOfFormMEV - dateRetour) < 0) {dateRetour.setTime(dateRetour.getTime() - JOUR);}// Si RETOUR > LASTDATE, on revient en arrière, jusqu'à la date ALLER, s'il le faut.
			jourRetour = '' + dateRetour.getDate();
			if (dateRetour.getDate() < 10) {jourRetour = '0' + dateRetour.getDate();}
			moisRetour = '' + (dateRetour.getMonth() + 1);
			if (dateRetour.getMonth() < 9) {moisRetour = '0' + moisRetour;}
			moisRetour += '/' + dateRetour.getFullYear();
		}
		/* Si la date de retour proposée est supérieur au dernier jour du formulaire, date RETOUR = date ALLER */
		jourMEVRetour.value = jourRetour;
		moisMEVRetour.value = moisRetour;
		retourMEV = {d: jourMEVRetour, m: moisMEVRetour};
		limitDateChoices(retourMEV, dateRetour, dateAller, true);
	}
	// Fonctions de compatibilité ancien moteurs (v2)
	WIN.initMEVDates = initDates;

	/**
	 * Cette fonction met à jour les champs (enabled ou disabled) et les classes associées des champs de formulaires en
	 * fonction du type sélectionné.
	 **/
	WIN.setMEVType = function() {
		var typeMEVAS = getElementById('typeMEVAS');
		var typeMEVAR = getElementById('typeMEVAR');
		var typeMEVPC = getElementById('typeMEVPC');
		var lieuMEVDepartAller = getElementById('lieuMEVDepartAller');
		var lieuMEVArriveeAller = getElementById('lieuMEVArriveeAller');
		var lieuMEVDepartRetour = getElementById('lieuMEVDepartRetour');
		var lieuMEVArriveeRetour = getElementById('lieuMEVArriveeRetour');
		var jourMEVRetour = getElementById('jourMEVRetour');
		var moisMEVRetour = getElementById('moisMEVRetour');
		var anneeMEVRetour = getElementById('anneeMEVRetour');
		var calendrierMEVAllerIcon = getElementById('calendrierMEVAllerIcon');
		var calendrierMEVRetourIcon = getElementById('calendrierMEVRetourIcon');
		addClass(calendrierMEVAllerIcon, 'calendarEnabled');
		if (typeMEVAS && typeMEVAS.checked) {
			disableInput(lieuMEVDepartRetour);
			disableInput(lieuMEVArriveeRetour);
			disableInput(jourMEVRetour);
			disableInput(moisMEVRetour);
			disableInput(anneeMEVRetour);
			if (lieuMEVDepartRetour) {
				lieuMEVDepartRetour.value = '';
			}
			if (lieuMEVArriveeRetour) {
				lieuMEVArriveeRetour.value = '';
			}
			removeClass(calendrierMEVRetourIcon, 'calendarEnabled');
			addClass(calendrierMEVRetourIcon, 'calendarDisabled');
			if (calendrierMEVRetourIcon) {
				calendrierMEVRetourIcon.style.display = 'none';
			}
		}
		else if (typeMEVAR && typeMEVAR.checked) {
			disableInput(lieuMEVDepartRetour);
			disableInput(lieuMEVArriveeRetour);
			enableInput(jourMEVRetour);
			enableInput(moisMEVRetour);
			enableInput(anneeMEVRetour);
			if (lieuMEVArriveeRetour) {
				lieuMEVDepartRetour.value = lieuMEVArriveeAller.value;
			}
			if (lieuMEVArriveeRetour) {
				lieuMEVArriveeRetour.value = lieuMEVDepartAller.value;
			}
			removeClass(calendrierMEVRetourIcon, 'calendarDisabled');
			addClass(calendrierMEVRetourIcon, 'calendarEnabled');
			if (calendrierMEVRetourIcon) {
				calendrierMEVRetourIcon.style.display = '';
			}
		}
		else if (typeMEVPC && typeMEVPC.checked) {
			enableInput(lieuMEVDepartRetour);
			enableInput(lieuMEVArriveeRetour);
			enableInput(jourMEVRetour);
			enableInput(moisMEVRetour);
			enableInput(anneeMEVRetour);
			removeClass(calendrierMEVRetourIcon, 'calendarDisabled');
			addClass(calendrierMEVRetourIcon, 'calendarEnabled');
			if (calendrierMEVRetourIcon) {
				calendrierMEVRetourIcon.style.display = '';
			}
		}
	};
	/**
	 * Cette fonction va rendre disabled les options de paxMEVBebes qui ne sont pas valables
	 **/
	WIN.setMEVPax = function() {
		//  var paxMEVAdultes=getElementById("paxMEVAdultes"), paxMEVBebes=getElementById("paxMEVBebes"), i;
		// FIXME [ygally] : support des anciens formulaires utilisant les id de pax sans 'MEV'
		var paxMEVAdultes = getElementById('paxMEVAdultes') || getElementById('paxAdultes'),
				paxMEVBebes = getElementById('paxMEVBebes') || getElementById('paxBebes'),
				i;

		for (i = 0; i < paxMEVBebes.options.length; i++) {
			if (paxMEVBebes.options[i].value <= paxMEVAdultes.value) {
				enableInput(paxMEVBebes.options[i]);
			}
			else {
				disableInput(paxMEVBebes.options[i]);
			}
		}
	};
	/**
	 * Recopie les valeurs des lieux aller dans les lieux de retour si on est en aller retour.
	 **/
	WIN.tranfertLieuMEVValueToReturn = function() {
		var typeMEVAR = getElementById('typeMEVAR');
		if (typeMEVAR && typeMEVAR.checked) {
			var lieuMEVDepartAller = getElementById('lieuMEVDepartAller');
			var lieuMEVArriveeAller = getElementById('lieuMEVArriveeAller');
			var lieuMEVDepartRetour = getElementById('lieuMEVDepartRetour');
			var lieuMEVArriveeRetour = getElementById('lieuMEVArriveeRetour');
			if (lieuMEVArriveeRetour && lieuMEVDepartAller) {
				lieuMEVArriveeRetour.value = lieuMEVDepartAller.value;
			}
			if (lieuMEVDepartRetour && lieuMEVArriveeAller) {
				lieuMEVDepartRetour.value = lieuMEVArriveeAller.value;
			}
		}
	};

	/**
	 * FIXME Identique à celle de MEH et MEC (à factoriser)
	 * errorDisplay : Affiche la première erreur qui a été détectée.
	 * @param {Array} el : Tableaux des différents ID du champ d'erreur.
	 * @private
	 */
	function errorDisplay(el, errList) {
		var elt, i, cnt = errList.length;
		for (i = 0; i < cnt; i++) {
			elt = getElementById(errList[i]);
			if (elt) {
				elt.style.display = 'none';
			}
		}
		elt = getElementById(el && el[0]);
		if (elt) {
			elt.style.display = 'block';
		}
	}

	/**
	 * verifyDatesFormMEV : test la validité des champs de dates.
	 * @param {Boolean} isEvent : Définit si l'appel est direct ou provient d'un evenement.
	 * @return {Boolean} "true" si le formulaire est valide.
	 */
	WIN.verifyDatesFormMEV = function(isEvent) {
		/* Permet de déterminer l'élément et la nature de l'évènement */
		var eventTarget = false, currentTarget;
		if (isEvent !== undefined &&
				typeof isEvent !== 'string' &&
				typeof isEvent !== 'boolean') {
			if (!isEvent) {isEvent = WIN.event;}
			if (isEvent.target) {currentTarget = isEvent.target;}
			else if (isEvent.srcElement) {currentTarget = isEvent.srcElement;}
			if (currentTarget && currentTarget.nodeType === 3) {currentTarget = currentTarget.parentNode;}// // Redéfinition de la cible si c'est un noeud texte (cf bug Safari)
			if (currentTarget) {eventTarget = currentTarget.id;}
		}
		else {eventTarget = isEvent || false;}

		LOG.info('formMEV#verifyDatesFormMEV(' + isEvent + '): start...');
		var ADateObj = {d: 'jourMEVAller', m: 'moisMEVAller', err: 'errorMEVDateAllerErronee'},
				RDateObj = {d: 'jourMEVRetour', m: 'moisMEVRetour', err: 'errorMEVDateRetourErronee'},
				reversedDateList = {radio: 'typeMEVAR', err: 'errorMEVDatesInversees'},
				errorsList = [ADateObj.err, RDateObj.err, reversedDateList.err],
				errorsToDisplay = [], isReverted = false, aller, retour, errorDatesMEV = false;
		/**
		 * isValid : test si la date est correctement formatée et si elle est passée.
		 * @param {!string} _d ID selecteur.
		 * @param {!string} _m ID selecteur.
		 * @param {!string} errorEl ID selecteur.
		 * @return {{date: !Date, d: !number, m: !number, y: !number, valid: !boolean}}
		 */
		function isValid(_d,_m,errorEl) {
			var day = parseInt(getElementById(_d).value, 10),
					month = parseInt(getElementById(_m).value.replace(/\/[0-9]{4}$/, ''), 10),
					year = parseInt(getElementById(_m).value.replace(/^[0-9]{2}\//, ''), 10);
			//LOG.info("FORMMEV "+day+"/"+month+"/"+year+" est valide?"+isValidDate(day,month,year));
			if (!isValidDate(day, month, year)) {
				if (!errorDatesMEV) {errorDatesMEV = true;}
				errorsToDisplay.push(errorEl);
				if (day < 10) {day = '0' + day;}
				if (month < 10) {month = '0' + month;}
				return {
					date: createDate(day, month, year),
					d: day,
					m: month,
					y: year,
					valid: false
				};
			}
			if (day < 10) {day = '0' + day;}
			if (month < 10) {month = '0' + month;}
			return {
				date: createDate(day, month, year),
				d: day,
				m: month,
				y: year,
				valid: true
			};
		}
		/**
		 * isDatesReversed : compare les 2 dates : affiche une erreur que pour l'Aller.
		 * @param {!{date: !Date, d: number, m: number, y: number, valid: boolean}} first premier objet date à comparer
		 * @param {!{date: !Date, d: number, m: number, y: number, valid: boolean}} second deuxième objet date à comparer
		 * @param {!string} errorEl : ID selecteur.
		 * @return {boolean} true si les dates sont inversées.
		 */
		function isDatesReversed(first, second, errorEl) {
			if (first.date.getTime() > second.date.getTime()) {
				//LOG.warn("FORMMEV Les Dates sont inversées");
				errorsToDisplay.push(errorEl);
				if (!errorDatesMEV) {errorDatesMEV = true;}
				return true;
			}
			return false;
		}
		//INIT
		var now;
		errorDisplay(errorsToDisplay, errorsList);
		aller = isValid(ADateObj.d, ADateObj.m, ADateObj.err);
		retour = isValid(RDateObj.d, RDateObj.m, RDateObj.err);
		if (getElementById(reversedDateList.radio).checked) {
			if (!errorDatesMEV) {errorDatesMEV = (isReverted = isDatesReversed(aller, retour, reversedDateList.err));}
		}
		if (eventTarget === ADateObj.d || eventTarget === ADateObj.m) {
			if (aller.valid && retour.valid && !isReverted && !errorDatesMEV) {
				initDates(aller.d + '/' + aller.m + '/' + aller.y, retour.d + '/' + retour.m + '/' + retour.y);
				errorDatesMEV = false;
			}
			else if (!aller.valid) {
				now = new Date();
				limitDateChoices(allerMEV, aller.date, now.date);
			}
			else if (!retour.valid || isReverted) {
				initDates(aller.d + '/' + aller.m + '/' + aller.y);
				errorDatesMEV = false;
			}
		}
		else if (eventTarget === RDateObj.d || eventTarget === RDateObj.m) {
			if (aller.valid && retour.valid && !isReverted && !errorDatesMEV) {
				initDates(aller.d + '/' + aller.m + '/' + aller.y, retour.d + '/' + retour.m + '/' + retour.y);
				errorDatesMEV = false;
			}
			else if (!retour.valid || isReverted) {
				limitDateChoices(retourMEV, retour.date, aller.date);
			}
		}
		else {
			if (aller.valid && retour.valid && !isReverted && !errorDatesMEV) {
				initDates(aller.d + '/' + aller.m + '/' + aller.y, retour.d + '/' + retour.m + '/' + retour.y);
				errorDatesMEV = false;
			}
			else if (!aller.valid) {
				now = new Date();
				limitDateChoices(allerMEV, aller.date, now.date);
			}
			else if (!retour.valid || isReverted) {
				limitDateChoices(retourMEV, retour.date, aller.date);
			}
		}

		if (isEvent && errorDatesMEV || errorsToDisplay && errorDatesMEV) {
			errorDisplay(errorsToDisplay, errorsList);
		}
		LOG.info('formMEV#verifyDatesFormMEV(' + isEvent + '): end [error=' + errorDatesMEV + ']');
		return errorDatesMEV;
	};
	/**
	 * verifyDestinationFormMEV : test la validité des champs de destination et de voyageurs.
	 * @param {Boolean} isEvent : Définit si l'appel est direct ou provient d'un evenement.
	 * @return {Boolean} "true" si le formulaire est valide.
	 */
	WIN.verifyDestinationsFormMEV = function(isEvent) {
		LOG.info('formMEV#verifyDestinationsFormMEV(' + isEvent + '): start...');
		var ADestObj = {dep: 'lieuMEVDepartAller', arr: 'lieuMEVArriveeAller', err: 'errorMEVLieuxEgauxAller'};
		var RDestObj = {dep: 'lieuMEVDepartRetour', arr: 'lieuMEVArriveeRetour', err: 'errorMEVLieuxEgauxRetour'};
		var aduBabObj = {a: ['paxMEVAdultes', 'paxAdultes'], b: ['paxMEVBebes', 'paxBebes'], err: 'errorMEVNbBebes'};
		var testDestList = {els: [RDestObj.dep, RDestObj.arr, ADestObj.dep, ADestObj.arr], err: 'errorMEVLieuVide'};
		var inputsList = [RDestObj.dep, RDestObj.arr, ADestObj.dep, ADestObj.arr],
				errorsList = [RDestObj.err, ADestObj.err, testDestList.err, aduBabObj.err],
				errorsToDisplay = [], i, cnt, elt;
		// remise a false
		errorDestinationsMEV = false;
		/**
		 * isRightNbOfBabies : Vérifie s'il n'y a pas plus de bébé(s) que d'adulte(s), si ce n'est pas le cas, push l'erreur.
		 * @param {Array.<string>} listOfAdultsId Tableaux d'ID(s), pour une question de compatibilité.
		 * @param {Array.<string>} listOfBabiesId Tableaux d'ID(s), pour une question de compatibilité.
		 * @param {string} errorEl ID DOMelement.
		 * @return {boolean} 'true' si le nombre de bébé est incorrect, sinon 'false'.
		 */
		function isRightNbOfBabies(listOfAdultsId, listOfBabiesId, errorEl) {
			var adults, babies, cnt;
			cnt = listOfAdultsId.length;
			for (i = 0; i < cnt; i++) {
				adults = getElementById(listOfAdultsId[i]);
				if (adults) { break; }
			}
			cnt = listOfBabiesId.length;
			for (i = 0; i < cnt; i++) {
				babies = getElementById(listOfBabiesId[i]);
				if (babies) { break; }
			}
			if (adults.value < babies.value) {
				errorsToDisplay.push(errorEl);
				return true;
			}
			return false;
		}

		/**
		 * isSamePlace : Vérifie si les 2 champs sont identiques, si c'est le cas, push l'erreur.
		 * @param {string} first ID d'un champ de texte.
		 * @param {string} second ID d'un champ de texte.
		 * @param {string} errorEl ID DOMelement.
		 * @return {boolean} 'true' si les deux sont identiques, sinon 'false'.
		 */
		function isSamePlace(first,second,errorEl) {
			var firstPlace = getElementById(first),
					secondPlace = getElementById(second);
			if (firstPlace && secondPlace && firstPlace.value && secondPlace.value && firstPlace.value === secondPlace.value) {
				setFieldStyleError(firstPlace);
				setFieldStyleError(secondPlace);
				//secondPlace.focus();
				errorsToDisplay.push(errorEl);
				return true;
			}
			return false;
		}

		/**
		 * isEmptyDestination : Pour chaque element, teste s'il est vide, si c'est le cas, push l'erreur.
		 * @param {Array.<string>} elements tableau des ID DOMelement(s) à checker.
		 * @param {string} errorEl ID selecteur.
		 * @return {boolean} true s'il y a une destination vide, sinon false.
		 */
		function isEmptyDestinations(elements, errorEl) {
			var el, i, cnt = elements.length;
			for (i = 0; i < cnt; ++i) {
				el = getElementById(elements[i]);
				if (el && !el.value) {
					setFieldStyleError(el);
					errorsToDisplay.push(errorEl);
					//el.focus();
					return true;
				}
			}
			return false;
		}

		// INIT
		errorDisplay(errorsToDisplay, errorsList);
		//TEST
		cnt = errorsList.length;
		for (i = 0; i < cnt; ++i) {
			elt = getElementById(errorsList[i]);
			if (elt) {
				elt.style.display = 'none';
			}
		}
		cnt = inputsList.length;
		for (i = 0; i < cnt; ++i) {
			elt = getElementById(inputsList[i]);
			if (elt) {
				resetFieldStyleError(elt);
				capTextField(elt, 30);
			}
		}
		WIN.tranfertLieuMEVValueToReturn();
		if (!errorDestinationsMEV) {errorDestinationsMEV = isSamePlace(RDestObj.dep, RDestObj.arr, RDestObj.err);}
		if (!errorDestinationsMEV) {errorDestinationsMEV = isSamePlace(ADestObj.dep, ADestObj.arr, ADestObj.err);}
		if (isEvent) {
			if (!errorDestinationsMEV) {errorDestinationsMEV = isEmptyDestinations(testDestList.els, testDestList.err);}
		}
		if (!errorDestinationsMEV) {errorDestinationsMEV = isRightNbOfBabies(aduBabObj.a, aduBabObj.b, aduBabObj.err);}
		if (isEvent || errorsToDisplay) {
			errorDisplay(errorsToDisplay, errorsList);
		}
		LOG.info('formMEV#verifyDestinationsFormMEV(' + isEvent + '): end [error=' + errorDestinationsMEV + ']');
		return errorDestinationsMEV;
	};
	/**
	 * Cette fonction vérifie la cohérence des données du formulaire MEV 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
	 **/
	WIN.verifyFormMEV = function(isEvent) {
		// INIT
		errorMEV = false;
		LOG.debug('formMEV#verifyFormMEV(' + isEvent + '): start...');
		errorDestinationsMEV = WIN.verifyDestinationsFormMEV(isEvent);
		errorDatesMEV = WIN.verifyDatesFormMEV(isEvent);
		LOG.debug('formMEV#verifyFormMEV(' + isEvent + '): end [error=' + errorDestinationsMEV + ']');
		if (errorDestinationsMEV || errorDatesMEV) {errorMEV = true;}
		return !errorMEV;
	};
	/**
	 * Fonction invoquée par initForm() du script form.js
	 **/
	WIN.initFormMEV = function() {
		if (!flagInitFormMEV) {flagInitFormMEV = true;}
		else {return;}
		var formMEV = getElementById('formMEV');
		if (!formMEV) {
			if (LOG && LOG.error) {
				LOG.error("initFormMEV> Can't find 'formMEV' element!");
			}
			return;
		}
		if (genericNavigator.navigator.id == MSIE) {
			addJavascriptToAttribute(formMEV, 'onsubmit', 'cancelIEEvent();submitFormMEV();');
		}
		else {
			// on retourne 'false' danse tous les cas car il ne faut pas que l'événement remonte
			addJavascriptToAttribute(formMEV, 'onsubmit', 'submitFormMEV();return false;');
		}
		var typeMEVAS = getElementById('typeMEVAS'),
				typeMEVAR = getElementById('typeMEVAR'),
				typeMEVPC = getElementById('typeMEVPC');
		addJavascriptToAttribute(typeMEVAS, 'onclick', 'setMEVType();');
		addJavascriptToAttribute(typeMEVAR, 'onclick', 'setMEVType();');
		addJavascriptToAttribute(typeMEVPC, 'onclick', 'setMEVType();');

		// Ajout des calendriers dynamiques (si les icones sont présentes)
		var jourMEVAller = getElementById('jourMEVAller'),
				moisMEVAller = getElementById('moisMEVAller'),
				jourMEVRetour = getElementById('jourMEVRetour'),
				moisMEVRetour = getElementById('moisMEVRetour'),
				calendrierMEVAllerIcon = getElementById('calendrierMEVAllerIcon'),
				calendrierMEVRetourIcon = getElementById('calendrierMEVRetourIcon'),
				calendrierMEVAller = getElementById('calendrierMEVAller'),
				calendrierMEVRetour = getElementById('calendrierMEVRetour'),
				calendarMEVAller, calendarMEVRetour;

		initJours(jourMEVAller);
		initMois(moisMEVAller);
		initJours(jourMEVRetour);
		initMois(moisMEVRetour);
		var formChangeListener = function(e) {
			if (!e) {e = WIN.event;}
			WIN.verifyDatesFormMEV(e);
		};
		var formClickListener = function() {
			calendarMEVAller.hide('cache ALLER');
			calendarMEVRetour.hide('cache RETOUR');
		};
		if (jourMEVAller && moisMEVAller && calendrierMEVAllerIcon && calendrierMEVAller) {
			try {
				calendarMEVAller = new WIN.Calendar(jourMEVAller, moisMEVAller, calendrierMEVAller, formChangeListener);
				calendrierMEVAllerIcon.onclick = function() {
					calendarMEVAller.clicAction(calendarMEVAller.poolIndex, true);
				};
			}
			catch (e1) {
				LOG.error('initFormMEV> problème de définition du calendrier aller (MEV) : ' + e1);
			}
		}
		if (jourMEVRetour && moisMEVRetour && calendrierMEVRetourIcon && calendrierMEVRetour) {
			try {
				calendarMEVRetour = new WIN.Calendar(jourMEVRetour, moisMEVRetour, calendrierMEVRetour, formChangeListener);
				calendrierMEVRetourIcon.onclick = function() {
					calendarMEVRetour.clicAction(calendarMEVRetour.poolIndex, true);
				};
			}
			catch (e2) {
				LOG.error('initFormMEV> problème de définition du calendrier retour (MEV) : ' + e2);
			}
		}
		jourMEVAller.onchange = formChangeListener;
		moisMEVAller.onchange = formChangeListener;
		jourMEVRetour.onchange = formChangeListener;
		moisMEVRetour.onchange = formChangeListener;
		jourMEVAller.onclick = formClickListener;
		moisMEVAller.onclick = formClickListener;
		jourMEVRetour.onclick = formClickListener;
		moisMEVRetour.onclick = formClickListener;
		// Ajout des des auto completions (si les élémentes de positionnement sont présents, ainsi que les champs hidden data)
		var lieuMEVDepartAller = getElementById('lieuMEVDepartAller'),
				lieuMEVArriveeAller = getElementById('lieuMEVArriveeAller'),
				lieuMEVDepartRetour = getElementById('lieuMEVDepartRetour'),
				lieuMEVArriveeRetour = getElementById('lieuMEVArriveeRetour'),

				dataMEVDepartAller = getElementById('dataMEVDepartAller') || getElementById('iataMEVDepartAller'),
				dataMEVArriveeAller = getElementById('dataMEVArriveeAller') || getElementById('iataMEVArriveeAller'),
				dataMEVDepartRetour = getElementById('dataMEVDepartRetour') || getElementById('iataMEVDepartRetour'),
				dataMEVArriveeRetour = getElementById('dataMEVArriveeRetour') || getElementById('iataMEVArriveeRetour'),

				propositionsMEVDepartAller = getElementById('propositionsMEVDepartAller'),
				propositionsMEVArriveeAller = getElementById('propositionsMEVArriveeAller'),
				propositionsMEVDepartRetour = getElementById('propositionsMEVDepartRetour'),
				propositionsMEVArriveeRetour = getElementById('propositionsMEVArriveeRetour'),

				// Nombre de villes qui vont être présentées dans les listes de propositions
				nombrePropositionsCompletionMEV = 12;
		if (lieuMEVDepartAller && dataMEVDepartAller && propositionsMEVDepartAller) {
			try {
				var mevCplt1 = new WIN.CompletionMEV(lieuMEVDepartAller, dataMEVDepartAller, propositionsMEVDepartAller, nombrePropositionsCompletionMEV, true);
				// Le dernier paramèter active le mode interegogation par ville. => Ajoute un attribut data contenant le data du lieu aux champs texte.
				// Ne change pas le fonctionnel des formulaires de type MEV2
				//        var mevCplt1=new WIN.CompletionMEV(lieuMEVDepartAller,dataMEVDepartAller,propositionsMEVDepartAller,nombrePropositionsCompletionMEV);
				if (!mevCplt1) {
					LOG.error('initFormMEV> problème de définition de la completion MEV.');
				}
			}
			catch (e3) {
				LOG.error('initFormMEV> problème de définition de la completion MEV : ' + e3);
			}
		}
		if (lieuMEVArriveeAller && dataMEVArriveeAller && propositionsMEVArriveeAller) {
			try {
				var mevCplt2 = new WIN.CompletionMEV(lieuMEVArriveeAller, dataMEVArriveeAller, propositionsMEVArriveeAller, nombrePropositionsCompletionMEV, true);
				// Le dernier paramèter active le mode interegogation par ville. => Ajoute un attribut data contenant le data du lieu aux champs texte.
				// Ne change pas le fonctionnel des formulaires de type MEV2
				//var mevCplt2=new WIN.CompletionMEV(lieuMEVArriveeAller,dataMEVArriveeAller,propositionsMEVArriveeAller,nombrePropositionsCompletionMEV);
				if (!mevCplt2) {
					LOG.error('initFormMEV> problème de définition de la completion MEV.');
				}
			}
			catch (e4) {
				LOG.error('initFormMEV> problème de définition de la completion MEV : ' + e4);
			}
		}
		if (lieuMEVDepartRetour && dataMEVDepartRetour && propositionsMEVDepartRetour) {
			try {
				var mevCplt3 = new WIN.CompletionMEV(lieuMEVDepartRetour, dataMEVDepartRetour, propositionsMEVDepartRetour, nombrePropositionsCompletionMEV);
				if (!mevCplt3) {
					LOG.error('initFormMEV> problème de définition de la completion MEV : ');
				}
			}
			catch (e5) {
				LOG.error('initFormMEV> problème de définition de la completion MEV : ' + e5);
			}
		}
		if (lieuMEVArriveeRetour && dataMEVArriveeRetour && propositionsMEVArriveeRetour) {
			try {
				var mevCplt4 = new WIN.CompletionMEV(lieuMEVArriveeRetour, dataMEVArriveeRetour, propositionsMEVArriveeRetour, nombrePropositionsCompletionMEV);
				if (!mevCplt4) {
					LOG.error('initFormMEV> problème de définition de la completion MEV.');
				}
			}
			catch (e6) {
				LOG.error('initFormMEV> problème de définition de la completion MEV : ' + e6);
			}
		}

		//  var paxMEVAdultes=getElementById("paxMEVAdultes"), paxMEVBebes=getElementById("paxMEVBebes");
		// FIXME [ygally] : support des anciens formulaires utilisant les id de pax sans 'MEV'
		var paxMEVAdultes = getElementById('paxMEVAdultes') || getElementById('paxAdultes'), paxMEVBebes = getElementById('paxMEVBebes') || getElementById('paxBebes');

		addJavascriptToAttribute(paxMEVAdultes, 'onchange', 'setMEVPax();');
		addJavascriptToAttribute(paxMEVBebes, 'onchange', 'setMEVPax();');

		// FIXME [ygally] : support des anciens formulaires utilisant un bouton de validation de type='button'
		var submitMEV = getElementById('submitMEV');
		if (submitMEV && submitMEV.type === 'button') {
			addJavascriptToAttribute(submitMEV, 'onclick', 'submitFormMEV();');
		}

		initDates();
		WIN.setMEVType();
		WIN.setMEVPax();
		WIN.verifyFormMEV(false);

		// [bfoucher] : permet de remettre le bouton de recherche du formulaire dans son état initial dans le cas où la page est rechargée
		addJavascriptToAttribute(EASY.dom.tags('BODY')[0], 'onunload', 'resetSubmitMEVButton()');
		flagInitFormMEV = true;
	};

	/**
	 * Initialise les lieux avec un texte par défaut. La définition des paramètres est explicite. Les
	 * paramètres sont optionnels. Si un paramètre est null, il n'est pas traité.
	 **/
	WIN.initMEVLieux = function(lieuDepartAller,lieuArriveeAller,lieuDepartRetour,lieuArriveeRetour) {

		if (lieuDepartAller) {
			getElementById('lieuMEVDepartAller').value = lieuDepartAller;
		}
		if (lieuArriveeAller) {
			getElementById('lieuMEVArriveeAller').value = lieuArriveeAller;
		}
		if (lieuDepartRetour) {
			getElementById('lieuMEVDepartRetour').value = lieuDepartRetour;
		}
		if (lieuArriveeRetour) {
			getElementById('lieuMEVArriveeRetour').value = lieuArriveeRetour;
		}
	};

	/**
	 *Initialise les nb pax. La définition des paramètres est explicite. Les
	 *paramètres sont optionnels. Si un paramètre est null, il n'est pas traité.
	 **/
	WIN.initMEVPax = function(pa, pe, pb) {
		if (pa !== undefined) {
			// FIXME ceci assure la compatibilité ascendante
			(getElementById('paxMEVAdultes') || getElementById('paxAdultes')).value = pa;
			//    getElementById("paxMEVAdultes").value=pa;
		}
		if (pe !== undefined) {
			// FIXME ceci assure la compatibilité ascendante
			(getElementById('paxMEVEnfants') || getElementById('paxEnfants')).value = pe;
			//    getElementById("paxMEVEnfants").value=pe;
		}
		if (pb !== undefined) {
			// FIXME ceci assure la compatibilité ascendante
			(getElementById('paxMEVBebes') || getElementById('paxBebes')).value = pb;
			//    getElementById("paxMEVBebes").value=pb;
		}
	};

	/**
	 *Initialise la classe. La définition des paramètres est explicite. Les
	 *paramètres sont optionnels. Si un paramètre est null, il n'est pas traité.
	 **/
	WIN.initMEVClasse = function(classe) {
		if (classe) {
			switch (classe) {
				case '2':
					getElementById('classeMEVPre').checked = true;
					break;
				case '3':
					getElementById('classeMEVAff').checked = true;
					break;
				//case '1': // par défaut
				//  getElementById('classeMEVEco').checked = true;
				//  break;
				default:
					getElementById('classeMEVEco').checked = true;
					break;
			}
		}
	};

	/**
	 *Initialise le type. La définition des paramètres est explicite. Les
	 *paramètres sont optionnels. Si un paramètre est null, il n'est pas traité.
	 **/
	WIN.initMEVType = function(type) {
		if (type !== null && type !== undefined) {
			switch (type) {
				case '0':
					getElementById('typeMEVAS').checked = true;
					break;
				case '2':
					getElementById('typeMEVPC').checked = true;
					break;
				//case '1': // par défaut
				//  getElementById('typeMEVAR').checked = true;
				//  break;
				default:
					getElementById('typeMEVAR').checked = true;
					break;
			}
		}
	};

	/**
	 * Cette méthode doit correspondre à la soumission
	 * réelle du formulaire.<br>
	 * Elle peut être surchargée si besoin.
	 *
	 * @param {Element} frm Formulaire à soumettre.
	 */
	WIN.doSubmitFormMEV = function(frm) {
		if (frm) {
			LOG.warn('formMEV#doSubmitFormMEV(' + frm.id + '): ancienne soumission de formulaire MEV!!');
			try {
				frm.submit();
			}
			catch (e) {
				LOG.fatal('Erreur à la soumission du formulaire MEV (id=' + frm.id + ') : ' + e);
			}
		}
		// on retourne 'false' dans tous les cas car il ne faut pas que l'événement remonte
		return false;
	};

	var RE_HOST = new RegExp('www[.](easyvoyage[.]com||easyviajar.com||easyviaggio[.]com||easyvoyage[.]co[.]uk||easyvoyage[.]de)');

	/**
	 * Cette fonction vérifie la cohérence des données, et le cas échéant soumet le formulaire formMEV
	 * Elle ajoute la classe wait à submitMEV pour permettre l'affichage d'une image de chargement.
	 * MAJ :
	 * Pour un code plus propre, depuis août 2010, les textes insérés dans une image sont proscrits.
	 * On profite donc de la classe wait pour aligner le texte et non plus pour charger une image de chargement.
	 * la fonction dot3 permet l'affichage des trois petits points après le texte "En cours".
	 *
	 * FIXME :
	 * Comme le changement implique de retoucher au CSS des affiliés (1100 form à vérifier/corriger), il a été décidé
	 * de n'executer ce code que dans l'environnement ESV, ce qui exclu les affiliés.
	 * TODO : Il faudra supprimer le test du "window.location.host" et vérifier les affiliations.
	 **/
	WIN.submitFormMEV = function() {
		LOG.debug('formMEV#submitFormMEV(): Validating...');

		if (!WIN.verifyFormMEV(true)) { return false; }
		LOG.info('formMEV#submitFormMEV(): Validation OK');
		var submitMEV = getElementById('submitMEV');
		addClass(submitMEV, 'wait');
		if (submitMEV.value && RE_HOST.test(WIN.location.host)) {
			EASY.fx.dot3(submitMEV, 'value', waitValueSubmitME);
		}
		LOG.warn('formMEV#submitFormMEV(): Submiting here!!');
		return WIN.doSubmitFormMEV(getElementById('formMEV'));
	};

	WIN.resetSubmitMEVButton = function() {
		var submitMEV = getElementById('submitMEV');
		removeClass(submitMEV, 'wait');
		if (submitMEV.value) {
			if (typeof submitMEV.stopDot3 === 'function') {
				submitMEV.stopDot3(submitValueSubmitME);
			}
			submitMEV.value = submitValueSubmitME;
		}
	};

	WIN.setActionMEV = function(dir) {
		getElementById('formMEV').setAttribute('action', dir);
	};

	WIN.setTargetFormMEV = function(targetForm) {
		getElementById('formMEV').setAttribute('target', targetForm);
	};

	// traductions du paramètre 'depart'
	var MAPPINGS_DEPART = [
		{lang: 'fr_FR', param: 'depart'},
		{lang: 'es_ES', param: 'origen'},
		{lang: 'it_IT', param: 'partenza'},
		{lang: 'en_GB', param: 'departure'},
		{lang: 'de_DE', param: 'abflug'}
	],
			// traductions du paramètre 'arrivee'
			MAPPINGS_ARRIVEE = [
				{lang: 'fr_FR', param: 'arrivee'},
				{lang: 'es_ES', param: 'destino'},
				{lang: 'it_IT', param: 'destinazione'},
				{lang: 'en_GB', param: 'arrival'},
				{lang: 'de_DE', param: 'ankunft'}
			];

	function realReadURL() {
		var clientIdValue = EASY.tools.getParameter('clientId');
		if (clientIdValue) {
			var inputs = EASY.dom.tags('input', getElementById('formMEV')),
					cnt = inputs.length,
					i;
			for (i = 0; i < cnt; ++i) {
				if (inputs[i].name === 'clientId') {
					inputs[i].value = clientIdValue;
					break;
				}
			}
		}

		// FIXME checks de iataMEVDepartAller et iataMEVArriveeAller à supprimer, c'est pour la compatibilité avec les anciens termes 'iata' au lieu de 'data'
		var eltDepartText = getElementById('lieuMEVDepartAller'),
				eltDepartData = getElementById('dataMEVDepartAller') || getElementById('iataMEVDepartAller'),
				eltArriveeText = getElementById('lieuMEVArriveeAller'),
				eltArriveeData = getElementById('dataMEVArriveeAller') || getElementById('iataMEVArriveeAller');

		// Remplissage des champs gérant le lieu de départ (s'il existent)
		if (eltDepartText) {
			autoFillLieuFromUrl(eltDepartText, eltDepartData, MAPPINGS_DEPART, true);
		}

		// Remplissage des champs gérant le lieu d'arrivée (s'il existent)
		if (eltArriveeText) {
			autoFillLieuFromUrl(eltArriveeText, eltArriveeData, MAPPINGS_ARRIVEE, true);
		}
	}

	/**
	 * Cette fonction effectue le préchargement des champs de formulaire du form MEV en fonction
	 * des paramètres d'URL associés.
	 **/
	WIN.readURLMEV = function() {
		// On remplace la fonction pour que le process ne se fasse qu'une fois (en cas d'appel multiple)
		WIN.readURLMEV = function() {
			warnMsg('formMEV#readURLMEV(): URL déjà interprétée!');
		};

		// Première interprétation des paramètres de l'URL
		realReadURL();
	};
}()); // exécution fonction anonyme ici

