// Initialisation des tableaux de filtrage
var arrayCOMPAGNIES=new Array();
var arrayESCALES=new Array();
var arrayAEROPORTS_DEPARTALLER=new Array();
var arrayAEROPORTS_ARRIVEEALLER=new Array();
var arrayAEROPORTS_DEPARTRETOUR=new Array();
var arrayAEROPORTS_ARRIVEERETOUR=new Array();
var arrayHEURES_DEPARTALLER=new Array();
var arrayHEURES_ARRIVEEALLER=new Array();
var arrayHEURES_DEPARTRETOUR=new Array();
var arrayHEURES_ARRIVEERETOUR=new Array();
var arrayDUREES_ALLER=new Array();
var arrayDUREES_RETOUR=new Array();

// DEBUG : TODO : remove
Array.toString=function(){
  var txt="Array{ length="+this.length;
  for(var i in this){
    txt+=", "+i+"="+this[i];
  }
  return txt+" }";
}

// Objet vol
function Vol(id,direct,prixTTC,dateDepartAller,dateArriveeRetour,compagnie,
    IATADepartAller,IATAArriveeAller,IATADepartRetour,IATAArriveeRetour,
    heureDepartAller,heureArriveeAller,heureDepartRetour,heureArriveeRetour,
    dureeAller,dureeRetour,partenaire,nomPartenaire,link){

  this.id=id;
  this.link=link;
  
  this.partenaire=partenaire;
  this.nomPartenaire=nomPartenaire;

  this.direct=direct;
  this.prixTTC=prixTTC;

  this.compagnie=compagnie;// Contient un code IATA

  this.dateDepartAller=dateDepartAller;// Contient le timestamp de la date et l'heure du depart aller
  this.dateArriveeRetour=dateArriveeRetour;// Contient le timestamp de la date et l'heure du depart retour

  this.IATADepartAller=IATADepartAller;// Contient le code IATA de l'aeroport de depart (vol aller)
  this.IATAArriveeAller=IATAArriveeAller;// Contient le code IATA de l'aeroport d'arrivee (vol aller)
  this.IATADepartRetour=IATADepartRetour;// Contient le code IATA de l'aeroport de depart (vol retour)
  this.IATAArriveeRetour=IATAArriveeRetour;// Contient le code IATA de l'aeroport d'arrivee (vol retour)

  this.heureDepartAller=heureDepartAller;// Contient le timestamp de l'heure de depart (vol aller)
  this.heureArriveeAller=heureArriveeAller;// Contient le timestamp de l'heure d'arrivee (vol aller)
  this.heureDepartRetour=heureDepartRetour;// Contient le timestamp de l'heure de depart (vol retour)
  this.heureArriveeRetour=heureArriveeRetour;// Contient le timestamp de l'heure d'arrivee (vol retour)

  this.dureeAller=dureeAller;// Contient le timestamp de la duree du vol aller
  this.dureeRetour=dureeRetour;// Contient le timestamp de la duree du vol retour
}

Vol.prototype.toString=function(){
  return this.id;
}

// Doit on ou non afficher un vol
Vol.prototype.canDisplay=function(){
  if(snf_getBorneInfFiltered(arrayPRIX,this.prixTTC)) return false;
  if(arrayPARTENAIRES[this.partenaire]) return false;

  if(arrayCOMPAGNIES[this.compagnie]) return false;
  if(arrayESCALES[this.direct]) return false;

  if(arrayAEROPORTS_DEPARTALLER[this.IATADepartAller]) return false;
  if(arrayAEROPORTS_ARRIVEEALLER[this.IATAArriveeAller]) return false;
  if(arrayAEROPORTS_DEPARTRETOUR[this.IATADepartRetour]) return false;
  if(arrayAEROPORTS_ARRIVEERETOUR[this.IATAArriveeRetour]) return false;

  if(snf_getBorneInfFiltered(arrayHEURES_DEPARTALLER,this.heureDepartAller)) return false;
  if(snf_getBorneInfFiltered(arrayHEURES_ARRIVEEALLER,this.heureArriveeAller)) return false;
  if(snf_getBorneInfFiltered(arrayHEURES_DEPARTRETOUR,this.heureDepartRetour)) return false;
  if(snf_getBorneInfFiltered(arrayHEURES_ARRIVEERETOUR,this.heureArriveeRetour)) return false;

  if(snf_getBorneInfFiltered(arrayDUREES_ALLER,this.dureeAller)) return false;
  if(snf_getBorneInfFiltered(arrayDUREES_RETOUR,this.dureeRetour)) return false;

  return true;
}

//alert(snf_getBorneInfFiltered(arrayPRIX,this.prixTTC));
//alert(arrayPARTENAIRES[this.partenaire]);
//alert(arrayCOMPAGNIES[this.compagnie]);
//alert(arrayESCALES[this.direct]);


// Tris
var SORT_PRIXTTC=0;
var SORT_COMPAGNIE=1;
var SORT_DIRECT=2;
var SORT_DATEALLER=3;
var SORT_DATERETOUR=4;
var SORT_AEROPORTDEPARTALLER=5;
var SORT_AEROPORTARRIVEEALLER=6;
var SORT_AEROPORTDEPARTRETOUR=7;
var SORT_AEROPORTARRIVEERETOUR=8;
var SORT_HEUREDEPARTALLER=9;
var SORT_HEUREARRIVEEALLER=10;
var SORT_HEUREDEPARTRETOUR=11;
var SORT_HEUREARRIVEERETOUR=12;
var SORT_DUREEALLER=13;
var SORT_DUREERETOUR=14;
var SORT_PARTENAIRE=15;

var sortType=-1;
var sortWay='asc';

// Fonction de comparaison entre deux vols (utilise le flag sortType)
function compareVols(vol1,vol2){
  if(sortType==SORT_COMPAGNIE){
    if(vol1.compagnie<vol2.compagnie) return -1;
    else if(vol1.compagnie>vol2.compagnie) return 1;
    else return 0;
  }
  else if(sortType==SORT_DIRECT) return vol1.direct-vol2.direct;
  else if(sortType==SORT_DATEALLER) return vol1.dateDepartAller-vol2.dateDepartAller;
  else if(sortType==SORT_DATERETOUR) return vol1.dateArriveeRetour-vol2.dateArriveeRetour;

  else if(sortType==SORT_PARTENAIRE) return vol1.partenaire-vol2.partenaire;

  else if(sortType==SORT_AEROPORTDEPARTALLER){
    if(vol1.IATADepartAller<vol2.IATADepartAller) return -1;
    else if(vol1.IATADepartAller>vol2.IATADepartAller) return 1;
    else return 0;
  }
  else if(sortType==SORT_AEROPORTARRIVEEALLER){
    if(vol1.IATAArriveeAller<vol2.IATAArriveeAller) return -1;
    else if(vol1.IATAArriveeAller>vol2.IATAArriveeAller) return 1;
    else return 0;
  }
  else if(sortType==SORT_AEROPORTDEPARTRETOUR){
    if(vol1.IATADepartRetour<vol2.IATADepartRetour) return -1;
    else if(vol1.IATADepartRetour>vol2.IATADepartRetour) return 1;
    else return 0;
  }
  else if(sortType==SORT_AEROPORTARRIVEERETOUR){
    if(vol1.IATAArriveeRetour<vol2.IATAArriveeRetour) return -1;
    else if(vol1.IATAArriveeRetour>vol2.IATAArriveeRetour) return 1;
    else return 0;
  }

  else if(sortType==SORT_HEUREDEPARTALLER) return vol1.heureDepartAller-vol2.heureDepartAller;
  else if(sortType==SORT_HEUREARRIVEEALLER) return vol1.heureArriveeAller-vol2.heureArriveeAller;
  else if(sortType==SORT_HEUREDEPARTRETOUR) return vol1.heureDepartRetour-vol2.heureDepartRetour;
  else if(sortType==SORT_HEUREARRIVEERETOUR) return vol1.heureArriveeRetour-vol2.heureArriveeRetour;

  else if(sortType==SORT_DUREEALLER) return vol1.dureeAller-vol2.dureeAller;
  else if(sortType==SORT_DUREERETOUR) return vol1.dureeRetour-vol2.dureeRetour;

  else return vol1.prixTTC-vol2.prixTTC;// Par defaut tri prix
}

// Fonction de tri generique en fonction du type de tri demande
function sortVols(type,way){
  if(way==undefined){// si le parametre way manque
    if(sortType==type) sortWay=(sortWay=='asc')? 'desc': 'asc';// si le type etait identique avant, on change le sens de tri
    else{
      sortWay='asc';// sinon on effectue un tri ascendant
      sortType=type;// avec le nouveau type de tri
    }
  }else{// si le parametre way est fourni
    sortType=type;
    sortWay=way;
  }
  array.sort(compareVols);
  if(sortWay=='desc') array.reverse();// si le tri est descendant, on renverse le tableau de vols
  snf_refresh();
}

/*********************************/
/****** Fonctions publiques ******/
/*********************************/

// Tous les tris possibles
function sortVolsPrixTTC(way){ sortVols(SORT_PRIXTTC,way); }
function sortVolsCompagnie(way){ sortVols(SORT_COMPAGNIE,way); }
function sortVolsDirect(way){ sortVols(SORT_DIRECT,way); }
function sortVolsDateAller(way){ sortVols(SORT_DATEALLER,way); }
function sortVolsDateRetour(way){ sortVols(SORT_DATERETOUR,way); }
function sortVolsAeroportDepartAller(way){ sortVols(SORT_AEROPORTDEPARTALLER,way); }
function sortVolsAeroportArriveeAller(way){ sortVols(SORT_AEROPORTARRIVEEALLER,way); }
function sortVolsAeroportDepartRetour(way){ sortVols(SORT_AEROPORTDEPARTRETOUR,way); }
function sortVolsAeroportArriveeRetour(way){ sortVols(SORT_AEROPORTARRIVEERETOUR,way); }
function sortVolsHeureDepartAller(way){ sortVols(SORT_HEUREDEPARTALLER,way); }
function sortVolsHeureArriveeAller(way){ sortVols(SORT_HEUREARRIVEEALLER,way); }
function sortVolsHeureDepartRetour(way){ sortVols(SORT_HEUREDEPARTRETOUR,way); }
function sortVolsHeureArriveeRetour(way){ sortVols(SORT_HEUREARRIVEERETOUR,way); }
function sortVolsDureeAller(way){ sortVols(SORT_DUREEALLER,way); }
function sortVolsDureeRetour(way){ sortVols(SORT_DUREERETOUR,way); }
function sortVolsPartenaire(way){ sortVols(SORT_PARTENAIRE,way); }

// Comment agir sur les fitres a partir d'un affichage different (sans checkbox) ?
// - Il suffit de faire appel aux fonctions suivantes :
function setAffichagePrixTTC(value,affiche,refresh){ snf_filtrer(arrayPRIX,value,affiche,refresh); }
function setAffichageEscales(value,affiche,refresh){ snf_filtrer(arrayESCALES,value,affiche,refresh); }
function setAffichageCompagnie(value,affiche,refresh){ snf_filtrer(arrayCOMPAGNIES,value,affiche,refresh); }

function setAffichageAeroportDepartAller(value,affiche,refresh){ snf_filtrer(arrayAEROPORTS_DEPARTALLER,value,affiche,refresh); }
function setAffichageAeroportArriveeAller(value,affiche,refresh){ snf_filtrer(arrayAEROPORTS_ARRIVEEALLER,value,affiche,refresh); }
function setAffichageAeroportDepartRetour(value,affiche,refresh){ snf_filtrer(arrayAEROPORTS_DEPARTRETOUR,value,affiche,refresh); }
function setAffichageAeroportArriveeRetour(value,affiche,refresh){ snf_filtrer(arrayAEROPORTS_ARRIVEERETOUR,value,affiche,refresh); }

function setAffichageHeureDepartAller(value,affiche,refresh){ snf_filtrer(arrayHEURES_DEPARTALLER,value,affiche,refresh); }
function setAffichageHeureArriveeAller(value,affiche,refresh){ snf_filtrer(arrayHEURES_ARRIVEEALLER,value,affiche,refresh); }
function setAffichageHeureDepartRetour(value,affiche,refresh){ snf_filtrer(arrayHEURES_DEPARTRETOUR,value,affiche,refresh); }
function setAffichageHeureArriveeRetour(value,affiche,refresh){ snf_filtrer(arrayHEURES_ARRIVEERETOUR,value,affiche,refresh); }

function choisiPrix(borneInf,borneSup,refresh){ choisirInterval(arrayPRIX,borneInf,borneSup,false,refresh); }
function choisiDirect(refresh){ choisir(arrayESCALES,'1',refresh); }
function choisiEscales(refresh){ choisir(arrayESCALES,'2',refresh); }
function choisiCompagnie(iata,refresh){ choisir(arrayCOMPAGNIES,iata,refresh); }

function choisiAeroportDepartAller(iata,refresh){ choisir(arrayAEROPORTS_DEPARTALLER,iata,refresh); }
function choisiAeroportArriveeAller(iata,refresh){ choisir(arrayAEROPORTS_ARRIVEEALLER,iata,refresh); }
function choisiAeroportDepartRetour(iata,refresh){ choisir(arrayAEROPORTS_DEPARTRETOUR,iata,refresh); }
function choisiAeroportArriveeRetour(iata,refresh){ choisir(arrayAEROPORTS_ARRIVEERETOUR,iata,refresh); }

function choisiHeuresDepartAller(borneInf,borneSup,refresh){ choisirInterval(arrayHEURES_DEPARTALLER,borneInf,borneSup,false,refresh); }
function choisiHeuresDepartAllerMatin(){ choisiHeuresDepartAller(5,12); }
function choisiHeuresDepartAllerApresMidi(){ choisiHeuresDepartAller(12,18); }
function choisiHeuresDepartAllerSoir(){ choisiHeuresDepartAller(18,24); }

function choisiHeuresArriveeAller(borneInf,borneSup,refresh){ choisirInterval(arrayAEROPORTS_ARRIVEEALLER,borneInf,borneSup,false,refresh); }
function choisiHeuresArriveeAllerMatin(){ choisiHeuresArriveeAller(5,12); }
function choisiHeuresArriveeAllerApresMidi(){ choisiHeuresArriveeAller(12,18); }
function choisiHeuresArriveeAllerSoir(){ choisiHeuresArriveeAller(18,24); }

function choisiHeuresDepartRetour(borneInf,borneSup,refresh){ choisirInterval(arrayHEURES_DEPARTRETOUR,borneInf,borneSup,false,refresh); }
function choisiHeuresDepartRetourMatin(){ choisiHeuresDepartRetour(5,12); }
function choisiHeuresDepartRetourApresMidi(){ choisiHeuresDepartRetour(12,18); }
function choisiHeuresDepartRetourSoir(){ choisiHeuresDepartRetour(18,24); }

function choisiHeuresArriveeRetour(borneInf,borneSup,refresh){ choisirInterval(arrayHEURES_ARRIVEERETOUR,borneInf,borneSup,false,refresh); }
function choisiHeuresArriveeRetourMatin(){ choisiHeuresArriveeRetour(5,12); }
function choisiHeuresArriveeRetourApresMidi(){ choisiHeuresArriveeRetour(12,18); }
function choisiHeuresArriveeRetourSoir(){ choisiHeuresArriveeRetour(18,24); }

// Fonctions permettant de selectionner les valeurs de tableaux entiers
function choisiTousPrix(refresh){ choisirTout(arrayPRIX,refresh); }
function choisiToutesEscales(refresh){ choisirTout(arrayESCALES,refresh); }
function choisiToutesCompagnies(refresh){ choisirTout(arrayCOMPAGNIES,refresh); }

function choisiTousAeroportsDepartAller(refresh){ choisirTout(arrayAEROPORTS_DEPARTALLER,refresh); }
function choisiTousAeroportsArriveeAller(refresh){ choisirTout(arrayAEROPORTS_ARRIVEEALLER,refresh); }
function choisiTousAeroportsDepartRetour(refresh){ choisirTout(arrayAEROPORTS_DEPARTRETOUR,refresh); }
function choisiTousAeroportsArriveeRetour(refresh){ choisirTout(arrayAEROPORTS_ARRIVEERETOUR,refresh); }

function choisiToutesHeuresDepartAller(refresh){ choisirTout(arrayHEURES_DEPARTALLER,refresh); }
function choisiToutesHeuresArriveeAller(refresh){ choisirTout(arrayHEURES_ARRIVEEALLER,refresh); }
function choisiToutesHeuresDepartRetour(refresh){ choisirTout(arrayHEURES_DEPARTRETOUR,refresh); }
function choisiToutesHeuresArriveeRetour(refresh){ choisirTout(arrayHEURES_ARRIVEERETOUR,refresh); }
