﻿var map;
var geocoder;
var baseIcon;
var restos = {};
var markers = [];
var MAX_RESTOS_IN_CACHE = 200;
var nbRestosInCache = 0;
var mapCenterIcon;
var mapCenter;
var ICON_CENTER = "/img/carto/office-building.png";
var ICON_RESTO = "/img/carto/mm_20_red.png";
var BASEURL_REDIRECT_LIST_RESTO = "http://www.ticketrestaurant.fr/ShowArticle.aspx?ArticleAutoNumber=129&Page=1&DisplayResults=Y&SearchNom=&SearchVille=";

function InitMap(address) {

    if (GBrowserIsCompatible()) {

        // Icone de base
        baseIcon = new GIcon();
        baseIcon.iconSize = new GSize(16, 20);
        baseIcon.iconAnchor = new GPoint(6, 20);
        baseIcon.infoWindowAnchor = new GPoint(10, 32);
        baseIcon.image = ICON_RESTO;

        // Icone centre recherche
        mapCenterIcon = new GIcon(baseIcon);
        mapCenterIcon.iconSize = new GSize(18, 24);
        mapCenterIcon.iconAnchor = new GPoint(6, 20);
        mapCenterIcon.infoWindowAnchor = new GPoint(10, 32);
        mapCenterIcon.image = ICON_CENTER;

        // Map
        geocoder = new GClientGeocoder();
        map = new GMap2(document.getElementById("map"));
        map.setCenter(new GLatLng(46.9, 1.7), 6);
        map.setUIToDefault();

        // Handler déplacement carto
        GEvent.addListener(map, "moveend", GetRestos)

        // Handler sur le clic recherche
        jQuery(".goSearch").click(function(e) {
            var address = jQuery(".inputAddress").val() + " , France";
            CenterMap(address);
        });

        // Handler sur la touche entrée
        jQuery(".inputAddress").keypress(function(e) {
            if (e.keyCode == 13) {
                var address = jQuery(".inputAddress").val() + " , France";
                CenterMap(address);
                return false;
            }
        });

        // Si addresse en paramètre
        if (address && address != "") {
            CenterMap(address);
        }
        else {
            // Premier refresh
            GetRestos();
        }

    }

    // Centrage sur Adresse
    function CenterMap(address) {

        geocoder.getLocations(
                address,
                function (reponse) {
                    if (!reponse || reponse.Status.code != 200) {
                        alert(address + " non trouvée");
                    } else {
                        var nombreReponse = reponse.Placemark.length;

                        if (nombreReponse > 0) {
                            //On récupère le placemark par défaut
                            var place = reponse.Placemark[0];

                            var point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);

                            map.setCenter(point, 13);

                            // Icone sur le centre de la recherche
                            if (mapCenter)
                                map.removeOverlay(mapCenter);

                            mapCenter = new GMarker(point, mapCenterIcon);
                            GEvent.addListener(mapCenter, "click", OnCenterMarkerClick);

                            map.addOverlay(mapCenter);

                            if (place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode) {
                                var Gcodepostal = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;

                                jQuery('.linkAddress').attr('href', BASEURL_REDIRECT_LIST_RESTO + Gcodepostal);
                            }
                            else if (place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality) {
                                var Glocalityname = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;

                                jQuery('.linkAddress').attr('href', BASEURL_REDIRECT_LIST_RESTO + Glocalityname);
                            }
                            else
                                jQuery('.linkAddress').attr('href', '#');
                        }
                        else {
                            alert(address + " non trouvée");
                        }
                    }
                }
              );
              
        // Clic sur le marker de centre de carte
        function OnCenterMarkerClick(e) {
            this.openInfoWindowHtml("<div><strong>Vous êtes ici</strong><br /></div>");
        }
    }

    // Appel Web Service pour récupération des restos
    function GetRestos() {
        var params = {};
        var WKTenvelope = "Env[" + map.getBounds().getSouthWest().lng()
                            + " : " + map.getBounds().getNorthEast().lng()
                            + " , " + map.getBounds().getSouthWest().lat()
                            + " : " + map.getBounds().getNorthEast().lat()
                            + "]";

        params.WKTrectangle = WKTenvelope;
        var queryString = toAjaxQueryString(params);

        // Appel Web Service
        jQuery.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "/WebServices/WSAffilie.asmx/GetData",
            data: queryString,
            dataType: "json",
            success: DisplayMarkers
        });

        // Affiche les markers
        function DisplayMarkers(result) {

            result = result.d;

            var index = 0;
            var ID = '';
            for (var i in result) {

                if (result[index] == undefined)
                    break;

                if (restos[index] == null) {

                    if (nbRestosInCache >= MAX_RESTOS_IN_CACHE)
                        RemoveMarker();
                    ID = result[index].ID;
                    restos[ID] = result[index];
                    CreateMarker(restos[ID]);
                    nbRestosInCache++;
                }
                index++;

            }

        }

        // Crée un marker et l'ajoute à la pile
        function CreateMarker(markerData) {

            if (markerData != undefined) {
                var icon = new GIcon(baseIcon);
                icon.image = ICON_RESTO;
                var point = new GLatLng(markerData.La, markerData.Lo);
                var mapMarker = new GMarker(point, baseIcon);
                mapMarker.markerData = markerData;

                // Click
                GEvent.addListener(mapMarker, "click", OnMarkerClick);

                // ajout du marker
                markers.push(mapMarker);
                map.addOverlay(markers[markers.length - 1]);
            }
        }

        // Supprime un marker de la pile
        function RemoveMarker() {
            var removed = markers.shift();
            if (removed) {
                delete restos[removed.markerData.ID];
                map.removeOverlay(removed);
                delete removed;
                nbRestosInCache--;
            }
        }

        // Clic sur un marker d'affilié
        function OnMarkerClick(e) {
            this.openInfoWindowHtml("<div><strong>"
                                            + this.markerData.Affilie.Name
                                            + "</strong><br />"
                                            + this.markerData.Affilie.Address.StreetNumber + " " + this.markerData.Affilie.Address.StreetName
                                            + "<br />"
                                            + this.markerData.Affilie.Address.ZipCode + " " + this.markerData.Affilie.Address.City
                                            + "<br />"
                                            + this.markerData.Affilie.Phone
                                            + "</div>");
        }

        // Permet le push des paramètres en JSON
        function toAjaxQueryString(params) {

            var queryString = "{";

            for (var param in params) {
                if (typeof param == 'object')
                    queryString += toAjaxQueryString(param);
                else
                    queryString += "'" + param + "':'" + params[param] + "',";
            }

            queryString = queryString.slice(0, queryString.length - 1);
            queryString += "}";

            return queryString;

        }

    }

}

