/**
 *  CONFIGURATION
 * 
 * id: ID de la gmap
 * infoWindow: boolean, true => custom infowindow, false => pas d'infowindow et marker non clickable
 * infos_front: Tableaux de données à remonter en front (name, address, desc, link)
 * default_marker: path to marker par défaut
 * pois: [],
 * styles : [],
 * zoom : int, s'applique que s'il n'y a qu'un seul marker sur la map, sinon calculé automatiquement pour englober tous les markers
 * hasCluster: bool
 */

function init_GMAP(gmap_conf){

    (function($){

        if(!gmap_conf){
            console.log('Erreur: Pas de paramètres passés à la fonction init_GMAP');
        }

        var mapMarkers = [];
        var mapId = gmap_conf.id;
        var pois = gmap_conf.pois;
        var map = new google.maps.Map( document.getElementById( mapId ), { center: new google.maps.LatLng(37.4419, -122.1419), zoom : gmap_conf.zoom, mapTypeId: google.maps.MapTypeId.ROADMAP, styles: gmap_conf.style}); 
        
    // Création de l'infoWindow et fonction de Toggle

        var infowindow = new google.maps.InfoWindow();
        function toggleInfowindow(i){
            var $window = $('#'+mapId).parents('.media-ratio').find('.gmap-infowindow');
            var $window_text = $window.find('.infowindow-text');
            var attributes = gmap_conf.infos_front;

            // Reset l'infowindow
            $window_text.html('');

            attributes.forEach(function(element, index){
                if(element == 'address'){
                    if(pois[i][element] != "" && pois[i][element] != ' '){
                        $window_text.append('<div class="gmap-loc"><strong>Coordonnées :</strong><span class="gmap-address"></span></div>')
                        .find('.gmap-address')
                        .html(pois[i]['address']);
                    }
                }else if(element == 'link'){
                    if( pois[i].has_link){
                        $window_text.append('<div class="gmap-link"></div>')
                        .find('.gmap-link')
                        .html('<a href="'+pois[i].url+'">'+pois[i].url_title+'</a>');
                    }
                }else{
                    if(pois[i][element] != "" && pois[i][element] != ' '){
                        $window_text.append('<div class="gmap-'+element+'"></div>').find('.gmap-'+element).html(pois[i][element])
                    }
                }
            });
            $window.addClass('opened');
        }

        // Listener pour fermer l'infowindow Custom (générique)
        $('.gmap-infowindow .gmap-close').on('click', function(){
            $(this).parents('.gmap-infowindow').removeClass('opened');
        });

        //   Boucle sur chaque POI pour lui assigner un marker
            for (i = 0; i < pois.length; i++){
                var marker_icon = gmap_conf.default_marker;
                if(pois[i].marker && pois[i].marker !== '' && pois[i].marker != ' '){
                    marker_icon = pois[i].marker;
                }
                marker = new google.maps.Marker({
                    position: new google.maps.LatLng( pois[i].latitude, pois[i].longitude ),
                    map: map,
                    icon: marker_icon,
                    clickable: gmap_conf.infoWindow
                });
                if(gmap_conf.infoWindow){
                    google.maps.event.addListener( marker, 'click', (function ( marker, i ) {
                        return function() {
                            toggleInfowindow(i);
                        };
                    })( marker, i ));
                }
                mapMarkers.push( marker );
            }
        
        // Placement des points et gestion de l'affichage de la gmap (zoom, centrage, limites)
        var bounds = new google.maps.LatLngBounds();
        for( i=0; i < mapMarkers.length; i++ ){
            bounds.extend( mapMarkers[i].getPosition() );
        } 
        map.setCenter( bounds.getCenter() );
        if( mapMarkers.length > 1 ){
            map.fitBounds( bounds );
            var zoom = map.getZoom() - 1;
            if( zoom > 10 )
            zoom = 10;
            map.setZoom( zoom );
            if(gmap_conf.hasCluster){
                var options = {
                    gridSize: 20,
                    imagePath: gmap_conf.clusterImagePath
                };
			    var markerCluster = new MarkerClusterer(map, mapMarkers, options );
            }
        }

        // Si page event, gmap a besoin que la map s'affiche naturellement pour init son center
        if($('.btn-event-map').length){
            $('.event-gmap').addClass('visible');
            $(document).ready(function(){
                $('.btn-event-map').click();
            });
        }

    }(jQuery));
}