﻿Array.prototype.add =function(item){
  this.push(item);
}
Array.prototype.addRange =function(items){
  var length =items.length;
  if (length !=0){
    for (var index =0;index <length;index++){
      this.push(items[index]);
    }
  }
}
Array.prototype.clear =function(){
  if (this.length >0){
    this.splice(0,this.length);
  }
}
Array.prototype.clone =function(){
  var clonedArray =[];
  var length =this.length;
  for (var index =0;index <length;index++){
    clonedArray[index]=this[index];
  }
  return clonedArray;
}
Array.prototype.contains =function(item){
  var index =this.indexOf(item);
  return (index >=0);
}
Array.prototype.dequeue =function(){
  return this.shift();
}
Array.prototype.indexOf =function(item){
  var length =this.length;
  if (length !=0){
    for (var index =0;index <length;index++){
      if (this[index]==item){
        return index;
      }
    }
  }
  return -1;
}
Array.prototype.insert =function(index,item){
  this.splice(index,0,item);
}
Array.prototype.queue =function(item){
  this.push(item);
}
Array.prototype.remove =function(item){
  var index =this.indexOf(item);
  if (index >=0){
    this.splice(index,1);
  }
}
Array.prototype.removeAt =function(index){
  this.splice(index,1);
}
Array.prototype.find = function(fnc){
    for (var i = 0; i < this.length; i++){
        if (fnc(this[i]))
            return this[i];
    }
    return null;
}
var $ = function(id){return document.getElementById(id);}

// Namespace de base pour CS 
var CS = {};

// Namespace de classe Utils
CS.Utils = {}; 
       
// Pile de function (pas fini)
CS.Utils._Executor = function(){
    
    var _functions = new Object();
    
    
    this.isExecutingFunction = false;
    
    this.CallNextFunction = function(){
        if (!this.isExecutingFunction && _functions.length > 0){
            window.setTimeout(function(){_functions[i].fnc.apply(_functions[i].caller, _functions[i].args);}, 0);
        }
    }
    this.add = function(fnc, options, caller, args){
        options = options||{}; 
        options.ExecuteInNewThread = options.ExecuteInNewThread||false;
        options.DelayToExecute = options.DelayToExecute||0;
        options.SetOnPull = options.SetOnPull||true;
        
        
        if (options.ExecuteInNewThread){
            window.setTimeout(function(){fnc.apply(caller, args);}, options.DelayToExecute);
        } else {
            _functions.push({fnc:function(){
                    this.isExecutingFunction = true; 
                    fnc.apply(caller, args);
                    this.isExecutingFunction = false;
                    this.CallNextFunction();
                }, caller:caller, args:args});
            this.CallNextFunction();
        }
    }
}

CS.Utils.Executor = new CS.Utils._Executor(); 


// Namespace qui contient les maps
CS.Maps = {} ;

// Array qui contient les différentes maps
CS.Maps.Maps = {};

// Objet qui gère une map
CS.Maps.Map = function(elmtID, options){

    /* Private variable */
    var _self = this; 
	var _map = null;
	var _elmtID = elmtID;
	var _elmt = null;
	var _mini = null;
	
	// options
    var _lat                    = 0;
    var _lng                    = 0;
    var _zoom                   = 12;
    var _mapType                = G_SATELLITE_MAP;
    
    var _showIconsOnMap         = false;
    var _showIconsInfoInDiv     = false;
    var _mapMaxItemDisplay      = 30;
	var _showKML                = false; 
	
    var _mapUFIAutoShow         = 0;
    var _mapPOIAutoShow         = 0;
    
    var _enableContinuousZoom   = false;
    var _enableDoubleClickZoom  = false;
    var _disableDragging        = false;
    
    var _moveEnd                = false;
    var _moveEndKML             = false;
    
    var _loadGMapTypeControl    = false;
    var _loadTextualZoomControl = false;
    var _loadTextualLinkControl = false;
    var _loadGScaleControl      = false;
    var _loadmapInfoIn          = false;
    
    var myMarkers = new Array();
    var myPoints = new Array();
    
    var loaded = false;
    
    var baseIcoGGEarth = new GIcon();
    baseIcoGGEarth.shadow = "";
    baseIcoGGEarth.image = "http://maps.google.com/mapfiles/kml/pal5/icon14.png";
    baseIcoGGEarth.iconSize = new GSize(16, 16);
    baseIcoGGEarth.iconAnchor = new GPoint(8, 8);
    baseIcoGGEarth.infoWindowAnchor = new GPoint(8, 8);

    var baseIcoFlag = new GIcon();
    baseIcoFlag.shadow = "";
    baseIcoFlag.image = "http://maps.google.com/mapfiles/kml/pal5/icon14.png";
    baseIcoFlag.iconSize = new GSize(18, 12);
    baseIcoFlag.iconAnchor = new GPoint(9, 6);
    baseIcoFlag.infoWindowAnchor = new GPoint(9, 6);

    var gicons = [];
    gicons["P"] = new GIcon(baseIcoGGEarth, "http://maps.google.com/mapfiles/kml/pal3/icon21.png");
    gicons["A"] = new GIcon(baseIcoGGEarth, "http://maps.google.com/mapfiles/kml/pal2/icon10.png");
    gicons["V"] = new GIcon(baseIcoGGEarth, "http://maps.google.com/mapfiles/kml/pal2/icon12.png");
    gicons["R"] = new GIcon(baseIcoGGEarth, "http://maps.google.com/mapfiles/kml/pal4/icon31.png");
    gicons["S"] = new GIcon(baseIcoGGEarth, "http://maps.google.com/mapfiles/kml/pal4/icon47.png");
    gicons["H"] = new GIcon(baseIcoGGEarth, "http://maps.google.com/mapfiles/kml/pal3/icon29.png");
    gicons["L"] = new GIcon(baseIcoGGEarth, "http://maps.google.com/mapfiles/kml/pal2/icon12.png");
    gicons["2See"] = new GIcon(baseIcoGGEarth, "i/oeil.gif");
    gicons["2See"].iconSize = new GSize(16, 9);
    gicons["2See"].iconAnchor = new GPoint(8, 4);
    gicons["2See"].infoWindowAnchor = new GPoint(8, 4);
    
    var EnumTypeAjaxCall = {
        None:0,
        VillesProches:1,
        GrandesVillesProches:2,
        RegionsProches:3,
        CapitalesProches:4,
        PaysProches:5,
        CapitalesDuMondeFullListe:50,
        PlaceToSee:99
    }
    var TypeAjaxCall = EnumTypeAjaxCall.None;
    
    function GPSPoint () {
        this.PointType      = EnumTypeAjaxCall.None;
        this.POINT          = null;
        this.LAT            = 0;
        this.LNG            = 0;
        this.UFI            = 0;
        this.FC             = "";
        this.KM             = 0;
        this.ADM1N          = "";
        this.PAYS           = "";
        this.CC1            = "";
        this.CP             = "";
        this.VILLEINSEE     = "";
        this.PAYSINSEE      = "";
        this.POP            = 0;
        this.ISOA2          = "";
        this.ISOA3          = "";
        this.ISON           = 0;
        this.CONTC          = "";
        this.CONT           = "";
        this.KM2            = 0;
        this.CURR           = "";
        this.CURRSYB        = "";
        this.FNN            = "";
        this.FN             = "";
        this.FLAG           = "";
        this.POI_ID         = "";
        this.POI            = "";
        this.POIDESC        = "";
        this.ZM             = "";
    }
    
    
    /* Public properties */
    this.get_Map = function(){
        return _map;
    }
    this.get_MapName = function(){
        return mapName;
    }

    var findPoint = function (points,UID)
    {
        return points.find( function( p ) { return p.UID == UID;})
    }
    
    /* private function */
    
    var load = function(){
        _elmt = $(elmtID);
        _map = new GMap2(_elmt);
        if (_enableContinuousZoom)  {_map.enableContinuousZoom();}
        if (_enableDoubleClickZoom) {_map.enableDoubleClickZoom();}
        if (_loadGMapTypeControl) {_map.addControl(new GMapTypeControl());}
        if (_loadTextualZoomControl) {_map.addControl(new TextualZoomControl());}
        if (_loadTextualLinkControl) {_map.addControl(new TextualLinkControl());}
        if (_loadmapInfoIn) {_map.addControl(new mapInfoIn());}
        if (_disableDragging) {_map.disableDragging();}
        
        if (_moveEnd) {var moveEndEventListener = GEvent.addListener(_map, "moveend", fncMoveEnd);} // Gérer les évents (Event Listenner)
        if (_moveEndKML) {var moveEndKMLEventListener = GEvent.addListener(_map, "moveend", fncMoveEndKML);} // Gérer les évents (Event Listenner)

//        _map.addControl(new GScaleControl(250));
//        var ovMap =new GOverviewMapControl(new GSize(200,100));
//        _map.addControl(ovMap);
//        _mini = ovMap.getOverviewMap();
//        window.setTimeout(function(){_mini.setZoom(-17);}, 0); // a répéter
        
        
	    GEvent.addDomListener(_elmt, 'DOMMouseScroll', wheelZoom); // Firefox 
        GEvent.addDomListener(_elmt, 'mousewheel', wheelZoom); // IE 

        //_map.setCenter(new GLatLng(_lat+0.00000000000001, _lng+0.00000000000001), _zoom, _mapType);
        _map.setCenter(new GLatLng(_lat, _lng), _zoom, _mapType);
        fncMoveEnd();

    }
	
	var mapZoomCheck = function() {
		switch (_map.getZoom()){
		
		    default:
		        break;
		}
	}
	
    // Permet de zoomer grace au scroll de la souris    
    var wheelZoom = function(a)
    { 
        if (a.detail) // Firefox 
        { 
            if (a.detail < 0) 
            { _map.zoomIn(); } 
            else if (a.detail > 0) 
            { _map.zoomOut(); } 
        } 
        else if (a.wheelDelta) // IE 
        { 
            if (a.wheelDelta > 0) 
            { _map.zoomIn(); } 
            else if (a.wheelDelta < 0) 
            { _map.zoomOut(); } 
        } 
    } 
    

	/* public function */
	var MapClear = function() {
        myMarkers = new Array();
        myPoints = new Array();
        GEvent.clearListeners(_map,'click');
        _map.clearOverlays()
    }

    this.MapMoveTo = function(latitude, longitude) {
        window.setTimeout(function() {
                _map.panTo(new GLatLng(latitude, longitude));
            }, 1000);
    }

    this.MapMoveToAndZoom = function (latitude, longitude, NewZoom) {
        MapClear();
        window.setTimeout(function() {_map.panTo(new GLatLng(latitude, longitude));}, 1000);
        window.setTimeout(function() {_map.setZoom(NewZoom);}, 3000);
    }
    
    // constructor
    var initialize = function(options){
        CS.Maps.Maps[elmtID] = _self;
        
        // On vérifie qu'il y ait au moins une option
        if (options){
            _lat                    = options.lat||_lat;
            _lng                    = options.lng||_lng;
            _zoom                   = options.zoom||_zoom;
            _mapType                = options.mapType||_mapType;
            
            _showIconsOnMap         = options.showIconsOnMap||_showIconsOnMap;
            _showIconsInfoInDiv     = options.showIconsInfoInDiv||_showIconsInfoInDiv;
            _mapMaxItemDisplay      = options.mapMaxItemDisplay||_mapMaxItemDisplay;
            _showKML                = options.showKML||_showKML; 

            _mapUFIAutoShow         = options.mapUFIAutoShow||_mapUFIAutoShow;
            _mapPOIAutoShow         = options.mapPOIAutoShow||_mapPOIAutoShow;

            _enableContinuousZoom   = options.enableContinuousZoom||_enableContinuousZoom;
            _enableDoubleClickZoom  = options.enableDoubleClickZoom||_enableDoubleClickZoom;
            _disableDragging        = options.disableDragging||_disableDragging;

            _moveEnd                = options.moveEnd||_moveEnd;
            _moveEndKML             = options.moveEndKML||_moveEndKML;

            _loadGMapTypeControl    = options.loadGMapTypeControl||_loadGMapTypeControl;
            _loadTextualZoomControl = options.loadTextualZoomControl||_loadTextualZoomControl;
            _loadTextualLinkControl = options.loadTextualLinkControl||_loadTextualLinkControl;
            _loadGScaleControl      = options.loadGScaleControl||_loadGScaleControl;
            _loadmapInfoIn          = options.loadmapInfoIn||_loadmapInfoIn;
        }
        
        if (window.addEventListener) {
	        window.addEventListener('load', load, false);
        }
        else if (window.attachEvent) {
            window.attachEvent('onload', load);
        }
    }
    initialize(options);

    var fncMoveEnd = function(){
        if (!loaded)
        {
            window.setTimeout(function() {fncMoveEndBis()}, 1000);
            loaded = true;
        } else {
            fncMoveEndBis();
        }
    }
    var fncMoveEndBis = function() {
        var center = _map.getCenter();
        var mapx = _map.getBounds().getNorthEast().lat();
        var mapy = _map.getBounds().getNorthEast().lng();
        var mapwidth = mapx - _map.getBounds().getSouthWest().lat();
        var mapheight = mapy - _map.getBounds().getSouthWest().lng();
        var mapzoom = _map.getZoom();

        LoadAjaxMarkers(center.lat(),center.lng(),mapx,mapy,mapwidth,mapheight,mapzoom,getTypeAjaxCall());
        RemoveExternalPoint(myPoints.length - 1);
        document.getElementById("message").innerHTML = _map.getBounds().getNorthEast().lat().toFixed(5) + " / " + _map.getBounds().getNorthEast().lng().toFixed(5);
        //center.toString();
    }
    
    var fncMoveEndKML = function(){
        var htmlarr = new Array();
        htmlarr.push('<a href=\"#\" onclick=\"CreerKMLForm(' + _map.getCenter().lat() + ',' + _map.getCenter().lng() + ',' + _map.getZoom() + ');return false;\"><img src=\"i/kmz.gif\" alt=\"\" /> KML</a>');
        htmlarr.push('<a href=\"poi.aspx?lat=' + _map.getCenter().lat() + '&lng=' + _map.getCenter().lng() + '&zm=' + _map.getZoom() + '\"><img src=\"i/lnk.gif\" alt=\"\" /> PermaLink (Lien permanent vers cette carte)</a>');
        //htmlarr.push('<a href=\"sendmail.aspx?lat=' + _map.getCenter().lat() + '&lng=' + _map.getCenter().lng() + '&zm=' + _map.getZoom() + '\"><img src=\"i/env.gif\" alt=\"\" /> Envoyer cette carte à un ami</a>');
        htmlarr.push('<a href=\"#\" onclick=\"openSendMailCoord(' + _map.getCenter().lat() + ',' + _map.getCenter().lng() + ',' + _map.getZoom() + ');return false;\"><img src=\"i/env.gif\" alt=\"\" /> Envoyer cette carte à un ami</a>');
       
        $("lnkkml_" + elmtID).innerHTML = "<b>" + htmlarr.join(" - ") + "</b>";
    }

    var MapIconActivate = function()
    {
        _map.clearOverlays();
        _showIconsOnMap=true;
        var mapx = _map.getBounds().getNorthEast().lat();
        var mapy = _map.getBounds().getNorthEast().lng();
        var mapwidth = mapx - _map.getBounds().getSouthWest().lat();
        var mapheight = mapy - _map.getBounds().getSouthWest().lng();
        var mapzoom = _map.getZoom();
    }
    
    var LoadAjaxMarkers = function (maplat,maplng,mapx,mapy,mapwidth,mapheight,mapzoom,typeItem)
    {
        var AjaxURL = "";
        
        // On charge les items
        switch (typeItem)
        {
            case EnumTypeAjaxCall.PaysProches:
                AjaxURL = "gpsdata.ashx?type=5&maplat=" + maplat + "&maplng=" + maplng + "&mapx=" + mapx + "&mapy=" + mapy + "&mapwidth=" + mapwidth + "&mapheight=" + mapheight + "&mapzoom=" + mapzoom;
                //debugger;
                break;
            case EnumTypeAjaxCall.CapitalesProches:
                AjaxURL = "gpsdata.ashx?type=4&maplat=" + maplat + "&maplng=" + maplng + "&mapx=" + mapx + "&mapy=" + mapy + "&mapwidth=" + mapwidth + "&mapheight=" + mapheight + "&mapzoom=" + mapzoom;
                break;
            case EnumTypeAjaxCall.RegionsProches:
                AjaxURL = "gpsdata.ashx?type=3&maplat=" + maplat + "&maplng=" + maplng + "&mapx=" + mapx + "&mapy=" + mapy + "&mapwidth=" + mapwidth + "&mapheight=" + mapheight + "&mapzoom=" + mapzoom;
                break;
            case EnumTypeAjaxCall.GrandesVillesProches:
                AjaxURL = "gpsdata.ashx?type=2&maplat=" + maplat + "&maplng=" + maplng + "&mapx=" + mapx + "&mapy=" + mapy + "&mapwidth=" + mapwidth + "&mapheight=" + mapheight + "&mapzoom=" + mapzoom;
                break;
            case EnumTypeAjaxCall.VillesProches:
                AjaxURL = "gpsdata.ashx?type=1&maplat=" + maplat + "&maplng=" + maplng + "&mapx=" + mapx + "&mapy=" + mapy + "&mapwidth=" + mapwidth + "&mapheight=" + mapheight + "&mapzoom=" + mapzoom;
                break;
            default:
                AjaxURL = "gpsdata.ashx?type=1&maplat=" + maplat + "&maplng=" + maplng + "&mapx=" + mapx + "&mapy=" + mapy + "&mapwidth=" + mapwidth + "&mapheight=" + mapheight + "&mapzoom=" + mapzoom;
            break;
        }
        GDownloadUrl(AjaxURL, function(data) {AddMarkers(data,typeItem);});
        
        // On charge les "places à voir"
        AjaxURL = "gpsdata.ashx?type=99&maplat=" + maplat + "&maplng=" + maplng + "&mapx=" + mapx + "&mapy=" + mapy + "&mapwidth=" + mapwidth + "&mapheight=" + mapheight + "&mapzoom=" + mapzoom;
        GDownloadUrl(AjaxURL, function(data) {AddMarkers(data,EnumTypeAjaxCall.PlaceToSee);});
    }
    
    var AddMarkers = function (data, typeItem)
    {
        try
        {
            var markers = eval(data);
        } catch (ex) {
            return;
        }
        var strArr = new Array();
        var mapcount = 0;
        
        switch (typeItem)
        {
            case EnumTypeAjaxCall.None:
            case EnumTypeAjaxCall.VillesProches:
            case EnumTypeAjaxCall.GrandesVillesProches:
            case EnumTypeAjaxCall.RegionsProches:
            case EnumTypeAjaxCall.CapitalesProches:
            case EnumTypeAjaxCall.PaysProches:
            case EnumTypeAjaxCall.CapitalesDuMondeFullListe:
                for (var i = 0; i < markers.length; i++) {
                //debugger;
                    if (_showIconsOnMap && mapcount < _mapMaxItemDisplay){
                        var point = new GPSPoint();
                        point.PointType     = TypeAjaxCall;
                        point.FNN           = markers[i].FNN;
                        point.FN            = markers[i].FN;
                        point.FC            = markers[i].FC;
                        point.POINT         = new GLatLng(markers[i].LAT, markers[i].LNG);
                        point.KM            = markers[i].KM;
                        point.ADM1N         = markers[i].ADM1N;
                        point.PAYS          = markers[i].PAYS;
                        point.ISOA2         = markers[i].ISOA2;
                        point.UFI           = markers[i].UFI;
                        point.CC1           = markers[i].CC1;
                        point.VILLEINSEE    = markers[i].VILLEINSEE;
                        point.CP            = markers[i].CP;
                        point.POP           = markers[i].POP;
                        point.CURR          = markers[i].CURR;
                        point.CURRSYB       = markers[i].CURRSYB;
                        point.UID           = point.UFI + "/" + point.POI_ID + "/" + point.ISOA2;
                        
                        if (findPoint(myPoints,point.UID) == null)
                        {
                            mapcount +=1;
                            myPoints.push(point);
                            var marker = MapAddIconMarker(point,typeItem);
                            myMarkers.push(marker);
                            if (_mapUFIAutoShow == point.UFI)
                            {
                                GEvent.trigger(marker, "click");
                                _mapUFIAutoShow= 0;
                            }
                            
                        } else {
                            //alert(point.UFI + ' existe !');
                        }
                    }
                    if (_showIconsInfoInDiv)
                    {
                        if (markers[i].FNN.toString().length > 14) { var FullNameN = markers[i].FNN.toString().substr(0, 11) + "..."; } else { var FullNameN = markers[i].FNN.toString(); }
                        strArr.push('<a href="#" onclick="CS.Maps.Maps[\'' + _elmtID + '\'].MapMoveTo(' + markers[i].LAT + ',' + markers[i].LNG + ');" title="' + markers[i].FNN + '">' + FullNameN + '</a> (' + parseFloat(markers[i].KM).toFixed(2) + ' km)<br />');
                    }
                }
                
                if (_showIconsInfoInDiv)
                {
                    switch (typeItem)
                    {
                        case EnumTypeAjaxCall.PaysProches:
                            document.getElementById("mapInfoVille").innerHTML = "<b>Pays proches :</b><br />" + strArr.join('');
                            break;
                        case EnumTypeAjaxCall.CapitalesProches:
                            document.getElementById("mapInfoVille").innerHTML = "<b>Capitales proches :</b><br />" + strArr.join('');
                            break;
                        case EnumTypeAjaxCall.RegionsProches:
                            document.getElementById("mapInfoVille").innerHTML = "<b>Régions proches :</b><br />" + strArr.join('');
                            break;
                        case EnumTypeAjaxCall.GrandesVillesProches:
                            document.getElementById("mapInfoVille").innerHTML = "<b>Grandes villes proches :</b><br />" + strArr.join('');
                            break;
                        case EnumTypeAjaxCall.VillesProches:
                            document.getElementById("mapInfoVille").innerHTML = "<b>Villes proches :</b><br />" + strArr.join('');
                            break;
                        default:
                            document.getElementById("mapInfoVille").innerHTML = "<b>Villes proches :</b><br />" + strArr.join('');
                            break;
                    }
                    
                    document.getElementById("mapInfoVille").scrollTop = 0;
                }
                break;
            case EnumTypeAjaxCall.PlaceToSee:
                for (var i = 0; i < markers.length; i++) {
                    if (_showIconsOnMap && mapcount < _mapMaxItemDisplay){
                        var point = new GPSPoint();
                        point.POINT     = new GLatLng(markers[i].LAT, markers[i].LNG);
                        point.PointType = EnumTypeAjaxCall.PlaceToSee
                        point.POI_ID    = markers[i].POI_ID;
                        point.POI       = markers[i].POI;
                        point.FNN       = markers[i].POI;
                        point.POIDESC   = markers[i].POIDESC;
                        point.FC        = "2See";
                        point.UID           = point.UFI + "/" + point.POI_ID;
                        
                        if (findPoint(myPoints,point.UID) == null )
                        {
                            mapcount +=1;
                            myPoints.push(point);
                            var marker = MapAddIconMarker(point,typeItem);
                            myMarkers.push(marker);
                            if (_mapPOIAutoShow == point.POI_ID)
                            {
                                GEvent.trigger(marker, "click");
                                _mapPOIAutoShow= 0;
                            }

                            
                        } else {
                            //alert(point.UFI + ' existe !');
                        }
                        //alert(myPoints.length);
                    }
                    if (_showIconsInfoInDiv)
                    {
                        if (markers[i].FNN.toString().length > 14) { var FullNameN = markers[i].FNN.toString().substr(0, 11) + "..."; } else { var FullNameN = markers[i].FNN.toString();   }
                        strArr.push('<a href="#" onclick="CS.Maps.Maps[\'' + _elmtID + '\'].MapMoveTo(' + markers[i].LAT + ',' + markers[i].LNG + ');" title="' + markers[i].FNN + '">' + FullNameN + '</a> (' + parseFloat(markers[i].KM).toFixed(2) + ' km)<br />');
                    }
                }
                if (_showIconsInfoInDiv)
                {
                    document.getElementById("mapInfoMonument").innerHTML = "<b>A voir dans le coin :</b><br />" + strArr.join('');
                    document.getElementById("mapInfoMonument").scrollTop = 0;
                }
            break;
        }
        //AddPoint(points2add.length - 1,EnumTypeAjaxCall.PlaceToSee);
        MapInfosloadingEND();
    }
    
    var MapAddIconMarker = function (Point, typeItem)
    {
        Point = Point||this;
        switch (typeItem)
        {
            case EnumTypeAjaxCall.PaysProches:
                var marker = new GMarker(Point.POINT, {title:Point.FNN,icon:new GIcon(baseIcoFlag, "i/flags/" + Point.ISOA2 + ".png")});
                break;
            case EnumTypeAjaxCall.CapitalesProches:
                var marker = new GMarker(Point.POINT, {title:Point.FNN,icon:new GIcon(baseIcoFlag, "i/flags/" + Point.ISOA2 + ".png")});
                break;
            case EnumTypeAjaxCall.RegionsProches:
                var marker = new GMarker(Point.POINT, {title:Point.FNN,icon:gicons[Point.FC]});
                break;
            case EnumTypeAjaxCall.GrandesVillesProches:
                var marker = new GMarker(Point.POINT, {title:Point.FNN,icon:gicons[Point.FC]});
                break;
            case EnumTypeAjaxCall.VillesProches:
                var marker = new GMarker(Point.POINT, {title:Point.FNN,icon:gicons[Point.FC]});
                break;
            default:
                var marker = new GMarker(Point.POINT, {title:Point.FNN,icon:gicons[Point.FC]});
                break;
        }
          marker.NfoPoint = Point;
          GEvent.addListener(marker, "click", function() {
            var htmlnfo = "<div style=\"font-size:x-small\">";
            htmlnfo += "<b>" + Point.FNN + "</b>";
            if (isExist(Point.POP)) {htmlnfo += " [ Population : " + Point.POP + " ]";};
            htmlnfo += "<br />";
            if (Point.FN != "") {htmlnfo += Point.FN + "<br />";};
            if (Point.PointType == EnumTypeAjaxCall.PlaceToSee)
            {
                htmlnfo += "<img src=\"i/oeil.gif\" alt=\"\" style=\"vertical-align:middle\" /> <a href=\"poi_detail.aspx?poi=" + Point.POI_ID + "\">" + Point.POI + "</a><br />";
            } else {
                htmlnfo += "<img src=\"i/flags/" + Point.ISOA2 + ".png\" alt=\"\" style=\"vertical-align:middle\" /> <a href=\"pays.aspx?iso=" + Point.ISOA2 + "\">" + Point.PAYS + "</a><br />";
            }
            if (isExist(Point.CP)) {htmlnfo += "Code postal : <b>" + Point.CP + "</b> ";};
            if (isExist(Point.VILLEINSEE)) {htmlnfo += "Code INSEE : " + Point.VILLEINSEE + " ";};
            if (Point.PointType == EnumTypeAjaxCall.PaysProches) {htmlnfo += "Monnaie : " + Point.CURR + " (" + Point.CURRSYB + ")";};
            htmlnfo += Point.ADM1N + "<br />";
            htmlnfo += "Lat/Long :: " + Point.POINT.lat().toFixed(2) + "/" + Point.POINT.lng().toFixed(2) + "<br />";
            //marker.openInfoWindowHtml("<b>" + Point.FULL_NAMEN + "</b><br>" + Point.FULL_NAME + "<br>" + Point.PAYS + "<br>" + Point.ADM1 + "<br />" + Point.POINT.lat() + "/" + Point.POINT.lng());
            htmlnfo += "<br />";
            htmlnfo += "";
            htmlnfo += "<a href=\"#\" onclick=\"CS.Maps.Maps[\'" + _elmtID + "\'].MapMoveTo(" + Point.POINT.lat() + "," + Point.POINT.lng() + ");return false;\">Centrer</a>";
            htmlnfo += " - <a href=\"#\" onclick=\"CS.Maps.Maps[\'" + _elmtID + "\'].MapMoveToAndZoom(" + Point.POINT.lat() + "," + Point.POINT.lng() + ",14);return false;\">Centrer & Zoomer</a>";
            //htmlnfo += " - <a href=\"#\" onclick=\"javascript:alert('Désolé, version Omega qui lave encore plus blanc (:-D), fonctionnalité pas encore disponible');return false;\">Modifier</a>";
            //htmlnfo += " - <a href=\"#\" onclick=\"javascript:alert('Désolé, version Omega qui lave encore plus blanc (:-D), fonctionnalité pas encore disponible');return false;\">Ajouter aux Favoris</a><br />";
            //htmlnfo += "<a href=\"#\" onclick=\"javascript:alert('Désolé, version Omega qui lave encore plus blanc (:-D), fonctionnalité pas encore disponible');return false;\">Ajouter un Commentaire</a>";
            //htmlnfo += " - <a href=\"#\" onclick=\"javascript:alert('Désolé, version Omega qui lave encore plus blanc (:-D), fonctionnalité pas encore disponible');return false;\">Lien permanent vers ce point</a><br />";
            if (Point.PointType == EnumTypeAjaxCall.PlaceToSee)
            {
                htmlnfo += "<div><a href=\"#\" onclick=\"openSendMailPOI(" + Point.POI_ID + ");return false;\"><img src=\"i/env.gif\" style=\"vertical-align:middle;\" /> Envoyer à un(e) ami(e)</a></div>";
                htmlnfo += "<div style=\"text-align:right\"><a href=\"kml.aspx?POI=" + Point.POI_ID + "&zm=" + _map.getZoom() + "\" target=\"_blank\"><img src=\"i/kmlfeed.gif\" style=\"vertical-align:middle;\" alt=\"Ouvrir ce point dans Google Earth directement\" /></a></div>";
            } else {
                htmlnfo += "<div><a href=\"#\" onclick=\"openSendMailUFI(" + Point.UFI + "," + _map.getZoom() +");return false;\"><img src=\"i/env.gif\" style=\"vertical-align:middle;\" /> Envoyer à un(e) ami(e)</a></div>";
                htmlnfo += "<div style=\"text-align:right\"><a href=\"kml.aspx?UF=" + Point.UFI + "&zm=" + _map.getZoom() + "\" target=\"_blank\"><img src=\"i/kmlfeed.gif\" style=\"vertical-align:middle;\" alt=\"Ouvrir ce point dans Google Earth directement\" /></a></div>";
            }
            htmlnfo += "</div>";

            marker.openInfoWindowHtml(htmlnfo);
            //mapCurrentUFI = Point.UFI;
          });
          _map.addOverlay(marker);
          return marker;
    }
    
    var getTypeAjaxCall = function () {
        switch (_map.getZoom())
            {
                case 1:
                case 2:
                case 3:
                    return EnumTypeAjaxCall.PaysProches;
                    break;
                case 4:
                case 5:
                    return EnumTypeAjaxCall.CapitalesProches;
                    break;
                case 6:
                case 7:
                    return EnumTypeAjaxCall.RegionsProches;
                    break;
                case 8:
                case 9:
                case 10:
                case 11:
                    return EnumTypeAjaxCall.GrandesVillesProches;
                    break;
                case 12:
                case 13:
                    return EnumTypeAjaxCall.VillesProches;
                    break;
                default:
                    return EnumTypeAjaxCall.VillesProches;
                    break;
            }
    }
    
    function RemoveExternalPoint(idx)
    {
        //debugger;
        try
        {
            if ( idx >= 0) 
            {
                var toclear = false;
                if (myMarkers[idx].getPoint().lat() < _map.getBounds().getSouthWest().lat()) {toclear=true;}
                if (myMarkers[idx].getPoint().lat() > _map.getBounds().getNorthEast().lat()) {toclear=true;}
                if (myMarkers[idx].getPoint().lng() > _map.getBounds().getNorthEast().lng()) {toclear=true;}
                if (myMarkers[idx].getPoint().lng() < _map.getBounds().getSouthWest().lng()) {toclear=true;}
            
                if (toclear)
                {
                    //alert(myMarkers[idx].getPoint().lat() + "/" + myMarkers[idx].getPoint().lng());
                    GEvent.clearInstanceListeners(myMarkers[idx]);
                    _map.removeOverlay(myMarkers[idx]);
                    myPoints.remove(findPoint(myPoints,myMarkers[idx].NfoPoint.UID));
                    myMarkers.removeAt(idx);
                }

                window.setTimeout(function(){RemoveExternalPoint(idx - 1);}, 1);
            } else {
                // terminé
            }
        } catch(ex) {
            MapClear();
        }
    }
    /////////////////// Control Link ////////////////////

    function TextualLinkControl() {
    }
    TextualLinkControl.prototype = new GControl();

    TextualLinkControl.prototype.initialize = function(map) {
        var container = document.createElement("div");

        var addLieux = document.createElement("div");
        this.setButtonStyle_(addLieux);
        container.appendChild(addLieux);
        addLieux.appendChild(document.createTextNode("Ajouter cet endroit dans \"Lieux à voir\""));
        addLieux.title = "Clickez ici pour partager ce lieu avec les autres utilisateurs";
        GEvent.addDomListener(addLieux, "click", function() {
            ProposerMap();
        });
        
        /*
        var favoris = document.createElement("div");
        this.setButtonStyle_(favoris);
        container.appendChild(favoris);
        favoris.appendChild(document.createTextNode("Favoris"));
        GEvent.addDomListener(favoris, "click", function() {
            alert('Désolé, version Omega qui lave encore plus blanc (:-D), fonctionnalité pas encore disponible');
        });
        
        var send = document.createElement("div");
        this.setButtonStyle_(send);
        container.appendChild(send);
        send.appendChild(document.createTextNode("Envoyer"));
        GEvent.addDomListener(send, "click", function() {
            alert('Désolé, version Omega qui lave encore plus blanc (:-D), fonctionnalité pas encore disponible');
        });
        
        var KML = document.createElement("div");
        this.setButtonStyle_(KML);
        container.appendChild(KML);
        KML.appendChild(document.createTextNode("KML"));
        GEvent.addDomListener(KML, "click", function() {
            alert('Désolé, version Omega qui lave encore plus blanc (:-D), fonctionnalité pas encore disponible');
        });
        
        var permaLink = document.createElement("div");
        this.setButtonStyle_(permaLink);
        container.appendChild(permaLink);
        permaLink.appendChild(document.createTextNode("PermaLink"));
        GEvent.addDomListener(permaLink, "click", function() {
            alert('Désolé, version Omega qui lave encore plus blanc (:-D), fonctionnalité pas encore disponible');
        });
        */
        map.getContainer().appendChild(container);
        return container;
    }

    TextualLinkControl.prototype.getDefaultPosition = function() {
        return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(100, 7));
    }
    TextualLinkControl.prototype.setButtonStyle_ = function(button) {
      button.style.textDecoration = "underline";
      button.style.color = "#0000cc";
      button.style.backgroundColor = "white";
      button.style.font = "small Arial";
      button.style.border = "1px solid black";
      button.style.padding = "2px";
      button.style.marginBottom = "3px";
      button.style.textAlign = "center";
      button.style.width = "10em";
      button.style.cursor = "pointer";
      button.style.color = "#FF0000";
    }
    /////////////////// Control Link ////////////////////

    /////////////////// Control Perso ///////////////////

    function mapInfoIn() {}
        mapInfoIn.prototype = new GControl();

        mapInfoIn.prototype.initialize = function(map) {
        var container = document.getElementById("nfoIn");
        
        map.getContainer().appendChild(container);
        return container;
    }

    mapInfoIn.prototype.getDefaultPosition = function() {
        return new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(7, 50));
    }

    /////////////////// Control Perso ///////////////////

    /////////////////// Control Zoom Perso //////////////

    // A TextualZoomControl is a GControl that displays textual "Zoom In"
    // and "Zoom Out" buttons (as opposed to the iconic buttons used in
    // Google Maps).
    function TextualZoomControl() {
    }
    TextualZoomControl.prototype = new GControl();

    // Creates a one DIV for each of the buttons and places them in a container
    // DIV which is returned as our control element. We add the control to
    // to the map container and return the element for the map class to
    // position properly.
    TextualZoomControl.prototype.initialize = function(map) {
      var container = document.createElement("div");

      var zoomInDiv = document.createElement("div");
      this.setButtonStyle_(zoomInDiv);
      container.appendChild(zoomInDiv);
      zoomInDiv.appendChild(document.createTextNode("[+] Zoomer"));
      GEvent.addDomListener(zoomInDiv, "click", function() {
        MapClear();
        map.zoomIn();
      });

      var zoomOutDiv = document.createElement("div");
      this.setButtonStyle_(zoomOutDiv);
      container.appendChild(zoomOutDiv);
      zoomOutDiv.appendChild(document.createTextNode("[-] Dézoomer"));
      GEvent.addDomListener(zoomOutDiv, "click", function() {
        MapClear();
        map.zoomOut();
      });

      map.getContainer().appendChild(container);
      return container;
    }

    // By default, the control will appear in the top left corner of the
    // map with 7 pixels of padding.
    TextualZoomControl.prototype.getDefaultPosition = function() {
      return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7, 7));
    }

    // Sets the proper CSS for the given button element.
    TextualZoomControl.prototype.setButtonStyle_ = function(button) {
      button.style.textDecoration = "underline";
      button.style.color = "#0000cc";
      button.style.backgroundColor = "white";
      button.style.font = "small Arial";
      button.style.border = "1px solid black";
      button.style.padding = "2px";
      button.style.marginBottom = "3px";
      button.style.textAlign = "center";
      button.style.width = "6em";
      button.style.cursor = "pointer";
    }

    /////////////////// Control Zoom Perso //////////////
}

// Et ensuite dans la page 
// var monObject = new CS.Maps.Map('idmonObject, 'monObject', {showKML:true, mapUFIAutoShow:'theValue'}); 
// monObject.MapMoveTo(10, 5);

/////////////////// Loading... //////////////////////

function MapInfosloading() {document.getElementById("loadnfo").innerHTML = '<b>Chargement des infos en cours, veuillez patienter...</b>';}
function MapInfosloadingEND() {document.getElementById("loadnfo").innerHTML = '<b>Chargement terminé</b>';window.setTimeout(function() {document.getElementById("loadnfo").innerHTML = '';}, 2000);}

function CreerKMLForm(lat, lng, zm)
{
    var divkml = document.createElement('div');
    divkml.id = 'divkml';
    divkml.className = 'kmldiv';
    divkml.innerHTML = "<b>Donnez un nom à cet emplacement</b>";

    var form = document.createElement('form');
    form.id = 'kmlform';
    form.action = 'kml.aspx?lat=' + lat + '&lng=' + lng + '&zm=' + zm;
    form.method = 'post'
    form.onsubmit = function(){
    if (document.getElementById('kmltitre').value == "")
    {
        alert("Vous n'avez pas saisi de titre !\nVous devez en saisir un.");
        return false;
    } else {
        this.target='hiframe';
        window.setTimeout(function(){
            var kml = document.getElementById('divkml');
            kml.parentNode.removeChild(kml);
            document.getElementById('aspnetForm').disabled = '';
            document.getElementById('aspnetForm').style.visibility = 'visible';
            document.getElementById('aspnetForm').style.display = 'block';

        }, 1);
        }
    ;}
   
    form.appendChild(document.createElement('br'));
    form.appendChild(document.createTextNode("Titre de cet emplacement"));
    form.appendChild(document.createElement('br'));
    var textTitre = document.createElement('input');
    textTitre.type = 'text';
    textTitre.id = 'kmltitre';
    textTitre.name = 'kmltitre';
    form.appendChild(textTitre);
    
    form.appendChild(document.createElement('br'));
    form.appendChild(document.createTextNode("Description de cet emplacement (optionnel)"));
    form.appendChild(document.createElement('br'));
    var textDesc = document.createElement('input');
    textDesc.type = 'text';
    textDesc.id = 'kmldesc';
    textDesc.name = 'kmldesc';
    form.appendChild(textDesc);

    form.appendChild(document.createElement('br'));

    var btn1 = document.createElement('input');
    btn1.type = 'submit';
    btn1.value = 'Télécharger le fichier KML [Google Earth]';
    btn1.id = 'btnKML';
    btn1.name = 'btnKML';
    form.appendChild(btn1);

    var btnCancel = document.createElement('input');
    btnCancel.type = 'button';
    btnCancel.value = 'Annuler et revenir à la carte';
    btnCancel.id = 'btnAnnul';
    btnCancel.onclick = function(){
            window.setTimeout(function(){
            var kml = document.getElementById('divkml');
            kml.parentNode.removeChild(kml);
            document.getElementById('aspnetForm').disabled = '';
            document.getElementById('aspnetForm').style.visibility = 'visible';
            document.getElementById('aspnetForm').style.display = 'block';

        }, 1);
    };
    btnCancel.name = 'btnAnnul';
    form.appendChild(btnCancel);
    
//    var hidden1 = document.createElement('input');
//    hidden1.type = 'hidden';
//    hidden1.id = 'field1';
//    hidden1.name = 'field1';
//    form.appendChild(hidden1);
    
    divkml.appendChild(form);
    document.getElementsByTagName('body')[0].appendChild(divkml);
    document.getElementById('aspnetForm').style.visibility = 'hidden';
    document.getElementById('aspnetForm').style.display = 'none';
}

/////////////////// Common //////////////////////////

function isExist(obj) { return obj?true:false }

/////////////////// Common //////////////////////////


function valideformbutton(evt, btn)
{
    if (document.all) {
        if (evt.keyCode==13) 
        {
            evt.keyCode=0;
            document.all[btn].click();
        }
    } else if (document.getElementById) {
        if (evt.keyCode==13) 
        {
            document.getElementById(btn).click();
        }
    } else {
    
    }
}
function openSendMailPOI(poi_id)
{
    var tmpurl = "send_ami.aspx?poi=" + poi_id;
    window.open(tmpurl, "_blank", "height=500,width=650,scrollbars=yes,resizable=yes,status=no,toolbar=no,menubar=no,location=no");
    return false;
}
function openSendMailUFI(ufi,zm)
{
    var tmpurl = "send_ami.aspx?UF=" + ufi + "&zm=" + zm;
    window.open(tmpurl, "_blank", "height=500,width=650,scrollbars=yes,resizable=yes,status=no,toolbar=no,menubar=no,location=no");
    return false;
}
function openSendMailCoord(lat,lng,zm)
{
    var tmpurl = "send_ami.aspx?lat=" + lat + "&lng=" + lng + "&zm=" + zm;
    window.open(tmpurl, "_blank", "height=500,width=650,scrollbars=yes,resizable=yes,status=no,toolbar=no,menubar=no,location=no");
    return false;
}
