/**
 * Fonction anonyme de déclaration de la classe VolSegment.
 * Certaines fonctions ne sont visible que par les
 * classes concernées (déclarées ici).
 * Ce mécanisme de fonction anonyme permet de reproduire
 * un système d'encapsulation digne d'un langage de
 * programmation évolué (comme le Java).
 * Classes et éléments visibles seront stockés dans le
 * namespace 'ev.rjs'.
 */
(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.tools){throw new Error("Le namespace 'ev.tools' doit exister");}
	// On s'assure que le namespace ev.mev existe
	if(!ev.mev){ ev.mev={}; }
	// Si la classe ev.mev.VolNew est déjà déclarée, on sort
	if(ev.mev.VolNew){return;}
	if(!ev.lang){throw new Error("Le namespace 'ev.lang' doit exister");}
	if(!ev.lang.mapper){throw new Error("L'objet 'ev.lang.mapper' doit exister");}

	/**
	 * Liste des propriétés utilisable sur les objets VolNew.
	 * FIXME: pour l'instant les champs suivant ne sont pas setté dans le rjs. Certains ($) peuvent être déduit facilement des données récupérés
	 * pubDate
	 * axe ($)
	 * partenaire
	 */
	var PROPERTIES=[
		'id',
		'ukey',
		'pubDate',
		'axe',		
		'prix',
		'prixInt',
		'prixValue',
		'idPartenaire',
		'partenaire',
		'codeCompagnie',
		'urlInfos',
		'idTrajetAR',
		'aeroports'		
	],
	PartenairesImagesPath = 'http://img.easyvoyage.com/logos/partenaires_63x20/',
	PartenairesImagesExt = '.png',
	
	/**
	 * Raccourci vers le mapper de traductions.
	 */
	elm=ev.lang.mapper,
	/**
	 * Raccourci vers les traductions de la page de résultats.
	 */
	results=ev.lang.mev&&ev.lang.mev.results||{},

	/**
	 * Expression régulière permettant d'interpréter un vol
	 * sous forme de clé unique (chaine de caractères).<br>
	 * Contient 8 groupes :<br>
	 *  - $1: id partenaire<br>
	 *  - $2: prix en centimes<br>
	 *  - $3 à $8: 6 segments de vol
	 */
	REGEXP_VOL_UKEY=(function (){ // tech de "closure"
		var p='([0-9]+),([0-9]+)',
		PAT_SEG='(.*)',
		SEP_SEG=';',
		n=6;
		while(n--){
			p+=SEP_SEG+PAT_SEG;
		}
		return new RegExp(p);
	}());
	
	//TODO: à utiliser pour éviter de recalculer à chaque fois le nombre d'escales
	/** @see getNbSegmentsAller	 */
	//var nbSegmentsAller;
	/** @see getNbSegmentsRetour	 */
	//var nbSegmentsRetour;

	/**
	 * Méthode facilitant la création d'accesseurs.
	 * @param {Object} _object : l'objet pour lequel il faut créer des accesseurs
	 * @param {Object} _property : propriété nécessitant des accesseurs
	 */
	function createAccessors(_object, _property){
		var tmpP=_property.capitalize();
		/** getter */
		_object['get'+tmpP]=function(){
			return _object[_property];
		};
		/** setter */
		_object['set'+tmpP]=function(v){
			_object[_property]=v;
		};
		//ev.log.warn('property "'+_property+'" ok : get'+tmpP+'() / set'+tmpP+'(v)');
	}

	/**
	 * Parcours le tableau array et test si un element à une propriété iata égale au paramètre iata de la fonction. 
	 * @param {Object} array
	 * @param {Object} iata
	 */
	function isEscaleInArray(array,iata) {
		if(!array || !iata) {
			return false;
		}
		for(var i=0;i<array.length;i++) {
			if(array[i].iata && array[i].iata==iata ) {
				return true;
			}
		}
		return false;			
	}

	/**
	 * Retourne le nom de l'aéroport du code donné.
	 * @param {String} c : code IATA de l'aeroport recherché
	 */
	function getNomAeroport(c){			
		/** Raccourci vers contexte MEV s'il existe. */
		var ctv=ev.mev.Context,
		/** Raccourci vers le tableau d'aéroports du contexte MEV s'il existe. */
		aps=ctv&&ctv.aeroports;
		if(!aps){
			ev.log.info('mev.vol._getNomAeroport(): tableau d\'aéroports non défini');
			return '';
		}
		if(!c||!aps[c]){
			ev.log.warn('mev.vol._getNomAeroport(): code aéroport inconnu \''+c+'\'');
			return '';
		}	
		return aps[c].nom||'';
	}

	/**
	 * Retourne le nom de la ville de l'aéroport du code donné.
	 * @param {String} c : code IATA de l'aeroport recherché
	 */
	function getNomVille(c){
		/** Raccourci vers contexte MEV s'il existe. */
		var ctv=ev.mev.Context,
		/** Raccourci vers le tableau d'aéroports du contexte MEV s'il existe. */
		aps=ctv&&ctv.aeroports;
		if(!aps) {
			ev.log.info('mev.vol._getNomVille(): tableau d\'aéroports non défini');
			return '';
		}
		if(!c||!aps[c]){
			ev.log.warn('mev.vol._getNomVille(): code aéroport inconnu \''+c+'\'');
			return '';
		}	
		return aps[c].nomVille||'';
	}

	/**
	 * Constructeur simple sans paramètre.
	 * Il initialise les getters/setters des
	 * propriétés du VolSegment.
	 * @see createAccessors(_object, _property)
	 */
	ev.mev.VolNew=function(){
		var propCnt=PROPERTIES.length;
		for(var i=0; i<propCnt; ++i){
			createAccessors(this, PROPERTIES[i]);
		}	
		this.segment=[null, null, null, null, null, null];

		/**
		 * @return un chaine vide ('') si ce vol contient une
		 *   partie retour et 'true' sinon
		 */
		this.getAS=function (){
			return !this.segment[ev.mev.TypeVolSegment.RETOUR_SEGMENT1]||'';
		};

		/**
		 * @return 'true' si ce vol contient une partie retour
		 *   et 'false' sinon
		 */
		this.hasRetour=function (){
			return !!this.segment[ev.mev.TypeVolSegment.RETOUR_SEGMENT1];
		};

		/**
		 * Ajoute un segment au vol. Si le type de segment existe déjà dans le vol, il est écrasé
		 * @param {ev.mev.VolSegment} volSegment
		 * @param {Number} typeVolSegment
		 */
		this.addSegment=function(volSegment, typeVolSegment){
			if(!volSegment){return;}
			/*if(typeof(volSegment)!=="ev.mev.VolSegment"){
				ev.log.error("ev.mev.VolNew#addSegment: le paramètre volSegment de type "+typeof(volSegment)+" doit être de type ev.mev.VolSegment");
			}*/
			if(typeVolSegment<0||typeVolSegment>5){
				ev.log.error("ev.mev.VolNew#addSegment: le paramètre typeVolSegment="+typeVolSegment+" doit être compris entre 0 et 5 inclus");
			}
			this.segment[typeVolSegment]=volSegment;
			this.segment[typeVolSegment].className='escale';		// TODO Vérifier l'utilité de cette déclaratation																	
		};
	};
	
	/**
		 * 
		 * @param {Object} prix
		 */
		function formatPrixLang(prix) {
			var out='';
			if(elm.ifdef(results.monnaiePrefixe) && elm.ifdef(results.monnaiePrefixe).length>0) {					
					return elm.ifdef(results.monnaiePrefixe) +prix;
				}else if(elm.ifdef(results.monnaieSuffixe) && elm.ifdef(results.monnaieSuffixe).length>0) {						
					return prix +elm.ifdef(results.monnaieSuffixe);
				}else {				
					return prix;					
				}		
		}
	
	
	/**
	 * Définition des autres méthodes de la classe Vol.
	 */
	ev.mev.VolNew.prototype={
		/**
		 * Retourne le nom du partenaire proposant le vol.
		 * Le tableau de  correspondance situé dans ev.mev.Context
		 * (raccourci 'prs') est utilisé afin de retrouvé le nom
		 * en fonction de l'id du partenaire.
		 * @return le nom du partenaire (ou une chaine vide si non
		 *   disponible)
		 */
		getPartenaireNom: function (){
			/** Raccourci vers contexte MEV s'il existe. */
			var ctv=ev.mev.Context,
			/** Raccourci vers le tableau de partenaires du contexte MEV s'il existe. */
			prs=ctv&&ctv.partenaires;
			return prs&&prs[this.idPartenaire]||'';
		},

		/**
		 * Retourne le chemin de l'image corespondant partenaire proposant le vol.
		 */
		getPartenaireImg: function (){
			return PartenairesImagesPath+this.idPartenaire+PartenairesImagesExt;
		},

		/**
		 * Retourne le prix du vol sans les encodages HTML de monnaie.
		 */
		getPrixPlainText: function (){
			if(typeof(this.prix)==='string'){
				return this.prix.replace('&euro;', "\u20ac");
			}
			return this.prix;
		},


		/***
		 * Renvoi le prix moyen par personne pour le vol sans le signe euro. Se base sur l'attribut  du Vol.
		 * Le calcul n'est fait qu'une seule fois et est stocké dans la variable d'instance prixMoyen. Si prixMoyen est déja 
		 * initialisé on le renvoi directement sans refaire le calcul.
		 * On considére tous les types de passagers comme étant égaux. 1 adulte = 1 enfant = 1 bébé.
		 * Ce qui donne: prixMoyen = prixTotal / ( nbAdulte + nbenfant + nbBB ).
		 * Info : The isNaN() function determines whether a value is an illegal number (Not-a-Number).
		 * 	return  TRUE if is not a number, and false if is a number. 
		 */
		getPrixMoyen:function() {			
		//	if(this.prixMoyen && !isNaN(this.prixMoyen) ) {return this.prixMoyen;}			
			/** Raccourci vers contexte MEV s'il existe. */
			var ctv=ev.mev.Context,
			crit = ctv&&ctv.getCriteres();
			if(!crit) {ev.log.warn('VolNex.getPrixMoyen.getPrixMoyen_ev.mev.Context.getCriteres()_undefined');return;}
			var nbPassager = 0;
			if(crit.paxAdultes && !isNaN(crit.paxAdultes)){nbPassager+= parseInt(crit.paxAdultes,10);}
			if(crit.paxEnfants && !isNaN(crit.paxEnfants)){nbPassager+= parseInt(crit.paxEnfants,10);}
			if(crit.paxBebes && !isNaN(crit.paxBebes)){nbPassager+=parseInt(crit.paxBebes,10);}		
			if(!nbPassager>0) {ev.log.warn('VolNex.getPrixMoyen.getPrixMoyen_nbPassager_undefined');return;}						
			this.prixMoyen = ( this.prixValue / nbPassager );
			this.prixMoyen = parseInt(this.prixMoyen + 0.5,10); // Equal to Math.floor method used on JAVA SERVER SIDE
			  							
			return this.prixMoyen;			
		},
		/**
		 * 
		 */
		getPrixMoyenLang:function() {		
		 var prixInt=this.getPrixMoyen();
		 return formatPrixLang(prixInt);
		},

		/**
		 * retourne le nombre de segment aller 
		 */
		getNbSegmentsAller:function(){
			//FIXME[poblin]: éviter de recalculer le nombre de segment si on a déjà fait le calcul pour le vol
			/*if(nbSegmentsAller){
				ev.log.warn("ev.mev.VolNew#getNbSegmentsAller: "+nbSegmentsAller);
				return nbSegmentsAller;
			}*/ 
			if(!this.segment[ev.mev.TypeVolSegment.ALLER_SEGMENT1]){
				// ne devrait jamais se produire
				return 0;
			}
			if(!this.segment[ev.mev.TypeVolSegment.ALLER_SEGMENT2]){
				return 1;
			}
			if(!this.segment[ev.mev.TypeVolSegment.ALLER_SEGMENT3]){
				return 2;
			}
			return 3;
		},
		
		/**
		 * retourne le nombre de segment retour 
		 */
		getNbSegmentsRetour:function(){
			if(!this.segment[ev.mev.TypeVolSegment.RETOUR_SEGMENT1]){
				// si c'est un aller simple seulement
				return 0;
			}
			if(!this.segment[ev.mev.TypeVolSegment.RETOUR_SEGMENT2]){
				return 1;
			}
			if(!this.segment[ev.mev.TypeVolSegment.RETOUR_SEGMENT3]){
				return 2;
			}
			return 3;
		},

		/**
		 * retourne le nombre d'escale sur l'ensemble du vol=nombre de stop
		 */
		getNbEscales:function(){
			if(this.getNbSegmentsRetour() && this.getNbSegmentsRetour() >0) {
				return this.getNbSegmentsAller()+this.getNbSegmentsRetour()-2;	
			} else {
				return this.getNbSegmentsAller()-1;
			}
			
		},
		
		/**
		 * retourne le nombre d'escale au sens des filtres
		 * 0 escale=direct à l'aller comme au retour
		 * 1 escales=1 escales à l'aller et/ou au retour
		 * 2 escales=2 escales à l'aller et/ou au retour
		 */
		getNbEscalesFiltre:function(){
			//sans escale	// ATTENTION : nb seg retour === 0 si aller simple
			if(this.getNbSegmentsAller()===1 && this.getNbSegmentsRetour()<=1){
				return 0;
			}
			//avec 1 escale (au sens des specifications)
			if(this.getNbSegmentsAller()===2 || this.getNbSegmentsRetour()===2){
				return 1;
			}
			//avec 2 escale (au sens des specifications)
			if(this.getNbSegmentsAller()===3 || this.getNbSegmentsRetour()===3){
				return 2;
			}
			return 0;
		},
		
		/**
		 * 
		 */
		getNbEscalesAller:function() {
			return this.getNbSegmentsAller()-1;
		},
		
		/**
		 * 
		 */
		getNbEscalesAllerStr:function() {
			var nbEscales = this.getNbEscalesAller();
			if(nbEscales > 1) {
				var str = nbEscales + elm.ifdef(results.spaceEscales);
				return str;
			}					
			if(!nbEscales){				
				return elm.ifdef(results.direct);
			}			
			if(nbEscales === 1){				
				return elm.ifdef(results.escale1);
			}
		},				
		/**
		 * 
		 */
		getNbEscalesRetour:function() {
			return Math.max(0, this.getNbSegmentsRetour()-1);
		},
		/**
		 * 
		 */
		getNbEscalesRetourStr:function(){
			if(!this.hasRetour()){
				return '';
			}
			var nbEscales = this.getNbEscalesRetour();
			if(nbEscales > 1) {
				var str = nbEscales + elm.ifdef(results.spaceEscales);
				return str;
			}					
			if(!nbEscales){				
				return elm.ifdef(results.direct);
			}			
			if(nbEscales === 1){				
				return elm.ifdef(results.escale1);
			}
		},
			
		/**
		 * retourne le code aéroport du lieu de départ aller
		 */
		getCodeAeroportDepartAller:function(){
			return this.segment[ev.mev.TypeVolSegment.ALLER_SEGMENT1].codeAeroportDepart;
		},
		
		/**
		 * retourne le code aéroport du lieu d'arrivée aller
		 */
		getCodeAeroportArriveeAller:function(){			
			return this.segment[this.getNbSegmentsAller()-1].codeAeroportArrivee;
		},
		
		/**
		 * retourne le code aéroport du lieu d'arrivée aller
		 */
		getCodeAeroportDepartRetour:function(){		
			return this.hasRetour()&&this.segment[ev.mev.TypeVolSegment.RETOUR_SEGMENT1].codeAeroportDepart||'';
		},
		
		/**
		 * retourne le code aéroport du lieu d'arrivée retour
		 */
		getCodeAeroportArriveeRetour:function(){
			return this.hasRetour()&&this.segment[this.getNbSegmentsRetour()+2].codeAeroportArrivee||'';
		},
		
		/**
		 * retourne la date départ aller
		 */
		getDateDepartAller:function(){
			return this.segment[ev.mev.TypeVolSegment.ALLER_SEGMENT1].dateDecollage;
		},
		/**
		 * retourne la date départ aller (format dd/mm)
		 */
		getDateDepartAllerDDMM:function(){
			return this.segment[ev.mev.TypeVolSegment.ALLER_SEGMENT1].dateDecollage.substring(0,5);
		},
		
		/**
		 * retourne la date arrivée aller
		 */
		getDateArriveeAller:function(){
			return this.segment[this.getNbSegmentsAller()-1].dateAtterissage;
		},
		
		/**
		 * retourne la date départ retour
		 */
		getDateDepartRetour:function(){
			return this.hasRetour()&&this.segment[ev.mev.TypeVolSegment.RETOUR_SEGMENT1].dateDecollage||'';
		},
		/**
		 * retourne la date départ retour (format dd/mm)
		 */
		getDateDepartRetourDDMM:function(){
//			ev.log.warn("ev.mev.VolNew - "+this.segment[ev.mev.TypeVolSegment.RETOUR_SEGMENT1]);
			return this.hasRetour()&&this.segment[ev.mev.TypeVolSegment.RETOUR_SEGMENT1].dateDecollage.substring(0,5)||'';
		},
		
		/**
		 * retourne la date arrivée aller
		 */
		getDateArriveeRetour:function(){
			return this.hasRetour()&&this.segment[this.getNbSegmentsRetour()+2].dateAtterissage||'';
		},
		
		/**
		 * retourne l'horaire du départ aller
		 */
		getHoraireDepartAller:function(){
			return this.segment[ev.mev.TypeVolSegment.ALLER_SEGMENT1].heureDecollage;
		},
		
		/**
		 * retourne l'horaire de l'arrivée aller
		 */
		getHoraireArriveeAller:function(){
			return this.segment[this.getNbSegmentsAller()-1].heureAtterissage;
		},
		
		/**
		 * retourne l'horaire du départ retour
		 */
		getHoraireDepartRetour:function(){
			return this.hasRetour()&&this.segment[ev.mev.TypeVolSegment.RETOUR_SEGMENT1].heureDecollage||'';
		},
		
		/**
		 * retourne l'horaire de l'arrivée retour
		 */
		getHoraireArriveeRetour:function(){
			return this.hasRetour()&&this.segment[this.getNbSegmentsRetour()+2].heureAtterissage||'';
		},
		
		/**
		 * retourne un tableau regroupant l'ensemble des codes compagnie des segments constituant le vol
		 */
		getCompagnies:function(){
			output=[];
			for(var i=0;i<this.segment.length;i++){
				if(this.segment[i]){
					output.push(this.segment[i].codeCompagnie);
				}
			}			
			return output;
		},
		
		/**
		 * retourne un tableau regroupant l'ensemble des noms des compagnies des segments constituant le vol
		 */
		getCompagniesNom:function(){
			output=[];
			for(var i=0;i<this.segment.length;i++){
				if(this.segment[i]){
					output.push(this.segment[i].getNomCompagnie());
				}
			}			
			return output;
		},
		
		/**
		 * retourne le nom de la compagnie du vol (celle du 1er segment)
		 */
		getCompagnieCode:function(){
			return this.segment[0].codeCompagnie;
		},
		
		/**
		 * retourne le nom de la compagnie du vol (celle du 1er segment)
		 */
		getCompagnieNom:function(){
			return this.segment[0].getNomCompagnie();
		},
		
		/**
		 * Retourne le chemin de l'image corespondant à la compagnie du vol (celle du 1er segment)
		 * plus utilisé dans template resultat.. vérifier ailleurs et eventuellement supprimer
		 */
		getCompagnieImg:function(){
			if(!this.codeCompagnie){
				this.codeCompagnie=this.getCompagnies()[0];
			}
//			return "http://img.easyvoyage.com/logos/compagniesAeriennes/"+this.codeCompagnie+".gif";
			return "http://img.easyvoyage.com/logos/compagniesAeriennes_32x22/"+this.codeCompagnie+".gif";
		},
		
		/**
		 * Retourne le chemin de l'image corespondant à la compagnie du vol (celle du 1er segment)
		 * pour la matrice.
		 */
		getCompagnieImgMatrix:function(){
			if(!this.codeCompagnie){
				this.codeCompagnie=this.getCompagnies()[0];
			}
			return "/base/imgs/logos/compagniesAeriennes/"+this.codeCompagnie+".gif";
		},
		

		/**
		 * retourne le nom de l'aéroport du lieu de départ aller
		 */
		getNomAeroportDepartAller:function(){			
			return getNomAeroport(this.getCodeAeroportDepartAller());
		},
		
		/**
		 * retourne le nom de l'aéroport du lieu de départ aller
		 */
		getNomAeroportArriveeAller:function(){			
			return getNomAeroport(this.getCodeAeroportArriveeAller());
		},
		
		/**
		 * retourne le nom de l'aéroport du lieu de départ aller
		 */
		getNomAeroportDepartRetour:function(){
			return getNomAeroport(this.getCodeAeroportDepartRetour());
		},
		
		/**
		 * retourne le nom de l'aéroport du lieu de départ aller
		 */
		getNomAeroportArriveeRetour:function(){
			return getNomAeroport(this.getCodeAeroportArriveeRetour());
		},
	
		getNomVilleDepartAller:function(){
			return getNomVille(this.getCodeAeroportDepartAller());
		},
		
		getNomVilleDepartRetour:function() {
			return getNomVille(this.getCodeAeroportDepartRetour());
		},
		
		getNomVilleArriveeRetour:function() {
			return getNomVille(this.getCodeAeroportArriveeRetour());
		},
		
		getNomVilleArriveeAller:function() {
			return getNomVille(this.getCodeAeroportArriveeAller());
		},
		

		
		/**
		 *  renvoi la duree du vol. Format du retour : hh:mm.
		 *  exemple : 1h25
		 */
		getDureeVolAller:function() {
			if(this.segment[0].duree == '00:00') {
				return '-';
			} else {
				return this.segment[0].duree;	
			}					
		},
		/**
		 * 
		 * @param {Object} duree
		 */
		setDureeVolAller:function(duree) {
			this.segment[0].duree=duree;													
		},		
		/**Renvoi true si la propriété est definie**/
		isDureeVolAllerDefined:function() {
			if(this.segment[0].duree == '00:00') {
				return false;
			} else {
				return true;	
			}
		},
		/**
		 * 
		 */
		getDureeVolAllerTitle:function() {
			if(this.segment[0].duree == '00:00'){
				return elm.ifdef(results.spaceDuree);
			} else {
				return elm.ifdef(results.duree);
			}
		},
					
		/**
		 * 
		 */
		getDureeVolRetour:function() {
			if(!this.segment[3]||this.segment[3].duree == '00:00') {
				return '-';
			} else {
				return this.segment[3].duree;	
			}											
		},
		
		setDureeVolRetour:function(duree) {
			this.segment[3].duree=duree;													
		},
		
		/**Renvoi true si la propriété est definie**/
		isDureeVolRetourDefined:function() {
			if(this.segment[3].duree == '00:00') {
				return false;
			} else {
				return true;	
			}
		},
		
		
		/***
		 *  Renvoi une chaine de caractere comportant le nom des villes + code aeroports des escales du vol.
		 *  ( Escales aller et retour ).
		 *  Pas  de doublon, si une escale est dans l'aller elle n'est pas recopier pour le retour....
		 */
		getNbEscalesStr:function() {
		if(this.getNbEscales()===0) {
				return ''; // TODO : Remplacer par le bon texte internationnalisé.
			}else if(this.getNbEscales() > 0){
				return this.getNbEscales();
			}
		},
		getEscalesTab:function() {	
			// Si pas d'escale dans le vol on revoit de suite une chaine vide.
			if(!this.getNbEscales()){
				return '';
			}				
			var escales =[];
			if(this.getNbEscalesAller() == 1 ) {
				// nom de la ville escale est la ville arrivee du prekmier segment				
				escales.push({iata:this.segment[0].codeAeroportArrivee,nom: getNomVille(this.segment[0].codeAeroportArrivee)});
			}else if(this.getNbEscalesAller() == 2 ) {
				// nom des ville escales sont ville départ et arrivee du segment 2 ( indice 1 )
				if(!isEscaleInArray(escales,this.segment[1].codeAeroportDepart)) {
					escales.push({iata:this.segment[1].codeAeroportDepart,nom: getNomVille(this.segment[1].codeAeroportDepart)});	
				}
				if(!isEscaleInArray(escales,this.segment[1].codeAeroportArrivee)) {
					escales.push({iata:this.segment[1].codeAeroportArrivee,nom: getNomVille(this.segment[1].codeAeroportArrivee)});	
				}			
			}			
			if(this.getNbEscalesRetour() == 1 ) {
			// nom de la ville escale est la ville arrivee du premier segment
				if(!isEscaleInArray(escales,this.segment[3].codeAeroportArrivee)) {
					escales.push({iata:this.segment[3].codeAeroportArrivee,nom: getNomVille(this.segment[3].codeAeroportArrivee)});	
				}
				
			} else if(this.getNbEscalesRetour() == 2 ) {
			// nom des ville escales sont ville départ et arrivee du segment 2 ( indice 1 )
				if(!isEscaleInArray(escales,this.segment[4].codeAeroportDepart)) {
					escales.push({iata:this.segment[4].codeAeroportDepart,nom: getNomVille(this.segment[4].codeAeroportDepart)});	
				}
				if(!isEscaleInArray(escales,this.segment[4].codeAeroportArrivee)) {
					escales.push({iata:this.segment[4].codeAeroportArrivee,nom: getNomVille(this.segment[4].codeAeroportArrivee)});	
				}	
				
			}
			return escales;		
		},
		
		getEscalesStr:function () {
			// On recupere le tableau
			var escales = this.getEscalesTab(),
				escalesStr = elm.ifdef(results.escalesStr);
			// On défini le separateur
				separateur = ', ';
			//si le nombre d'escales est null on return une phrase sinon les valeurs
			if (this.getNbEscales() === 0) {
				return elm.ifdef(results.escalesStrNull);
			}else if (this.getNbEscales() > 0) {
				// Formatage de la string à renvoyer
				for (var i=0;i<escales.length;i++){
					// A la fin du tableau on change le separateur
					if (i==(escales.length-1)) {
						separateur = '';
					}else {
						separateur = ', ';
					}
						escalesStr = escalesStr + escales[i].nom +'('+escales[i].iata+') ' + separateur;
				}
				
				return escalesStr;
			}
		},
		
		getEscalesStrR:function() {
			// Défini si il affiche la version réduite ou non
			if (this.getNbEscales() === 0) {
				escalesStrR = elm.ifdef(results.escalesStrNull);
			}if (this.getNbEscales() === 1) {
				escalesStrR = this.getEscalesStr();
			}else if(this.getNbEscales() > 1){
				// On recupere le tableau
				var escales = this.getEscalesTab(),
					escalesStr = elm.ifdef(results.escalesStr),
					i=0;
				// Formatage de la string à renvoyer
				escalesStrR = escalesStr + escales[i].nom +'('+escales[i].iata+') ' + ', ...';
			}
			return escalesStrR;
		},

		/**
		 * surcharge de toString
		 */
		toString: function(){
			//return "Vol{"+this.ukey+"}";
			//return this.prix+" - "+this.idPartenaire+" - "+this.getCompagnies().join();
			//return this.prix+" - "+this.idPartenaire+" - "+this.getNbEscalesFiltre();
			return this.prix+" - "+this.idPartenaire+" - "+this.getNbEscales()+" - "+this.getHoraireDepartAller()+" - "+this.getCompagnieCode();
		},

		/**
		 * Initialise l'objet vol à partir d'une
		 * clé unique.
		 * NB : l'url de redirection n'est pas
		 * récupérée et donc est nulle.
		 * @param {String} ukey clé unique à interpréter
		 */
		initFromUniqueKey: function(ukey){
			if(!REGEXP_VOL_UKEY.test(ukey)){
				ev.log.warn('ev.mev.Vol#initFromUniqueKey()> Clé de vol indéchiffrable : '+ukey);
				return;
			}
			// enregistrement des champs du vol
			this.ukey=ukey;
			this.idPartenaire=parseInt(RegExp.$1, 10);
			this.prixValue=parseInt(RegExp.$2, 10)/100;
			var segs=[], n=6;
			segs.push(RegExp.$3);
			segs.push(RegExp.$4);
			segs.push(RegExp.$5);
			segs.push(RegExp.$6);
			segs.push(RegExp.$7);
			segs.push(RegExp.$8);
			while(n--){
				if(segs[n]){
					this.addSegment(ev.mev.VolSegment.createFromString(segs[n]), n);
				}
			}
//			ev.log.debug('ev.mev.VolNew#initFromUniqueKey()> Vol lu : '+this.idPartenaire+', '+this.prixValue+', '+ev.tools.array.toString(this.segment));
			return this;
		}
	};
	
		// Tris
		var SORT_PRIXTTC=0;
		var SORT_COMPAGNIE=1;
		var SORT_DIRECT=2;
		var SORT_DATEALLER=3;
		var SORT_DATERETOUR=4;
		var SORT_AEROPORTDEPARTALLER=5;
		var SORT_AEROPORTARRIVEEALLER=6;
		var SORT_AEROPORTDEPARTRETOUR=7;
		var SORT_AEROPORTARRIVEERETOUR=8;
		var SORT_HEUREDEPARTALLER=9;
		var SORT_HEUREARRIVEEALLER=10;
		var SORT_HEUREDEPARTRETOUR=11;
		var SORT_HEUREARRIVEERETOUR=12;
		var SORT_DUREEALLER=13;
		var SORT_DUREERETOUR=14;
		var SORT_PARTENAIRE=15;
		var SORT_TYPES=[
			'SORT_PRIXTTC',
			'SORT_COMPAGNIE',
			'SORT_DIRECT',
			'SORT_DATEALLER',
			'SORT_DATERETOUR',
			'SORT_AEROPORTDEPARTALLER',
			'SORT_AEROPORTARRIVEEALLER',
			'SORT_AEROPORTDEPARTRETOUR',
			'SORT_AEROPORTARRIVEERETOUR',
			'SORT_HEUREDEPARTALLER',
			'SORT_HEUREARRIVEEALLER',
			'SORT_HEUREDEPARTRETOUR',
			'SORT_HEUREARRIVEERETOUR',
			'SORT_DUREEALLER',
			'SORT_DUREERETOUR',
			'SORT_PARTENAIRE'
		];
		
		var sortType=-1;
		var sortWay='asc';
		
		// Fonction de comparaison entre deux vols (utilise le flag sortType)
		function compareVols(vol1,vol2){
		  	if(sortType==SORT_COMPAGNIE){
			    if(vol1.getCompagnieCode()===vol2.getCompagnieCode()){
	            	return vol1.prixValue-vol2.prixValue;
			    }
			    if(vol1.getCompagnieCode()<vol2.getCompagnieCode()){return -1;}
				if(vol1.getCompagnieCode()>vol2.getCompagnieCode()){return 1;}
				return 0;
		  }
		  else if(sortType==SORT_DIRECT){
		  	if(vol1.getNbEscales()===vol2.getNbEscales()){
				return vol1.prixValue-vol2.prixValue;
			}
			return (vol1.getNbEscales()-vol2.getNbEscales());
		  }
		  else if(sortType==SORT_DATEALLER){
		  	var VOL1dateDepartAllerMS=new Date(vol1.getDateDepartAller().substring(6,10),vol1.getDateDepartAller().substring(3,5)-1,vol1.getDateDepartAller().substring(0,2)).getTime();
			var VOL2dateDepartAllerMS=new Date(vol2.getDateDepartAller().substring(6,10),vol2.getDateDepartAller().substring(3,5)-1,vol2.getDateDepartAller().substring(0,2)).getTime();
			if(VOL1dateDepartAllerMS===VOL2dateDepartAllerMS){
				return vol1.prixValue-vol2.prixValue;
			}
			return VOL1dateDepartAllerMS-VOL2dateDepartAllerMS;
		  }
		 else if(sortType==SORT_DATERETOUR){
		  	var VOL1dateRetourArriveeMS=new Date(vol1.getDateRetourArrivee().substring(6,10),vol1.getDateRetourArrivee().substring(3,5)-1,vol1.getDateRetourArrivee().substring(0,2)).getTime();
			var VOL2dateRetourArriveeMS=new Date(vol2.getDateRetourArrivee().substring(6,10),vol2.getDateRetourArrivee().substring(3,5)-1,vol2.getDateRetourArrivee().substring(0,2)).getTime();
			if(VOL1dateRetourArriveeMS===VOL2dateRetourArriveeMS){
				return vol1.prixValue-vol2.prixValue;
			}
			return VOL1dateRetourArriveeMS-VOL2dateRetourArriveeMS;
		  }
		
		  else if(sortType==SORT_PARTENAIRE){
		  	if(vol1.idPartenaire===vol2.idPartenaire){
				return vol1.prixValue-vol2.prixValue;
			}
		  	return vol1.idPartenaire-vol2.idPartenaire;
		  } 
		
		  else if(sortType==SORT_AEROPORTDEPARTALLER){
		  	if(vol1.getCodeAeroportDepartAller()===vol2.getCodeAeroportDepartAller()){
				return vol1.prixValue-vol2.prixValue;
			}
		    if(vol1.getCodeAeroportDepartAller()<vol2.getCodeAeroportDepartAller()){return -1;}
		    if(vol1.getCodeAeroportDepartAller()>vol2.getCodeAeroportDepartAller()){return 1;}
		    return 0;
		  }
		  else if(sortType==SORT_AEROPORTARRIVEEALLER){
		  	if(vol1.getCodeAeroportArriveeAller()===vol2.getCodeAeroportArriveeAller()){
				return vol1.prixValue-vol2.prixValue;
			}
		  	if(vol1.getCodeAeroportArriveeAller()===vol2.getCodeAeroportArriveeAller()){
				return vol1.prixValue-vol2.prixValue;
			}
		    if(vol1.getCodeAeroportArriveeAller()<vol2.getCodeAeroportArriveeAller()){return -1;}
		    if(vol1.getCodeAeroportArriveeAller()>vol2.getCodeAeroportArriveeAller()){return 1;}
		    return 0;
		  }
		  else if(sortType==SORT_AEROPORTDEPARTRETOUR){
		  	if(vol1.getCodeAeroportDepartRetour()===vol2.getCodeAeroportDepartRetour()){
				return vol1.prixValue-vol2.prixValue;
			}
		    if(vol1.getCodeAeroportDepartRetour()<vol2.getCodeAeroportDepartRetour()){return -1;}
		    if(vol1.getCodeAeroportDepartRetour()>vol2.getCodeAeroportDepartRetour()){return 1;}
		    return 0;
		  }
		  else if(sortType==SORT_AEROPORTARRIVEERETOUR){
		  	if(vol1.getCodeAeroportArriveeRetour()===vol2.getCodeAeroportArriveeRetour()){
				return vol1.prixValue-vol2.prixValue;
			}
		    if(vol1.getCodeAeroportArriveeRetour()<vol2.getCodeAeroportArriveeRetour()){return -1;}
		    if(vol1.getCodeAeroportArriveeRetour()>vol2.getCodeAeroportArriveeRetour()){return 1;}
		    return 0;
		  }
		
		  else if(sortType==SORT_HEUREDEPARTALLER){
		  	var vol1HoraireDepartAllerMinute=vol1.getHoraireDepartAller().substring(0,2)*60+vol1.getHoraireDepartAller().substring(3,5);
			var vol2HoraireDepartAllerMinute=vol2.getHoraireDepartAller().substring(0,2)*60+vol2.getHoraireDepartAller().substring(3,5);
		  	if(vol1HoraireDepartAllerMinute===vol2HoraireDepartAllerMinute){
				return vol1.prixValue-vol2.prixValue;
			}
			return vol1HoraireDepartAllerMinute-vol2HoraireDepartAllerMinute;
		  } 
		  else if(sortType==SORT_HEUREARRIVEEALLER){
		  	var vol1HoraireArriveeAllerMinute=vol1.getHoraireArriveeAller().substring(0,2)*60+vol1.getHoraireArriveeAller().substring(3,5);
			var vol2HoraireArriveeAllerMinute=vol2.getHoraireArriveeAller().substring(0,2)*60+vol2.getHoraireArriveeAller().substring(3,5);
			if(vol1HoraireArriveeAllerMinute===vol2HoraireArriveeAllerMinute){
				return vol1.prixValue-vol2.prixValue;
			}
			return vol1HoraireArriveeAllerMinute-vol2HoraireArriveeAllerMinute;
		  }
		  else if(sortType==SORT_HEUREDEPARTRETOUR){
		  	var vol1HoraireDepartRetourMinute=vol1.getHoraireDepartRetour().substring(0,2)*60+vol1.getHoraireDepartRetour().substring(3,5);
			var vol2HoraireDepartRetourMinute=vol2.getHoraireDepartRetour().substring(0,2)*60+vol2.getHoraireDepartRetour().substring(3,5);
			if(vol1HoraireDepartRetourMinute===vol2HoraireDepartRetourMinute){
				return vol1.prixValue-vol2.prixValue;
			}
			return vol1HoraireDepartRetourMinute-vol2HoraireDepartRetourMinute;
		  }
		  else if(sortType==SORT_HEUREARRIVEERETOUR){
		  	var vol1HoraireArriveeRetourMinute=vol1.getHoraireArriveeRetour().substring(0,2)*60+vol1.getHoraireArriveeRetour().substring(3,5);
			var vol2HoraireArriveeRetourMinute=vol2.getHoraireArriveeRetour().substring(0,2)*60+vol2.getHoraireArriveeRetour().substring(3,5);
			if(vol1HoraireArriveeRetourMinute===vol2HoraireArriveeRetourMinute){
				return vol1.prixValue-vol2.prixValue;
			}
			return vol1HoraireArriveeRetourMinute-vol2HoraireArriveeRetourMinute;
		  }
		
		  else if(sortType==SORT_DUREEALLER){
		  	 //NOT IMPLEMENTED
		  }
		  else if(sortType==SORT_DUREERETOUR){
		  	 //NOT IMPLEMENTED
		  }
		
		  else{
		  	 diff=vol1.prixValue-vol2.prixValue;// Par defaut tri prix
		  	 return diff;
		  } 
		}
		
		/**
		 * Fonction de tri générique en fonction du type de tri demandé.
		 * 
		 * @param {Object} type type de tri
		 * @param {Object} way sens du tri (ASCendant / DESCendant)
		 * @param {Object} listeVol liste de vols à trier
		 * @param {Object} refresh 'true' si l'on souhaite faire un refresh [par défaut 'false']
		 * FIXME [ygally] ev.mev.Vol n'est pas censé avoir connaissance de display.refresh() (ni de display tout court d'ailleurs)
		 */
		function sortVols(type,way,vols,refresh){
			if(!way){ // si le parametre way manque
			if(sortType==type){
			// si le type etait identique avant, on change le sens de tri
			sortWay=(sortWay=='asc')? 'desc': 'asc';
			}
			else{
			sortWay='asc';// sinon on effectue un tri ascendant
			sortType=type;// avec le nouveau type de tri
			}
			}else{// si le parametre way est fourni
			sortType=type;
			sortWay=way;
			}
			changeClassTri(type,sortWay);
			vols.sort(compareVols);
			if(sortWay=='desc'){
			// si le tri est descendant, on renverse le tableau de vols
			vols.reverse();
			}
			// par défaut on rafraichi, sinon refresh doit être "vrai"
			if(refresh===undefined||refresh){
//ev.log.warn('ev.mev.VolNew.__sortVols('+SORT_TYPES[type]+')> ask for display refresh');
				display.refresh();
			}
		}
		
		/*********************************/
		/****** Fonctions publiques ******/
		/*********************************/
		
       /**
        * Supprime toutes les classes des éléments de tri
        */
       function removeAllTriClass(){
			ev.dom.element('triPrix').className='';
			ev.dom.element('triPart').className='';
			ev.dom.element('triDates').className='';
			ev.dom.element('triDep').className='';
			ev.dom.element('triArr').className='';
			ev.dom.element('triAero').className='';
			ev.dom.element('triDur').className='';
			ev.dom.element('triEsc').className='';
			ev.dom.element('triComp').className='';
       }
       /**
        * Change la classe de l'element sur lequel on effectue le tri (afin de modifier l'affichage)
        * @param {Object} type
        * @param {Object} sortWay
        */
       function changeClassTri(type,sortWay){
               //on efface toutes les classes des éléments de tri
               removeAllTriClass();
               var element;
               //on identifie l'élément //TODO[poblin]: il y a peut etre un moyen plus rapide
               if(type===SORT_PRIXTTC){
                       element=ev.dom.element('triPrix');
               }
               else if(type===SORT_PARTENAIRE){
                       element=ev.dom.element('triPart');
               }
               else if(type===SORT_DATEALLER){
                       element=ev.dom.element('triDates');
               }
               else if(type===SORT_HEUREDEPARTALLER){
                       element=ev.dom.element('triDep');
               }
               else if(type===SORT_HEUREARRIVEEALLER){
                       element=ev.dom.element('triArr');
               }
               else if(type===SORT_AEROPORTDEPARTALLER){
                       element=ev.dom.element('triAero');
               }
               else if(type===SORT_DUREERETOUR){
                       element=ev.dom.element('triDur');
               }
               else if(type===SORT_DIRECT){
                       element=ev.dom.element('triEsc');
               }
               else if(type===SORT_COMPAGNIE){
                       element=ev.dom.element('triComp');
               }
               else{
                       ev.log.error("ev.mev.VolNew - filtre inconnu"+type);
               }
               //on change la classe de l'élément récupéré
               if(sortWay==='asc'){
                       element.className='triUp';
               }
               else{
                       element.className='triDown';
               }
       }

  

       // Tous les tris possibles
       ev.mev.VolNew.sortVolsPrix=function(way,vols,refresh){
                sortVols(SORT_PRIXTTC,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsCompagnie=function(way,vols,refresh){
                sortVols(SORT_COMPAGNIE,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsDirect=function(way,vols,refresh){
                sortVols(SORT_DIRECT,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsDateAller=function(way,vols,refresh){
                sortVols(SORT_DATEALLER,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsDateRetour=function(way,vols,refresh){
                sortVols(SORT_DATERETOUR,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsAeroportDepartAller=function(way,vols,refresh){
                sortVols(SORT_AEROPORTDEPARTALLER,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsAeroportArriveeAller=function(way,vols,refresh){
                sortVols(SORT_AEROPORTARRIVEEALLER,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsAeroportDepartRetour=function(way,vols,refresh){
                sortVols(SORT_AEROPORTDEPARTRETOUR,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsAeroportArriveeRetour=function(way,vols,refresh){
                sortVols(SORT_AEROPORTARRIVEERETOUR,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsHeureDepartAller=function(way,vols,refresh){
                sortVols(SORT_HEUREDEPARTALLER,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsHeureArriveeAller=function(way,vols,refresh){
                sortVols(SORT_HEUREARRIVEEALLER,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsHeureDepartRetour=function(way,vols,refresh){
                sortVols(SORT_HEUREDEPARTRETOUR,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsHeureArriveeRetour=function(way,vols,refresh){
                sortVols(SORT_HEUREARRIVEERETOUR,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsDureeAller=function(way,vols,refresh){
                sortVols(SORT_DUREEALLER,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsDureeRetour=function(way,vols,refresh){
                sortVols(SORT_DUREERETOUR,way,vols,refresh);
       };
       ev.mev.VolNew.sortVolsPartenaire=function(way,vols,refresh){
                sortVols(SORT_PARTENAIRE,way,vols,refresh);
       }
	   // Perme tde trier la liste de vols en utilisant le dernier filtre utilisé. 
	   // si aucun filtre n'a encore été utilisé, on prend le tri par défaut.
	   ;
	   ev.mev.VolNew.sortVolsCurrent=function(way,vols,refresh) {
	   		/*
			var t=sortType;
			sortType=-1;// On remet le sortype à -1 afin de ne pas inversion le sens de tri lors de l'appel de cette méthode.
			sortVols(t,way,vols,refresh);
			*/
						
			vols.sort(compareVols);
			if(sortWay=='desc'){
			// si le tri est descendant, on renverse le tableau de vols
			vols.reverse();
			}
			// par défaut on rafraichi, sinon refresh doit être "vrai"
			if(refresh===undefined||refresh){
			//ev.log.warn('ev.mev.VolNew.__sortVols('+SORT_TYPES[type]+')> ask for display refresh');
				display.refresh();
			}
			
			
			
	   };



	/**
	 * Evénement à exécuter lorsqu'on click sur un bouton
	 * de redirection correspondant à un vol.<br>
	 * L'objet sur lequel on exécute cette méthode doit
	 * posséder une propriété avec l'url infos à utiliser.
	 * (this.urlInfos)
	 */
	ev.mev.VolNew.onclick=function (){
		if(this.urlInfos){
			window.open(this.urlInfos,'','toolbar=yes,location=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width=980,height=600,left=100,top=100');
		}
	};






	/** Méthode de comparaison de vol, on compare sur 
		- Date / heure depart 
		- Date / heure arrivée
		- Date / heure départ escale(s).
		- Date / heure arrivée escale(s).
		- Code compagnies.
	*/
	function compareVol22(v1,v2) {
		/** Checkla valdiité, non null, non undefined de tous les paramètres utilisés pour la comparaison.*/
			
		if(!v1 || !v2) {
			return false;
		}		
		if(!v1.getCompagnies() || !v2.getCompagnies()) {
			return false;
		}
		
		if(!v1.getNbSegmentsAller() || !v1.getNbSegmentsRetour()) {
			return false;
		}
		if(!v2.getNbSegmentsAller() || !v2.getNbSegmentsRetour() ){
			return false;
		}			
		/** Si un vol n'a pas de segments il est non valide.*/
		if(v1.getNbSegmentsAller() == 0) {
			return false;
		}
		if(v2.getNbSegmentsAller() == 0) {
			return false;
		}		
		if(v1.getNbSegmentsRetour() == 0) {
			return false;
		}		
		if(v2.getNbSegmentsRetour() == 0) {
			return false;	
		}
					
		/** Test égalité des parametres de comparaison.*/			
		if(v1.getCompagnies().length != v2.getCompagnies().length) {			
			return false;
		}
		for(var j=0;j<v1.getCompagnies().length ;j++) {
			if(v1.getCompagnies()[j] !=v2.getCompagnies()[j]   ) {
				return false;
			}
		}							
		if(v1.getNbSegmentsAller() != v2.getNbSegmentsAller()) {
			return false;		
		}		
		if(v1.getNbSegmentsRetour() != v2.getNbSegmentsRetour() ){
			return false;
		}	
					
		if(v1.getDateDepartAller() != v2.getDateDepartAller()) {
			return false;
		}						
		if(v1.getDateDepartRetour() != v2.getDateDepartRetour()) {
			return false;
		}			
		if(v1.getDateArriveeAller() != v2.getDateArriveeAller()) {
			return false;
		}						
		if(v1.getDateArriveeRetour() != v2.getDateArriveeRetour()) {
			return false;
		}			
					
		if(v1.getHoraireDepartAller() != v2.getHoraireDepartAller()) {
			return false;
		}
		if(v1.getHoraireArriveeAller() != v2.getHoraireArriveeAller()) {
			return false;
		}
		if(v1.getHoraireDepartRetour() != v2.getHoraireDepartRetour()) {
			return false;
		}
		if(v1.getHoraireArriveeRetour() != v2.getHoraireArriveeRetour()) {
			return false;
		}
											
		var v1sa=v1.getNbSegmentsAller();
		var v2sa=v2.getNbSegmentsAller();
		
		var v1sr=v1.getNbSegmentsRetour();	
		var v2sr=v2.getNbSegmentsRetour();
		
		//ev.log.info('Nb segments Aller:'+v1sa + 'Nb segments Retour:'+v1sr)
		for(var i=0;i<v1sa;i++) {			
			if(v1.segment[i] && !v2.segment[i]) {
				return false;
			}
			if(!v1.segment[i] && v2.segment[i]) {
				return false;
			}			
			if(v1.segment[i] && v2.segment[i]) {
				var s1=v1.segment[i];
				var s2=v2.segment[i];
				//ev.log.info('Segments ALLER s1:'+s1);
				//ev.log.info('Segments ALLER s2:'+s2);
				
				if(!compareSegment(s1,s2)){				
					//ev.log.info('Segments différents ALLER...');
					return false;
				}				
			}
			
							
		}
		
		for(var i=3;i<v1sa+3;i++) {
			if(v1.segment[i] && !v2.segment[i]) {
				return false;
			}
			if(!v1.segment[i] && v2.segment[i]) {
				return false;
			}			
			if(v1.segment[i] && v2.segment[i]) {
				var s1=v1.segment[i];
				var s2=v2.segment[i];
				//ev.log.info('Segments RETOUR s1:'+s1);
				//ev.log.info('Segments RETOUR s2:'+s2);
				if(!compareSegment(s1,s2)){
					//ev.log.info('Segments différents RETOUR...');		
					return false;
				}				
			}					
		}
		
		return true;	
	}

	/**
	*	Méthode de comparaison de segments.
	*	@param s1 premier segment à comparer.
	*	@param s2 deuxième segment à comparer.	
	*	@return false si les segments sont différent ou si un des paramètres de segments nécessaire pour la comparaison n'est pas valide.
	*	@return true si les segments sont considéres comme identique.
	*   Paramètre requis pour la comparaison :
	*		- Code compagnie.
	*		- Date et heure de décollage.
	*		- Date et heure d'atterissage.
	*		- Code aéroport départ et arrivée.
	*/
	function compareSegment(s1,s2) {
		/** Test de validité des paramètres nécessaire à la comparaison.*/
		//ev.log.info('test validite des arguments de segments');
		if( !s1 || !s2){
			ev.log.info('un segments est nul ANORMAL');
			return false;
		}
		//ev.log.info('deux segments non nuls');			
		if(!s1.dateDecollage || !s2.dateDecollage) {			
			return false;
		}
		//ev.log.info('date decollage non nulles');	
		//ev.log.info('s1.dateAtterissage='+s1.dateAtterissage+' s2.dateAterissage'+s2.dateAterissage );
		if(!s1.dateAtterissage || !s2.dateAtterissage) {
			return false;				
		}		
		//ev.log.info('date  dateAtterissage non nulles');
		if(!s1.heureDecollage || !s2.heureDecollage) {
			return false;
		}		
		if(!s1.heureAtterissage || !s2.heureAtterissage) {
		 	return false;
		}
		//ev.log.info('heure  identiques');		
		if(!s1.codeAeroportDepart || !s2.codeAeroportDepart) {
			return false;
		}
		//ev.log.info('code aeroport identiques identiques');
		if(!s1.codeAeroportArrivee || !s2.codeAeroportArrivee) {
			return false;
		}
		
		//ev.log.info("Comparaison de segments...before code aeroport");		
		if(s1.codeAeroportDepart != s2.codeAeroportDepart) {
			return false;
		}		
		if(s1.codeAeroportArrivee != s2.codeAeroportArrivee) {
			return false;
		}		
		if(s1.dateDecollage != s2.dateDecollage) {
			return false;
		}
		if(s1.dateAtterissage != s2.dateAtterissage) {
			return false;
		}	
		if(s1.heureDecollage!=s2.heureDecollage) {
			return false;
		}				
		if(s1.heureAtterissage!=s2.heureAtterissage) {
			return false;
		}								
		return true;			
	}

	/**
	*  Recherche vol dans la liste vols
	*  Renvoi le vol en question si trouvé,sinon renvoi un null 
	* @param vol Vol à comparer dans la liste
	* @param vols liste des vols dans laquelle on doit chercher
	* @ return objet vol si le vol est trouvé dans la liste.
	*/
	ev.mev.VolNew.isVolInListe = function(vols,vol) {
		
		if(!vols) {
			return -1;
		}
		if(!vols.length) {
			return -1;
		}
		if(vols.length <1){
			return -1;
		}
	//	ev.log.info('ev.mev.VolNew.isVolInListe avant boucle for:'+vols.length);				
		/** On compare chaque vol de la liste avec le vol de référence.*/
		
		for(var i=0;i<vols.length;i++){		
			var v=vols[i];										
			if(compareVol22(vol,v) === true) {
			//	ev.log.info('cols identiques.');
				return i;
			}else {
			//	ev.log.info('vols différent.');
			}									
		}
		
		/** aucun vol trouvé dans la liste on renvoi null.*/
		return -1;	
	}
	
	/**
	 * 
	 * @param {Object} refPartenaires
	 */
	ev.mev.VolNew.sortVolsRefPartenairePrix = function(vols) {
		for(var i=0;i<vols.length;i++) {
			sortRefPartenairePrix(vols[i].refPartenaire);
		}
	}
	
	
	
	
	/**
	 * 
	 * @param {Object} refPartenaires
	 */
	sortRefPartenairePrix = function(refPartenaires) {
		if(!refPartenaires) {
			return false;
		}
		if(!refPartenaires.length) {
			return false;
		}			
		for(var i=0;i<refPartenaires.length;i++) {
			var rp=refPartenaires[i];
			for(var j=1;j<refPartenaires.length;j++) {
				var rp2=refPartenaires[j];				
				if(rp2.prixValue < rp.prixValue) {
					var old=refPartenaires[i];	
					refPartenaires[i]=refPartenaires[j];
					refPartenaires[j]=old;
				}
			}				 
		}
	}
	
	ev.log.debug('ev.mev.Vol ok');
	ev.tools.onFileLoad('ev/mev/Vol.js');
}()); // exécution de la fonction anonyme ici
