//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
//
// fonctions de création de GoogleMaps et Toogle KML
// besoin de JQuery (testé avec jquery-1.3.2.min.js)
// 
// créé 01/12/2009 
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//

//----------------------------------------------------------------------------//
// init des var 
//----------------------------------------------------------------------------//

//google.load('maps', '2');

var currentKmlObjects = {}; // objet des KML
var config = {};    // valeur de config

// valeur par défaut si on n'en déclare pas lors de l'appel (ici centre sur le France) 
var defaut_lat = 46.18280177;
var defaut_lon = 4.44102002;
var defaut_zoom = 5;

// pour itinéraire
var monItineraire;
var couleur;

    
//----------------------------------------------------------------------------//
// Initilaisation : création de l'instance google
//----------------------------------------------------------------------------//
function init() {
    
    
    if(!document.getElementById('localizeMapBox')){
    
        alert('Erreur : Pas de place prévu pour insérer la carte');
        return false;
    }
    
    // on créé l'objet
    // store the object loaded for the given file... initially none of the objects are loaded, so initialize these to null
    $('.infoKML').each(function(i) {
    
        var index = $(this).children('input.urlkml').val();
        currentKmlObjects[index] = null;
    });
    
    
    if (google.maps.BrowserIsCompatible()) {
    	
    	// si on a pas donnée de valeur, on en donne par défaut
        if(!config.defaut_lat){config.defaut_lat = defaut_lat;}
        if(!config.defaut_lon){config.defaut_lon = defaut_lon;}
        if(!config.defaut_zoom){config.defaut_zoom = defaut_zoom;}
    	
    	
		map = new google.maps.Map2(document.getElementById('localizeMapBox'));
		map.setCenter(new google.maps.LatLng(config.defaut_lat, config.defaut_lon), config.defaut_zoom);
		geoCodeur = new google.maps.ClientGeocoder();
		
		map.addControl(new google.maps.SmallMapControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,10)));
		//map.addControl(new google.maps.MapTypeControl());
		//map.addControl(new google.maps.OverviewMapControl());
		//map.addControl(new google.maps.ScaleControl());
		
		
        // Options définies par défaut pour l'itinéraire
        optionsItineraire={
            // Type d'itinéraire : Routier
            travelMode: G_TRAVEL_MODE_DRIVING,
            // Eviter les autoroutes : Vrai (=oui)
            avoidHighways: true,
            // Préserver la vue actuelle : Vrai (=oui)
            preserveViewport: false
        }
        
        
        // texteItineraire : correspond à la balise <div> ayant pour identifiant id="EmplacementTexteItineraire"
        texteItineraire = document.getElementById('localizeItineraireBox');
        // Création d'un nouvel itinéraire nommé "monItineraire"
        // Le résultat s'affichera sous forme de carte dans la carte nommée "map" 
        // Le résultat s'affichera sous forme textuelle dans "texteItineraire" 
        monItineraire = new google.maps.Directions(map, texteItineraire);
        // lorsque le résultat du calcul de l'itinéraire nommé "monItineraire", 
        // est réussi et disponible, mais avant que toutes les informations 
        // ne viennent s'insérer dans la carte et dans le descriptif détaillé 
        // de l'itinéraire (='load'), alors la fonction 'onGDirectionsLoad' est appelée 
        google.maps.Event.addListener(monItineraire, 'load', onGDirectionsLoad);
        // lorsque le résultat du calcul de l'itinéraire nommé 'monItineraire',
        // provoque une erreur (='error'), alors la fonction 'handleErrors' est appelée 
        google.maps.Event.addListener(monItineraire, 'error', handleErrors);
	}
    else{
		alert("Désolé, mais votre navigateur n\'est pas compatible avec Google Maps");
	}
    
	//------------------------------------//
    // on charge les KML selon les cases à cochée
    //------------------------------------//
    majKML();
}
//----------------------------------------------------------------------------//
// Charge un fichier KML
//----------------------------------------------------------------------------//
function majKML(){
// on charge les KML selon les cases à cochée
	
	/*
	// pour chaque cases cochées, on charge le kml correspondant
    $('.infoKML :checked').each(function(i) {
    
        var urlkml = $(this).parent().children('input.urlkml').val();
        loadKml(urlkml);
    });
    */
    
    // pour chaque cases cochées, on charge le kml correspondant
    $('.infoKML').each(function(i) {
    
        var urlkml = $(this).children('input.urlkml').val();
        
        // on enlève tous les KML potentiellement chargé (si on localise un point ou calcule un itinéraire)
        deleteKmlFromUrl(urlkml);
        
        // et on charge tous ceux qui sont coché
        if($(this).children('input.togglekml').attr('checked')){
        
            loadKml(urlkml);
        }
    });
}
//----------------------------------------------------------------------------//
// Charge un fichier KML
//----------------------------------------------------------------------------//
function loadKml(kmlUrl) {
// Charge le fichier KML dans la carte
// <kmlUrl> est l'index de l'objet des KML (qui l'url du fichier)

    geoXml = new GGeoXml(kmlUrl);
    map.addOverlay(geoXml);
 
    currentKmlObjects[kmlUrl] = geoXml;
}
//----------------------------------------------------------------------------//
//
//----------------------------------------------------------------------------//
function deleteKmlFromUrl(kmlUrl){
// Supprime le fichier KML de la carte s'il existe
// <kmlUrl> est l'index de l'objet des KML (qui l'url du fichier)

    if (currentKmlObjects[kmlUrl]) {
    
        map.removeOverlay(currentKmlObjects[kmlUrl]);
        currentKmlObject = null;
    }
}
//----------------------------------------------------------------------------//
//
//----------------------------------------------------------------------------//
function geocodeAdresse(addresse) {

	if (geoCodeur) {
		geoCodeur.getLatLng(
			addresse,
			function(point) {
				if (!point) {
					alert('Impossible de géolocaliser cette adresse');
				} else {
					
					createMarker(point);
                	//------------------------------------//
                    // on charge les KML selon les cases à cochée
                    //------------------------------------//
                    majKML();
				}
			}
		);
	}
}
//----------------------------------------------------------------------------//
//
//----------------------------------------------------------------------------//
function createMarker(point, draggable, content){
// création d'un marker
// point : issu de coordonnées ou adresse 
// draggable : boolean
// content : information à mettre dans une bulle
// 

    
    if(draggable == '') draggable = false;
    // protection : si content est undefine
    if(!content) content = '';

    if(draggable){
    
    	marker = new google.maps.Marker(point, {draggable: true});
    	google.maps.Event.addListener(marker, 'dragstart', function() {
    		map.closeInfoWindow();
    	});
    	google.maps.Event.addListener(marker, 'dragend', function(point) {
    		centreCarte();
    	});
    	google.maps.Event.addListener(marker, 'drag', function(point) {
    		afficheCoordonnees(point);
    	});
    }
    else {
    
    	marker = new google.maps.Marker(point);
    }
    
	// on ne peut pas mettre d'info si le marker est draggable => incoherent
	if(!draggable && content != ''){
        
        marker.openInfoWindowHtml(content);
	}
	
	// protection pour éviter une erreur JS quand on appel le script sans div où charger la map
	if(map){
    	map.clearOverlays();
    	map.addOverlay(marker);
    	map.setCenter(point);
    }
}
//----------------------------------------------------------------------------//
//
//----------------------------------------------------------------------------//
// Fonction onGDirectionsLoad()
// Cette fonction va permettre de modifier la couleur du tracé de l'itinéraire 
// en fonction de son type : 
// piéton : Violet, 
// routier (sans autoroutes) : Bleu, 
// routier avec autoroute : Rouge. 
// Les paramètres modifiables sont : 
// color : couleur de la ligne (=couleur), 
// weight : épaisseur de la ligne en pixels(=5), 
// opacity : transparence de la ligne - valeur de 0 à 1. 
function onGDirectionsLoad(){
    monItineraire.getPolyline().setStrokeStyle({color: couleur, weight: 5, opacity: 1});
}
//----------------------------------------------------------------------------//
//
//----------------------------------------------------------------------------//
// Fonction handleErrors()
// Cette fonction permet d'afficher un message d'erreur lorsque le calcul de l'itinéraire
// nommé 'monItineraire' a échoué
function handleErrors(){
    /* Ouvre une fenêtre d'alerte, dans laquelle s'affiche un message suivi du code erreur */
    alert('itinéraire impossible à calculer, vérifiez vos adresses de départ et d\'arrivée');  //+monItineraire.getStatus().code
}
//----------------------------------------------------------------------------//
//
//----------------------------------------------------------------------------//
// Fonction setDirections() 
// Cette fonction permet de calculer l'itinéraire demandé. 
// adresseDepart : Adresse de départ, 
// adresseArrivee : Adresse d'arrivé,  
// optionsItineraire : Options applicables à l'itinéraire. 
function setDirections(adresseDepart, adresseArrivee) {
    
    // Si la case 'Eviter les autoroutes' est cochée alors l'option avoidHighways = true sinon avoidHighways = false
    if($('#autoroutes').attr('checked')){
    
        couleur = '#FF0000';
        optionsItineraire.avoidHighways=true;
    }
    else{
        couleur = '#0000FF';
        optionsItineraire.avoidHighways=false;
    }
    monItineraire.load('from: ' + adresseDepart + ' to: ' + adresseArrivee, optionsItineraire);
    
    
	//------------------------------------//
    // on charge les KML selon les cases à cochée
    //------------------------------------//
    majKML();
}

