//version 3.02 du 30/04/09
//gérer un zoom par défaut
//gérer un zoom forcé
var map     = null;
var dir     = null;
var cluster =  null;

var markers =  new Array();
var markers_mgr   =  new Array;
var icons	=	new Array;
var markersListByCat=new Array();

var paramcarte;
var gmaplang   ='fr';

var default_cat = {titre:"Pas de cat",icone:""};

var computedbounds=null;
var computedcenter=null;

var urlflux;

var debug   =  false;
var debug_msg= new Array();

var cluster_mode=true;

var xmlResultText=null;

//#OPTIONS

function initMap()
{
   if (GBrowserIsCompatible())
   {
      map = new GMap2(document.getElementById("map"));
      loadMarkers();
   }
}

function enableClustering(){cluster_mode=true;}
function disableClustering(){cluster_mode=false;}

function setMapFlux(url)
{
   urlflux=url;
   addDebugInfo("INFO","setMapFlux() - Modification de l'url : "+url);
}

function setLang(lang)
{
   gmaplang=lang;
   addDebugInfo("INFO","setLang() Modification de la langue : "+lang);
}

function setIconsList()
{
	var icones     =  $("icone",xmlResultText);

	markersListByCat[0]={titre:default_cat.titre,icone:default_cat.icone,id:0,points:new Array()};
	
	$(icones).each(function()
      {
	    var i=new GIcon();
	    i.image=$(this).attr('icone');
	    i.iconeSize=new GSize($(this).attr('iconew'),$(this).attr('iconeh'));
	    i.iconAnchor = new GPoint(16,16);
		i.infoWindowAnchor = new GPoint(16,16);
        icons[$(this).attr('id')]={GMGIcon:i,titre:$(this).attr('libelle')};
        markersListByCat[markersListByCat.length]={titre:$(this).attr('libelle'),icone:$(this).attr('icone'),id:$(this).attr('id'),points:new Array()};
      });
}

function getListeMarkersByCat(){return markersListByCat;}

function setXMLResult(text){xmlResultText=text;}

function loadMarkers()
{
	setXMLResult(null);
   $.ajax({type: "GET",async:false,url: urlflux,success: function(xml)
   {
	  setXMLResult(xml);
	  setIconsList()

      var listem     =  $("marker",xml);
      addDebugInfo("INFO","loadMarkers() - Chargement du flux terminé : "+listem.length+" points");
      paramcarte     =  $("param",xml);
      manageParam()

      var temp_computedbounds =  $("bounds",xml);
      computedbounds =  new GLatLngBounds(new GLatLng(parseFloat(temp_computedbounds.attr('minlat')),parseFloat(temp_computedbounds.attr('minlng'))),new GLatLng(parseFloat(temp_computedbounds.attr('maxlat')),parseFloat(temp_computedbounds.attr('maxlng'))));

      var temp_computedcenter =  $("center",xml);
      computedcenter =  new GLatLng(parseFloat(temp_computedcenter.attr('lat')),parseFloat(temp_computedcenter.attr('lng')))


      map.setCenter(computedcenter,13);

      $(listem).each(function()
      {
         var temp_point=new GLatLng(parseFloat($(this).attr('lat')),parseFloat($(this).attr('lng')));

         addMarker({point:temp_point,titre:$(this).attr('titre'),html:$(this).text(),icone:$(this).attr('icon')});
      });

      cluster=new ClusterMarker(map, { markers:markers_mgr } );
      if(cluster_mode)cluster.clusteringEnabled=true;else cluster.clusteringEnabled=false;
      cluster.fitMapToMarkers();
      cluster.refresh();

      map.setZoom(map.getBoundsZoomLevel(computedbounds));
     
   }})
}

function manageParam()
{
   if(paramcarte.attr('map_controls')==1)
   {
      addDebugInfo("INFO","manageParam() - Affichage du controle : "+paramcarte.attr('control_size'));
      switch(paramcarte.attr('control_size'))
      {
         case "small":  map.addControl(new GSmallMapControl());break;
         case "large": map.addControl(new GLargeMapControl());break;
      }
   }

   if(paramcarte.attr('overview')!="")
   {
      addDebugInfo("INFO","manageParam() - Affichage du overview : "+paramcarte.attr('overview'));
      taille=paramcarte.attr('overview').split(",")
      map.addControl(new GOverviewMapControl(new GSize(taille[0],taille[1])));
   }

   if(paramcarte.attr('type_controls')==1)
   {
      addDebugInfo("INFO","manageParam() - Affichage du controle de type de carte");
      map.addControl(new GMapTypeControl());
   }

   if(paramcarte.attr('zoomwheel')==1)map.enableScrollWheelZoom();else map.disableScrollWheelZoom();

   // Gestion du zoom avec double-clic
   if(paramcarte.attr('dblclick_zoom')==1)map.enableDoubleClickZoom();

   // Gestion du zoom continu
   if(paramcarte.attr('continuousZoom')==1)map.enableContinuousZoom();
}

function addMarkerToCat(m)
{
	for(i=0;i < markersListByCat.length;i++)
	{
		if(markersListByCat[i].id == m.icone)
		{
			markersListByCat[i].points[markersListByCat[i].points.length]=	{titre:m.titre,id:markers.length-1};
		}	
	}	
}

function addMarker(m)
{
	if(m.icone != null)
	{
		var marker  = new GMarker(m.point,{icon:icons[m.icone].GMGIcon});
		
	}
	else
	{
   		var marker  = new GMarker(m.point);
	}

   GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(m.html); });
   markers[markers.length]= {point:marker,html:m.html,titre:m.titre};
   markers_mgr[markers_mgr.length]=marker;
   addMarkerToCat(m);
   //map.addOverlay(marker);
}

function openInfoWindow(id)
{
	markers_mgr[id].openInfoWindowHtml(markers[id].html);	
}

function removeMarkers()
{
   map.clearOverlays();
   markers =  new Array();
   addDebugInfo("INFO","removeMarkers() - Suppression de tous les markers");
}

function removeMarkerById(id)
{

}

function removeMarkerByIndex(i)
{
   var marker=markers[i].point;
   marker.remove();
   markers=(i>markers.length)?false:(markers.slice(0,i).concat(markers.slice(i+1,markers.length)));
   addDebugInfo("INFO","removeMarkerByIndex() - Suppression du "+i+" ène marker");
}

function hideMarkerById(i)
{
   markers[i].point.hide();
   addDebugInfo("INFO","hideMarkerByIndex() - Masquage du "+i+" ène marker");
}

function showMarkerById(i)
{
   markers[i].point.show();
   addDebugInfo("INFO","showMarkerByIndex() - Affichage du "+i+" ène marker");
}

function mapDirectionsFromQuery(depart,arrivee)
{
   dir = new GDirections(map, document.getElementById("gmapdirdiv"));
   GEvent.addListener(dir, "load", onGDirectionsLoad);
   dir.load("from: " + depart + " to: " + arrivee,{ "locale":  gmaplang});

}

function mapDirectionsFromMarkers(i,j)
{
   dir = new GDirections(map, document.getElementById("gmapdirdiv"));
   GEvent.addListener(dir, "load", onGDirectionsLoad);
   addDebugInfo("INFO","mapDirectionsFromMarkers - trajet de : '"+markers[i].titre+"' "+markers[i].point.getLatLng().toString()+" vers : '"+markers[j].titre+"' "+markers[j].point.getLatLng().toString());
   dir.load("from: " + markers[i].point.getLatLng().lat()+","+markers[i].point.getLatLng().lng() + " to: " + markers[j].point.getLatLng().lat()+","+markers[j].point.getLatLng().lng(),{ "locale":  gmaplang});

}

//renvoi la distance en mètres entre deux points
function getDistanceFromMarkers(i,j)
{
   var point1  =  markers[i].point.getLatLng();
   var point2  =  markers[j].point.getLatLng();
   var distance=  point1.distanceFrom(point2);

   return distance;
}
function onGDirectionsLoad()
{

}

function addDebugInfo(typem,message)
{
   var nb=debug_msg.length;
   debug_msg[nb]="["+typem+"] "+message;

   var html=$("#gmapdebugdiv").html()+"<br/>"+"["+typem+"] "+message;
   $("#gmapdebugdiv").html(html);
}
