(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.rjs){throw new Error("Le namespace 'ev.rjs' doit exister");}
	// On s'assure que le namespace ev.meh existe
	if(!ev.meh){ ev.meh={}; }
	//Si la classe ev.meh.GetInfosHotelPartenaireMethod est définie on sort
	if(ev.meh.GetInfosHotelPartenaireMethod){return;}

	/**
	 * Constructeur de la classe GetInfosHotelPartenaireMethod.
	 * Il construit une instance de GetInfosHotelPartenaireMethod 
	 * à partir des paramètres donnés.
	 *
	 * @param {String} _url : adresse de la page a appeler
	 * @param {Integer} _partenaire : identifiant numérique du partenaire
	 * @param {Function} _doAfterRetrieve : méthode à exécuter une fois que la requête est terminée
	 */
	ev.meh.GetInfosHotelPartenaireMethod=function(_url, _partenaire, _doAfterRetrieve){
		/**
		 * Constante globale, l'instance ev.rjs.Locator
		 * qui sera utilisée pour toutes les invocations.<br>
		 * <br>
		 * Timeout de 10 secondes est fixé.<br>
		 * Ceci est très long, mais doit être géré par une
		 * attente en cas de prollongement des requêtes.
		 */
		//var RJS_LOCATOR=new ev.rjs.Locator(10000, 'Partenaire'+_partenaire);
		var RJS_LOCATOR=new ev.rjs.Locator(20000, 'Partenaire'+_partenaire);
			
		function callback(r){
			if (!r) {
				ev.log.warn('ev.meh.GetInfosHotelPartenaireMethod > onRJSEvent(' + !!_e + ')> NO results : ' + r);
				return;
			}
			//récupération du nom du partenaire et de son id
			var nomPartenaire=r.partenaireName;
			//ev.log.info('-> Partenaire : '+nomPartenaire);

			//recupération des hotels d'un patenaire				
			var listHotels=r.hotels;
			if (!listHotels||listHotels.constructor!==Array){
				ev.log.warn('ev.meh.GetInfosHotelPartenaireMethod > onRJSEvent('+!!_e+')> Liste d\'hotels NOT Good : '+listHotels);
				return;
			}
			//ev.log.debug("ev.meh.GetInfosHotelPartenaireMethod#onRJSEvent: "+_e.getResource()+" (by "+_e.getSource()+")");
			for (var i = 0; i < listHotels.length; i++) {// Parcourir la liste des hotels proposés par les differents partenaires
					// Récupération les données nécessaires à la construction d'un objet hotel 		
					var hotelPart = listHotels[i];
					var idHotelPartenaire = hotelPart.idHPart;
					var idHotelEasy = hotelPart.idHEasy;
					var idHotelPartenaireSearch = hotelPart.idHPartSearch;
					var urlDetails = hotelPart.urlInfos;
					var prixMin=0;
					if(hotelPart.prix != null){
						prixMin = hotelPart.prix;
					}			
					
					var flagHotelDejaRecup = false;
					
					if (idHotelEasy != 0 && prixMin != 0) {	// Si l'hotel de partenaire est associé à un hotel Easy alors on l'ajoute a la liste des resultats 
						var hotelEasy = null;// variable qui permettra de savoir si l'hotelEasy auquel est rattaché l'hotelPartenaire existe deja dans la liste de resultats (et qui permettra aussi de le stocker)
						
						// Si la liste de resultats contient au moins un element, alors on parcourt la liste pour voir si l'hotelEasy existe deja ou pas...
						// Si la liste est vide cela signifie qu'il faut inserer l'hotelEasy ainsi que l'hotel partenaire
						if (listeResultats.length != 0) {
							for (var j = 0; j < listeResultats.length; j++) {
								//...s'il existe deja cela signifie qu'on a deja rencontre un partenaire qui avait des chambre de libre pour cet hotel
								// On stocke l'hotel 
								if (listeResultats[j].idHotelEasy == idHotelEasy) {
									
									for(var k = 0; k < listeResultats[j].listeHotelPart.length; k++){
										if(listeResultats[j].listeHotelPart[k].idHotelPart == idHotelPartenaire){
											flagHotelDejaRecup = true;
										}
									}
									
									hotelEasy = listeResultats[j];
									break;	
								}
							}
						}
						
						if(flagHotelDejaRecup){// ...si le flag est a true cela signifie que l'hotel a été recupéré avec getFirstResult, on recupere juste les informations manquantes				
					
						}else if (hotelEasy) {// ...si l'hotel easy existe deja cela signifie qu'on a deja rencontré un partenaire qui avait des chambre de libre pour cet hotel
							// dans ce cas on rattache l'hotelPart que l'on vient de recuperer à cet hotel (Easy)
							// Construire un objet hotel partenaire
							var hotelPartenaire = new ev.meh.HotelPartenaire(hotelEasy.getNbPropositionsPartenaires(), _partenaire, nomPartenaire, idHotelPartenaire, idHotelPartenaireSearch, urlDetails, prixMin);
							
							//on élimine les doublons dans les résultats (partenaires apparaissant deux fois pour un même hôtel)
							var partenairePresentsParHotelEasy = new Array(); //tableau permettant de savoir si un partenaire a répondu deux fois pour un même hôtel
							for (var l = 0; l < hotelEasy.listeHotelPart.length; l++) { //si le nom d'un partenaire est présent dans le tableau c'est qu'i a déjà été inséré dans l'objet hotelEasy.listeHotelPart correspondant
							    if (!partenairePresentsParHotelEasy[hotelEasy.listeHotelPart[l].nomPart]) {
							    	partenairePresentsParHotelEasy[hotelEasy.listeHotelPart[l].nomPart] = l+1;
							    }
							}
							if (!partenairePresentsParHotelEasy[nomPartenaire]) {//si le nom du partenaire que l'on est en train de traiter n'a pas été rencontré alors on insert l'hôtel courant
								hotelEasy.listeHotelPart.push(hotelPartenaire);
							}  else {//sinon c'est que le partenaire a déjà répondu pour cet hôtel (identifiant idHEasy identique mais idHPart différent)
								var rangDoublon = partenairePresentsParHotelEasy[nomPartenaire]; //on récupère le rang de l'hôtel doublon déjà présent dans hotelEasy.listeHotelPart
						        if (parseFloat(hotelEasy.listeHotelPart[rangDoublon-1].prixTTC) >= prixMin) {
						            // Si l'ancien hôtel est plus cher on le remplace par le nouveau
						            hotelEasy.listeHotelPart[rangDoublon-1] = hotelPartenaire;
						        } else {
						        	//sinon on ne fait rien, le nouvel hôtel n'est pas inséré dans la liste de résultats.
						        }
						    }
								
							
							hotelEasy.listeHotelPart.sort(ev.meh.HotelPartenaire.compare);//On trie la liste de proposition pour avoir la proposition avec le prix le moins elevé en premrière position dans la liste de proposition et la proposition avec le prix le plus elevé à la fin de la liste
							
							
							// Mettre à jour le prix min de hotel easy , qui correspond au plus petit prix
							if (parseFloat(prixMin) < parseFloat(hotelEasy.prixTTC)) {
								
								//on prend le descriptif du partenaire proposant le prix le moins elevé.
								if (hotelPart.desc && hotelPart.desc != null) {
									hotelEasy.descriptionCourte = hotelPart.desc;
								}
								if (hotelPart.img && hotelPart.img != null) {
									hotelEasy.urlPhoto = hotelPart.img;
								}else{
									hotelEasy.urlPhoto = "/base/imgs/me3/meh/no_photo.gif";
								}
								
								hotelEasy.prixTTC = prixMin;
							}
							
						}else {// ...s'il n'existe pas alors on crée l'hotel Easy et on lui rattache l'hotelPart que l'on vient de recuperer	
							display.nbHotelsFinis++;
							
							// On construit les objets hotelEasy et hotelPartenaire correspondant
							hotelEasy = new ev.meh.Hotel(idHotelEasy, prixMin, ev.meh.Context().getCriteres());
							var hotelPartenaire = new ev.meh.HotelPartenaire(hotelEasy.getNbPropositionsPartenaires(), _partenaire, nomPartenaire, idHotelPartenaire, idHotelPartenaireSearch, urlDetails, prixMin);
							
							// On rattache l'hotel partenaire à l'hotel Easy
							hotelEasy.listeHotelPart.push(hotelPartenaire);
		
							// On remplit les attributs de l'objet hotel
							if (hotelPart.id && hotelPart.id != null) {
								hotelEasy.id = hotelPart.id;
							}
							if (hotelPart.nom && hotelPart.nom != null) {
								hotelEasy.nom = hotelPart.nom;
							}
							if (hotelPart.star && hotelPart.star != null && hotelPart.star != "-1") {
								hotelEasy.etoiles = hotelPart.star;
							}else {
								hotelEasy.etoiles = "0";
							}
							if (hotelPart.desc && hotelPart.desc != null) {
								hotelEasy.descriptionCourte = hotelPart.desc;
							}
							if (hotelPart.img && hotelPart.img != null) {
								hotelEasy.urlPhoto = hotelPart.img;
							}else{
								hotelEasy.urlPhoto = "/base/imgs/me3/meh/no_photo.gif";
							}
							if (hotelPart.lat && hotelPart.lat != null) 
								hotelEasy.latitude = hotelPart.lat;
							if (hotelPart.lng && hotelPart.lng != null) 
								hotelEasy.longitude = hotelPart.lng;
							if (hotelPart.ee && hotelPart.ee != null) 
								hotelEasy.noteEasyExperts = hotelPart.ee;
							if (hotelPart.eop && hotelPart.eop != null) 
								hotelEasy.noteEasyOpinions = hotelPart.eop;
		
							if (hotelPart.equip && hotelPart.equip != null){
								var tableauxAmenagts = hotelPart.equip.split(";");
								for (var iAm=0; iAm<tableauxAmenagts.length; iAm++) {
									hotelEasy.listeAmenagements.push(tableauxAmenagts[iAm]);	
								}
							}
		
							// On insert l'hotel dans la liste de resulats
							listeResultats.push(hotelEasy);		
						}	
					}
			}//fin for
				
			// si aucune erreur, on lance le callback (s'il y en a un)
			if(typeof(_doAfterRetrieve)=='function') _doAfterRetrieve(_partenaire, listHotels.length);
			
		};
	
		ev.requestManager.invokeEra(RJS_LOCATOR, _url, callback, true);
	};
	
	ev.log.info("ev/meh/GetInfosHotelPartenaireMethod.js ok");

})();