
var oMap = Base.extend({

  constructor: function()
  {
      this.class_name = 'oMap';

      this.gmap = null;
      this.bounds = null;

      this.manager 			= new Array();
      this.markerZoom		 	= new Array();
      this.markerUnZoom 	 	= new Array();
      this.markerAllZoom	 	= new Array();

      this.polylineManager  	= new Array();
      this.polylineInfo 	 	= new Array();
      this.polylineDetails    = new Array();
      this.polylineContener 	= new Array();

      this.staticMapOptions = {
        'sensor':'false',
        'size':'550x400',
        'weight':'3',
        'shadow':'true',
        'zoom':'15'
      };

      this.showSearchLinks = 1;

      this.polylineStaticManager 	= new Array();
      this.polylineStaticInfo 	= new Array();

      this.mgr = null;
      this.divId = null;

      this.clusterManager		= new Array();
      this.egeoxmlManager		= new Array();
      this.egeoxmlPolyline	= new Array();
      this.marker				= new Array();

      this.kmlManager = new Array();

      iMap = this;

      /* --- Element de configuration --- */
      this.modePlanOnClick = false;
      /* -- Cluster et Marker de StopArea -- */
      this.cMarkerWidth = 25;
      this.cMarkerHeight = 30;
      this.pMarkerWidth = 25;
      this.pMarkerHeight = 30;
      /* -- Cluster et Marker de Site -- */
      this.cMarkerSiteWidth = 44;
      this.cMarkerSiteHeight = 39;
      this.cMarkerSiteImg = "picto_info_evenementiel.png";
      this.pMarkerSiteWidth = 25;
      this.pMarkerSiteHeight = 34;
      /* -- Cluster et Marker de City -- */
      this.cMarkerCityWidth = 25;
      this.cMarkerCityHeight = 30;
      this.cMarkerCityImg = "pictos/marker-commune.png";
      this.pMarkerCityWidth = 25;
      this.pMarkerCityHeight = 30;
      /* -- Cluster et Marker favori -- */
      this.cMarkerFavWidth = 24;
      this.cMarkerFavHeight = 25;
      this.cMarkerFavImg = "pictos/fav_created.png";
      this.pMarkerFavWidth = 24;
      this.pMarkerFavHeight = 25;
    },

  CreateMap: function (MapCenterX, MapCenterY, Zoom, id, custom, option)
  {
      if (GBrowserIsCompatible())
      {
        iMap.divId = id;
        var GoogleMapObj = document.getElementById(id);
        iMap.gmap = new GMap2(GoogleMapObj);

      if(typeof(MapCenterX) == "number" && typeof(MapCenterY) == "number" && typeof(Zoom) == "number")
      {
        this.MapCenter(MapCenterX, MapCenterY, Zoom);
      }else return false;

      this.bounds = new GLatLngBounds();

        if(custom=="disabled")//Map par defaut
        {
          iMap.gmap.addControl(new GLargeMapControl());
          iMap.gmap.addControl(new GMapTypeControl());
        function wheelZoom(a) {
          if ((a.detail || -a.wheelDelta) < 0)
            iMap.gmap.zoomIn();
          else
            iMap.gmap.zoomOut();
        }

        MapName = "NavitiaMap";
        }
        else//Map custom
        {
          iMap.gmap.addControl(new CustomGLargeMapControl(iMap.gmap), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(5,5)));
          iMap.gmap.addControl(new CustomMapControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(5,5)));
        }
        this.overviewMap = new GOverviewMapControl();
        this.scaleControl = new GScaleControl();

        iMap.gmap.addControl(this.overviewMap);
        iMap.gmap.addControl(this.scaleControl);
        Geocoder = new GClientGeocoder();
        iMap.gmap.enableDoubleClickZoom();
        iMap.gmap.enableContinuousZoom();

        iMap.mgr = new GMarkerManager(iMap.gmap);

        /* Initialisation des elements de configurations */
        if(option != null){
          if(option['modePlanOnClick'] != null)
            iMap.modePlanOnClick = option['modePlanOnClick'];
          if(option['cMarkerHeight'] != null && option['cMarkerHeight'] != '')
            iMap.cMarkerHeight = option['cMarkerHeight'];
          if(option['cMarkerWidth'] != null && option['cMarkerWidth'] != '')
            iMap.cMarkerWidth = option['cMarkerWidth'];
          if(option['pMarkerHeight'] != null && option['pMarkerHeight'] != '')
            iMap.pMarkerHeight = option['pMarkerHeight'];
          if(option['pMarkerWidth'] != null && option['pMarkerWidth'] != '')
            iMap.pMarkerWidth = option['pMarkerWidth'];
          if(option['cMarkerSiteWidth'] != null && option['cMarkerSiteWidth'] != '')
            iMap.cMarkerSiteWidth = option['cMarkerSiteWidth'];
          if(option['cMarkerSiteHeight'] != null && option['cMarkerSiteHeight'] != '')
            iMap.cMarkerSiteHeight = option['cMarkerSiteHeight'];
          if(option['cMarkerSiteImg'] != null && option['cMarkerSiteImg'] != '')
            iMap.cMarkerSiteImg = option['cMarkerSiteImg'];
          if(option['pMarkerSiteWidth'] != null && option['pMarkerSiteWidth'] != '')
            iMap.pMarkerSiteWidth = option['pMarkerSiteWidth'];
          if(option['pMarkerSiteHeight'] != null && option['pMarkerSiteHeight'] != '')
            iMap.pMarkerSiteHeight = option['pMarkerSiteHeight'];
          if(option['cMarkerCityWidth'] != null && option['cMarkerCityWidth'] != '')
            iMap.cMarkerCityWidth = option['cMarkerCityWidth'];
          if(option['cMarkerCityHeight'] != null && option['cMarkerCityHeight'] != '')
            iMap.cMarkerCityHeight = option['cMarkerCityHeight'];
          if(option['cMarkerCityImg'] != null && option['cMarkerCityImg'] != '')
            iMap.cMarkerCityImg = option['cMarkerCityImg'];
          if(option['pMarkerCityWidth'] != null && option['pMarkerCityWidth'] != '')
            iMap.pMarkerCityWidth = option['pMarkerCityWidth'];
          if(option['pMarkerCityHeight'] != null && option['pMarkerCityHeight'] != '')
            iMap.pMarkerCityHeight = option['pMarkerCityHeight'];
          if(option['cMarkerFavWidth'] != null && option['cMarkerFavWidth'] != '')
            iMap.cMarkerFavWidth = option['cMarkerFavWidth'];
          if(option['cMarkerFavHeight'] != null && option['cMarkerFavHeight'] != '')
            iMap.cMarkerFavHeight = option['cMarkerFavHeight'];
          if(option['cMarkerFavImg'] != null && option['cMarkerFavImg'] != '')
            iMap.cMarkerFavImg = option['cMarkerFavImg'];
          if(option['pMarkerFavWidth'] != null && option['pMarkerFavWidth'] != '')
            iMap.pMarkerFavWidth = option['pMarkerFavWidth'];
          if(option['pMarkerFavHeight'] != null && option['pMarkerFavHeight'] != '')
            iMap.pMarkerFavHeight = option['pMarkerFavHeight'];
          if(typeof(option['showSearchLinks']) != 'undefined') {
            iMap.showSearchLinks = option['showSearchLinks'];
          }
        }
      }
  },
  ResizeMap: function()
  {
    this.gmap.removeControl(this.overviewMap);
      this.gmap.checkResize();
      this.gmap.addControl(this.overviewMap);
  },

  /* Marker HTML LocalSearch */
  CustomMarkerHtml : function(marker, html, resultat)
  {
    html.innerHTML = "<br />";
    html.innerHTML += "<div class='strong'>" + resultat.titleNoFormatting + "</div>";
    html.innerHTML += "<div>" + resultat.addressLines[0] + "</div>";
    html.innerHTML += "<div>" + resultat.addressLines[1] + "</div>";
    return html;
  },

  MapCenter: function (pf_LamberX, pf_LamberY, pi_scale)
  {
      if((typeof(cfg)!='undefined') && (cfg.getValue('Map') != false) && (cfg.getValue('Map').getValue('coordType') != false)) {
        var CoordIn = cfg.getValue('Map').getValue('coordType');
      }
      else
      {
        var CoordIn = 'LAMB2';
      }
      var source = new Proj4js.Proj(CoordIn);
      var dest = new Proj4js.Proj('WGS84');
      var p = new Proj4js.Point(parseFloat(pf_LamberX),parseFloat(pf_LamberY));
      Proj4js.transform(source, dest, p);
      this.gmap.setCenter(new GLatLng(p.y, p.x), parseInt(pi_scale));
  },

  /**
   * Centre la carte en fonction des bords d�finis dans l'attribut "bounds"
   */
  MapCenterByBounds: function () {
    this.gmap.setCenter(this.bounds.getCenter());
  },

  /**
   * Change le zoom de la map
   * @param {integer} Le niveau de zoom entre 0 et 19
   */
  MapZoom: function (zoomLevel) {
    this.gmap.setZoom(zoomLevel);
  },

  /**
   * Zoom automatiquement en fonction des bords définis dans l'attribut "bounds"
   */
  MapZoomByBounds: function() {
    this.gmap.setZoom(this.gmap.getBoundsZoomLevel(this.bounds));
  },

  /**
   * Etend les bords de la map en fonction d'un objet de type GLatLng
   * @param {GLatLng} L'objet point à passer
   */
  ExtendBounds: function(pointObject) {
    this.bounds.extend(pointObject);
  },

  /* Construit une etiquette en fonction du nom d'arret, de ville et d'un tableau de ligne*/
  InfoContentBuilder: function(Name,CName,LineArray)
  {
    var etiquette = "<div class='info_bulle'>";
    etiquette +="<h1>"+Name;
    if(CName != "")
      etiquette += " ("+CName+")";
    etiquette +="</h1>";

    var more = false;
    if(LineArray.length > 4)
    {
      LineArray.length = 4;
      more = true;
    }

    etiquette += "<ul>";
    for(var i=0;i<LineArray.length;i++)
    {
      etiquette += "<li><span>Ligne "+LineArray[i]['LCode']+" : </span>"+LineArray[i]['LName']+"</li>";
    }
    if(more == true)
    {
      etiquette += "<li>...</li>";
    }
    etiquette += "</ul>";

    etiquette += '<p>Rechercher un itin&eacute;raire</p>';
    etiquette += '<div><a href=\"'+urlSite+'/route/vuesearch/?rappelDeparture='+encodeURIComponent(CName)+'%20-'+encodeURIComponent(Name)+'\">Depuis ce point &raquo;</a></div>';
    etiquette += '<div><a href=\"'+urlSite+'/route/vuesearch/?rappelDestination='+encodeURIComponent(CName)+'%20-'+encodeURIComponent(Name)+'\">Vers ce point &raquo;</a></div>';
    etiquette += '<div><a href=\"'+urlSite+'/route/vueHoraire/?stopAreaLibelle='+encodeURIComponent(Name)+'&cityLibelle='+encodeURIComponent(CName)+'">Voir les horaires &agrave; cet arr&ecirc;t &raquo;</a></div>';

    etiquette += '</div>';
    delete(LineArray);
    return etiquette;
  },

  /* Bind une infobulle sur un marqueur de depart ou d'arrivee */
  InfoBindContent: function(content,id,adresse,cityName)
  {
    var etiquette = "<div class='info_bulle'>";
    if(content == 'Departure')
    {
      etiquette += "<div class='info-details info-start-flag'><h1>"+adresse+" ("+cityName+")</h1>";
      etiquette += "<p>Ce point correspond \340 votre point de d\351part.</p>";
      etiquette += "</div>";
    }
    else if(content == 'Destination')
    {
      etiquette += "<div class='info-details info-stop-flag'><h1>"+adresse+" ("+cityName+")</h1>";
      etiquette += "<p>Ce point correspond \340 votre point d\'arriv\351e.</p>";
      etiquette += "</div>";
    }
    else if(content == 'wayPoint')
    {
      etiquette += "<div class='info-details info-via-flag'><h1>"+adresse+" ("+cityName+")</h1>";
      etiquette += "<p>Ce point correspond \340 votre \351tape interm\351diaire.</p>";
      etiquette += "</div>";
    }

    etiquette += '<p><a href="#" onclick="map.DeleteMarker(\''+content+'\',\''+id+'\');return false;" title="Supprimer ce point">Supprimer ce point</a></p>';

    etiquette += "</div>";
    iMap.BindInfoWindowCustom(iMap.manager[id],etiquette);
  },

  /* Cree une etiquette pour le depart arrivee laissant a l'utilisateur le choix de son point */
  InfoContentBuilderDepartureArrival: function(Link,id,adresse,cityName,codePoint)
  {
    var etiquette = "<div class='info_bulle'>";
    if((typeof(cfg)!='undefined') && (cfg.getValue('Site') != null) && (cfg.getValue('Site').getValue('area') != null)) {
          var siteArea = cfg.getValue('Site').getValue('area');
        }
        else
        {
          var siteArea = 'limousin';
        }
        //siteArea = ucfirst(siteName);
    if(id=="error")
    {
      etiquette += "<p>Il est impossible de faire une recherche d'itin&eacute;raire &agrave; partir ou vers ce point. En dehors de la r&eacute;gion " + siteArea + ", seuls les points d'arr&ecirc;ts signal&eacute;s sur la carte sont cliquables.</p>";
    }
    else
    {
      etiquette += "<div class='info-details info-stop'><h1>"+adresse+" ("+cityName+")</h1>";
      etiquette += "<div>Rechercher un itin\351raire</div>";
      for(var i=0;i<Link.length;i++)
      {
        if(Link[i]=="Departure")
          etiquette +="<div><a title='Choisissez ce point comme d\351part' id='markerDepart' onclick='map.MarkerSelected(\"Departure\",\""+id+"\",\""+adresse+"\",\""+cityName+"\",\""+codePoint+"\"); return false;' href='#'>Depuis ce point &raquo;</a></div>";

        if(Link[i]=="wayPoint")
          etiquette +="<div><a title='Choisissez ce point comme \351tape interm\351diaire' id='markerWayPoint' onclick='map.MarkerSelected(\"wayPoint\",\""+id+"\",\""+adresse+"\",\""+cityName+"\",\""+codePoint+"\"); return false;' href='#'>En passant par ce point &raquo;</a></div>";

        if(Link[i]=="Destination")
          etiquette +="<div><a title='Choisissez ce point comme destination' id='markerDestination' onclick='map.MarkerSelected(\"Destination\",\""+id+"\",\""+adresse+"\",\""+cityName+"\",\""+codePoint+"\"); return false;' href='#'>Vers ce point &raquo;</a></div>";
      }
      etiquette += "</div>";
    }
    etiquette += "</div>";
    return etiquette;
  },

  /* Fonction permettant l'affichage d'une adresse */
  ShowAddress: function(address) {
    Geocoder.getLatLng(
      address,
      function(point) {
        if (!point) {
          $('#msg_error_container').removeClass('hide')
          iMap.gmap.clearOverlays() ;
        } else {
          Geocoder.getLocations(
            address,
            function(response){
              if(response || response.Status.code==200)
              {
                var detailsRes = response.Placemark[0].AddressDetails;
                address = "";
                if(detailsRes.Accuracy>=4)
                {
                  address += detailsRes.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
                  address += ", ";
                  address += detailsRes.Country.CountryName;
                  $('#msg_error_container').addClass('hide')
                  iMap.gmap.setCenter(point, 13);
                  var marker = new GMarker(point);
                  iMap.gmap.addOverlay(marker);
                  marker.openInfoWindowHtml(address);
                }
                else
                {
                  $('#msg_error_container').removeClass('hide')
                  iMap.gmap.clearOverlays() ;
                }
              }
            }
          )

        }
      }
    )
  },


  /* Fonction gerant les clics de depart, d'arrivee et de l'etape intermediaire */
  InitMarkerListener: function()
  {
    msw = new MswStreetNetwork();
    iMap.manager['X1']=iMap.CreateMarkerSelection(0,0,''); iMap.manager['X1'].hide();
    iMap.manager['X2']=iMap.CreateMarkerSelection(0,0,''); iMap.manager['X2'].hide();
    iMap.manager['Xi']=iMap.CreateMarkerSelection(0,0,''); iMap.manager['Xi'].hide();
    iMap.manager['error']=iMap.CreateMarkerSelection(0,0,''); iMap.manager['error'].hide();

    GEvent.addListener(iMap.gmap,'click',function(overlay,latlng){

      if($('#IsClick').val() == "1")
      {
        if(latlng != null)
        {
          var lat = latlng.lat();
          var lon = latlng.lng();
          var point = new GLatLng(lat,lon);

          var iTp = new oTp();
          if((typeof(cfg)!='undefined') && (cfg.getValue('Map') != false) && (cfg.getValue('Map').getValue('coordType') != false)) {
            var CoordIn = cfg.getValue('Map').getValue('coordType');
          }
          else
          {
            var CoordIn = 'LAMB2';
          }
          var dest = new Proj4js.Proj(CoordIn);
          var source = new Proj4js.Proj('WGS84');
          var p = new Proj4js.Point(parseFloat(lon),parseFloat(lat));
          Proj4js.transform(source, dest, p);

          msw.getAdressByXY(parseFloat(p.x),parseFloat(p.y),

            function(objet_retourne,param)
            {
              var codePoint = p.x+"-"+p.y;

              var lat = latlng.lat();
              var lon = latlng.lng();
              var point = new GLatLng(lat,lon);

              if(objet_retourne.status == 'error')
              {
                iMap.manager['error'].setLatLng(point);
                iMap.manager['error'].show();
                iMap.manager['error'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival([],'error','','',codePoint));
              }
              else
              {
                var cityName = iTp.htmlentities(objet_retourne.place.city.trim());
                var adresse = iTp.htmlentities(objet_retourne.adress.trim());
                var idx = iTp.htmlentities(objet_retourne.place.idx);
                var typePoint = iTp.htmlentities(objet_retourne.place.type);

                iMap.manager['error'].hide();

                if($('#DepartureCityName').attr('rel') == 0 && $('#DestinationCityName').attr('rel') == 0 )
                {
                  tab = new Array('Departure','wayPoint','Destination');

                  iMap.manager['X1'].setLatLng(point);
                  iMap.manager['X1'].show();
                  iMap.manager['X1'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'X1',adresse,cityName,codePoint));
                }
                else if($('#DepartureCityName').attr('rel') != 0 ^ $('#DestinationCityName').attr('rel') != 0 )
                {
                  if($('#DepatureCityName').attr('rel') != 0)
                    tab = new Array('Destination');
                  if($('#DestinationCityName').attr('rel') != 0)
                    tab = new Array('Departure');

                  if(iMap.manager['X1'].isHidden())
                  {
                    iMap.manager['X1'].setLatLng(point);
                    iMap.manager['X1'].show();
                    iMap.manager['X1'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'X1',adresse,cityName,codePoint));
                  }
                  else
                  {
                    iMap.manager['X2'].setLatLng(point);
                    iMap.manager['X2'].show();
                    iMap.manager['X2'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'X2',adresse,cityName,codePoint));
                  }
                }
                else if($('#wayPointCityName').attr('rel') == 0)
                {
                  tab = new Array('wayPoint');

                  iMap.manager['Xi'].setLatLng(point);
                  iMap.manager['Xi'].show();
                  iMap.manager['Xi'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'Xi',adresse,cityName,codePoint));
                }
              }
            },'json'
          );
        }
      }
    });
  },


  /* InitClusterMarkerListener via StopAreaExternalCode */
  InitClusterMarkerListener: function(marker,ExternalCode)
  {
    iMap.manager['X1']=iMap.CreateMarkerSelection(0,0,''); iMap.manager['X1'].hide();
    iMap.manager['X2']=iMap.CreateMarkerSelection(0,0,''); iMap.manager['X2'].hide();
    iMap.manager['Xi']=iMap.CreateMarkerSelection(0,0,''); iMap.manager['Xi'].hide();
    iMap.manager['error']=iMap.CreateMarkerSelection(0,0,''); iMap.manager['error'].hide();

    if($('#IsClick').val() == "1")
    {
      if(marker != null && ExternalCode != null)
      {
        var latlng = marker.getPoint();
        var lat = latlng.lat();
        var lon = latlng.lng();
        var point = new GLatLng(lat,lon);
        if((typeof(cfg)!='undefined') && (cfg.getValue('Map') != false) && (cfg.getValue('Map').getValue('coordType') != false)) {
          var CoordIn = cfg.getValue('Map').getValue('coordType');
        }
        else
        {
          var CoordIn = 'LAMB2';
        }
        var dest = new Proj4js.Proj(CoordIn);
        var source = new Proj4js.Proj('WGS84');
        var p = new Proj4js.Point(parseFloat(lon),parseFloat(lat));
        Proj4js.transform(source, dest, p);
        var codePoint = p.x+"-"+p.y;

        $.getJSON(urlSite+"/InfoWindow/maker",{StopAreaExternalCode:ExternalCode, showSearchLinks: iMap.showSearchLinks},
          function(data)
          {
            if(data == '')
            {
              iMap.manager['error'].setLatLng(point);
              iMap.manager['error'].show();
              iMap.manager['error'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival([],'error','','',codePoint));
            }
            else
            {
              /* InfoStoparea */
              var Name = "";
              /* InfoCity */
              var CName= "" ;

              var k=0;
               //==> Parseur JSON
               $.each(data,function(i,item){
                 if(i!='LineArray')
                 {
                   /* InfoStopAea */
                   Name = item[k].Name;
                   /* InfoCity */
                   CName= item[k].City.Name;
                 }
                 k++;
               });

               var iTp = new oTp();
               var cityName = iTp.htmlentities(CName);
              var adresse = iTp.htmlentities(Name);

              iMap.manager['error'].hide();


              if($('#DepartureCityName').attr('rel') == 0 && $('#DestinationCityName').attr('rel') == 0 )
              {
                if($('#wayPointCityName').length == 0) {
                  tab = new Array('Departure','Destination');
                } else {
                  tab = new Array('Departure','wayPoint','Destination');
                }


                iMap.manager['X1'].setLatLng(point);
                iMap.manager['X1'].show();
                iMap.manager['X1'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'X1',adresse,cityName,codePoint));
              }
              else if($('#DepartureCityName').attr('rel') != 0 ^ $('#DestinationCityName').attr('rel') != 0 )
              {
                if($('#wayPointCityName').length == 0) {
                  if($('#DepatureCityName').attr('rel') != 0)
                    tab = new Array('Destination');
                  if($('#DestinationCityName').attr('rel') != 0)
                    tab = new Array('Departure');
                } else {
                  if($('#DepatureCityName').attr('rel') != 0)
                    tab = new Array('wayPoint','Destination');
                  if($('#DestinationCityName').attr('rel') != 0)
                    tab = new Array('Departure','wayPoint');
                }

                if(iMap.manager['X1'].isHidden())
                {
                  iMap.manager['X1'].setLatLng(point);
                  iMap.manager['X1'].show();
                  iMap.manager['X1'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'X1',adresse,cityName,codePoint));
                }
                else
                {
                  iMap.manager['X2'].setLatLng(point);
                  iMap.manager['X2'].show();
                  iMap.manager['X2'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'X2',adresse,cityName,codePoint));
                }
              }
              else if($('#wayPointCityName').length > 0 && $('#wayPointCityName').attr('rel') == 0)
              {
                tab = new Array('wayPoint');

                iMap.manager['Xi'].setLatLng(point);
                iMap.manager['Xi'].show();
                iMap.manager['Xi'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'Xi',adresse,cityName,codePoint));
              }
            }
          },'json'
        );
      }
    }
  },

  /* InitClusterCityMarkerListener via Libelle */
  InitClusterCityMarkerListener: function(marker,cityName)
  {
    if(marker != null && cityName != null)
    {
      iMap.manager['X1']=iMap.CreateMarkerSelection(0,0,''); iMap.manager['X1'].hide();
      iMap.manager['X2']=iMap.CreateMarkerSelection(0,0,''); iMap.manager['X2'].hide();
      iMap.manager['Xi']=iMap.CreateMarkerSelection(0,0,''); iMap.manager['Xi'].hide();
      iMap.manager['error']=iMap.CreateMarkerSelection(0,0,''); iMap.manager['error'].hide();

      var latlng = marker.getPoint();
      var lat = latlng.lat();
      var lon = latlng.lng();
      var point = new GLatLng(lat,lon);
      if((typeof(cfg)!='undefined') && (cfg.getValue('Map') != false) && (cfg.getValue('Map').getValue('coordType') != false)) {
        var CoordIn = cfg.getValue('Map').getValue('coordType');
      }
      else
      {
        var CoordIn = 'LAMB2';
      }
      var dest = new Proj4js.Proj(CoordIn);
      var source = new Proj4js.Proj('WGS84');
      var p = new Proj4js.Point(parseFloat(lon),parseFloat(lat));
      Proj4js.transform(source, dest, p);
      var codePoint = p.x+"-"+p.y;

      adresse = '';

      iMap.manager['error'].hide();

      if($('#DepartureCityName').attr('rel') == 0 && $('#DestinationCityName').attr('rel') == 0 )
      {
        tab = new Array('Departure','wayPoint','Destination');

        iMap.manager['X1'].setLatLng(point);
        iMap.manager['X1'].show();
        iMap.manager['X1'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'X1',adresse,cityName,codePoint));
      }
      else if($('#DepartureCityName').attr('rel') != 0 ^ $('#DestinationCityName').attr('rel') != 0 )
      {
        if($('#DepatureCityName').attr('rel') != 0)
          tab = new Array('wayPoint','Destination');
        if($('#DestinationCityName').attr('rel') != 0)
          tab = new Array('Departure','wayPoint');

        if(iMap.manager['X1'].isHidden())
        {
          iMap.manager['X1'].setLatLng(point);
          iMap.manager['X1'].show();
          iMap.manager['X1'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'X1',adresse,cityName,codePoint));
        }
        else
        {
          iMap.manager['X2'].setLatLng(point);
          iMap.manager['X2'].show();
          iMap.manager['X2'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'X2',adresse,cityName,codePoint));
        }
      }
      else if($('#wayPointCityName').attr('rel') == 0)
      {
        tab = new Array('wayPoint');

        iMap.manager['Xi'].setLatLng(point);
        iMap.manager['Xi'].show();
        iMap.manager['Xi'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'Xi',adresse,cityName,codePoint));
      }
    }
  },

  MarkerSelected: function(rappelMarker,id,adresse,cityName,codePoint)
  {
    var rappelEntrypoint = '';

    if (adresse != '')
      rappelEntrypoint += adresse + " " ;
    if (cityName != '')
      rappelEntrypoint += "(" + cityName + ")";

    if(rappelMarker == "wayPoint")
    {
      if(iMap.manager['Xi'].isHidden())
      {
        id = 'Xi';
        iMap.manager['Xi'] = iMap.manager['X1'];
        iMap.manager['X1'].hide();
      }
      ShowWayPoint();
      $('#wayPointRappelArea').removeClass('hide');
      $('#wayPoint').attr('rel',$('#wayPoint').val());
      $('#wayPoint').val(adresse);
    }
    else
    {
      $('#'+rappelMarker+'Libelle').attr('rel',$('#'+rappelMarker+'Libelle').val());
      $('#'+rappelMarker+'Libelle').val(adresse);
      $('#'+rappelMarker).val(codePoint);
    }

    $('#'+rappelMarker+'Rappel').empty().append(rappelEntrypoint);
    $('#'+rappelMarker+'CityName').attr('rel',$('#'+rappelMarker+'CityName').val());
    $('#'+rappelMarker+'CityName').val(cityName);
    $('#'+rappelMarker+'Selected').empty().append('<a href="#" id="'+rappelMarker+'LinkSelected" onclick="map.DeleteMarker(\''+rappelMarker+'\',\''+id+'\');return false;" title="Supprimer la s&eacute;lection">Supprimer la s&eacute;lection &raquo;</a>');

    //Et on modifie l'info bulle
    iMap.InfoBindContent(rappelMarker,id,adresse,cityName);

    if(rappelMarker == "Departure")
      iMap.manager[id].setImage(urlImage+'icon-start-flag.gif');
    else if(rappelMarker == "Destination")
      iMap.manager[id].setImage(urlImage+'icon-stop-flag.gif');
    else if(rappelMarker == "wayPoint")
      iMap.manager[id].setImage(urlImage+'icon-via-flag.gif');

    if( typeof(FormFunction) == 'function' )
      FormFunction(rappelMarker);

    iMap.manager[id].closeExtInfoWindow(iMap.gmap);

  },

  /* Efface un Marker depart arrivee */
  DeleteMarker: function(rappelMarker,id)
  {
    iMap.manager[id].closeExtInfoWindow(iMap.gmap);
    iMap.manager[id].hide();

    if(rappelMarker=='wayPoint')
    {
      //$('#wayPointRappelArea').addClass('hide');

      $('#'+rappelMarker+'Rappel').empty();
      $('#'+rappelMarker+'LinkSelected').remove();

      if( $('#'+rappelMarker).attr('rel') != '0')
      {
        $('#'+rappelMarker).val($('#'+rappelMarker).attr('rel'));
        $('#'+rappelMarker).attr('rel','0');
      }

      if( $('#'+rappelMarker+'CityName').attr('rel') != '0')
      {
        $('#'+rappelMarker+'CityName').val($('#'+rappelMarker+'CityName').attr('rel'));
        $('#'+rappelMarker+'CityName').attr('rel','0');
      }

      //$('#'+rappelMarker).val('');

      if( typeof(HideWayPoint) == 'function' )
        HideWayPoint();
    }
    else
    {
      $('#'+rappelMarker+'Rappel').empty();
      $('#'+rappelMarker+'Libelle').val($('#'+rappelMarker+'Libelle').attr('rel'));
      $('#'+rappelMarker+'Libelle').attr('rel','0');
      $('#'+rappelMarker+'CityName').val($('#'+rappelMarker+'CityName').attr('rel'));
      $('#'+rappelMarker+'CityName').attr('rel','0');
      //$('#'+rappelMarker).val('');
      $('#'+rappelMarker+'LinkSelected').remove();
    }
  },

  /* Initialise un marker */
  CreateMarkerSelection: function(CoordX,CoordY,etiquette)
  {
    var point = new GLatLng(CoordX,CoordY);
    var icon  = new GIcon();
      icon.image 			  = urlImage+'icon-stop.gif';
      icon.iconSize 		  = new GSize(16,16);
      icon.iconAnchor 	  = new GPoint(8,16);
      icon.infoWindowAnchor = new GPoint(8,0);
    var marker = new GMarker(point,{icon:icon});
    iMap.gmap.addOverlay(marker);
    marker.bindInfoWindow(etiquette);
    //iMap.BindInfoWindowCustom(marker,etiquette);
    return marker;
  },

  /* PLAN DU RESEAU (CARTE INTERACTIVE) */
  GetInfoWindowPlan: function(externalCode,marker)
  {

     //InfoStoparea
    var Idx = "" ;
    var Id = "";
    var ExternalCode = "";
    var Name = "";
    var CoordX = "";
    var CoordY = "";
    //InfoCity
    var CIdx = "";
    var CId= "" ;
    var CName= "" ;
    var CCityCode = "";
    var CExternalCode = "";
    var CCode = "";
    //InfoLines
    LineArray = new Array();
    Line = new Array();
    var LExternalCode = "";
    var LName = "";
    var LIdx = "";
    var LId= "";
    var LCode = "";
    var LNetworkExternalCode = "";
    var LNetwork = "";

     $.getJSON(urlSite+"/InfoWindow/maker",{StopAreaExternalCode:externalCode, showSearchLinks: iMap.showSearchLinks},function(data){
       var k=0;
       //==> Parseur JSON
       $.each(data,function(i,item){
         if(i=='LineArray')
         {
           var longueur = item.length;
           /* InfoLines */
           for(var j=0;j<longueur;j++)
           {
             LineArray[j]=new Array();
             LineArray[j]["LExternalCode"] = item[j].ExternalCode;
             LineArray[j]["LName"] = item[j].Name;
             LineArray[j]["LIdx"] = item[j].Idx;
             LineArray[j]["LId"] = item[j].Id;
             LineArray[j]["LCode"] = item[j].Code;
             LineArray[j]["LNetworkExternalCode"] = item[j].NetworkExternalCode;
             LineArray[j]["LNetwork"] = item[j].Network;
           }
           /**/
         }
         else
         {
           /* InfoStopAea */
           Idx = item[k].Idx;
           Id = item[k].Id;
           ExternalCode = item[k].ExternalCode;
           Name = item[k].Name;
           CoordX = item[k].Coord.CoordX;
           CoordY = item[k].Coord.CoordY;
           /* InfoCity */
           CIdx = item[k].City.Idx;
           CId= item[k].City.Id;
           CName= item[k].City.Name;
           CCityCode = item[k].City.CityCode;
           CExternalCode = item[k].City.ExternalCode;
           CCode = item[k].City.Idx;
         }
         k++;
       });// ==> Fin parseur JSON
       marker.openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilder(Name,CName,LineArray));
     });
  },

  //InfoBulle VeloPlus
  VeloInfoWindowContentBuilder: function(infos)
  {
    var content = ''
    var infosTab = new Array();
    if (infos!='')
    {
      infosTab = infos.split('|');
      if(infosTab.length==3)
      {
        content += "<div class='velo_plus'>";
        var libelle = infosTab[0].split(' - ');
        content += "<div><strong>Station "+libelle[0]+"</strong></div>";
        content += "<div>Bornes disponibles : "+infosTab[1]+"</div>";
        if(infosTab[2]=='1')
          content +="<div>Terminal de paiement : oui</div>";
        else if (infosTab[2]=='0')
          content += "<div>Terminal de paiement : non</div>";
        content += "</div>";
      }
    }
    return content;
  },

  GetInfoWindowMarker: function(marker,infos)
  {
    marker.openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.VeloInfoWindowContentBuilder(infos));
  },

  GetInfoWindowSite: function(externalCode,mapObj,marker){
    $.getJSON(urlSite+"/InfoWindow/maker",{SiteExternalCode:externalCode, showSearchLinks: iMap.showSearchLinks},function(data){
      marker.openExtInfoWindow(mapObj,"custom_info_window",data);
    });
  },

  GetInfoWindowSiteSearch: function(externalCode,mapObj,marker){

    if(marker != null && externalCode != null)
    {
      var latlng = marker.getPoint();
      var lat = latlng.lat();
      var lon = latlng.lng();
      var point = new GLatLng(lat,lon);
      if((typeof(cfg)!='undefined') && (cfg.getValue('Map') != false) && (cfg.getValue('Map').getValue('coordType') != false)) {
        var CoordIn = cfg.getValue('Map').getValue('coordType');
      }
      else
      {
        var CoordIn = 'LAMB2';
      }
      var dest = new Proj4js.Proj(CoordIn);
      var source = new Proj4js.Proj('WGS84');
      var p = new Proj4js.Point(parseFloat(lon),parseFloat(lat));
      Proj4js.transform(source, dest, p);
      var codePoint = p.x+"-"+p.y;

      $.getJSON(urlSite+"/InfoWindow/maker",{SiteExternalCode:externalCode,Output:"json", showSearchLinks: iMap.showSearchLinks},
        function(data)
        {
          if(typeof(data) != 'object' || data.status == 'false' || data == null)
          {
            iMap.manager['error'].setLatLng(point);
            iMap.manager['error'].show();
            iMap.manager['error'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival([],'error','','',codePoint));
          }
          else
          {
             var Name = data.Name;
             var CName= data.City.Name;

             var iTp = new oTp();
             var cityName = iTp.htmlentities(CName);
            var adresse = iTp.htmlentities(Name);

            iMap.manager['error'].hide();


            if($('#DepartureCityName').attr('rel') == 0 && $('#DestinationCityName').attr('rel') == 0 )
            {
              tab = new Array('Departure','wayPoint','Destination');

              iMap.manager['X1'].setLatLng(point);
              iMap.manager['X1'].show();
              iMap.manager['X1'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'X1',adresse,cityName,codePoint));
            }
            else if($('#DepartureCityName').attr('rel') != 0 ^ $('#DestinationCityName').attr('rel') != 0 )
            {
              if($('#DepatureCityName').attr('rel') != 0)
                tab = new Array('wayPoint','Destination');
              if($('#DestinationCityName').attr('rel') != 0)
                tab = new Array('Departure','wayPoint');

              if(iMap.manager['X1'].isHidden())
              {
                iMap.manager['X1'].setLatLng(point);
                iMap.manager['X1'].show();
                iMap.manager['X1'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'X1',adresse,cityName,codePoint));
              }
              else
              {
                iMap.manager['X2'].setLatLng(point);
                iMap.manager['X2'].show();
                iMap.manager['X2'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'X2',adresse,cityName,codePoint));
              }
            }
            else if($('#wayPointCityName').attr('rel') == 0)
            {
              tab = new Array('wayPoint');

              iMap.manager['Xi'].setLatLng(point);
              iMap.manager['Xi'].show();
              iMap.manager['Xi'].openExtInfoWindow(iMap.gmap,"custom_info_window",iMap.InfoContentBuilderDepartureArrival(tab,'Xi',adresse,cityName,codePoint));
            }
          }
        },'json'
      );
    }
  },

  BindInfoWindowCustom: function(marker,content)
  {
    var mapObj = iMap.gmap;
    GEvent.addListener(marker, 'click', function(event){
            marker.openExtInfoWindow(mapObj,"custom_info_window",content);
            //mapObj.setCenter(new GLatLng(event.y,event.x));
          });

  },

  CloseAllExtInfoWindow: function(manager) {
    for(var i = 0 ; i < manager.length ; i ++) {
      manager[i].closeExtInfoWindow(this.gmap);
    }
  },

  /* MODULE : A PROXIMITE DE */
  /* Affiches les markers à proximité du point recherché */
  DrawProximityMarker: function(coordJsTab, option)
  {
    var indice = 1;
    var i = '';
    for(i in coordJsTab) {
      if(i == 'in_array') continue;
      if(option != null) {
        if(i == 'current') {
          var marker = iMap.DrawSingleMarker(coordJsTab[i][0], coordJsTab[i][1], i, "", option);
        } else {
          var marker = iMap.DrawSingleMarker(coordJsTab[i][0], coordJsTab[i][1], i, indice, option);
        }

        iMap.markerAllZoom.push(marker);
        if(i == 'current') {
          iMap.MapCenter(parseFloat(coordJsTab[i][0]), parseFloat(coordJsTab[i][1]), 15);
        } else {
          indice++;
        }
      }
    }
    iMap.mgr.addMarkers(iMap.markerAllZoom,1,17);
    iMap.mgr.refresh();
  },

  /* Créer et affiche un marker */
  DrawSingleMarker:function(x, y, extCode, indice, option)
  {
    if((typeof(cfg)!='undefined') && (cfg.getValue('Map') != false) && (cfg.getValue('Map').getValue('coordType') != false)) {
      var CoordIn = cfg.getValue('Map').getValue('coordType');
    }
    else
    {
      var CoordIn = 'LAMB2';
    }
    var source = new Proj4js.Proj(CoordIn);
    var dest = new Proj4js.Proj('WGS84');
    var p = new Proj4js.Point(parseFloat(x),parseFloat(y));
    Proj4js.transform(source, dest, p);
    var point 	   	   = new GLatLng(p.y, p.x);

    myIcon = new GIcon();
    if(option != null) {
      option['textValue'] = indice;
      if(indice > 9 && option['delta'] != null) {
        option['textX'] = option['delta'];
      }
      myIcon.image = this.GetUrlPictoMaker(option);
      myIcon.iconSize = new GSize(parseInt(option['imgWidth'], 10), parseInt(option['imgHeight'], 10));
      myIcon.iconAnchor = new GPoint(0,0);
      myIcon.infoWindowAnchor = new GPoint(0,0);
    }

    var marker = new GMarker(point,{icon:myIcon,clickable:false});
    marker.codeext = extCode;

    return marker;
  },

  /* FEUILLE DE ROUTE DETAILS ITINERAIRE */
  /* Organise les markers custom avec markermanagers */
  DrawMarkerStopArea: function(detailMarker, tabToAdd, indice, option, PMRSearch)
  {
    var urlPictos = urlImage + 'pictos/';

    var tab = detailMarker.split('=>');
    var type = tab[0];
    var cx   = tab[2];
    var cy   = tab[1];

    var point = new GLatLng(cx,cy);
    var icon = new GIcon();
      icon.image = this.GetImageUrl(type.toLowerCase());

    /* --- Gestion du Picto dynamique --- */
    if(indice != null && type != 'departure' && type != 'arrival') {
      var opt = new Array();
      if(tabToAdd == 'zoom') {
        opt['imgUrl'] = "http://" + location.hostname + icon.image;
        if(option['textX'] != null) opt['textX'] = option['textX'];
        if(option['textY'] != null) opt['textY'] = option['textY'];
        if(option['textColor'] != null) opt['textColor'] = option['textColor'];
        if(option['textContour'] != null) opt['textContour'] = option['textContour'];
        if(option['textContourColor'] != null) opt['textContourColor'] = option['textContourColor'];
        if(option['textSize'] != null) opt['textSize'] = option['textSize'];
      }
        opt['textValue'] = indice;
      icon.image = this.GetUrlPictoMaker(opt);
    }
    icon = this.SetIcon(icon,type.toLowerCase());
    var marker = new GMarker(point,{icon:icon});

    this.bounds.extend(point);

    if(tabToAdd == "zoom" && type != "correspondance")
    {
      iMap.markerZoom.push(marker);
    }
    else if(tabToAdd == "unzoom")
    {
      iMap.markerUnZoom.push(marker);
    }
    else if(tabToAdd == "allzoom")
    {
      iMap.markerAllZoom.push(marker);
    }
  },

  /* encode les polylines */
  DrawPolylines: function(detailPolyline)
  {
    var tab = detailPolyline.split('=>');

    if(typeof(tab[4]) == "undefined") {
      tab[4] = "";
    }

    var num = parseInt(tab[0]);
    var type = tab[1];
    var cx = parseFloat(tab[3]);
    var cy = parseFloat(tab[2]);
    var isInItinerary = tab[4];

    if(iMap.polylineManager[num] == null || iMap.polylineManager[num] == undefined || iMap.polylineManager[num] == false)
    {
      iMap.polylineManager[num] = new Array();
    }

    if(isInItinerary == "iti" && type!="voiture" && type!="velo" && type!="vls") {
      type = "pieton-avion";
    }

    iMap.polylineManager[num].push(new GLatLng(cx,cy));
    iMap.polylineInfo[num] = type;

    // équivalent détaillé de polylineInfo avec possibilité d'ajouter des données
    iMap.polylineDetails[num] = {
      'type': type,
      'iti': (tab[4] == 'iti')
    };
  },

  /* affiche les markers et les polylines */
  DrawResult: function()
  {
    var couleur;

    iMap.mgr.addMarkers(iMap.markerZoom,14,17);
    iMap.mgr.addMarkers(iMap.markerUnZoom,1,13);
    iMap.mgr.addMarkers(iMap.markerAllZoom,1,17);
    iMap.mgr.refresh();

    var polylineEncoder = new PolylineEncoder();
    var j = 0;
    for(var i in iMap.polylineManager)
    {
      j = parseInt(i);
      if(typeof(j) == 'number' && j >= 0 && typeof(iMap.polylineManager[i]) != 'undefined') {
        if(iMap.polylineManager[i].length>1)
        {
          var polyReturn = polylineEncoder.dpEncode(iMap.polylineManager[i]);

          couleur = this.GetModeColor(iMap.polylineInfo[i].toLowerCase());
          opacity = 1;

          switch(iMap.polylineInfo[i].toLowerCase()) {
            case 'pieton':
            case 'pieton-avion':
              // On cache les tracés à pied, vélo ou voiture en "vol d'oiseau" (iti == true)
              // car doublon avec les street network de ces trajets.
              if(iMap.polylineDetails[i].iti == true) {
                opacity = 0;
              }
            break;
            default:
              opacity = 1;
            break;
          }

          iMap.polylineContener[i] = new GPolyline.fromEncoded({
            color:couleur,
            weight: 3,
            opacity: opacity,
            points: polyReturn.encodedPoints,
            levels: polyReturn.encodedLevels,
            zoomFactor: 2,
            numLevels: 18
          });

          iMap.gmap.addOverlay(iMap.polylineContener[i]);
        }
      }
    }
  },

  /* bind une infobulle a un marker */
  BindMarkerInfoWindow: function(detailMarker,opt)
  {
    var tab = detailMarker.split('=>');
    var indice = parseInt(tab[0]);
    var text = tab[1];

    if(opt == 'zoom') {
      iMap.BindInfoWindowCustom(iMap.markerZoom[indice],text);
    }
    else if(opt == 'allzoom') {
      iMap.BindInfoWindowCustom(iMap.markerAllZoom[indice],text);
    }
    else {
      iMap.BindInfoWindowCustom(iMap.markerUnZoom[indice],text);
    }
  },

  DrawMarkerCity: function(key, option)
  {
    var mapObj  = iMap.gmap;
    var pMarker = new GIcon();
      pMarker.iconSize = new GSize(iMap.pMarkerCityWidth,iMap.pMarkerCityHeight);
      pMarker.iconAnchor = new GPoint(iMap.pMarkerCityWidth/2,iMap.pMarkerCityHeight/2);
      pMarker.infoWindowAnchor = new GPoint(iMap.pMarkerCityWidth/2,iMap.pMarkerCityHeight/2);

    iMap.egeoxmlManager[key] = new EGeoXml(key ,mapObj,[urlSite + "/route/vueMap?&output=1&options="+ option['optionAjaxCall']],{baseicon:pMarker,nozoom:true,noshadow:true,preloadimages:true,addmarker:function(){}});
    iMap.egeoxmlManager[key].parse();

    if(typeof(iMap.egeoxmlManager[key]) != 'undefined') {
      var eventListener=GEvent.addListener(iMap.egeoxmlManager[key], "parsed", function(){
          var cMarker = new GIcon();
          cMarker.image = iMap.cMarkerCityImg;
          cMarker.iconSize = new GSize(iMap.cMarkerCityWidth, iMap.cMarkerCityHeight);
          cMarker.iconAnchor = new GPoint(iMap.cMarkerCityWidth/2, iMap.cMarkerCityHeight/2);
          iMap.clusterManager[key] = new ClusterMarker(mapObj, {markers:iMap.egeoxmlManager[key].gmarkers,gridSize:1000,clusterMarkerIcon:cMarker});
          $(iMap.clusterManager[key]._mapMarkers).each(function(i,marker){
            marker.iconcluster = cMarker;

            GEvent.addListener(marker, "click", function(){
              var cityName = marker.codeext.trim();
                iMap.InitClusterCityMarkerListener(marker,cityName);
              iMap.gmap.setCenter(marker.getLatLng(), 14);
            });
          });

          iMap.clusterManager[key].refresh();
        }
      );
        }
  },

  DrawMarkerSite: function(key, option)
  {
    var mapObj  = iMap.gmap;

    var pMarker = new GIcon();
    pMarker.iconSize = new GSize(iMap.pMarkerSiteWidth, iMap.pMarkerSiteHeight);
    pMarker.iconAnchor = new GPoint(iMap.pMarkerSiteWidth/2, iMap.pMarkerSiteHeight/2);
    pMarker.infoWindowAnchor = new GPoint(iMap.pMarkerSiteWidth/2, iMap.pMarkerSiteHeight/2);

    iMap.egeoxmlManager[key] = new EGeoXml('exmlSite' + key ,mapObj,[urlSite + "/route/vueMap?&output=1&options="+ option['optionAjaxCall']],{baseicon:pMarker,nozoom:true,noshadow:true,preloadimages:true,addmarker:function(){}});
    iMap.egeoxmlManager[key].parse();

    if(typeof(iMap.egeoxmlManager[key]) != 'undefined') {
      var eventListener=GEvent.addListener(iMap.egeoxmlManager[key], "parsed", function(){
        var cMarkerSite = new GIcon();
          cMarkerSite.image= option['urlClusterImage'];
          cMarkerSite.iconSize=new GSize(iMap.cMarkerSiteWidth, iMap.cMarkerSiteHeight);
          cMarkerSite.iconAnchor=new GPoint(iMap.cMarkerSiteWidth/2, iMap.cMarkerSiteHeight/2);
          iMap.clusterManager[key] = new ClusterMarker(mapObj, {markers:iMap.egeoxmlManager[key].gmarkers,gridSize:1000,clusterMarkerIcon:cMarkerSite, optCluster:option['optCluster']});
          iMap.clusterManager[key].refresh();
          $(iMap.clusterManager[key]._mapMarkers).each(function(i,marker){
            marker.iconcluster = cMarkerSite;

            GEvent.addListener(marker, "click", function(){
              var ExternalCode = marker.codeext;

              if(option.Output == "json")
                  iMap.GetInfoWindowSiteSearch(ExternalCode,mapObj,marker);
                else
                  iMap.GetInfoWindowSite(ExternalCode,mapObj,marker);
            });

            if(option['externalCode'] != null && option['externalCode'] != ''
              && option['externalCode'] == marker.codeext) {
              iMap.gmap.setCenter(marker.getLatLng());
              iMap.GetInfoWindowSite(marker.codeext, mapObj, marker);
            }
          });

          if(option['hideCluster'] != null && option['hideCluster'] == true)
            iMap.clusterManager[key].hideAllMarkers();
        }
      );
        }
  },

  DrawKmlFavorites: function(key, option) {
    var mapObj = iMap.gmap;
    var pMarker = new GIcon();
      pMarker.iconSize = new GSize(iMap.pMarkerFavWidth, iMap.pMarkerFavHeight);
      pMarker.iconAnchor = new GPoint(iMap.pMarkerFavWidth /2, iMap.pMarkerFavHeight / 2);
      pMarker.infoWindowAnchor = new GPoint(iMap.pMarkerFavWidth / 2, iMap.pMarkerFavHeight / 2);

    iMap.egeoxmlManager[key] = new EGeoXml('exml' + key ,mapObj,[urlSite + "/cu/favorite?action=kml&ajax=true"],{baseicon:pMarker,nozoom:true,noshadow:true,preloadimages:true,addmarker:function(){}});
    iMap.egeoxmlManager[key].parse();

    if(typeof(iMap.egeoxmlManager[key]) != 'undefined')
    {
      var eventListener=GEvent.addListener(iMap.egeoxmlManager[key], "parsed", function(){
        var cMarker = new GIcon();
          cMarker.image = option['urlClusterImage'];
          cMarker.iconSize = new GSize(iMap.cMarkerFavWidth, iMap.cMarkerFavHeight);
          cMarker.iconAnchor = new GPoint(iMap.cMarkerFavWidth/2, iMap.cMarkerFavHeight/2);
          iMap.clusterManager[key] = new ClusterMarker(mapObj, {markers:iMap.egeoxmlManager[key].gmarkers,gridSize:200,clusterMarkerIcon:cMarker});

          $(iMap.clusterManager[key]._mapMarkers).each(function(i,marker){
            marker.iconcluster = cMarker;

            GEvent.addListener(marker, "click", function(){
              var data = new Array();
                data['id'] = key;
              var descTab = marker.codeext.split('|');
              if(descTab.length >= 2) {
                data['externalCode'] = descTab[1];
                var favType = descTab[0];
                if(favType == '0') {

                  if(iMap.modePlanOnClick == 'choosestop') {
                    iMap.InitClusterMarkerListener(marker,data['externalCode']);
                  } else if(iMap.modePlanOnClick == 'chooseline') {
                    iMap.GetInfoWindowPlanExtended(data, marker);
                  } else if (iMap.modePlanOnClick == 'filtreline') {
                    iMap.OnClickStopArea(data, marker);
                  } else if (iMap.modePlanOnClick == 'classic'){
                    iMap.GetInfoWindowPlanExtended(data, marker);
                    iMap.DrawKmlPolylines(data);
                  } else {
                     iMap.GetInfoWindowPlan(data['externalCode'],marker);
                     iMap.DrawKmlPolylines(data);
                  }
                } else if(favType == '2') {
                  var mapObj  = iMap.gmap;
                  if(option.Output == "json")
                      iMap.GetInfoWindowSiteSearch(data['externalCode'],mapObj,marker);
                    else
                      iMap.GetInfoWindowSite(data['externalCode'],mapObj,marker);
                }
              }
            });
          });

          iMap.clusterManager[key].refresh();

          if(option['hideCluster'] != null && option['hideCluster'] == true)
            iMap.clusterManager[key].hideAllMarkers();
          if(option['externalCode'] != null && option['externalCode'] != '')
            iMap.GetAndOpenInfoWindow(key, option);
        }
      );
    }
  },

  DrawKmlStopAreas: function(key, option) {
    var mapObj = iMap.gmap;
    var pMarker = new GIcon();
      pMarker.iconSize = new GSize(iMap.pMarkerWidth, iMap.pMarkerHeight);
      pMarker.iconAnchor = new GPoint(iMap.pMarkerWidth /2, iMap.pMarkerHeight / 2);
      pMarker.infoWindowAnchor = new GPoint(iMap.pMarkerWidth / 2, iMap.pMarkerHeight / 2);

    iMap.egeoxmlManager[key] = new EGeoXml('exml' + key ,mapObj,[urlSite + "/route/vueMap?&output=1&options=" + option['optionAjaxCall']],{baseicon:pMarker,nozoom:true,noshadow:true,preloadimages:true,addmarker:function(){}});
    iMap.egeoxmlManager[key].parse();

    if(typeof(iMap.egeoxmlManager[key]) != 'undefined')
    {
      var eventListener=GEvent.addListener(iMap.egeoxmlManager[key], "parsed", function(){
        var cMarker = new GIcon();
          cMarker.image = option['urlClusterImage'];
          cMarker.iconSize = new GSize(iMap.cMarkerWidth, iMap.cMarkerHeight);
          cMarker.iconAnchor = new GPoint(iMap.cMarkerWidth/2, iMap.cMarkerHeight/2);
          iMap.clusterManager[key] = new ClusterMarker(mapObj, {markers:iMap.egeoxmlManager[key].gmarkers,gridSize:200,clusterMarkerIcon:cMarker});
          //iMap.MapCenter(mapCenterX,mapCenterY,mapCenterZ);

          $(iMap.clusterManager[key]._mapMarkers).each(function(i,marker){
            marker.iconcluster = cMarker;

            GEvent.addListener(marker, "click", function(){
              var data = new Array();
              data['id'] = key;
              data['externalCode']= marker.codeext;
              if(iMap.modePlanOnClick == 'choosestop') {
                iMap.InitClusterMarkerListener(marker,data['externalCode']);
              } else if(iMap.modePlanOnClick == 'chooseline') {
                iMap.GetInfoWindowPlanExtended(data, marker);
              } else if (iMap.modePlanOnClick == 'filtreline') {
                iMap.OnClickStopArea(data, marker);
              } else if (iMap.modePlanOnClick == 'classic'){
                iMap.GetInfoWindowPlanExtended(data, marker);
                iMap.DrawKmlPolylines(data);
              } else {
                 iMap.GetInfoWindowPlan(data['externalCode'],marker);
                 iMap.DrawKmlPolylines(data);
              }
            });
          });

          iMap.clusterManager[key].refresh();

          if(option['hideCluster'] != null && option['hideCluster'] == true)
            iMap.clusterManager[key].hideAllMarkers();
          if(option['externalCode'] != null && option['externalCode'] != '') {
            if(iMap.noInfoWindow != true) {
              iMap.GetAndOpenInfoWindow(key, option);
            }
          }
        }
      );
    }
  },

  DrawKmlHybride: function(key, option) {
    var mapObj = iMap.gmap;
    var pMarker = new GIcon();
    pMarker.iconSize = new GSize(iMap.pMarkerWidth, iMap.pMarkerHeight);
    pMarker.iconAnchor = new GPoint(iMap.pMarkerWidth /2, iMap.pMarkerHeight / 2);
    pMarker.infoWindowAnchor = new GPoint(iMap.pMarkerWidth / 2, iMap.pMarkerHeight / 2);
    if(cfg.getValue('ModeColor').getValue('nobackgroundcolor') == 'true') {
      var nobackgroundvalue = true;
    } else {
      var nobackgroundvalue = false;
    }
    iMap.egeoxmlManager[key] = new EGeoXml(key , mapObj, [urlSite + "/route/vueMap?&output=1&options=" + option['optionAjaxCall']],{baseicon:pMarker,nozoom:true,noshadow:true,nobackground:nobackgroundvalue,preloadimages:true});
    iMap.egeoxmlManager[key].parse();
    if(typeof(iMap.egeoxmlManager[key]) != 'undefined')
    {
      var eventListener=GEvent.addListener(iMap.egeoxmlManager[key], "parsed", function(){
        iMap.polylineManager = iMap.egeoxmlManager[key].gpolylines;
        iMap.mgr.addMarkers(iMap.egeoxmlManager[key].gmarkers, 1, 17);
        iMap.mgr.refresh();
      });
    }
  },

  GetInfoWindowPlanExtended: function(option,marker){
    var mapObj = iMap.gmap;
    $.getJSON(urlSite+"/InfoWindow/maker",{StopAreaExternalCode:option['externalCode'], showSearchLinks: iMap.showSearchLinks},function(data){
      marker.openExtInfoWindow(mapObj,"custom_info_window",data.Html);
    });
  },

  /* Recupere un template HTML pour l'infobulle + un tableau de TObjet */
  OnClickStopArea: function(option, marker) {
    var mapObj = iMap.gmap;
    var opt = option;
    $.getJSON(urlSite+"/InfoWindow/maker",{StopAreaExternalCode:option['externalCode'], showSearchLinks: iMap.showSearchLinks},function(data){
      marker.openExtInfoWindow(mapObj,"custom_info_window",data.Html);
      if(data.TObject['LineArray'].length < 4) {
        iMap.DrawKmlPolylines(opt);
      } else {
        //iMap.RemovePolylines();
        //iMap.RemoveMarkerManager();
      }
    });
  },

  /* Récupère un KML modélisant des lignes et l'affiche sur la carte */
  DrawKmlPolylines: function(option) {
    var pMarker = new GIcon();
    pMarker.iconSize = new GSize(iMap.pMarkerWidth, iMap.pMarkerHeight);
    pMarker.iconAnchor = new GPoint(iMap.pMarkerWidth /2, iMap.pMarkerHeight / 2);
    pMarker.infoWindowAnchor = new GPoint(iMap.pMarkerWidth / 2, iMap.pMarkerHeight / 2);

    var key = option['id'];
    var url = urlSite+'/route/vueMap?output=1&stopAreaExternalCode=' + option['externalCode'];
    var contenu = iMap.ClientAjaxGetXML(url);
    iMap.RemovePolylines();
    iMap.RemoveMarkerManager();
    iMap.egeoxmlPolyline[key] = new EGeoXml('exmlPolylines' + key , iMap.gmap, null , {baseicon:pMarker,nozoom:true});
    iMap.egeoxmlPolyline[key].parseString([contenu]);
    iMap.polylineManager = iMap.egeoxmlPolyline[key].gpolylines;
    iMap.mgr 		 	 = iMap.egeoxmlPolyline[key].gmarkers;
    iMap.BindMarkerManager();
  },

  GetKmlForLineExternalCode: function(lineExternalCode){
    var key = lineExternalCode;
    var url = urlSite+'/route/vueMap?&output=1&options={"requestedtype":"linelist","lineexternalcode":"'+lineExternalCode+'"}';
    var contenu = iMap.ClientAjaxGetXML(url);
    iMap.RemovePolylines();
    iMap.egeoxmlPolyline[key] = new EGeoXml('exmlPolylines' + key, iMap.gmap, null, {nozoom:true, polylineoptions:{clickable:false}});
    iMap.egeoxmlPolyline[key].parseString([contenu]);
    iMap.polylineManager = iMap.egeoxmlPolyline[key].gpolylines;
  },

  GetKmlForExternalCode: function(externalCode, externalCodeType) {
    var key = externalCode;
    var url = urlSite+'/route/vueMap?&output=1&options={"requestedtype":"linelist","' + externalCodeType + '":"' + externalCode + '"}';
    var contenu = iMap.ClientAjaxGetXML(url);
    iMap.RemovePolylines();
    iMap.egeoxmlPolyline[key] = new EGeoXml('exmlPolylines' + key, iMap.gmap, null, {nozoom:true});
    iMap.egeoxmlPolyline[key].parseString([contenu]);
    iMap.polylineManager = iMap.egeoxmlPolyline[key].gpolylines;
  },

  /* Efface les polylines */
  RemovePolylines: function()
  {
    for(var i=0;i<iMap.polylineManager.length;i++)
    {
      iMap.gmap.removeOverlay(iMap.polylineManager[i]);
    }
  },

  RemoveMarkerManager: function()
  {
    for(var i = 0; i < iMap.mgr.length; i++) {
      iMap.gmap.removeOverlay(iMap.mgr[i]);
    }
  },

  BindMarker: function(marker)
  {
    GEvent.addListener(marker, "click", function(){
      var data = new Array();
      data['externalCode']= marker.codeext;
      if(iMap.modePlanOnClick == 'choosestop') {
        iMap.InitClusterMarkerListener(marker,data['externalCode']);
      } else if(iMap.modePlanOnClick == 'chooseline') {
        iMap.GetInfoWindowPlanExtended(data, marker);
      } else if (iMap.modePlanOnClick == 'filtreline') {
        iMap.OnClickStopArea(data, marker);
      } else {
         iMap.GetInfoWindowPlan(data['externalCode'],marker);
         iMap.DrawKmlPolylines(data);
      }
    });
  },

  BindMarkerManager: function()
  {
    for(var i = 0; i < iMap.mgr.length; i++) {
      iMap.BindMarker(iMap.mgr[i]);
    }
  },

  ClientAjaxGetXML: function(url)
  {
    var contenu = $.ajax({
              type: "GET",
              async: false,
              url: url,
              success : function (data){}
              }).responseText;
    var tmp;
    for(var i = 0; i < contenu.length; i++){
      tmp = tmp + contenu.charAt(i);
      if (contenu.charAt(i) == "\n"){
        tmp = tmp.replace("\n","");
      }
    }
    contenu = tmp;
    contenu = contenu.replace("undefined","");
    return contenu;
  },

  AdaptPolylinesWeightToZoom: function(zoom)
  {
    for(var i = 0; i < iMap.polylineManager.length; i++){
      if(zoom >= 14 ){
          iMap.polylineManager[i].show();
        if(iMap.polylineManager[i].color == '#C0C0C0'){
          iMap.polylineManager[i].weight = 15;
        }else{
          if(iMap.polylineManager[i].color == '#FFFFFF'){
            iMap.polylineManager[i].weight = 10.5;
          }
          else{
            iMap.polylineManager[i].weight = 5;
          }
        }
      }
      if(zoom > 12 && zoom < 14){
          iMap.polylineManager[i].show();
        if(iMap.polylineManager[i].color == '#C0C0C0'){
          iMap.polylineManager[i].weight = 10;
        }else{
          if(iMap.polylineManager[i].color == '#FFFFFF'){
            iMap.polylineManager[i].weight = 8.5;
          }
          else{
            iMap.polylineManager[i].weight = 3;
          }
        }
      }
      if(zoom <= 12 && zoom >= 10){
        iMap.polylineManager[i].show();
        if(iMap.polylineManager[i].color == '#C0C0C0'){
          iMap.polylineManager[i].weight = 7.5;
        }else{
          if(iMap.polylineManager[i].color == '#FFFFFF'){
            iMap.polylineManager[i].weight = 5.2;
          }else{
            iMap.polylineManager[i].weight = 2;
          }
        }
      }
      if(zoom < 10){
        iMap.polylineManager[i].hide();
      }
    }
  },

  GetModeColor: function(mode)
  {
    if(cfg == null)
    {
      return false;
    }
    else if(typeof(mode) != 'string')
    {
      return false;
    }
    else
    {
      var modeColor = cfg.getValue('ModeColor');
      mode 		  = mode.toLowerCase();
      mode 		  = mode.replace(' ', '_');
      return modeColor.getValue(mode);
    }
  },

  GetImageUrl: function(type)
  {
    var urlFolder;
    if(cfg != null) {
      var folder    = cfg.getValue('ModePicto');
      if(folder != false) {
        urlFolder = folder.getValue('folder');
      } else {
        urlFolder = "pictos/";
      }
    } else {
      urlFolder = "pictos/";
    }
    var urlPicto = urlImage + urlFolder;
    var imgName;

    if(typeof(type) != 'string')
    {
      return false;
    }
    else
    {
      var typePicto = cfg.getValue('ModePicto');
      type 		  = type.toLowerCase();
      type 		  = type.replace(' ', '_');
      imgName 	  = typePicto.getValue(type);

      if(imgName == false) return false;
      return urlPicto + imgName;
    }
  },

  GetUrlPictoMaker: function(option) {
    var url = urlSite + "/Picto/maker?";
    for(var i in option) {
      if(i == 'in_array')
        continue;

      url = url + "&" + i + "=" + option[i];
    }
    return url
  },

  SetIcon: function(icon,type)
  {
    if(typeof(icon) != 'object' || typeof(type) != 'string')
    {
      return false;
    }
    else
    {
      var typePictoSize = cfg.getValue('ModePictoSize');
      type 			  = type.toLowerCase();
      type 			  = type.replace(' ', '_');

      var iconSize 		 = typePictoSize.getValue(type + 'IconSize');
      var iconAnchor 		 = typePictoSize.getValue(type + 'IconAnchor');
      var infoWindowAnchor = typePictoSize.getValue(type + 'InfoWindowAnchor');

      if(iconSize == false || iconAnchor == false || infoWindowAnchor == false) return false;

      iconSize   		 = iconSize.split(';');
      iconAnchor 		 = iconAnchor.split(';');
      infoWindowAnchor = infoWindowAnchor.split(';');

      icon.iconSize 		  = new GSize(parseInt(iconSize[0]), parseInt(iconSize[1]));
      icon.iconAnchor 	  = new GPoint(parseInt(iconAnchor[0]), parseInt(iconAnchor[1]));
      icon.infoWindowAnchor = new GPoint(parseInt(infoWindowAnchor[0]), parseInt(infoWindowAnchor[1]));

      return icon;
    }
  },

  DrawStaticPolylines: function(detailPolyline)
  {
    var tab = detailPolyline.split('=>');
    var num  = parseInt(tab[0]);
    var type = tab[1];

    var attributes 	= new Array();
      attributes['type'] = type;
      attributes['x'] = parseFloat(tab[3]);
      attributes['y'] = parseFloat(tab[2]);
      attributes['polylinecolor']	= this.GetModeColor(type);

    if(typeof(this.polylineStaticManager[num]) == 'undefined')
    {
      this.polylineStaticManager[num] = new Array();
    }

    this.polylineStaticManager[num].push(attributes);
    this.polylineStaticInfo[num] = type;
  },

  SetStaticMapOptions : function(options)
  {
    if(typeof(options) == 'object')
      this.staticMapOptions = options;
  },

  GetStaticMapOptions : function()
  {
    return this.staticMapOptions;
  },

  GetPolylineStaticManager : function()
  {
    return this.polylineStaticManager;
  },

  GetPolylineStaticInfo : function()
  {
    return this.polylineStaticInfo;
  },

  GetStaticMap: function(sectionId,options)
  {
    var mapUrl = '';
    var mapUrlOptions = '';
    var mapUrlPath = '';
    var mapUrlDep = '';
    var mapUrlArr = '';

    var bounds = new GLatLngBounds;

    if(typeof(this.polylineStaticManager[sectionId]) != 'object')
    {
      return false;
    }
    else
    {
      if(typeof(options) != 'object' || typeof(options) == 'undefined')
        var options = this.staticMapOptions;

      mapUrl = "http://maps.google.com/maps/api/staticmap?";
      mapUrlOptions = "sensor=" + options.sensor;
      mapUrlOptions += "&size=" + options.size;

      var poly = this.polylineStaticManager[sectionId];
      var countMax = (poly.length - 1);

      for(var i=0; i<=countMax; i++)
      {

        var path = '';

        if(i == 0)
        {
          mapUrlOptions += "&center=" + poly[i]['x'] + "," + poly[i]['y'];

          //mapUrlDep += "&markers=icon:" + encodeURI( urlRoot + this.GetImageUrl(poly[i]['type'].toLowerCase()) );
          mapUrlDep += "&markers=label:D";
          mapUrlDep += "|color:" + encodeURI( this.GetModeColor(poly[i]['type'].toLowerCase()).replace('#','0x') ) + "FF";
          mapUrlDep += "|shadow:" + options.shadow;
          mapUrlDep += "|" + poly[i]['x'] + "," + poly[i]['y'];

          mapUrlPath   += "&path=weight:" + options.weight;
          mapUrlPath   += "|color:" + encodeURI( this.GetModeColor(poly[i]['type'].toLowerCase()).replace('#','0x') ) + "FF";
        }
        else if(i == countMax)
        {
          mapUrlArr += "&markers=label:A";
          mapUrlArr += "|color:" + encodeURI( this.GetModeColor(poly[i]['type'].toLowerCase()).replace('#','0x') ) + "FF";
          mapUrlArr += "|" + poly[i]['x'] + "," + poly[i]['y'];
        }

        mapUrlPath += "|" + poly[i]['x'] + "," + poly[i]['y'];

        bounds.extend(new GLatLng(poly[i]['x'],poly[i]['y']));

      }

      //mapUrlOptions += "&zoom=" + this.gmap.getBoundsZoomLevel(bounds);
      mapUrlOptions += "&zoom=" + options.zoom;

      mapUrl += mapUrlOptions + mapUrlDep + mapUrlArr + mapUrlPath;

      return mapUrl;
    }
  },

  SetKmlManager: function(kmlManager){
    if( typeof(kmlManager)=='object' )
      this.kmlManager = kmlManager;
  },

  GetKmlManager: function(){
    return this.kmlManager;
  },

  InitKmlManager: function(){
        this.kmlManager = new Array();
  },

  /*
   * Ouvre l'info bulle d'un marker,
   * @var key : identifiant du tableau clusterManager contenant le marquer
   * @var opt : ensemble de variables dont 'externalCode' identifiant du marker à ouvrir et 'zoom' valeur du zoom auquel afficher l'infobulle
   */
  GetAndOpenInfoWindow: function(key, opt) {
    for(var i = 0;i < iMap.clusterManager[key]._mapMarkers.length; i++) {
      var extCode = iMap.clusterManager[key]._mapMarkers[i].codeext;
      if(extCode == opt['externalCode']) {
        if(typeof(opt['hideAllMarkers']) != 'undefined' && opt['hideAllMarkers']==true) {
          iMap.clusterManager[key].hideAllMarkers();
          iMap.clusterManager[key]._mapMarkers[i].show();
        } else {
          iMap.clusterManager[key].showAllMarkers();
        }
        if(typeof(opt['closeInfoWindow']) == 'undefined' || opt['closeInfoWindow'] != false) {
          iMap.GetInfoWindowPlanExtended(opt, iMap.clusterManager[key]._mapMarkers[i]);
        }
                iMap.gmap.setCenter(iMap.clusterManager[key]._mapMarkers[i].getLatLng());
                iMap.gmap.setZoom(opt['zoom']);
      }
    }
  },

  DrawKmlMap: function(key, option) {
    var url = iMap.kmlManager[key].path;
    iMap.kmlManager[key].geoxml = new EGeoXml('exmlPolylines' + key, iMap.gmap, url , {nozoom:true,nobackground:true});
    iMap.kmlManager[key].geoxml.parse();
  },

  LocalitySearch: function(option){

    var adressNameInputId 	= "locality-name-input";
    var cityNameInputId 	= "locality-cityname-input";
    var resultBlocId		= "bloc-result";
    var errorBlocId			= "msg_error_container";

    var mapZoom				= 16;

    var typeNameList 		= new Array();
      typeNameList['address'] = "Adresse";
      typeNameList['city'] 	= "Ville";
      typeNameList['stoparea']= "Arr\352t";
      typeNameList['site']	= "Lieu";

    var userMsgList 		= new Array();
      userMsgList['false_status']	= "Erreur technique";
      userMsgList['no_result'] 	= "Aucune adresse trouv\351e";
      userMsgList['zoom_link_title'] 	= "Cliquer pour centrer sur ";

    var oName;
    var oCityName;
    var oResBloc;
    var oErrBloc;

    var name;
    var cityName;

    var count;
    var typeList;
    var entryPointList;
    var entryPoint;

    var oResList;
    var oH;
    var oOl;
    var oLi;
    var oA;
    var oA_id;

    var typeLibelle;
    var entryPointFullName;

    if(typeof(option)=="object")
    {
      $.each(option,function(opt,value){
        switch(opt){
          case "adressNameInputId":
            if( typeof(value) == "string" )
              adressNameInputId = value;
            break;
          case "cityNameInputId":
            if( typeof(value) == "string" )
              cityNameInputId = value;
            break;
          case "resultBlocId":
            if( typeof(value) == "string" )
              resultBlocId = value;
            break;
          case "errorBlocId":
            if( typeof(value) == "string" )
              errorBlocId = value;
            break;
          case "mapZoom":
            if( typeof(value) == "number" )
              mapZoom = value;
            break;
          case "typeNameList":
            if( typeof(value) == "object" )
              typeNameList = value;
            break;
          case "userMsgList":
            if( typeof(value) == "object" )
              userMsgList = value;
            break;
          default:
            break;
        }
      });
    }

    oResBloc	= $("#"+resultBlocId);
    oErrBloc	= $("#"+errorBlocId);

    if(oResBloc.length != 0 && oErrBloc.length != 0)
    {
      oResBloc.empty().hide();
      oErrBloc.empty().addClass("hide");

      oName		= $("#"+adressNameInputId);
      oCityName 	= $("#"+cityNameInputId);

      if(oName.length != 0)
        name = oName.val().trim();
      if(oCityName.length != 0)
        cityName = oCityName.val().trim();

      if(name != '' && name != null && name != undefined || cityName != '' && cityName != null && cityname != undefined)
      {
        msw = new MswStreetNetwork();

        var params = {'name':name,'cityname':cityName};

        msw.getXYByAdress(params,function(data,param){

          if(data.status==false || data.status=="error")
          {
            oErrBloc.empty().html(userMsgList["no_result"]).removeClass("hide");
          }
          else
          {
            count 			= data.EntryPointCount;
            typeList	 	= new Array();
            entryPointList	= new Array();
            entryPoint 		= new Array();

            oResList = $(document.createElement("ul"));

            oResList = oResList.attr("id","locality-search-result");
            oResBloc.empty().append(oResList);

            for(var i=0;i<count;i++)
            {
              entryPoint = new Array();
              //entryPoint["id"]			= data[i].attr_id;
              entryPoint["name"]			= data[i].attr_entrypointname;
              entryPoint["number"]		= data[i].attr_number;
              entryPoint["typename"]		= data[i].attr_typename;
              entryPoint["type"]			= (data[i].attr_entrypointtype).toLowerCase();
              //entryPoint["responsequality"]= data[i].attr_entrypointresponsequality;
              entryPoint["cityname"]		= data[i].attr_cityname;
              entryPoint["citycode"]		= data[i].attr_citycode;
              //entryPoint["externalcode"]	= data[i].attr_entrypointexternalcode;
              //entryPoint["entrypointidx"]	= data[i].attr_entrypointidx;
              //entryPoint["entrypointid"]	= data[i].attr_entrypointid;
              entryPoint["coordx"]		= parseFloat(data[i].attr_coordx.replace('\,','\.'));
              entryPoint["coordy"]		= parseFloat(data[i].attr_coordy.replace('\,','\.'));
              entryPoint["wgs_coordx"]	= data[i].attr_wgs_coordx;
              entryPoint["wgs_coordy"]	= data[i].attr_wgs_coordy;
              entryPointList[i]=entryPoint;

              oOl = $("#locality-search-result-"+entryPoint["type"]);

              if(typeNameList[entryPoint["type"]] == undefined)
                typeLibelle = entryPoint["type"];
              else
                typeLibelle = typeNameList[entryPoint["type"]];

              if(oOl.length == 0)
              {
                oH 	= $(document.createElement("H2")).text(typeLibelle);
                oOl = $(document.createElement("Ol")).attr('id',"locality-search-result-"+entryPoint["type"]);
                oResList.append(oH);
                oResList.append(oOl);
              }

              entryPointFullName = "";
              if(entryPoint["typename"]!="null")
              {
                if(entryPoint["number"]!="null")
                  entryPointFullName += entryPoint["number"]+" ";
                entryPointFullName += entryPoint["typename"]+" ";
              }
              if(entryPoint["name"]!="null")
                entryPointFullName += entryPoint["name"];
              if(entryPoint["cityname"]!="null")
                entryPointFullName += ", "+entryPoint["cityname"];
              if(entryPoint["citycode"]!="null")
                entryPointFullName += " ("+entryPoint["citycode"]+")";

              oLi = $(document.createElement("li"));
              oA_id = "locality-search-result-point-"+i;
              oA = $(document.createElement("a")).
                    attr("id",oA_id).
                    html(entryPointFullName).
                    attr("title",userMsgList["zoom_link_title"]+entryPointFullName).
                    attr("onclick","javascript:mapFull.MapCenter("+entryPoint["coordx"]+","+entryPoint["coordy"]+","+mapZoom+");return false;");
              oLi.append(oA);
              oOl.append(oLi);

            }

            oResBloc.show("fast");
          }
        },"json");
      }
    }
  },

  GetStaticMapLine: function(stopList,option)
  {
    var bounds = new GLatLngBounds;

    var urlStaticMap = 'http://maps.google.com/maps/api/staticmap?';
      urlStaticMap += 'sensor=' + this.staticMapOptions.sensor;
      urlStaticMap += '&size=' + this.staticMapOptions.size;

    if(typeof(stopList) != "undefined")
    {
      var count = 1;
      var maxCount = stopList.length;
      var linePath = '';
      var lineColor = "0x000000";
      if(typeof(option.lineColor) != 'undefined')
        lineColor = option.lineColor.replace('#','0x');
      var staticMarker = '';

      $.each(stopList,function(i,item) {
        if( typeof(item.coordX) != 'undefined' && typeof(item.coordY) != 'undefined' ) {

          var pf_LamberX = item.coordX.replace(/,/,'.');
          var pf_LamberY = item.coordY.replace(/,/,'.');
          if((typeof(cfg)!='undefined') && (cfg.getValue('Map') != false) && (cfg.getValue('Map').getValue('coordType') != false)) {
            var CoordIn = cfg.getValue('Map').getValue('coordType');
          }
          else
          {
            var CoordIn = 'LAMB2';
          }
          var source = new Proj4js.Proj(CoordIn);
          var dest = new Proj4js.Proj('WGS84');
          var p = new Proj4js.Point(parseFloat(pf_LamberX),parseFloat(pf_LamberY));
          Proj4js.transform(source, dest, p);

          //urlRoot tmp à supprimer
          urlRoot = "http://ezp.sim.canaltp.fr";

          if(count==1)
            staticMarker += '&markers=icon:' + urlRoot + option.urlDepPicto;
          else if(count==maxCount)
            staticMarker += '&markers=icon:' + urlRoot + option.urlArrPicto;
          /*else
            staticMarker += '&markers=icon:' + urlRoot + option.urlStopPicto;*/

          staticMarker += '|' + p.y.toString() + ',' + p.x.toString();

          linePath += '|' + p.y.toString() + ',' + p.x.toString();

          bounds.extend(new GLatLng(p.y,p.x));

          count++;
        }
      });
    }

    if(typeof(option.drawMarker)!='undefined' && option.drawMarker == true)	{
      urlStaticMap += staticMarker;
    }

    if(typeof(option.drawLine)!='undefined' && option.drawLine == true)	{
      urlStaticMap += '&path=weight:' + this.staticMapOptions.weight + '|color:' + lineColor +  linePath;
    }

    if(maxCount==0) {
      urlStaticMap += '&center=' + this.gmap.getCenter().lat().toString() + ',' + this.gmap.getCenter().lng().toString();
      urlStaticMap += '&zoom=7';
    } else {
      urlStaticMap += '&zoom=' + this.staticMapOptions.zoom;
    }

    //urlStaticMap += '&center=' + this.bounds.getCenter().lat().toString() + ',' + this.bounds.getCenter().lng().toString();

    return urlStaticMap;
  },

  addSimpleMarker: function(marker,option) {

    if( typeof(marker)=='undefined' || typeof(marker) != 'object' ) {
      if(typeof(option) != 'undefined' && typeof(option.coordX) != 'undefined' && typeof(option.coordY) != 'undefined' ) {
        var x = option.coordX;
        var y = option.coordY;
        if((typeof(cfg)!='undefined') && (cfg.getValue('Map') != false) && (cfg.getValue('Map').getValue('coordType') != false)) {
          var CoordIn = cfg.getValue('Map').getValue('coordType');
        }
        else
        {
          var CoordIn = 'LAMB2';
        }
        var source = new Proj4js.Proj(CoordIn);
        var dest = new Proj4js.Proj('WGS84');
        var p = new Proj4js.Point(parseFloat(x),parseFloat(y));
        Proj4js.transform(source, dest, p);
        var point = new GLatLng(p.x, p.y);
        var myIcon = new GIcon();
        var imgWidth = 20;
        var imgHeight = 20;
        var anchorWidth = 10;
        var anchorHeight = 20;
        if(typeof(option.imgWidth) != 'undefined' && typeof(option.imgHeight) != 'undefined') {
          imgWidth = parseInt(option.imgWidth, 10);
          imgHeight = parseInt(option.imgHeight, 10);
        }
        if(typeof(option.anchorWidth) != 'undefined' && typeof(option.anchorHeight) != 'undefined') {
          anchorWidth = parseInt(option.anchorWidth, 10);
          anchorHeight = parseInt(option.anchorHeight, 10);
        }
        if(typeof(option.img) != 'undefined')
          myIcon.image = option.img
        myIcon.iconSize = new GSize(imgWidth, imgHeight);
        myIcon.iconAnchor = new GPoint(anchorWidth,anchorHeight);
        myIcon.infoWindowAnchor = new GPoint(0,0);
      }

      var marker = new GMarker(point,{icon:myIcon,clickable:false});
    }

    iMap.gmap.addOverlay(marker);

    return true;
  }
});
