function Itineraire(gmap, idResultatItineraire, idResultatItineraireDetails) { 
    this._visible = false;

    this._gmap = gmap;
    this._idResultatItineraire = document.getElementById(idResultatItineraire);
    this._idResultatItineraireDetails = document.getElementById(idResultatItineraireDetails);

    this._gdirections = new GDirections(gmap, document.getElementById(idResultatItineraireDetails));

    this._adresses = new Array; // Objets Adresse par lesquelles passe l'itinéraire
    this._result = null; // Résultat d'un itinéraire

    GEvent.addListener(this._gdirections, "error", Itineraire.handleGDirectionsErrors);

    var s = this;
    GEvent.addListener(this._gdirections, "load", function(dir) { s.onItineraireFound(dir); });
};
/**
 * Montre les informations de l'itinéraire
 * Cache le prix de la course si est visible
 */
Itineraire.prototype.toggleDisplay = function(a) {
    var divItineraire = document.getElementById('idResultatItineraireDetails');

    if (this._visible) {
	divItineraire.style.display = "none";
	a.innerHTML = "Montrer le détail de l\'itinéraire";
    } else {
	divItineraire.style.display = "block";
	a.innerHTML = "Cacher le détail de l\'itinéraire";
	tarifCourse.hide();
    }
    this._visible = !this._visible;
};
Itineraire.prototype.hide = function() {
    if (!this._visible) return;
    this._visible = false;
    var divItineraire = document.getElementById('idResultatItineraireDetails');
    divItineraire.style.display = "none";
    var a = document.getElementById('btDisplayItineraire');
    a.innerHTML = "Montrer le détail de l\'itinéraire";
};

Itineraire.prototype.findFromForm = function(form) {
    var idDepart = form.elements['selectDepart'].value;
    var idArrivee = form.elements['selectArrivee'].value;
    if (idDepart==idArrivee) {
	alert("L'adresse d'arrivée doit être différente de l'adresse de départ");
	return;
    }

    var adresseDepart = Adresse.Instances[idDepart];
    var adresseArrivee = Adresse.Instances[idArrivee];

    if (adresseDepart==null || adresseArrivee==null) return;
    if (this._adresses.length==2 && this._adresses[0]==adresseDepart && this._adresses[1]==adresseArrivee) return;

    var waypoints = new Array();
    waypoints[0] = adresseDepart.lat()+","+adresseDepart.lng();
    waypoints[1] = adresseArrivee.lat()+","+adresseArrivee.lng();
    this._gdirections.loadFromWaypoints(waypoints);

    this._adresses = [adresseDepart, adresseArrivee];
};

Itineraire.prototype.onItineraireFound = function(dir) {
    if (this._idResultatItineraire==null) return;

    var distance = dir.getDistance();
    var distance = distance['meters']/1000;

    var duree = dir.getDuration();

    this._idResultatItineraire.innerHTML = "Distance : " + distance + " Kms, durée d'environ " + duree['html'];
    this._idResultatItineraire.innerHTML += ' <a href="#" class="submit" id="btDisplayItineraire" onclick="itineraire.toggleDisplay(this); return false;">Voir le détail de l\'itinéraire</a>';
    this._idResultatItineraire.innerHTML += ' <a href="#" class="submit" id="btDisplayPrix" onclick="tarifCourse.toggleDisplay(this); return false;">Estimer le prix de la course</a>';

    this._result = dir;

    GEvent.trigger(this, "itineraireChanged");
};

Itineraire.prototype.distanceKm = function() {
    if (this._result==null) return 0;
    var distance = this._result.getDistance();
    return distance['meters']/1000;
};

Itineraire.prototype.dureeSecs = function() {
    if (this._result==null) return 0;
    var duree = this._result.getDuration();
    return duree['seconds'];
};

Itineraire.prototype.dureeHtml = function() {
    if (this._result==null) return 0;
    var duree = this._result.getDuration();
    return duree['html'];
};

Itineraire.handleGDirectionsErrors = function(dir) {
    if (dir.getStatus().code==G_GEO_UNKNOWN_ADDRESS) alert("Aucune localisation g\351ographique n'a pu \364tre obtenue pour au moins une des adresses de d\351part ou d'arriv\351e.");
    else if (dir.getStatus().code==G_GEO_SERVER_ERROR) alert("Erreur de la requ&\364te de g\351olocalisation. La raison en est inconnue...");
    else if (dir.getStatus().code==G_GEO_MISSING_QUERY) alert("Erreur de la requ&\364te de g\351olocalisation");
    else if (dir.getStatus().code==G_GEO_BAD_KEY) alert("Cl\351 Google Maps API incorrect !");
    else if (dir.getStatus().code==G_GEO_BAD_REQUEST) alert("Au moins une des adresses de d\351part ou d'arriv\351e n'a pas \351t\351 comprise");
    else alert("Une erreur inconnue s'est produite !");
};


