/*global window, ev */

/**
 * 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(){
	// 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.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');
	ev.tools.onFileLoad('volSegment.js');
})(); // exécution de la fonction anonyme ici