(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;}

	/**
	 * On recupere la liste des hotels proposé par un partenaire, on parse ensuite cette
	 * liste afin de creer des objets Hotel qui contiennent une photo, une description courte
	 * une liste de partenaire/prix etc...
	 * pour chaque hotel on verifie si il existe deja, si non on le creer et on enregistre
	 * les information de l'hotel, si il existe deja, on ajoute le partenaire/prix a la liste
	 * des partenaire qui propose l'hotel.
	 * Pour les descriptions et photo, on prend celle du partenaire qui a répondu
	 * le plus et qui est le moins cher et qui a une description et/ou une photo
	 * (en effet la description et la photo peuvent provenir de 2 partenaire différent).
	 * On sauvegarde les codePartenaireHotel et idPart qui servirons a afficher
	 * la grande description et la liste de photo appeler dans display.js
	 */

	/**
	 * 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;
									// on sauvegarde l Id du partenaire a qui appartient la description
									// ainsi que le codeHotelPartenaire de l'hotel (pour eviter les doublons)
									hotelEasy.idPartDescCourte = hotelPartenaire.idPart;
									hotelEasy.coPartDescCourte = hotelPartenaire.idHotelPart;
								}

								if (hotelPart.img && hotelPart.img != null) {
									// on sauvegarde l Id du partenaire a qui appartient l'icone hotel
									// ainsi que le codeHotelPartenaire de l'hotel (pour eviter les doublons)
									hotelEasy.urlPhoto = hotelPart.img;
									hotelEasy.idPartPhoto = hotelPartenaire.idPart;
									hotelEasy.coPartPhoto = hotelPartenaire.idHotelPart;
								} else {
									if (hotelEasy.urlPhoto == "" || hotelEasy.urlPhoto == null ||
											hotelEasy.urlPhoto == ev.me.URL_IMAGE+"/base/imgs/meddle/meh/hub/noPhoto_64x64.jpg") {
										hotelEasy.urlPhoto = ev.me.URL_IMAGE+"/base/imgs/meddle/meh/hub/noPhoto_64x64.jpg";
										hotelEasy.idPartPhoto = hotelPartenaire.idPart;
										hotelEasy.coPartPhoto = hotelPartenaire.idHotelPart;
									}
								}

								hotelEasy.prixTTC = prixMin;
							}
							else {
								if (hotelPart.desc && hotelPart.desc != null &&
										(hotelEasy.descriptionCourte == "" || hotelEasy.descriptionCourte == null)) {
									// si le partenaire qui vient de repondre a un prix plus elever
									// mais une description qui n est pas vide alors que le/les partenaires moins
									// cher n ont pas de description.
									hotelEasy.descriptionCourte = hotelPart.desc;
									hotelEasy.idPartDescCourte = hotelPartenaire.idPart;
									hotelEasy.coPartDescCourte = hotelPartenaire.idHotelPart;
								}
								if (hotelPart.img && hotelPart.img != null &&
										(hotelEasy.urlPhoto == "" || hotelEasy.urlPhoto == null ||
												hotelEasy.urlPhoto == ev.me.URL_IMAGE+"/base/imgs/meddle/meh/hub/noPhoto_64x64.jpg"))
								{
									// si le partenaire qui vient de repondre a un prix plus elever
									// mais a une photo alors que le/les partenaire n'en ont pas et
									// ou que url photo correspond au gif image "noPhoto" alors on prend la photo de ce partenaire
									hotelEasy.urlPhoto = hotelPart.img;
									hotelEasy.idPartPhoto = hotelPartenaire.idPart;
									hotelEasy.coPartPhoto = hotelPartenaire.idHotelPart;
								}
							}

						}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;
							} else {
								hotelEasy.descriptionCourte = "";
							}
							 hotelEasy.idPartDescCourte = hotelPartenaire.idPart;
							 hotelEasy.coPartDescCourte = hotelPartenaire.idHotelPart;

							if (hotelPart.img && hotelPart.img != null) {
								hotelEasy.urlPhoto = hotelPart.img;
							} else {
								hotelEasy.urlPhoto = ev.me.URL_IMAGE+"/base/imgs/meddle/meh/hub/noPhoto_64x64.jpg";
							}
							hotelEasy.idPartPhoto = hotelPartenaire.idPart;
							hotelEasy.coPartPhoto = hotelPartenaire.idHotelPart;

							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");

})();
