/**
 * 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(){
	// 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");}
	// On s'assure que le namespace ev.mev existe
	if(!ev.mev){ ev.mev={}; }
	// Si la classe ev.mev.Vol est déjà déclarée, on sort
	if(ev.mev.Vol){return;}

	/**
	 * Liste des propriétés utilisable sur les objets Vol.
	 */
	var PROPERTIES=[
		'id',
		'ukey',
		'pubDate',
		'axe',
		'nomVilleDepart',
		'nomVilleArrivee',
		'prix',
		'prixInt',
		'idPartenaire',
		'nomPartenaire',
		'partenaire',
		'codeAeroportDepartAller',
		'codeAeroportArriveeAller',
		'codeAeroportDepartRetour',
		'codeAeroportArriveeRetour',
		'codeCompagnie',
		'nomCompagnie',
		'compagnie',
		'dateDepartAller',
		'dateDepartRetour',
		'urlInfos',
		'idTrajetAR'
	];

	/**
	 * Méthode facilitant la création d'accesseurs.
	 * @param {Object} _object : l'objet pour lequel il faut créer des accesseurs
	 * @param {Object} _property : propriété nécessitant des accesseurs
	 */
	function createAccessors(_object, _property){
		var tmpP=_property.capitalize();
		/** getter */
		_object['get'+tmpP]=function(){
			return _object[_property];
		};
		/** setter */
		_object['set'+tmpP]=function(v){
			_object[_property]=v;
		};
		//ev.log.warn('property "'+_property+'" ok : get'+tmpP+'() / set'+tmpP+'(v)');
	}

	/**
	 * Constructeur simple sans paramètre.
	 * Il initialise les getters/setters des
	 * propriétés du Vol.
	 * @see createAccessors(_object, _property)
	 */
	ev.mev.Vol=function(){
		var propCnt=PROPERTIES.length;
		for(var i=0; i<propCnt; ++i){
			createAccessors(this, PROPERTIES[i]);
		}
	};

	/**
	 * Définition des autres méthodes de la classe Vol.
	 */
	ev.mev.Vol.prototype={
		objetToXML: function(){
			//FIXME gérer les & => &amp;
			var xml='<vol>';
			var propCnt=PROPERTIES.length;
			var prop;
			for(var i=0; i<propCnt; ++i){
				prop=PROPERTIES[i];
				if(this[prop]!==undefined){
					// NB : si c'est null ou 0 ou '' ou false, on l'ajoute aussi
					xml+='<'+prop+'>'+this[prop]+'</'+prop+'>';
				}
			}
			return xml+'</vol>';
		},

		/**
		 * fonction qui permet d'alimenter un objet critere à partir d'un objet XMLDocument passé en paramètre
		 * @param {Object} document
		 */
		DOMToObjet: function(document){
			//FIXME gérer les &amp; => &
			if(!document){
				throw new Error("Impossible de creer un objet 'Vol' à partir de l'objet passé en paramètre.");
			}
			var propCnt=PROPERTIES.length;
			var prop;
			var tag;
			for(var i=0; i<propCnt; ++i){
				prop=PROPERTIES[i];
				tag=ev.dom.tags(prop);
				if(tag[0]&&tag[0].firstChild){
					this[prop]=tag[0].firstChild.nodeValue;
				}
			}
		},



		toString: function(){
			return "Vol{"+this.ukey+"}";
		}
	};

	ev.log.debug('ev.mev.Vol ok');
})(); // exécution de la fonction anonyme ici
