/*******************************************************************************/
// START - VUE DE DETAIL D'UN LIEU

var gMaps_ElUrl = location.protocol+'//www.ville-geneve.ch/';

/**
 *	Chargement de la carte et affichage du point de situation
 *	Utilisé dans la vue de détail d'un lieu
 * 
 */
function det_Gload(){

    // Si ce n'est pas IE6, on change quelques éléments'
    if (!gMaps_isIE6()) {

        // StreetView
        panorama = new google.maps.StreetViewPanorama(document.getElementById("panoStreetView"))

        map.setStreetView(panorama);
        //    panorama = map.getStreetView();
        panorama.setOptions({
            navigationControlOptions: {
                position: google.maps.ControlPosition.TOP_LEFT,
                style: google.maps.NavigationControlStyle.ZOOM_PAN
            }
        });

    }
    // Définition des variables de l'adresse actuellement affichée
    p_x = ($("#x").val() != '')? $("#x").val() : '';
    p_y = ($("#y").val() != '')? $("#y").val() : '';
    p_lat = ($("#latitude").val() != '')? $("#latitude").val() : p_x;
    p_lng = ($("#longitude").val() != '')? $("#longitude").val() : p_y;
    p_address = ($("#adresseLieu").length != 0)? $("#adresseLieu").val() : '';
    
    // Zoom sur le plan
    if($("#mapLevel").length != 0)
        p_level = $("#mapLevel").val();
    else
        p_level = '';
	
    // On définit l'adresse à afficher pour centrer le plan et placer le marqueur
    var address = p_address+', Suisse';

    // Def du niveau de zoom - Par défaut:15
    if(p_level == '')
        gMaps_level = 15;
    else
        gMaps_level = parseInt(p_level);

    var geocoder = new google.maps.Geocoder();
    var sview_client = new google.maps.StreetViewService(); // classe streetview
	
    if(p_lat != '' && p_lng != ''){
        // On récupère la position selon les coordonées GPS
        gMaps_coordLieu = new google.maps.LatLng( p_lat, p_lng );
        // Contrôle si le streetview est disponible
        sview_client.getPanoramaByLocation(gMaps_coordLieu, 50, det_displayStreetView);
    }
    // Si pas de coordonnées GPS, on demande à Google de nous les donner
    else{
        geocoder.geocode({
            'address': address
        }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                gMaps_coordLieu  = results[0].geometry.location;
                // Checke si le streetview est disponible
                sview_client.getPanoramaByLocation(gMaps_coordLieu, 50, det_displayStreetView);
            }
            else{
                alert("Adresse inconnue : " + address);
            }
        })
    }
}

/**
 * Affiche le StreetView
 * Utilisé dans la vue de détail d'un lieu
 *
 */
function det_displayStreetView(data, status){

    if (status == 'OK') {
        //affichage streetview
        var sview_pano = new google.maps.StreetViewPanorama(document.getElementById("panoStreetView"))
        sview_pano.setPosition(gMaps_coordLieu);
    }
    // Panorama non trouvable ou erreur
    else {
        $('#panoStreetView').hide();
        $('#map').width('958px');
		
    }
	
    // Affichage de la carte
    map.setCenter(gMaps_coordLieu);
	map.setZoom(gMaps_level);
    // Adapte la carte à la bonne taille
    google.maps.event.trigger(map, 'resize');
    // Recentre la carte sur le point
    map.panTo(gMaps_coordLieu);
    //Ajout des contrôle de zoom
    //map.addControl( new GLargeMapControl3D() );
    //map.addControl( new GMapTypeControl() );
    //positionnement du marker
    //var rem = '<div class="map-bulle">Test<\/div>';
    var marker = gMaps_markerWithoutBubble(gMaps_coordLieu, '');
    gMaps_addOverlay(marker)
	
}


/*******************************************************************************/
// END - VUE DE DETAIL D'UN LIEU



/*******************************************************************************/
// START - PLAN DE VILLE

var pdv_showQuartiersTxt = "Afficher les quartiers";
var pdv_hideQuartiersTxt = "Masquer les quartiers";
var pdv_QuartiersToggleBtn = null;

/**
 * Affiche le plan de ville
 */
function pdv_Gload(){

    // On rajoute un bouton pour faire apparaitre les quartiers
    var quartiersControlDiv = document.createElement('DIV');
    new gMaps_quartiersControl(quartiersControlDiv);

    quartiersControlDiv.index = 1;
    map.controls[google.maps.ControlPosition.TOP_RIGHT].push(quartiersControlDiv);
	
    // On centre la carte au départ sur le pont du Mont-Blanc
    var address = 'Pont du Mont-blanc, Genève, Suisse';
    // Def du niveau de zoom - Par défaut:13
    var gMaps_level = 13;
	
    // On charge le plan des quartiers
    pdv_KmlLoad();
	
    geocoder = new google.maps.Geocoder();
	
    geocoder.geocode({
        'address': address
    }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            map.setCenter(results[0].geometry.location);
            map.setZoom(gMaps_level);
        }
    });

    //Resize de la carte en hauteur
    $("#map").css( 'height', $('#main_container').height() )
	
    // On remet à zéro la coordonnée GPS moyenne
    gMaps_resetCentralPosition();

	
    // Active le bouton d'ouverture du mode plein écran
    $('#pdv_openFS').click( function () {
        pdv_openFS();
        pdv_resizeResults();
    });
	
    // Active le bouton de fermeture du mode plein écran
    $('#pdv_closeFS').click(function () {
        pdv_closeFS();
        pdv_resetResults();
    });
	
    // Observe si la fenêtre change de taille et recalcule le tout si ça arrive
    $(window).resize(function() {
        gMaps_resize();
        pdv_resizeResults();
    });

    // Bouton Rechercher
    $('#pdv_addressForm').submit(function () {
        //$.address.value( $('#gsa_gm_searchbox').val() );
        pdv_showAddressResult();
        return false;
    });

    // Bouton Rechercher
    $('#pdv_lieuxForm').submit(function () {
        /**
		 * TODO : Système de lancement automatique via l'adresse de la page
		 *		$.address.value( $('#gsa_gm_searchbox').val() );
		 */
        //		$.address.value( '/' );
        // On envoit la requête que si au moins un type de lieux est sélectionné
        pdv_checkSelectionLieux();
        pdv_showLieuxResult();
        return false;
    });


    $('#gsa_gm_searchbox').keyup(function () {
        pdv_checkAdress();
    });


    // On grise les boutons envoi pour la recherche de lieux et d'adresses
    // si aucun lieu sélectionné ou aucune adresse n'est spécifiée
    pdv_checkAdress();
    pdv_checkSelectionLieux();


    // Si ce n'est pas IE6, on change quelques éléments'
    if (!gMaps_isIE6()) {
        // On affiche le bouton "Plein écran"
        $('#pdv_openFS').show();
        // On affiche les ombres de la carte
        $('#ds').show();

        // StreetView
        panorama = new google.maps.StreetViewPanorama(document.getElementById("panoStreetView"))

        map.setStreetView(panorama);
        //    panorama = map.getStreetView();
        map.setOptions({streetViewControl : 1});
        panorama.setOptions({
            enableCloseButton: true,
            navigationControlOptions: {
                position: google.maps.ControlPosition.TOP_LEFT,
                style: google.maps.NavigationControlStyle.ZOOM_PAN
            }
        });

        // On contrôle si le StreetView s'ouvre ou se ferme
        google.maps.event.addListener(panorama, "visible_changed", function () {
            gMaps_toogleStreetView();
        });        
        
        // On change la position du StreetView, on recentre le plan
        google.maps.event.addListener(panorama, "position_changed", function () {
            map.setCenter(panorama.getPosition());
        });

    }

    
}

// Va chercher les résultats de la recherche et les affiche
// @param content string    valeur retournée par l'ajax

function pdv_showAddressResult(){

    var q = $('#gsa_gm_searchbox').val();
    if (q != 'Rechercher' && q != '') {
        pdv_showWaitImg();
        var adrResultGSA = gMaps_ElUrl + 'index.php?id=6676';

        if (gMaps_isStreetViewVisible()) panorama.setVisible(false);

        $.ajax({
            type: "GET",
            dataType : 'html',
            url: adrResultGSA,
            data : 'q=' + q + '&clear_cache=1',
            success: function(content) {
                pdv_displayResult(content);
            }
        });
    }
    
}

/**
 * Va chercher les résultats de la recherche et les affiche
 * @param content string    valeur retournée par l'ajax
 */
function pdv_showLieuxResult(){

    if ( $('#pdv_lieuxCategorie').val() > 0 ) {
        pdv_showWaitImg();
        var adrResultGSA = gMaps_ElUrl + 'index.php?id=2436';
        var	valToSearch = '';
	
        if ( $('#pdv_lieuxQuartier').val() != '0' ) valToSearch = valToSearch + '&tx_displaycontroller[quartier]=' + $('#pdv_lieuxQuartier').val();
        if ( $('#pdv_lieuxCategorie').val() != '0' ) valToSearch = valToSearch + '&tx_displaycontroller[categorie]=' + $('#pdv_lieuxCategorie').val();

        if (gMaps_isStreetViewVisible()) panorama.setVisible(false);
        
        $.ajax({
            type: "GET",
            dataType : 'html',
            url: adrResultGSA,
            data : valToSearch+'&clear_cache=1',
            success: function(content) {
                pdv_displayResult(content);
            }
        });
    }
}

/**
 * Intègre le nom des lieux recherchés dans le résultat de recherche
 */
function pdv_changeResultTitle() {
	            
    // On met à jour le titre de la page de résultat de recherche
    var lieux = '<b>' + $('#pdv_lieuxCategorie option:selected').html().toLowerCase() + '</b>' ;
    var quartier = '<b>' + $('#pdv_lieuxQuartier option:selected').html() + '</b>';
    if ($('#pdv_lieuxQuartier option:selected').val() != 0)
        $('#gsa_lieux_resultsTitle').html('pour ' + lieux + ' dans ' + quartier);
    else
        $('#gsa_lieux_resultsTitle').html('pour ' + lieux + ' dans tous les quartiers');
	
}


/*
 * Affichage des résultats dans la colonne de gauche
 * @param content string    valeur retournée par l'ajax
 */
function pdv_displayResult(content){

    gMaps_clearOverlays();

    $('#gsa_pdv_results').html(content);
	
    // Gestion de la pagination
    $('ul.tx-pagebrowse li a').click(function () {
        //		gMaps_clearOverlays();
        pdv_showWaitImg();
        if (gMaps_isStreetViewVisible()) panorama.setVisible(false);
        $.ajax({
            type: "GET",
            dataType : 'html',
            url: $(this).attr('title'),
            data : '&clear_cache=1',
            success: function(content) {
                pdv_displayResult(content);
            }
        });
        return false;
    });
	
    // on affiche les marqueurs des lieux trouvés
    pdv_showMarkers();
    // On cache les formulaires de recherche
    pdv_hideForms();
    // On définit les événements pour les lieux dans la colonne des résultats
    pdv_onResults();
    // On recalcule la taille des résultats de recherche
    pdv_resizeResults();
    // On change les titres dans les résultats
    pdv_changeResultTitle();
    $('ul.tx-pagebrowse li a').each(function () {
        $(this).attr('title', $(this).attr('href'));
        $(this).attr('href', 'javascript:return false;');
    });
}


/**
 * Crée et place les marqueurs des lieux trouvés dans les résultats de recherche
 */
function pdv_showMarkers() {

    gMaps_clearOverlays();
    
    var x = 0;

    $('div.gsa_result').each(function(index) {    
        var p_address = $(this).find('.adresse').val();
        if ( $(this).find('.lat').val() ) var p_lat = parseFloat ( $(this).find('.lat').val() );
        else var p_lat = '';
        if ( $(this).find('.lng').val() ) var p_lng = parseFloat ( $(this).find('.lng').val() );
        else var p_lng = '';
		
        // On définit le contenu des bulles, si c'est un grand ou petit marqueur,
        // et si la colonne de gauche ouvre une bulle
        if ( $(this).hasClass('smallIcon') ) {
            var small = true;
            // La zone qui pourra afficher la bulle en cliquant dessus
            var button = '';
            // Le contenu à afficher dans la bulle
            var content = $(this).find('.lieux_result').html();
        }
        else {
            var small = false;
            // La zone qui pourra afficher la bulle en cliquant dessus
            var button = $(this);
            // Le contenu à afficher dans la bulle
            var content = $(this).find('.lieux_result').html();
        }
		
        // Défini si c'est le dernier marqueur à afficher
        x = x + 1;
        pdv_markerDisplay('bulle', p_address, p_lat, p_lng, content, button, index, small, $('div.gsa_result').length, x);
    });
}

/**
 * Place les markers des adresses nouvellement trouvées
 * @param   p_makerType string  Type de marqueur à afficher ('bulle' ou 'simple')
 * @param   p_address   string  Adresse à afficher
 * @param   p_lat       string  Latitude du point
 * @param   p_lng       string  Longitude du point
 * @param   p_title     Object  Element de la colonne de résultat de recherche
 *                              qui est lié au marqueur (le titre)
 * @return  array		Position GPS du marqueur (latitude, longitude)
 */
function pdv_markerDisplay(p_makerType, p_address, p_lat, p_lng, p_content, p_button, _marker, _small, _last , _x) {

    // Il faut au moins que l'adresse soit connue
    if (p_address != ''){
        // Si on connait la position GPS
        if (p_lat != '' && p_lng != '') {
            position = new google.maps.LatLng( p_lat, p_lng );
            if (p_makerType == 'bulle')
                marker = gMaps_markerWithBubble(position, p_content, p_button, _marker, _small, _last, _x);
            else
                marker = gMaps_markerWithoutBubble(position,  _marker, _last, _x);
            gMaps_addOverlay(marker)
        }
        // Si on ne connait pas la positionn GPS, on utilise l'adresse
        else {
            var geocoder = new google.maps.Geocoder();
			
            geocoder.geocode({
                'address': p_address
            }, function(results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    position = results[0].geometry.location;
                    if (p_makerType == 'bulle')
                        marker = gMaps_markerWithBubble(position, p_content, p_button, _marker, _small, _last, _x);
                    else
                        marker = gMaps_markerWithoutBubble(position, _marker, _last, _x);
                    gMaps_addOverlay(marker)
                }
            });
        }
    }
    else{
        alert("Adresse vide");
    }
}

/**
 * On affiche l'image de "waiting" dans la colonne de droite
 */
function pdv_showWaitImg(){
    $('#gsa_pdv_results').show();
    $('#gsa_pdv_results').html('<div class="gsa_lieux_results"><div class="ajax_wait" style="text-align:center;margin-top:80px;"><img src="fileadmin/villege/templates/images/ajax_wait.gif" title="" alt="" /></div></div>');
}

/**
 * Masque les formulaires de recherche dans le PDV
 */
function pdv_hideForms() {
    $('#menu_left').hide('slow');
    $('#gsa_pdv_results').show();
}

/**
 * Affiche les formulaires de recherche dans le PDV
 */
function pdv_showForms() {
    $('#menu_left').show();
    $('#gsa_showPDVForms').hide();
    $('#gsa_pdv_results').hide('slow');
    gMaps_clearOverlays();
}

/**
 * Définit le comportement à avoir lors d'un clic sur les titres des lieux
 * trouvés dans le PDV
 */
function pdv_onResults(){
    $('.gsa_result').click(function () {
        $('.gsa_result').removeClass('lieux_result_selected')
        $(this).addClass('lieux_result_selected');
    });
}


/**
 * Contrôle que le formulaire de type de lieux soit bien rempli..
 * Si ce n'est pas le cas, on désactive le bouton d'envoi
 *
 * On change également la valeur de l'état par défaut des quartiers
 */
function pdv_checkSelectionLieux() {
    if ( $('#pdv_lieuxCategorie').val() > 0 ) {
        $('#pdv_lieuxForm button').removeAttr( 'disabled' );
        $('#pdv_lieuxForm button').removeClass( 'disabled' );
    }
    else {
        $('#pdv_lieuxForm button').attr( 'disabled', 'disabled' );
        $('#pdv_lieuxForm button').addClass( 'disabled' );
    }
}


/**
 * Contrôle que le formulaire d'adresses soit bien rempli..
 * Si ce n'est pas le cas, on désactive le bouton d'envoi
 */
function pdv_checkAdress() {
    var q = $('#gsa_gm_searchbox').val();
    if (q != 'Rechercher' && q != '') {
        $('#pdv_addressForm button').removeAttr( 'disabled' );
        $('#pdv_addressForm button').removeClass( 'disabled' );
    }
    else {
        $('#pdv_addressForm button').attr( 'disabled', 'disabled' );
        $('#pdv_addressForm button').addClass( 'disabled' );
    }
}

/**
 * Charge les quartiers
 */
function pdv_KmlLoad() {
    gMaps_KmlOverlay = new google.maps.KmlLayer('http://www.ville-geneve.ch/fileadmin/villege/templates/pdv/vdg_quartiers.kml');
}


/**
 * Affiche ou masque les quartiers sur la carte et 
 * change le libellé du bouton
 */
function pdv_KmlToggle() {
    if ($('#pdv_QuartiersToggleBtn_id').text() == pdv_showQuartiersTxt) {
        $('#pdv_QuartiersToggleBtn_id').text(pdv_hideQuartiersTxt)
        pdv_KmlShow();
    }
    else {
        $('#pdv_QuartiersToggleBtn_id').text(pdv_showQuartiersTxt)
        pdv_KmlHide();
    }
}

/**
 * Masque les quartiers sur la carte
 */
function pdv_KmlHide() {
    gMaps_KmlOverlay.setMap(null);
    gMaps_KmlOverlay_status = 'hidden';
}

/**
 * Affiche les quartiers sur la carte
 */
function pdv_KmlShow() {
    gMaps_addOverlay(gMaps_KmlOverlay);
    gMaps_KmlOverlay_status = 'visible';
}



/**
 * On ferme le mode plein écran
 */
function pdv_closeFS() {
    var currentCenter = map.getCenter();
    gMaps_fullscreen = false;
    $('#pdv_closeFS').hide();
    $('#pdv_openFS_vgeLogo').hide();
    $('#pdv_openFS').show();
    $('body').removeClass('pdv_fs');
    $('#container_left').removeAttr('style');
    pdv_updateShadowPosition();
    gMaps_resize();
    map.setCenter(currentCenter);
} 

/**
 * On passe en mode plein écran
 */
function pdv_openFS() {
    var currentCenter = map.getCenter();
    gMaps_fullscreen = true;
    $('#pdv_openFS').hide();
    $('#pdv_openFS_vgeLogo').show();
    $('#pdv_closeFS').show();
    $('body').addClass('pdv_fs');
    $('#container_left').height(gMaps_getWindowHeight());
    pdv_updateShadowPosition()
    gMaps_resize();
    map.setCenter(currentCenter);
}

/**
 * Recalcule la taille des résultats de recherche
 */
function pdv_resizeResults() {
    if (gMaps_fullscreen) {
        $('#gsa_pdv_results .gsa_lieux_results').height($('#container_center').height() - 260);
        $('#gsa_pdv_results .gsa_lieux_results').css('overflow','auto');
    }
}


/**
 * Remet à zéro la taille des résultats de recherche
 */
function pdv_resetResults() {
    $('#gsa_pdv_results .gsa_lieux_results').removeAttr('style');
}

/**
 * On change la position des ombres en plein écran
 */
function pdv_updateShadowPosition() {
    if (gMaps_fullscreen) {
        $('#ds').css('position','absolute');
        $('#ds').css('left','245px');
        $('#ds').css('top','-140px');
    }
    else {
        $('#ds').css('position','relative');
        $('#ds').css('left','0px');
        $('#ds').css('top','-740px');
    }
}

/*******************************************************************************/
// END - PLAN DE VILLE
 

/*******************************************************************************/
//  START - METHODES COMMUNES
 
/**
 * Renvoi la petite icône à positionner sur la carte
 * @return			object	GIcon	
 */
function gMaps_getSmallIcon() {
    return new google.maps.MarkerImage(gMaps_ElUrl + 'fileadmin/villege/templates/pdv/smallDot.png', new google.maps.Size(18,12));
}
 
/**
 * Renvoi l'icône à positionner sur la carte
 * @param	_num	string	Numéro du marker ('blank' si marker vide)
 * @return object MarkerImage
 */
function gMaps_getIcon(_num) {
	

    // On contrôle que c'est bien un marqueur connu qui sera affiché
    var accepted = ['blank', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    if ($.inArray(_num, accepted) == -1) {
        _num = 'blank';
    }
        
    return new google.maps.MarkerImage(
        gMaps_ElUrl + 'fileadmin/villege/templates/pdv/marker_' + _num + '.png'
        );

}

/**
 * Renvoi l'ombre d'une icone de marqueur
 * @return object MarkerImage
 */
function gMaps_getIconShadow() {
    return new google.maps.MarkerImage(
        gMaps_ElUrl + 'fileadmin/villege/templates/pdv/shadow.png'
        );
}

/**
 * Renvoi le contour d'une icone de marqueur
 * @return array
 */
function gMaps_getIconShape() {
    var shapeImg = {
        coord : [27,0,27,1,27,2,27,3,27,4,27,5,27,6,27,7,27,8,27,9,27,10,27,11,27,12,27,13,27,14,27,15,27,16,27,17,27,18,27,19,27,20,27,21,27,22,27,23,27,24,27,25,18,26,18,27,17,28,17,29,16,30,16,31,16,32,15,33,15,34,14,35,13,35,12,34,12,33,11,32,11,31,11,30,10,29,10,28,9,27,9,26,0,25,0,24,0,23,0,22,0,21,0,20,0,19,0,18,0,17,0,16,0,15,0,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0,0],
        type: 'poly'
    }
    return shapeImg;
}


/**
 * Ajuste la position centrale des marqueurs actuelle
 * pour centrer ultérieurement le plan
 * @param	object	_newPosition	position GPS à ajouter
 * @param	booleab	_doCenter	Indique s'il faut centrer la carte
 *
 * @return void
 */
function gMaps_updateCentralPosition ( _newPosition ) {

    if (_newPosition) {
        if (gMaps_CentralPosition == false) {
            gMaps_CentralPosition = [_newPosition , _newPosition];
        }
        else {
            var NElat = gMaps_CentralPosition[0].lat();
            var NElng = gMaps_CentralPosition[0].lng();
            var SWlat = gMaps_CentralPosition[1].lat();
            var SWlng = gMaps_CentralPosition[1].lng();
			
            if ( _newPosition.lat() < SWlat ) SWlat = _newPosition.lat();
            if ( _newPosition.lat() > NElat ) NElat = _newPosition.lat();
            if ( _newPosition.lng() < SWlng ) SWlng = _newPosition.lng();
            if ( _newPosition.lng() > NElng ) NElng = _newPosition.lng();
		
            var NE = new google.maps.LatLng( NElat, NElng );
            var SW = new google.maps.LatLng( SWlat, SWlng );
            gMaps_CentralPosition = [ NE , SW ];
        }
    }
}

/**
 * Remet à zéro la position centrale actuelle
 */
function gMaps_resetCentralPosition() {
    gMaps_CentralPosition = false;
	
}

/**
 * Retourne la position centrale actuelle
 */
function gMaps_getCentralPosition() {
    return gMaps_CentralPosition;
}

/**
 * Recentre le plan autour de tous les marqueurs actuellement affichés
 */
function gMaps_centerMapOnCentralPosition() {
	
    if ( gMaps_CentralPosition ) {
	
        var bounds = new google.maps.LatLngBounds;
        bounds.extend(gMaps_CentralPosition[1]);
        bounds.extend(gMaps_CentralPosition[0]);
		
        // On recadre le plan en fonction des bounds
        map.fitBounds(bounds);
        // On récupère le zoom actuel
        var zoom;
		if( gMaps_level != '' && gMaps_level != undefined )
			zoom = gMaps_level;
		else
			zoom = map.getZoom();
        var clat = ( bounds.getNorthEast().lat() + bounds.getSouthWest().lat() ) /2;
        var clng = ( bounds.getNorthEast().lng() + bounds.getSouthWest().lng() ) /2;
        var center = new google.maps.LatLng(clat,clng);
        map.setCenter(center);
		map.setZoom(zoom);
    }
    gMaps_resetCentralPosition();
}

/**
 * Ajoute un marqueur sur le plan
 */
function gMaps_addOverlay(marker) {
    gMaps_makersShowed.push(marker);
    marker.setMap(map);
}


/**
 * Efface tous les marqueurs du plan
 */
function gMaps_clearOverlays() {
    gMaps_resetCentralPosition();
	
    gMaps_infoWindows.close();
 	
    $(gMaps_makersShowed).each(function (index) {
        // On cache les marqueurs, sauf le plan des quartiers
        if (this != gMaps_KmlOverlay ) this.setMap(null);
    });
    // On remet à zéro l'index des marqueurs affichés
    gMaps_makersShowed = [gMaps_KmlOverlay];
}


/**
 * Crée un marqueur avec une bulle
 * @param   point       Object  Point géographique de type GLatLng
 * @param   p_content	String	Texte qui sera affiché dans la bulle
 * @param   p_button    Object  Element de la colonne de résultat de recherche
 *                              qui est lié au marqueur
 * @param   _numMarker	String	Identifiant du marqueur à afficher (0 à 9)
 * @param   _small	Boolean	Indique si le marquer doit avoir une grande ou petite icone
 * @param   _last	Boolean	Indique si le marqueur est le dernier à devoir être affiché
 * @param   _x		Integer
 * @return  marker
 */
function gMaps_markerWithBubble(point, p_content, p_button, _numMarker, _small, _last, _x) {
	
    // Indique quel icon il faut afficher
    var marker = null;
    if (_small) {
        marker = new google.maps.Marker({
            icon: gMaps_getSmallIcon(),
            position: point,
            map: map
        });
    }
    else {
        marker = new google.maps.Marker({
            icon: gMaps_getIcon(_numMarker),
            shadow: gMaps_getIconShadow(),
            shape: gMaps_getIconShape(),
            position: point,
            map: map 
        });

        // On ne centre la carte que sur les points qui ne sont pas petits
        gMaps_updateCentralPosition ( point ) ;
    }
        
    var contentString =  '<div class="map-bulle">' + p_content + '<div class="clear_both"><!-- --></div></div>';

    google.maps.event.addListener(marker, 'click', function() {

		// Désactive les bulles en attendant la correction de Google


		var point = marker.getPosition();
        // Si on est en streetview, on boue la vue, mais pas de bulle
        if (gMaps_viewMode == 'streetview') {
            gMaps_infoWindows.close();
            panorama.setPosition(point);
        }

        // Si pas streetview, on ouvre une bulle et on recentre
        else {
            gMaps_infoWindows.setContent( contentString );
            gMaps_infoWindows.open(map,marker);
        }
        map.panTo(point);
    });

    if(p_button != '' && !_small){
        p_button.click(
            function() {
                var point = marker.getPosition();
                // Si on est en streetview, on boue la vue, mais pas de bulle
                if (gMaps_viewMode == 'streetview') {
                    gMaps_infoWindows.close();
                    panorama.setPosition(point);
                }

                // Si pas streetview, on ouvre une bulle et on recentre
                else {
                    //gMaps_infoWindows.setContent( contentString );
                    //gMaps_infoWindows.open(map,marker);
                }
                map.panTo(point);
            }
        );
    }


	
	
    // On centre le plan si on a fini d'afficher les marqueurs
    if (_last == _x ) {
        gMaps_centerMapOnCentralPosition();
    }
	
	
    return marker;
}

/**
 * Crée un marqueur sans bulle, uniquement le titre
 * @param   point       Object  Point géographique de type GLatLng
 * @param   _numMarker	String	Identifiant du marqueur à afficher (0 à 9)
 * @param   _last	Boolean	Indique si le marqueur est le dernier à devoir être affiché
 * @param   _x		Integer
 */
function gMaps_markerWithoutBubble(point, _numMarker, _last, _x) {
    gMaps_updateCentralPosition ( point ) ;
    var marker = new google.maps.Marker({
        icon: gMaps_getIcon(_numMarker),
        shadow: gMaps_getIconShadow(),
        shape: gMaps_getIconShape(),
        position: point,
        map: map
    });
	
    // On centre le plan si on a fini d'afficher les marqueurs
    if (_last == _x ) {
        gMaps_centerMapOnCentralPosition();
    }
    return marker;
}


/**
 *	603 = Erreur Flash
 */
function gMaps_handleNoFlash(errorCode) {

    if (errorCode == 600) {
        alert("Error: No panorama found");
        return;
    }

    if (errorCode == 603) {
        alert("Error: Flash doesn't appear to be supported by your browser");
        return;
    }
}

/**
 * Vérifie que le navigateur est capable d'afficher un StreetView
 */
function gMaps_showPanoData(panoData) {
    if (panoData.code != 200) {
        GLog.write('showPanoData: Server rejected with code: ' + panoData.code);
        return;
    }
}
 
function gMaps_quartiersControl(controlDiv) {

    // Set CSS styles for the DIV containing the control
    // Setting padding to 5 px will offset the control
    // from the edge of the map
    controlDiv.style.padding = '5px';

    // Set CSS for the control border
    var controlUI = document.createElement('DIV');
    controlUI.style.backgroundColor = 'white';
    controlUI.style.borderStyle = 'solid';
    controlUI.style.borderWidth = '1px';
    controlUI.style.cursor = 'pointer';
    controlUI.style.textAlign = 'center';
    controlUI.title = pdv_showQuartiersTxt;
    controlUI.id = 'pdv_QuartiersToggleBtn';
    controlDiv.appendChild(controlUI);

    // Set CSS for the control interior
    var controlText = document.createElement('DIV');
    controlText.style.fontFamily = 'Arial,sans-serif';
    controlText.style.fontSize = '12px';
    controlText.style.paddingLeft = '4px';
    controlText.style.paddingRight = '4px';
    controlText.style.marginLeft = '4px';
    controlText.style.marginRight = '4px';
    controlText.style.marginTop = '1px';
    controlText.style.marginBottom = '1px';
    controlText.innerHTML = pdv_showQuartiersTxt;
    controlText.id = 'pdv_QuartiersToggleBtn_id';
    controlUI.appendChild(controlText);

    // Setup the click event listeners: simply set the map to Chicago
    google.maps.event.addDomListener(controlUI, 'click', function() {
        pdv_KmlToggle();
    });
}
 
/***********************************/
// START - METHODES POUR LE PLEIN ECRAN
 
/**
 * On redimensionne la carte
 */
function gMaps_resize() {
	
    // Taille de la carte à afficher
    var mapSize = gMaps_getMapSize();
    var windowH = mapSize[0];
    var windowW = mapSize[1] - 5;
    // On change la taille de la carte
    // Mode Streetview et Plein Ecran
    if(panorama && gMaps_viewMode == 'streetview' && gMaps_fullscreen) {
        $('#map').attr('style','overflow: hidden; height: 200px; width: 200px; z-index: 20; right: 0px; position: absolute; bottom: 0px; margin-bottom: 0px; border-top: 3px solid grey; border-left: 3px solid grey;');
        $('#panoStreetView').attr('style','right: 0px; overflow: hidden; z-index: 10; bottom: 0pt; height: ' + windowH + 'px; width: ' + windowW + 'px; position: relative;');
    }
    // Mode Streetview et Ecran petit
    else if(panorama && gMaps_viewMode == 'streetview') {
        if (gMaps_isIE())
            $('#map').attr('style','overflow: hidden; height: 200px; width: 200px; z-index: 20; right: 0px; position: absolute; bottom: 0pt; margin-bottom: 227px; border-top: 3px solid grey; border-left: 3px solid grey;');
        else
            $('#map').attr('style','overflow: hidden; height: 200px; width: 200px; z-index: 20; right: 0px; position: absolute; bottom: 0pt; margin-bottom: 178px; border-top: 3px solid grey; border-left: 3px solid grey;');
        $('#panoStreetView').attr('style','right: 0px; overflow: hidden; z-index: 10; bottom: 0pt; height: 600px; width: 735px; position: relative;');
    }
    // Mode Carte et Plein écran
    else if(gMaps_fullscreen) {
        $('#map').attr('style','right: 0px; overflow: hidden; z-index: 10; bottom: 0pt; height: ' + windowH + 'px; width: ' + windowW + 'px; position: relative;');
        $('#panoStreetView').attr('style','display:none;');
    }
    // Mode Carte et Ecran petit
    else {
        $('#map').attr('style','position: relative; overflow: hidden; z-index: 0;');
        $('#panoStreetView').attr('style','display:none;');
    }

    // On redimensionne les ombres de la carte
    gMaps_resizeShadows();
	
    // On met à jour les dimensions de la carte dans le js de gMaps
    if (map != null) {
        google.maps.event.trigger(map, 'resize');
        google.maps.event.trigger(panorama, 'resize');
    }
} 


/**
 * On calcule la taille de la carte
 */
function gMaps_getMapSize() {
 
    var windowH = null;
    var windowW = null;

    // Si on est en mode plein écran
    if (gMaps_fullscreen) {
        windowH = gMaps_getWindowHeight();
        windowW = gMaps_getWindowWidth() - $('#container_left').width() - 15;
    }
    // Sinon
    else {
        windowH = 600;
        windowW = 735;
    }
    return [windowH, windowW];
}


/**
 * On redimensionne les ombres de la carte
 */
function gMaps_resizeShadows() {

    var height = $('#map').height();
    var width = $('#map').width();
	
    var top = height+135;
    var left = width-15;
	
	
    $('#ds_v_1').css("height",height+"px");
    $('#ds_v_2').css("height",height+"px");
    $('#ds_v_3').css("height",height+"px");
    $('#ds_v_4').css("height",height+"px");
    $('#ds_v_5').css("height",height+"px");
    $('#ds_v2_1').css("height",height+"px");
    $('#ds_v2_2').css("height",height+"px");
    $('#ds_v2_3').css("height",height+"px");
    $('#ds_v2_4').css("height",height+"px");
    $('#ds_v2_5').css("height",height+"px");
    $('#ds_v2_1').css("left",left+"px");
    $('#ds_v2_2').css("left",left+"px");
    $('#ds_v2_3').css("left",left+"px");
    $('#ds_v2_4').css("left",left+"px");
    $('#ds_v2_5').css("left",left+"px");
	
    $('#ds_h_1').css("width",width+"px");
    $('#ds_h_2').css("width",width+"px");
    $('#ds_h_3').css("width",width+"px");
    $('#ds_h_4').css("width",width+"px");
    $('#ds_h_5').css("width",width+"px");
    $('#ds_h2_1').css("width",width+"px");
    $('#ds_h2_2').css("width",width+"px");
    $('#ds_h2_3').css("width",width+"px");
    $('#ds_h2_4').css("width",width+"px");
    $('#ds_h2_5').css("width",width+"px");
    $('#ds_h2_1').css("top",top+"px");
    $('#ds_h2_2').css("top",top+"px");
    $('#ds_h2_3').css("top",top+"px");
    $('#ds_h2_4').css("top",top+"px");
    $('#ds_h2_5').css("top",top+"px");
	
}

/**
 * Calcule la hauteur de la fenêtre actuellement ouverte
 */
function gMaps_getWindowHeight() {
    if (window.self && self.innerHeight) {
        return self.innerHeight;
    }
    if (document.documentElement && document.documentElement.clientHeight) {
        return document.documentElement.clientHeight;
    }
    return 0;
} 

/**
 * Calcule la largeur de la fenêtre actuellement ouverte
 */
function gMaps_getWindowWidth() {
    if (window.self && self.innerWidth) {
        return self.innerWidth;
    }
    if (document.documentElement && document.documentElement.clientWidth) {
        return document.documentElement.clientWidth;
    }
    return 0;
} 

 
/***********************************/
// END - METHODE POUR LE PLEIN ECRAN

/***********************************/
// START - METHODES POUR LE STREETVIEW

// On contrôle si le streetView est visible ou pas
function gMaps_isStreetViewVisible() {
    if (!panorama) return false;
    return panorama.getVisible() ;
}


function gMaps_toogleStreetView() {
    if (panorama) {
        if (gMaps_isStreetViewVisible()) {
            gMaps_openStreetView();
        }
        else {
            gMaps_closeStreetView();
        }
    }
}
// On ouvre le SV, donc
// - on change les dimensions du map
// - on cache les boutons de contrôle
// - on affiche la carte en mode plan
function gMaps_openStreetView() {
    if (panorama_loaded && panorama) {
        gMaps_viewMode = 'streetview';
//        $('#panoStreetView').attr('style','right: 0px; overflow: hidden; z-index: 10; bottom: 0pt; height: 600px; width: 735px; position: relative;');
//        $('#map').attr('style','background-color: rgb(229, 227, 223); overflow: hidden; height: 200px; width: 200px; z-index: 20; right: 0px; position: absolute; bottom: 0pt; margin-bottom: 178px; border-top: 3px solid grey; border-left: 3px solid grey;');
        $('#pdv_QuartiersToggleBtn').hide();

        // On cache les marqueurs sur le streetview
        // (ok, c'est manuel, mais aucune méthode dans l'API pour ca en ce moment)
        $('#panoStreetView div:first-child div:first-child div:nth-child(4)').hide();

        // On cache les ombres de la carte
        $('#ds').hide();

        // On masque les controles
        map.setOptions({
            navigationControl: false,
            mapTypeControl: false,
            scaleControl: false
        });
        // On met à jour les dimensions de la carte dans le js de gMaps
        gMaps_resize();
        google.maps.event.trigger(map, 'resize');

        // On ferme l'éventuelle bulle ouverte
        gMaps_infoWindows.close();
    }

    // On indique que le streetView est chargé
    panorama_loaded = true;
}

// On referme le SV, donc
// - on change les dimensions du map
// - on reaffiche les boutons de contrôle
// - on reaffiche le mode utilisé à l'ouverture du SV
function gMaps_closeStreetView() {

    if (panorama) {
        gMaps_viewMode = 'normal';
       // $('#map div:first').attr('style','position: absolute; left: 0px; top: 0px; overflow: hidden; z-index: 0; width: 100%; height: 100%; border:none');
        $('#pdv_QuartiersToggleBtn').show();

        if (!gMaps_isIE6()) $('#ds').show();

        // On réaffiche les controles
        map.setOptions({
            navigationControl: true,
            mapTypeControl: true,
            scaleControl: true
        });
        // On met à jour les dimensions de la carte dans le js de gMaps
        gMaps_resize();
        google.maps.event.trigger(map, 'resize');

        map.setCenter(panorama.getPosition());
    }
}



/***********************************/
// END - METHODES POUR LE STREETVIEW


// Contrôle si nous sommes sous IE6
function gMaps_isIE6 () {
    if($.browser.msie && $.browser.version=="6.0") return true;
    else return false;
}


// Contrôle si nous sommes sous IE
function gMaps_isIE () {
    if($.browser.msie) return true;
    else return false;
}


/*******************************************************************************/
// END - METHODES COMMUNES


/*******************************************************************************/
// INITIALISATION DES JS POUR LES PAGES AFFICHANT UN GOOGLE MAP

var map;
var panorama;
var overlayMap;
var panorama_loaded = false;

var gMaps_coordLieu; // coordonnées du point retournées par google
var gMaps_CentralPosition; // coordonnées du dernier marqueur affiché
var gMaps_level; // Niveau de Zoom actuel
var gMaps_makersShowed = []; // Liste des marqueurs affichés sur le map
var gMaps_makersHidded = []; // Liste des marqueurs cachés sur le map (pendant le StreetView)
var gMaps_KmlOverlay; // Marqueur contenant le plan des quartiers coloré
var gMaps_KmlOverlay_status;
var gMaps_fullscreen = false;
var gMaps_infoWindows = false;
var gMaps_viewMode = false;

$(document).ready(function(){

    gMaps_CentralPosition = false;
    gMaps_infoWindows = new google.maps.InfoWindow();

    // On Dom Ready
    google.maps.event.addListener(gMaps_infoWindows, 'domready', function () {
        if (gMaps_infoWindows.get("isdomready")) {
            // show the infowindow by setting css
//            $('.gmnoprint div').css('overflow','');
        }
        else {
            // trigger a domready event again.
            google.maps.event.trigger(gMaps_infoWindows, 'content_changed');
            gMaps_infoWindows.set("isdomready", true);
        }
    });



	// Récupère le type de carte de page : PDV ou page de détail
	var get_typeMap = ($("#typeMap").length != 0)? $("#typeMap").val() : '';

    // Initialise la carte sur la page
    if( ($("#map").length != 0) ) {

        // Initialisation de la carte
        var myOptions = {
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            mapTypeControlOptions: {
                style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR
            },
            NavigationControlOptions: {
                style: google.maps.NavigationControlStyle.ZOOM_PAN
            }
        };
        map = new google.maps.Map(document.getElementById("map"), myOptions);
    }

    // Appel des fonctions
    if($("#typeMap").length != 0 && map) {

        // Affiche la vue de détail d'un lieu
        if(get_typeMap == "dispWithAdr")
            det_Gload();
        // Affiche le plan de ville
        else if(get_typeMap == "streetMap")
            pdv_Gload();

        // Gestion du bouton pour afficher / masquer la carte
        $("#showMap").click(function ()	{
            if( $(this).text() == "[-]" ) {
                $(this).text("[+]");
                $("#map").hide('15');
            }else{
                $(this).text("[-]");
                $("#map").show('15');
            }
            return false;
        }); // Fin de function
    }
});





