

/**
 * Fonction anonyme de déclaration de la classe Vol.
 * 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() {
	var WIN = this,
			EASY = WIN.ev,
			LOG = EASY && EASY.log,
			TOOLS = EASY && EASY.tools,
			RJS = EASY && EASY.rjs,
			MEV = EASY && EASY.mev,
			BZZ;

	// Si les namespaces/classes nécessaires ne sont pas chargées : exception
	if (!EASY) {throw "Le namespace 'ev' doit exister";}
	if (!LOG) {throw "Le namespace 'ev.log' doit exister";}
	if (!TOOLS) {throw "Le namespace 'ev.tools' doit exister";}
	if (!RJS) {throw "Le namespace 'ev.rjs' doit exister";}
	if (!MEV) {throw "Le namespace 'ev.mev' doit exister";}

	// Si le namespace ev.mev.buzz est déjà déclaré, on sort
	if (MEV.buzz) { return; }
	BZZ = (MEV.buzz = {});

	/** Constante globale qui identifie l'URL racine des fichiers rjs.
 * Il faut vérifier que la source ici définie, correspond effectivement
 * à une localisation valable de fichiers rjs.
 */
	var URL_ROOT = (function() {
		switch (EASY.lang.current) {
			case 'es_ES':
				return 'http://www.easyviajar.com';
			case 'it_IT':
				return 'http://www.easyviaggio.com';
			case 'en_GB':
				return 'http://www.easyvoyage.co.uk';
			case 'de_DE':
				return 'http://www.easyvoyage.de';
			//case "fr_FR":
			default:
				return 'http://www.easyvoyage.com';
		}
	}()); // exécution de la procédure ici
	// Chemin d'accès aux fichiers distants du Buzz vol.
	var RJS_PATH = '/rjs/mev';

	/**
	 * Constante globale, regroupe les instances
	 * ev.rjs.Locator qui seront utilisées pour les
	 * invocations.<br>
	 * <br>
	 * Les timeouts sont fixés entre 6 et 10 secondes.<br>
	 * Ceci est très long, mais doit être géré par une
	 * attente en cas de prollongement des requêtes.
	 */
	var rjsLocators = {};

	/**
	 * Locator gérant les préchargement, chargement et
	 * 'plus de résultats' du Buzz TopMulti.<br>
	 * (peut se charger en meme tps que les autres Buzz,
	 * mais une seule requete sur celui-là ne peut être
	 * exécutée à la fois)
	 */
	rjsLocators.topMulti = new RJS.Locator(6000, 'buzzTopMulti');

	/**
	 * Locator gérant les préchargement, chargement et
	 * 'plus de résultats' du Buzz NextDates.<br>
	 * (peut se charger en meme tps que les autres Buzz,
	 * mais une seule requete sur celui-là ne peut être
	 * exécutée à la fois)
	 */
	rjsLocators.nextDates = new RJS.Locator(10000, 'buzzNextDates');

	/**
	 * Locator gérant les préchargement, chargement et
	 * 'plus de résultats' du Buzz Compagnies.<br>
	 * (peut se charger en meme tps que les autres Buzz,
	 * mais une seule requete sur celui-là ne peut être
	 * exécutée à la fois)
	 */
	rjsLocators.compagnies = new RJS.Locator(8000, 'buzzCompagnies');

	// Variable permettant de bloquer les appels simultanés sur les Buzz, par identifiants.
	var BUZZ_LOADING = {};

	/**
	 * Classe privée permettant d'écouter le client
	 * de Buzz RJS pour un identifiant et une
	 * ressource donnés.<br>
	 * Ce constructeur définit la méthode d'écoute des
	 * événements (d'un RJS Locator) qui ne traitera que
	 * les événements concernant la ressource donnée.
	 * @param {Object} _id : identifiant du Buzz demandé.
	 * @param {Object} _resource : ressource correspondant
	 *     au Buzz.
	 * @param {Object} _onAfter : méthode à exécuter après
	 *     l'invocation de la ressource (dés réception des
	 *     resultats).
	 */
	function BuzzRJSListener(_id, _resource, _onAfter) {
		/**
	 * Traite les événements concernant la ressource
	 * donnnée.
	 * @param {Object} _e : événement envoyé par un RJS
	 *     Locator.
	 */
		this.onRJSEvent = function(_e) {
			// si l'événement n'est pas conforme, on sort
			if (!_e) { return; }
			if (typeof(_e.getResource) !== 'function') { return; }
			if (typeof(_e.getReturned) !== 'function') { return; }
			if (typeof(_e.getSource) !== 'function') { return; }
			// si ce n'est pas la ressource concernée, on sort
			if (_e.getResource() !== _resource) { return; }
			// traitement
			var results = _e.getReturned();
			if (results && results.constructor === Array) {
				_e.getSource().removeListener(this);
				if (typeof(_onAfter) === 'function') {
					_onAfter(results);
				}
			}
			else {
				LOG.warn('onRJSEvent(' + !!_e + ')> NOT Good : ' + results);
				LOG.warn('onRJSEvent(' + !!_e + ')> NOT Good : ' + results.constructor);
			}
			// on signale la fin du chargement (pour d'éventuelles futures requêtes)
			BUZZ_LOADING[_id] = false;
		};
	}


	/**
	 * Fonction permettant de charger un Buzz distant
	 * de type 'Buzz Top Multi-axe' (un top des prix
	 * contenant 'limit' résultat(s) par axe).
	 * @param {Integer} site : id du site actuel.
	 * @param {Integer} codeClient : code client du compte.
	 * @param {Object} id : nom ou code identifiant
	 *     l'invocation (il permet d'éviter plusieurs
	 *     appels distants pour le même contenu ; NOTA:
	 *     il est tout de même récupéré à nouveau si le
	 *     param force est 'true').
	 * @param {Object} axesProperty : propriété à utiliser
	 *     pour récupérer la liste d'axes demandés.
	 * @param {Object} limit : nombre de résultats par axe
	 * FIXME rajouter param force :.
	 * @param {Boolean} force : true pour forcer la
	 *     requête distante ; false sinon.
	 */
	BZZ.invokePreloadTopMulti = function(site, codeClient, id, axesProperty, limit) {
		if (!codeClient) {
			codeClient = 1;
		}
		var url = '/vols/buzz/top.rjs?pageInfos=/mev/infos.jsp&buzzId=' + id + '&site=' + site + '&codeClient=' + codeClient + '&axeProperty=' + axesProperty + '&limit=' + limit + '&action=LOAD';
		EASY.requestManager.invokeEra(url);
	};

	/**
	 * Fonction permettant de charger un Buzz distant
	 * de type 'Buzz Next Dates' (un top des prix
	 * contenant 'limit' résultats correspondant aux
	 * dates les plus proches à venir).
	 * @param {Integer} site : id du site actuel.
	 * @param {Integer} codeClient : code client du compte.
	 * @param {Object} id : nom ou code identifiant
	 *     l'invocation (il permet d'éviter plusieurs
	 *     appels distants pour le même contenu ; NOTA:
	 *     il est tout de même récupéré à nouveau si le
	 *     param force est 'true').
	 * @param {Object} axeProperty : propriété à utiliser
	 *     pour récupérer l'axe demandé.
	 * @param {Object} limit : nombre de résultats par axe.
	 */
	BZZ.invokePreloadNextDates = function(site, codeClient, id, axeProperty, limit) {
		if (!codeClient) {
			codeClient = 1;
		}
		var url = '/vols/buzz/date.rjs?pageInfos=/mev/infos.jsp&buzzId=' + id + '&site=' + site + '&codeClient=' + codeClient + '&axeProperty=' + axeProperty + '&limit=' + limit + '&action=LOAD';
		EASY.requestManager.invokeEra(url);
	};

	/**
	 * Fonction permettant de charger un Buzz distant
	 * de type 'Buzz Top Multi-axe' (un top des prix
	 * contenant 'limit' résultat(s) par axe).
	 * @param {Integer} site : id du site actuel.
	 * @param {Integer} codeClient : code client du compte.
	 * @param {Object} id : nom ou code identifiant
	 *     l'invocation (il permet d'éviter plusieurs
	 *     appels distants pour le même contenu ; NOTA:
	 *     il est tout de même récupéré à nouveau si le
	 *     param force est 'true').
	 * @param {Object} axesProperty : propriété à utiliser
	 *     pour récupérer la liste d'axes demandés.
	 * @param {Integer} limit : nombre de résultats par axe.
	 * @param {String} pageInfos : page de tracking/redirection.
	 * @param {Object} _onAfter : méthode à exécuter après
	 *     l'invocation (exécutée dans tous les cas ; sauf double
	 *     invocation simultanées).
	 */
	BZZ.invokeTopMulti = function(site, codeClient, id, axesProperty, limit, pageInfos, _onAfter) {
		function onAfter(_results) {
			_onAfter(_results);
			BUZZ_LOADING[id] = false;
		}

		if (BUZZ_LOADING[id]) { return; }
		BUZZ_LOADING[id] = true;
		if (!codeClient) {
			codeClient = 1;
		}
		var p=pageInfos;
		if(!p) {
			p='/mev/infos.jsp';
		}
		var url = '/vols/buzz/top.rjs?pageInfos='+pageInfos+'&buzzId=' + id + '&site=' + site + '&codeClient=' + codeClient + '&axeProperty=' + axesProperty + '&limit=' + limit;
		EASY.requestManager.invokeEra(url, onAfter);
	};

	/**
	 * Fonction permettant de charger un Buzz distant
	 * de type 'Buzz Next Dates' (un top des prix
	 * contenant 'limit' résultats correspondant aux
	 * dates les plus proches à venir).
	 * @param {Integer} site : id du site actuel.
	 * @param {Integer} codeClient : code client du compte.
	 * @param {Object} id : nom ou code identifiant
	 *     l'invocation (il permet d'éviter plusieurs
	 *     appels distants pour le même contenu ; NOTA:
	 *     il est tout de même récupéré à nouveau si le
	 *     param force est 'true').
	 * @param {Object} axeProperty : propriété à utiliser
	 *     pour récupérer l'axe demandé.
	 * @param {Integer} limit : nombre de résultats par axe.
	 * @param {String} pageInfos : page de tracking/redirection.
	 * @param {Object} onAfter : méthode à exécuter après
	 *     l'invocation (exécutée dans tous les cas)
	 * FIXME rajouter param force :.
	 * @param {Boolean} force : true pour forcer la
	 *     requête distante ; false sinon.
	 */
	BZZ.invokeNextDates = function(site, codeClient, id, axeProperty, limit, pageInfos, _onAfter) {
		function onAfter(_results) {
			_onAfter(_results);
			BUZZ_LOADING[id] = false;
		}

		if (BUZZ_LOADING[id]) { return; }
		BUZZ_LOADING[id] = true;
		if (!codeClient) {
			codeClient = 1;
		}
		if(!pageInfos) {
			pageInfos='/mev/infos.jsp';
		}
		var url = '/vols/buzz/date.rjs?pageInfos='+pageInfos+'&buzzId=' + id + '&site=' + site + '&codeClient=' + codeClient + '&axeProperty=' + axeProperty + '&limit=' + limit;
		EASY.requestManager.invokeEra(url, onAfter);
	};

	/**
	 * Fonction permettant de charger un Buzz distant
	 * de type 'Buzz Compagnies' (un top des prix
	 * contenant 'limit' résultats correspondant aux
	 * compagnies disponibles).
	 * @param {Integer} site : id du site actuel.
	 * @param {Integer} codeClient : code client du compte.
	 * @param {Object} id : nom ou code identifiant
	 *     l'invocation (il permet d'éviter plusieurs
	 *     appels distants pour le même contenu ; NOTA:
	 *     il est tout de même récupéré à nouveau si le
	 *     param force est 'true').
	 * @param {Object} axeProperty : propriété à utiliser
	 *     pour récupérer l'axe demandé.
	 * @param {Integer} limit : nombre de résultats par axe.
	 * @param {String} pageInfos : page de tracking/redirection.
	 * @param {Object} onAfter : méthode à exécuter après
	 *     l'invocation (exécutée dans tous les cas)
	 * FIXME rajouter param force :.
	 * @param {Boolean} force : true pour forcer la
	 *     requête distante ; false sinon.
	 */
	BZZ.invokeCompagnies = function(site, codeClient, id, axeProperty, limit, pageInfos, onAfter) {
		if (BUZZ_LOADING[id]) { return; }
		BUZZ_LOADING[id] = true;
		if (!codeClient) {
			codeClient = 1;
		}
		var rjsResource = new RJS.Resource(URL_ROOT + RJS_PATH + '/buzzCompagnies.jsp?id=' + id + '&site=' + site + '&clientId=' + codeClient + '&axeProperty=' + axeProperty + '&limit=' + limit + '&pageInfos=' + pageInfos);
		var rjsListener = new BuzzRJSListener(id, rjsResource, onAfter);
		rjsLocators.compagnies.addListener(rjsListener);
		rjsLocators.compagnies.invoke(rjsResource);
	};

	LOG.debug('mev.buzz#<init>: OK');
}()); // exécution de la fonction anonyme ici

