// on teste d'abord l'existance des classes nécessaires
Classe.checkDefined("XHRTimeline");
Classe.checkDefined("XHRPostMethod");
Classe.checkDefined("Compte");
Classe.checkDefined("SetCompteMethod");
Classe.checkDefined("Criteres");
Classe.checkDefined("SetCriteresMethod");
Classe.checkDefined("GetCriteresMethod");
// on teste ensuite l'existance du namespace MEH.recherche
if(typeof(MEH)=='undefined') throw new Error("Le namespace 'MEH' n'est pas défini!");
//FIXME if(typeof(MEH.recherche)=='undefined') throw new Error("Le namespace 'MEH.recherche' n'est pas défini!");
if(typeof(MEH.Recherche)=='undefined') throw new Error("Le namespace 'MEH.Recherche' n'est pas défini!");

/**
 * Classe permettant de stoker les
 * informations générales du moteur
 * MEH3.
 */
function Context(){
	if(arguments.callee.singletonInstance){
		// si le singleton a été instancié on le retourne directement.
		return arguments.callee.singletonInstance;
	}
	
	// sinon, definition de l'instance

	arguments.callee.singletonInstance=this;

	this.BASE_XML="/meh/xml";
	this.PAGE_INDEX="formulaire.html";
	this.PAGE_RESULTS="result.html";
	this.PAGE_INFOS="infos.html";
	this.PATH_SET_COMPTE="setCompte.jsp";
	this.PATH_SET_CRITERES="setCriteres.jsp";
	this.PATH_GET_CRITERES="getCriteres.jsp";

	var compte=new Compte();
	var criteres=new Criteres();
	var xhrContextTimeline=new XHRTimeline(100);

	/**
	 * Permet de récupérer le compte courant de la page.
	 */
	this.getCompte=function(){
		return compte;
	}

	/**
	 * Permet de récupérer le compte courant de la page.
	 */
	this.getCriteres=function(){
		return criteres;
	}

	/**
	 * Retourne la timeline générale du contexte de la page.
	 */
	this.getTimeline=function(){
		return xhrContextTimeline;
	}

	/**
	 * Permet de récupérer le jeu de criteres courant de la page
	 * et de lancer la recherche.
	 * NB : Ne doit être appelée qu'une seule fois.
	 */
	this.lancerRecherche=function(){
		if(typeof(log)=='function') log("Context.lancerRecherche() - criteres: "+criteres.toString(), 'debug');
		//var getCriteresMethod=new GetCriteresMethod(3000, this.BASE_XML+"/"+this.PATH_GET_CRITERES, criteres, this.onCriteresRetreived);
		var getCriteresMethod=new GetCriteresMethod(15000, this.BASE_XML+"/"+this.PATH_GET_CRITERES, criteres, this.onCriteresRetreived, 3);

		// Ajout de la méthode GET à la timeline...
		// La méthode sera exécutée au premier appel de #throwTimelineEvent(TimelineEvent)
    	xhrContextTimeline.addTimelineListener(getCriteresMethod);
	}

	/**
	 * Utilisation du jeu de criteres, une
	 * fois qu'il est récupéré et démarrage
	 * recherche.
	 */
	this.onCriteresRetreived=function(){
		if(typeof(log)=='function') log('criteres retreived : '+criteres.toString());
		// lancement de la recherche
		MEH.Recherche.startRecherche();
	}
	
	this.initForm=function(){
		// Alimenter le formulaire à partir de l'objet
		if(document.getElementById("lieuMEH") != null){
			document.getElementById("lieuMEH").value=criteres.ville;
		}
		if(document.getElementById("jourDebutMEH") != null && document.getElementById("moisDebutMEH") != null){
			Date.convertDateToSelector(criteres.dateDebut, "jourDebutMEH", "moisDebutMEH");
		}
		if(document.getElementById("jourFinMEH") != null && document.getElementById("moisFinMEH") != null){
			Date.convertDateToSelector(criteres.dateFin, "jourFinMEH", "moisFinMEH");
		}
		if(document.getElementById("chambres") != null){
			document.getElementById("chambres").value=criteres.chambres;
		}
		if(document.getElementById("paxAdultes") != null){
			document.getElementById("paxAdultes").value=criteres.paxAdultes;	
		}
		if(document.getElementById("paxEnfants") != null){
			document.getElementById("paxEnfants").value=criteres.paxEnfants;	
		}
		if(document.getElementById("etoiles") != null){
			document.getElementById("etoiles").value=criteres.etoiles;		
		}
	}

	/**
	 * FIXME
	 */
	this.setCriteres=function(){
		if(typeof(log)=='function') log("Envoi des criteres...", "debug");
		xhrContextTimeline.addTimelineListener(new SetCriteresMethod(15000, this.BASE_XML+"/"+this.PATH_SET_CRITERES, criteres, this.onCriteresRecorded, 3));
	}

	/**
	 * FIXME
	 */
	this.onCriteresRecorded=function(){
		if(typeof(log)=='function') log('criteres recorded : '+criteres.toString(), "info");

		if(typeof(log)=='function') log("Ouverture page resultats...", "debug");
		window.location.href=Context().PAGE_RESULTS;
	}

	/**
	 * Permet de choisir le chemin des pages XML.
	 * @param {String} _baseXML : chemin des XML
	 */
	this.setBaseXML=function(_baseXML){
		this.BASE_XML=_baseXML;
	}

	/**
	 * Permet de choisir le chemin de la page d'index.
	 * @param {String} _page : page d'index
	 */
	this.setPageIndex=function(_page){
		this.PAGE_INDEX=_page;
	}

	/**
	 * Permet de choisir le chemin de la page de resultats.
	 * @param {String} _page : page de resultats
	 */
	this.setPageResults=function(_page){
		this.PAGE_RESULTS=_page;
	}

	/**
	 * Permet de choisir le chemin de la page de redirection partenaire.
	 * @param {String} _page : page de redirection
	 */
	this.setPageInfos=function(_page){
		this.PAGE_INFOS=_page;
	}

	/**
	 * Permet de choisir le site et le code client
	 * du compte courant.
	 *
	 * Une fois les données fixées, cette méthode
	 * envoie la nouvelle définition de compte dans
	 * la session.
	 *
	 * @param _site : ID du site
	 * @param _codeClient : code client du compte (si on souhaite utiliser le compte principal du site, ce paramètre est facultatif)
	 */
	this.setCompteBySiteAndCode=function(_site, _codeClient){
		if(_site!=undefined){
			// init du compte à partir des paramètres donnés
			compte.setBySiteAndCode(_site, _codeClient);

			// envoi du compte au serveur (via timeline)
			this.recordCompte();
		}
	}

	/**
	 * Permet de choisir le compte client courant à
	 * partir de son identifiant numérique.
	 *
	 * Une fois les données fixées, cette méthode
	 * envoie la nouvelle définition de compte dans
	 * la session.
	 *
	 * @param _client : ID du compte client
	 */
	this.setCompteByClient=function(_client){
		if(_client!=undefined){
			// init du compte à partir du paramètre donné
			compte.setCompteByClient(_client);

			// envoi du compte au serveur (via timeline)
			this.recordCompte();
		}
	}

	/**
	 * Méthode privée permettant d'effectuer la requête réelle
	 * d'enregistrement du compte vers le serveur.
	 */
	this.recordCompte=function(){
		if(typeof(log)=='function') log("recordCompte() - compte: "+compte.toString(), 'info');
		//var postCompteMethod=new SetCompteMethod(3000, this.BASE_XML+"/"+this.PATH_SET_COMPTE, compte, this.onCompteRecorded);
		var postCompteMethod=new SetCompteMethod(15000, this.BASE_XML+"/"+this.PATH_SET_COMPTE, compte, this.onCompteRecorded, 3);

		// Ajout de la méthode POST à la timeline...
		// La méthode sera exécutée au premier appel de #throwTimelineEvent(TimelineEvent)
    xhrContextTimeline.addTimelineListener(postCompteMethod);
	}

	/**
	 * FIXME
	 */
	this.onCompteRecorded=function(){
		if(typeof(log)=='function') log('compte recorded : '+compte.toString(), "info");
	}

	// on retourne l'instance créée
	return this;
}

// instanciation du singleton
new Context();
if (typeof(log)=='function') log("me3/meh/Context.js ok", "info");
