var search_map;
var search_mgr;
var search_mapBounds;
var search_map_markers;
var search_map_allMarkers;
var search_map_markersOn;

// Initialisation de la carte de recherche
function searchMapInit(profil,mode,lat,long,programmes) {

	if (!GBrowserIsCompatible())
		return;

	// Initialisation
	geoInit();
	var invest = profil == 'I';

	// Objet GMap
	search_map = new GMap2(document.getElementById("searchMap"));
	var center = new GLatLng(lat,long);
	search_map.setCenter(center, 12);
	search_mapBounds = new GLatLngBounds();
	search_mapBounds.extend(center);

	// MarkerManager
	search_mgr = new MarkerManager(search_map);
	search_map_markers = [];
	search_map_allMarkers = [];
	search_map_markersOn = [];
	
	// Exploration des donnees programmes
	for(i in geoInfosProgrammes) {
		if(!geoInfosProgrammes.hasOwnProperty(i))
			continue;
		
		// Donnees programmes
		var programme = geoInfosProgrammes[i];
		if(Math.abs(programme["coords"][0]) > 180
				|| Math.abs(programme["coords"][1]) > 180)
			continue;
		var pLatLng = new GLatLng(programme["coords"][0], programme["coords"][1]);

		// programme specifiques aux investisseurs
		if(!invest && programme["invest"])
			continue;

		// mode de recherche
		if((mode == 'R' && programme["mode"] == "P")
				|| (mode != 'R' && programme["mode"] != mode))
			continue;

		// Programme selectionne
		var isProgrammeOn = jQuery.inArray(programme["code"], programmes) >= 0;
		
		// Marker
		var myMarker = createMarker(pLatLng,programme,isProgrammeOn);

		// Programme selectionne
		if(isProgrammeOn) {
			search_mapBounds.extend(pLatLng);
			search_map_markersOn.push(myMarker);
		}

		// Mise a jour des referenciels de Markers
		search_map_allMarkers[programme["code"]] = myMarker;
		search_map_markers.push(myMarker);
	}

	search_map.setCenter(search_mapBounds.getCenter(), search_map.getBoundsZoomLevel(search_mapBounds));

	search_mgr.addMarkers(search_map_markers,0);
	search_mgr.refresh();

	var customUI = search_map.getDefaultUI();
	customUI.maptypes.satellite = false;
	customUI.maptypes.hybrid = false;
	customUI.maptypes.physical = false;
	customUI.controls.maptypecontrol = false;
	customUI.controls.menumaptypecontrol = false;
	if(mode == 'P') {
		customUI.controls.scalecontrol = false;
		customUI.controls.smallzoomcontrol3d = false;
		customUI.zoom.doubleclick = false;
		customUI.zoom.scrollwheel = false;
	}
	search_map.setUI(customUI);

	// Creation d'un Marker
	function createMarker(pLatLng,programme,isProgrammeOn) {
		var myMarker = new GMarker(pLatLng, {
			title: programme["nom"],
			icon: isProgrammeOn ? programmeOnIcon : programmeIcon
		});
		myMarker.codeProgramme = programme["code"];
		myMarker.isOn = isProgrammeOn;
		myMarker.html = programme["html"];
		GEvent.addListener(myMarker, "click", function() {
		    myMarker.openExtInfoWindow(search_map,
		    	"search_info_window",
		    	myMarker.html,
		    	{beakOffset: 7}
		    ); 
		});
		return myMarker;
	}
}

// Mise a jour de la carte de recherche
function searchMapUpdate(codes,lat,lng) {
	
	// Fermeture de la fenêtre info widow avant rechargement
	if(search_map.getExtInfoWindow() != null ){
		search_map.closeExtInfoWindow();
	}
	
	search_mapBounds = new GLatLngBounds();
	
	if(lat !== false && lng !== false)
		search_mapBounds.extend(new GLatLng(lat,lng));

	for(code in search_map_allMarkers) {
		var myMarker = search_map_allMarkers[code];
		if(myMarker.isOn && jQuery.inArray(code,codes) == -1) {
			myMarker = updateMarkerIcon(code,myMarker,programmeIcon);
			myMarker.isOn = false;
		}
		else if(!myMarker.isOn && jQuery.inArray(code,codes) >= 0) {
			myMarker = updateMarkerIcon(code,myMarker,programmeOnIcon);
			myMarker.isOn = true;
		}
		
		if(myMarker.isOn) {
			search_mapBounds.extend(myMarker.getLatLng());
		}
	}
	search_mgr.refresh();
	if( codes.length>0 ) {
		search_map.setCenter(search_mapBounds.getCenter(), search_map.getBoundsZoomLevel(search_mapBounds));
	}
	else {
		// Pas de résultat, zoom sur la France:
		var address = "France";
		geocoder = new GClientGeocoder();
		geocoder.getLatLng(
			address, function(point) {
				search_map.setCenter(point, 4);
			}
		);
	}
}

// Mise a jour de l'icon d'un Marker par duplication, suppression et ajout d'un nouveau Marker
// Pas de possibliite d'update sur l'objet icon
function updateMarkerIcon(code,marker,icon) {
	var myNewMarker = new GMarker(marker.getLatLng(),{
		title: marker.getTitle(),
		icon: icon
	});
	myNewMarker.codeProgramme = marker.codeProgramme;
	myNewMarker.isOn = marker.isOn;
	myNewMarker.html = marker.html;
	GEvent.addListener(myNewMarker, "click", function() {
		myNewMarker.openExtInfoWindow(search_map,
	    	"search_info_window",
	    	myNewMarker.html,
	    	{beakOffset: 7}
	    ); 
	});
	search_map_allMarkers[code] = myNewMarker;
	search_mgr.removeMarker(marker);
	search_mgr.addMarker(myNewMarker,0);
	return myNewMarker;
}
