

(function() {
	var WIN = this,
			EASY = WIN.ev;
	if (!EASY) { throw 'me.Compte#<init>: Compte_EASY_undefined'; }

	if (!EASY.rjs) {
		throw new Error("Le namespace 'EASY.rjs' doit exister");
	}

	if (!EASY.me) {
		EASY.me = {};
	}

	if (EASY.me.Compte) {
		return;
	}

	/**
	 * Objet compte : permet de stocker les données d'un compte
	 * client dans la page courante et dans la session.
	 */
	EASY.me.Compte = function() {
		var site, codeClient, client, siteNom, nom;

		/**
		 * Permet de récupérér l'indetifiant numérique du site courant.
		 */
		this.getSite = function() {
			return site;
		};

		/**
		 * Permet de récupérer l'identifiant numérique du compte client.
		 */
		this.getClient = function() {
			return client;
		};

		/**
		 * Permet de choisir le site et le code client
		 * du compte.
		 *
		 * @param {string} _site : ID du site.
		 * @param {string} _codeClient : code client du compte (si on souhaite utiliser le compte principal du site, ce paramètre est facultatif).
		 */
		this.setBySiteAndCode = function(_site, _codeClient) {
			if (_site) {
				// init du compte à partir des paramètres donnés
				site = _site;
				codeClient = _codeClient;
				client = undefined;
			}
		};

		/**
		 * Permet de choisir le compte client courant à
		 * partir de son identifiant numérique.
		 *
		 * @param {string} _client : ID du compte client.
		 */
		this.setCompteByClient = function(_client) {
			if (_client) {
				// init du compte à partir du paramètre donné
				site = undefined;
				codeClient = undefined;
				client = _client;
			}
		};

		/**
		 * Permet de savoir si le compte est correct
		 * ('true') ou pas encore initialisé ('false').
		 */
		this.isSet = function() {
			return siteNom !== undefined;
		};

		/**
		 * Cette méthode copie les propriétés du compte donné
		 * dans le compte du contexte.
		 * @param {Object} c compte à copier dans celui du contexte.
		 */
		this.updateFrom = function(c) {
			EASY.tools.copyProperties(this, c);
			if (c.site) {
				site = c.site;
			}
			if (c.codeClient) {
				codeClient = c.codeClient;
			}
			if (c.client) {
				client = c.client;
			}
			if (c.siteNom) {
				siteNom = c.siteNom;
			}
			if (c.nom) {
				nom = c.nom;
			}
		};

		/**
		 * Permet de construire un document XML (chaîne de caractères)
		 * à partir de l'objet compte.
		 */
		this.objetToXML = function() {
			var xml = '<compte>';
			if (site) {
				xml += '<site>'+ site + '</site>';
			}
			if (codeClient) {
				xml += '<codeClient>'+ codeClient + '</codeClient>';
			}
			if (client) {
				xml += '<client>'+ client + '</client>';
			}
			xml += '</compte>';
			return xml;
		};

		/**
		 * Permet de construire la suite d'une URL
		 * à partir de l'objet compte.
		 */
		this.objetToURL = function() {
			//var url = "?";
			var url = '';
			if (site) {
				url += '&site='+ site;
			}
			if (codeClient) {
				url += '&codeClient='+ codeClient;
			}
			if (client) {
				url += '&client='+ client;
			}
			return url;
		};

		/**
		 * Fonction qui permet d'alimenter un objet compte à partir d'un objet XMLDocument passé en paramètre
		 * @param {Object} _doc : objet XMLDocument à parcourir.
		 */
		this.DOMToObjet = function(_doc) {
			if (!_doc) {throw new Error('impossible de creer un objet compte à partir du document donné');}
			var nodeTmp = _doc.getElementsByTagName('site')[0];
			if (nodeTmp && nodeTmp.firstChild) {
				site = nodeTmp.firstChild.nodeValue;
			}
			nodeTmp = _doc.getElementsByTagName('codeClient')[0];
			if (nodeTmp && nodeTmp.firstChild) {
				codeClient = nodeTmp.firstChild.nodeValue;
			}
			nodeTmp = _doc.getElementsByTagName('client')[0];
			if (nodeTmp && nodeTmp.firstChild) {
				client = nodeTmp.firstChild.nodeValue;
			}
		};

		/**
		 * Méthode permettant un affichage plus clair
		 * lors de trace de débogage.
		 */
		this.toString = function() {
			return 'Compte{' + (site ? site : '') + '/' + (codeClient ? codeClient : '') + ' - ' + (client ? client : '') + ' - ' + (siteNom ? siteNom : '') + '/' + (nom ? nom : '') + '}';
		};
	};



	/**
	 * Lance la requête ERA de création de compte et appel la méthode listener donnée en paramètre à reception de la réponse. Le listener prend en paramètre
	 * le résultat de la réponse.
	 * @param {Object} _param.site id du site.
	 * @param {Object} _param.code code client.
	 * @param {Object} _param.force paramètre force, à déterminer.
	 * @param {Object} _param.listener méthode à appeler à la réception de la réponse et en cas de timeout répété.
	 * @param {Object} _param.parentController instance de l'objet qui appel cette méthode.
	 */
	EASY.me.Compte.sendCompte = function(_param) {
		var nbRequest = 0;
		var enginePath = _param.enginePath;

		var regexp = /^\d{0,6}$/;
		if (!_param.listener) {
			EASY.log.error('ev.era.setCompte_no_receive_method_specified');
			return;
		}
		// Parse de la réponse et appel du listener avec la liste de recherche en paramètre.
		function onSuccess (r) {
			_param.listener(r);
		}
		// Méthode appelée lorsque la requête est en erreur. Cf. ev.requestManager.invokeEra.
		function onError (r) {
			_param.listener({exception: 'MAX_RETRY_REACHED'});
		}
		if (!(_param.site && _param.site.toString().match(regexp))) {
			EASY.requestManager.invokeEra(enginePath + '/compte/choisir.rjs?urlInfos=infos.jsp&force='+ _param.force, {onSuccess: onSuccess, onError: onError});
		}else if (_param.code && _param.code.toString().match(regexp)) {
			EASY.requestManager.invokeEra(enginePath + '/compte/choisir.rjs?urlInfos=infos.jsp&site='+ _param.site + '&codeClient='+ _param.code + '&force='+ _param.force, {onSuccess: onSuccess, onError: onError});
		}else {
			EASY.requestManager.invokeEra(enginePath + '/compte/choisir.rjs?urlInfos=infos.jsp&site='+ _param.site + '&force='+ _param.force, {onSuccess: onSuccess, onError: onError});
		}
	};

	EASY.log.debug('ev/me/Compte.js ok');
}());

