

/**
 * Fonction anonyme de déclaration de la classe VolSegment.
 * 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 window = this,
			ev = window.ev;

	if (!ev) { throw 'mev.searchHistoryManager#<init>: Needs ev.core module!'; }
	// On s'assure que le namespace ev.mev existe
	if (!ev.mev) { ev.mev = {}; }
	// Si la classe ev.mev.VolSegment est déjà déclarée, on sort
	if (ev.mev.VolSegment) {return;}

	/**
	 * Liste des propriétés utilisable sur les objets VolSegment.
	 */
	var PROPERTIES = [
		'id',
		'codeCompagnie',
		'dateDecollage',
		'heureDecollage',
		'codeAeroportDepart',
		'dateAtterissage',
		'heureAtterissage',
		'codeAeroportArrivee',
		'duree',
		'className',
		'aeroports'
	],

			/**
			 * Expression régulière permettant d'interpréter un
			 * segment de vol sous forme de clé unique (chaine de
			 * caractères).<br>
			 * Contient 9 groupes :<br>
			 *  - $1: date décollage<br>
			 *  - $2: heure décollage<br>
			 *  - $3: IATA aéroport décollage<br>
			 *  - $4: date atterrissage<br>
			 *  - $5: heure atterrissage<br>
			 *  - $6: IATA aéroport atterrissage<br>
			 *  - $7: durée de vol en minutes<br>
			 *  - $8: code compagnie aérienne<br>
			 *  - $9: id du vol
			 */
			REGEXP_VOLSEGMENT_UKEY = /^([0-9]{8})?,([0-9]{4})?,([A-Z0-9]{3}),([0-9]{8})?,([0-9]{4})?,([A-Z0-9]{3}),([0-9]{4})?,([A-Z0-9]{2,3})?,([0-9]{1,4})?$/,

			/**
			 * Expression régulière permettant de déchiffrer une
			 * date serveur (format yyyyMMdd).<br>
			 * Groupes :
			 *  - $1: année
			 *  - $2: mois
			 *  - $3: jour
			 */
			REGEXP_DATE_SERVEUR = /^([0-9]{4})([0-9]{2})([0-9]{2})$/,

			/**
			 * Expression régulière permettant de déchiffrer un
			 * horaire ou une durée (format HHmm).<br>
			 * Groupes :
			 *  - $1: heures
			 *  - $2: minutes
			 */
			REGEXP_HOUR_SERVEUR = /^([0-9]{2})([0-9]{2})$/;

	/**
	 * 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 VolSegment.
	 * @see createAccessors(_object, _property)
	 */
	ev.mev.VolSegment = function(vs) {
		if (vs) {
			var propCnt = PROPERTIES.length, i;
			for (i = 0; i < propCnt; ++i) {
				this[PROPERTIES[i]] = vs[PROPERTIES[i]];
				createAccessors(this, PROPERTIES[i]);
			}
		}
		this.className = 'default';
	};

	/**
	 * Définition des autres méthodes de la classe Vol.
	 */
	ev.mev.VolSegment.prototype = {
		toString: function() {
			return this.codeCompagnie + this.id + ','+
					this.dateDecollage + ','+
					this.heureDecollage + ','+
					this.codeAeroportDepart + ','+
					this.dateAtterissage + ','+
					this.heureAtterissage + ','+
					this.codeAeroportArrivee + ','+
					this.duree + '}';
		},

		getNomAeroportArrivee: function() {
			if (ev.mev.Context.aeroports === undefined) {
				ev.log.debug(('volSegment aeroport undefined'));
				return '';
			}
			if (ev.mev.Context.aeroports[this.codeAeroportArrivee] === undefined) {
				ev.log.debug(('volSegment aeroport undefined'));
				return '';
			}
			return ev.mev.Context.aeroports[this.codeAeroportArrivee].nom;
		},

		getNomAeroportDepart: function() {
			if (ev.mev.Context.aeroports === undefined) {
				ev.log.debug(('volSegment aeroport undefined'));
				return '';
			}
			if (ev.mev.Context.aeroports[this.codeAeroportDepart] === undefined) {
				ev.log.debug(('volSegment aeroport undefined'));
				return '';
			}
			return ev.mev.Context.aeroports[this.codeAeroportDepart].nom;
		},

		getNomVilleArrivee: function() {
			if (ev.mev.Context.aeroports === undefined) {
				ev.log.debug(('volSegment aeroport undefined'));
				return '';
			}
			if (ev.mev.Context.aeroports[this.codeAeroportArrivee] === undefined) {
				ev.log.debug(('volSegment aeroport undefined'));
				return '';
			}
			return ev.mev.Context.aeroports[this.codeAeroportArrivee].nomVille;
		},

		getNomVilleDepart: function() {
			if (ev.mev.Context.aeroports === undefined) {
				ev.log.debug(('volSegment aeroport undefined'));
				return '';
			}
			if (ev.mev.Context.aeroports[this.codeAeroportDepart] === undefined) {
				return '';
			}
			return ev.mev.Context.aeroports[this.codeAeroportDepart].nomVille;
		},

		getNomCompagnie: function() {
			if (ev.mev.Context.compagnies === undefined) {
				//        ev.log.debug(('volSegment compagnies undefined'));
				return '';
			}
			if (ev.mev.Context.compagnies[this.codeCompagnie] === undefined) {
				//        ev.log.debug(('volSegment compagnies undefined'));
				return '';
			}
			return ev.mev.Context.compagnies[this.codeCompagnie];
		}
	};

	/**
	 * Convertit une clé unique de segment de vol
	 * en objet VolSegment.
	 * @param {String} str chaine à interpréter.
	 * @return un objet ev.mev.VolSegment (ou null si la clé unique est mauvaise).
	 */
	ev.mev.VolSegment.createFromString = function(str) {
		if (!REGEXP_VOLSEGMENT_UKEY.test(str)) {
			ev.log.warn('ev.mev.VolSegment.createFromString()> Clé de segment de vol indéchiffrable : ' + str);
			return null;
		}
		// stockage de tous les groupes avant traitement des champs
		var dtDec = RegExp.$1,
				hrDec = RegExp.$2,
				aDec = RegExp.$3,
				dtAtt = RegExp.$4,
				hrAtt = RegExp.$5,
				aAtt = RegExp.$6,
				dur = RegExp.$7,
				comp = RegExp.$8,
				id = RegExp.$9;

		// enregistrement des champs du segment de vol
		return new ev.mev.VolSegment({
			dateDecollage: dtDec && dtDec.replace(REGEXP_DATE_SERVEUR, '$3/$2/$1'),
			heureDecollage: hrDec && hrDec.replace(REGEXP_HOUR_SERVEUR, '$1:$2'),
			codeAeroportDepart: aDec,
			dateAtterissage: dtAtt && dtAtt.replace(REGEXP_DATE_SERVEUR, '$3/$2/$1'),
			heureAtterissage: hrAtt && hrAtt.replace(REGEXP_HOUR_SERVEUR, '$1:$2'),
			codeAeroportArrivee: aAtt,
			duree: dur && dur.replace(REGEXP_HOUR_SERVEUR, '$1:$2'),
			codeCompagnie: comp,
			id: id
		});
	};

	/**
	 * Enumération des type de volSegment
	 */
	ev.mev.TypeVolSegment = {
		ALLER_SEGMENT1: 0,
		ALLER_SEGMENT2: 1,
		ALLER_SEGMENT3: 2,
		RETOUR_SEGMENT1: 3,
		RETOUR_SEGMENT2: 4,
		RETOUR_SEGMENT3: 5
	};

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

