var carnetAdresses = null; // CarnetAdresses
var viewTableCarnetAdresses = null;

var selectAdressesToCenter = null; // Select
var selectAdressesDepart = null; // Select
var selectAdressesArrivee = null; // Select

var gicon = null; // pushpin des taxis

var itineraire = null; // Itineraire
var tarifCourse = null; // TarifCourse

var map = null;

function init() {
    Taxilib.init('map', 'idCheckboxTypesTaxi', initLocalScripts);
}
function leave() {
    if (carnetAdresses!=null) carnetAdresses.writeCookie();
    if (Taxilib && Taxilib.leave) Taxilib.leave();
}
/**
 * Appelé sur le onload de la page
 */
function initLocalScripts() {
    map = Taxilib.map();
    Taxilib.viewMap.setCenter(48.85820278, 2.2943500, 11);

    selectAdressesToCenter = new Select(document.forms['center'].elements['selectAdresseToCenter']);
    selectAdressesDepart = new Select(document.forms['formItineraire'].elements['selectDepart']);
    selectAdressesArrivee = new Select(document.forms['formItineraire'].elements['selectArrivee']);

    carnetAdresses = new CarnetAdresses();

    // ITINERAIRE ET PRIX DE LA COURSE
    itineraire = new Itineraire(Taxilib.gmap(), "idResultatItineraire", "idResultatItineraireDetails");
    tarifCourse = new TarifCourse(itineraire);
    
    // La liste entière du carnet d'adresses a été modifiée, ou chargée par populateRows()
    HEvent.addListener(carnetAdresses, "reset", function() {
	    var adresses = carnetAdresses.adresses();
	    for (var id in adresses) {
		var adresse = adresses[id];
		var description = adresse.adresse().adresse() + " ["+adresse.intitule()+"]";
		selectAdressesToCenter.add(id, description);
		selectAdressesDepart.add(id, description);
		selectAdressesArrivee.add(id, description);
	    }	    
	});

    // Une adresse a été ajoutée au carnet
    HEvent.addListener(carnetAdresses, "added", function(id) {
	    var ccAdresse = carnetAdresses.adresses()[id];

	    var description = ccAdresse.adresse().adresse() + " ["+ccAdresse.intitule()+"]";
	    selectAdressesToCenter.add(id, description);

	    // L'adresse peut déjà exister dans les select des itinéraires, qui contiennent toutes
	    // les adresses du carnet d'adresse mais aussi les adresses présentes sur la carte
	    if (selectAdressesDepart.valueExists(id)) {
		selectAdressesDepart.chgDescription(id, description);
		selectAdressesArrivee.chgDescription(id, description);
	    } else {
		selectAdressesDepart.add(id, description);
		selectAdressesArrivee.add(id, description);
	    }	    
	});
    
    // Une adresse a été supprimée du carnet
    HEvent.addListener(carnetAdresses, "removed", function(id) {
	    selectAdressesToCenter.remove(id);
	    selectAdressesDepart.remove(id);
	    selectAdressesArrivee.remove(id);
	    map.removeMarker(["adresses", id]);	    
	});

    // Localiser une adresse sur la carte
    HEvent.addListener(carnetAdresses, "localised", centerToAdresseFromCC);

    // Une adresse du carnet a été modifiée (donc l'intitulé a été modifié)
    HEvent.addListener(carnetAdresses, "datasChanged", function(id, indexes, values) {
	    var ccAdresse = carnetAdresses.adresses()[id];
	    var description = ccAdresse.adresse().adresse() + " ["+ccAdresse.intitule()+"]";

	    selectAdressesToCenter.chgDescription(id, description);
	    selectAdressesDepart.chgDescription(id, description);
	    selectAdressesArrivee.chgDescription(id, description);
	});

    HEvent.addListener(Taxilib, "windowMapOpened", function(taxi) {
	    var traceur = Taxilib.getTraceurFromImei(taxi.imei());
	    tarifCourse.prixCourse(traceur);
	});

    carnetAdresses.loadFromCookie(); // Initialise le cookie

    viewTableCarnetAdresses = new ViewTable('idCarnetAdresses');
    viewTableCarnetAdresses.setAlternateRowColors();
    viewTableCarnetAdresses.setModel(carnetAdresses);
    viewTableCarnetAdresses.addColumn('intitule');
    viewTableCarnetAdresses.addColumn('adresse');
    viewTableCarnetAdresses.addColumn('region');
    viewTableCarnetAdresses.addColumn('departement');
    viewTableCarnetAdresses.addColumn('commune');
    viewTableCarnetAdresses.addColumn('actions');
    viewTableCarnetAdresses.populateRows();

    viewTableCarnetAdresses.createHeader();
    viewTableCarnetAdresses.orderAsc('intitule');    

    Taxilib.start();
    Son.playFlash("message.mp3");
}

/**
 * L'utilisateur veut localiser l'adresse en clair qu'il a fourni dans le champ texte
 */
function createAdresseFromGUI(adresse) {
    Adresse.find(adresse, function(a) {
	    var id = a.id();

	    // a est un objet Adresse
	    var marker = map.addMarker(['adresses', id], [a.lat(), a.lng()], a.windowMap());
	    map.bestViewOnMarker(['adresses', id]);
	    Map._onMarkerClicked(map, marker);

	    var description = a.adresse();
	    selectAdressesDepart.add(id, description);
	    selectAdressesArrivee.add(id, description);

	    HEvent.addListener(a, "addToCarnetAdresse", function() { addAdresseToCC(a); });
	    HEvent.addListener(a, "removeMarker", function() {
		    map.removeMarker(['adresses', id]);

		    selectAdressesDepart.remove(id);
		    selectAdressesArrivee.remove(id);
		});
	});
}

/**
 * Appelé depuis le calque
 * Fermer le calque puis l'ouvrir à nouveau
 */
function addAdresseToCC(adresse) {
    var intitule = prompt("Intitulé pour cette adresse :");
    if (intitule==null) return;

    var ccAdresse = new CCAdresse(intitule, adresse);
    carnetAdresses.addAdresse(ccAdresse);

    var id = adresse.id();
    map.removeMarker(['adresses', id]);

    var marker = map.addMarker(['adresses', id], [adresse.lat(), adresse.lng()], ccAdresse.windowMap());
    HEvent.addListener(ccAdresse, "removeMarker", function() {
	    map.removeMarker(['adresses', id]);
	});
    
    Map._onMarkerClicked(map, marker);
}

/**
 * L'utilisateur veut afficher cette adresse qui provient du carnet d'adresse, et centrer la carte dessus
 */
function centerToAdresseFromCC(id) {
    var ccAdresse = carnetAdresses.getFromId(id);
    if (ccAdresse==null) return;

    var adresse = ccAdresse.adresse();

    var marker = map.addMarker(['adresses', id], [adresse.lat(), adresse.lng()], ccAdresse.windowMap());
    map.bestViewOnMarker(['adresses', id]);
    HEvent.addListener(ccAdresse, "removeMarker", function() {
	    map.removeMarker(['adresses', id]);
	});

    Map._onMarkerClicked(map, marker);
}

/**
 * L'utilisateur veut ajouter une adresse à son carnet d'adresse en précisant :
 *  - son intitulé
 *  - l'adresse
 *
 * 1) Vérifier que l'intitulé n'existe pas déjà
 * 2) Essayer de résoudre l'adresse
 * 3) L'ajouter au carnet
 * 4) Afficher l'adresse sur la carte
 */
function createAdresseForCC(intitule, adresse) {
    if (intitule.length==0) {
	alert("vous devez préciser un intitulé");
	return;
    }

    if (adresse.length==0) {
	alert("vous devez préciser une adresse");
	return;
    }

    if (carnetAdresses.intituleExists(intitule)) {
	alert('ce label existe déjà');
	return;
    }

    Adresse.find(adresse, function(a) {
	    carnetAdresses.addAdresse(new CCAdresse(intitule, a));
	});

}

TypeTaxi.prototype.getPushpin = function(id) { 
    if (gicon==null) {
	gicon = new GIcon();
	gicon.image = "/pushpins/pushpin-bleu.png";
	/*icon.shadow = "css/images/transparent.png";*/
	gicon.iconSize = new GSize(21, 20);
	/*icon.shadowSize = new GSize(12, 20);*/
	gicon.iconAnchor = new GPoint(6, 20);
	gicon.infoWindowAnchor = new GPoint(5, 1);
	gicon.transparent = "/pushpins/transparent21x20.png";	
    }

    return gicon;
}

    function Son() { };
Son.object = null;
Son.flashObject = null;

Son.play = function(wavFile) {
    if (Son.object==null) {
	Son.object = document.createElement('object');
	Son.object.type = "audio/mpeg";

	var param = document.createElement('param');
	param.name = "autostart";
	param.value = true;
	
	Son.object.appendChild(param);
	document.body.appendChild(Son.object);
    }

    Son.object.data = wavFile;
};

Son.playFlash = function(mp3File) {
    if (Son.flashObject!=null) document.body.removeChild(Son.flashObject);

    Son.flashObject = document.createElement('div');    
    Son.flashObject.innerHTML = "<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0' width='1' height='1' id='dewplayer' align='middle'><param name='allowScriptAccess' value='always' /> <param name='movie' value='dewplayer.swf?mp3=" + mp3File + "&autostart=1' /> <param name='quality' value='high' /> <param name='bgcolor' value='#ffffff' /> <param name='wmode' value='transparent' /> <embed src='dewplayer.swf?mp3=" + mp3File + "&autostart=1' wmode='transparent' quality='high' bgcolor='#ffffff' width='1' height='1' name='dewplayer' align='middle' allowScriptAccess='always' type='application/x-shockwave-flash' pluginspage='http://www.macromedia.com/go/getflashplayer' ></embed></object>";

    document.body.appendChild(Son.flashObject);
};

