/*global window, ev */

/**
 * Documentation principale sur DokuWiki : http://delhi/dokuwiki/doku.php?id=general:js:lang
 * 
 * <b>Dans une page HTML, il faut les éléments obligatoires suivants :</b>
 * - la définition globale de la langue de la page (ex: <b>window.lang='fr_FR'</b> pour le français) ;
 * - l'appel à la librairie principale <b>http://cdn.easyvoyage.com/js/tools.js</b> ;
 * - les textes doivent être chargés <b>avant</b> les fichiers Javascript les utilisant.
 * (avec la méthode ev.lang.mapper.load(string...) ; cf. plus bas)
 * 
 * <b>Les éléments de fonctionnement de l'outil :</b>
 * - Espace de noms ("package") : <b>ev.lang</b>
 * - Objet principal de ce module : <b>ev.lang.mapper</b>
 * (Objet unique, pas de classe correspondante, soit l'équivalent de l'instance d'un Singleton)
 * - Fichier à insérer dans la page : <b>http://cdn.easyvoyage.com/js/ev/lang/mapper.js</b>
 *
 * <b>Chargement des textes (exemple de chargement du namespace ev.lang.test.text) :</b>
 * &lt;script type="text/javascript"&gt;ev.lang.mapper.load('test.text');&lt;/script&gt;
 * 
 * Beaucoup plus d'info sur DokuWiki.
 *
 * 
 * Fonction anonyme de déclaration de la classe gérant les
 * textes d'internationalisation.
 * 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.lang'.
 */
(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.tools){throw new Error("Le namespace 'ev.tools' doit exister");}
	if(!ev.log){throw new Error("Le namespace 'ev.log' doit exister");}
	if(!window.lang){throw new Error("La variable 'window.lang' doit exister");}
	// On crée le namespace ev.lang s'il n'est pas déjà déclaré
	if(!ev.lang){ev.lang={};}

	var DOT_PAT=/\./,
	BASE_PATH=window.ev_dev&&'/base'||'http://cdn.easyvoyage.com';

	/**
	 * Objet principal gérant le chargement des propriétés textes.
	 */
	ev.lang.mapper={
		/**
		 * Méthode permettant de déclancher le téléchargement des fichiers
		 * correspondant au namespaces donnés en paramaètres.
		 * 
		 * ex: mapper.load("test.text", "test.img", ...);
		 * 
		 * @param String... autant de paramètres que de namespaces à charger
		 */
		load: function (){
//			// FIXME temp
//			ev.log.LEVEL=ev.log.DEBUG;

			var l=arguments.length, f, scripts;
			scripts=[];
			while(l--){
				f=arguments[l].replace(DOT_PAT, '/');
				ev.log.debug('Treating file \''+f+'[_'+window.lang+'].js\'...');
				scripts.push('<script type="text/javascript" src="'+BASE_PATH+'/js/ev/lang/'+f+'_'+window.lang+'.js"></script>');
				ev.log.debug('Added script : '+scripts[scripts.length-1]);
				scripts.push('<script type="text/javascript" src="'+BASE_PATH+'/js/ev/lang/'+f+'.js"></script>');
				ev.log.debug('Added script : '+scripts[scripts.length-1]);
			}

			// Ajout des scripts dans le DOM (ils vont être exécutés à la volée)
			l=scripts.length;
			while(l--){
				document.writeln(scripts[l]);
			}

//			// FIXME temp
//			ev.log.LEVEL=ev.log.WARN;
		},

		/**
		 * Permet le chargement des propriétés textes à l'intérieur
		 * des différents fichiers chargés via load().
		 * 
		 * Doit se trouver au moins une fois par fichier chargé avec load().
		 * 
		 * ex: mapper.set("test.text", {var1: "bonjour", var2: "au revoir"});
		 *
		 * @param p : chemin du fichier de propriétés de langues
		 * @param v : tableaux associatif (JSON) des variables à ajouter
		 */
		set: function (p, v){
//			// FIXME temp
//			ev.log.LEVEL=ev.log.DEBUG;

			var l, tmpPath=ev.lang, path=p.split(DOT_PAT), n=0;
			ev.log.debug('p: '+p+' ; tmpPath: '+tmpPath+' ; path: ['+path+'] ; n: '+n);
			ev.log.info('Parcours du chemin des variables...');
			while(n<path.length){
				if(path[n].length){
					ev.log.debug('Entering into \''+path[n]+'\'...');
					if(!tmpPath[path[n]]){
						// si l'espace de noms n'existe pas, on le crée
						ev.log.debug('> Creating new namespace \''+path[n]+'\'...');
						tmpPath[path[n]]={};
					}
					ev.log.info(' -> \''+path[n]+'\'');
					tmpPath=tmpPath[path[n]];
				}
				else{
					ev.log.warn('Espace de noms contenant des vides \''+p+'\'');
				}
				++n;
			}

			// Itération sur les variables à insérer
			ev.log.info('Insertion/remplacement des variables...');
			for(l in v){
				ev.log.info(l+'='+v[l]+'  ->  ev.lang.'+p+(tmpPath[l]!==undefined&&tmpPath[l]!==null&&tmpPath[l].length? ' [old : '+tmpPath[l]+']': ''));
				tmpPath[l]=v[l];
			}

//			// FIXME temp
//			ev.log.LEVEL=ev.log.WARN;
		},

		/**
		 * Retourne la propriété donnée si définie et '' sinon.
		 * @param {String} p propriété à tester et afficher
		 * @param {String} n nom de la propriété (facultatif)
		 */
		ifdef: function (p, n){
			if(p!==undefined){
				return p;
			}
			else{
				ev.log.warn('Propriété non définie : '+(n? n+'=': '')+p);
				return '&nbsp;';
			}
		}
	};

	ev.log.debug('ev.lang.mapper ok');
	ev.tools.onFileLoad('ev/lang/mapper.js');
}()); // exécution de la fonction anonyme, ici