// ******** READ ME ******** //
//
// INSTANCIATION DE LA GOOGLE MAP:
// CREER UN DIV QUI CONTIENDRA LA MAP (EX: <div id="hotelMap" style="width:500px; height:300px"></div>)
// CONFIGURER LE ElementID (ci-bas) SELON L'ID DU DIV
// FAIRE UN INCLUDE DU PRESENT FICHIER DANS VOTRE PAGE
// APPELER LA FONCTION JAVA loadGMap(Latitude, Longitude, ZoomLevel, MapType, EncodedPolyline, EncodedLevels)
// LE RESTE SE FAIT TOUT SEUL !
//
// ******** ******* ******** //



// CONFIGURATION DE LA MAP
var ElementID = 'hotelMap'		//nom du div qui contient la map

var isShowControls = true 	//true si on veut afficher les controles de zoom et de types de map
var defaultLevel = 3;		//3 = afficher tjrs -- Utilisé par la map pour décider si le point s'affiche ou non (selon le ZoomLevel)

// defaults des points... pour jouer avec les dimensions des points voir la methode createMarker()
var defaultPointColor = "blue";
var defaultPointImage = "http://labs.google.com/ridefinder/images/mm_20_" + defaultPointColor + ".png";
var defaultPointShadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
var defaultPointIsDraggable = false
// FIN CONFIGURATION DE LA MAP




// arrays contenant les points de la map
var points = [];
var point_markers = [];

// Fonction d'entrée
function loadGMap(Latitude, Longitude, ZoomLevel, MapType, EncodedPolyline, EncodedLevels) 
	{if (Latitude == '')
		{Latitude = 4.915832801313164;
		ZoomLevel = 1;}
	if (Longitude == '')
		{Longitude = 0;
		ZoomLevel = 1;}
	if (GBrowserIsCompatible())
		{document.map = new GMap2(document.getElementById(ElementID));
		showControls();
		setResult(new GLatLng(Latitude, Longitude), ZoomLevel, EncodedPolyline, EncodedLevels);
		var mapTypes = document.map.getMapTypes()
		document.map.setMapType(mapTypes[MapType]);}}


function showControls()
	{
		if (isShowControls)
		{
			document.map.addControl(new GSmallMapControl());
			//document.map.addControl(new GMapTypeControl());
		}
	}


function setResult(point, ZoomLevel, EncodedPolyline, EncodedLevels)
	{
		document.map.setCenter(point, ZoomLevel);
		if ((EncodedPolyline != '') && (EncodedPolyline != '????'))
		{
			decode(EncodedPolyline, EncodedLevels);
			overlayPolyline(EncodedPolyline, EncodedLevels);
		}
		else
		{
			createPoint(point)
		}
	}
	


function decode(EncodedPolyline, EncodedLevels)
	{var encoded_points = EncodedPolyline;
	var encoded_levels = EncodedLevels;

	if (encoded_points.length==0 || encoded_levels.length==0)
		{return;}

	var enc_points = decodeLine(encoded_points);
	var enc_levels = decodeLevels(encoded_levels);

	if (enc_points.length==0 || enc_levels.length==0)
		{return;}

	if (enc_points.length != enc_levels.length)
		{alert('Error loading map ~D53901');
		return;}

	deleteAllMarkers();

	points = [];

	for (var i = 0; i < enc_points.length; ++i) 
		{createPoint(new GLatLng(enc_points[i][0], enc_points[i][1]));}}


function decodeLine (encoded)
	{var len = encoded.length;
	var index = 0;
	var array = [];
	var lat = 0;
	var lng = 0;
	
	while (index < len)
		{var b;
		var shift = 0;
		var result = 0;
		do
			{b = encoded.charCodeAt(index++) - 63;
			result |= (b & 0x1f) << shift;
			shift += 5;}
		while (b >= 0x20);
		var dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
		lat += dlat;

		shift = 0;
		result = 0;
		do
			{b = encoded.charCodeAt(index++) - 63;
			result |= (b & 0x1f) << shift;
			shift += 5;}
		while (b >= 0x20);
		var dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
		lng += dlng;

		array.push([lat * 1e-5, lng * 1e-5]);}
	return array;}


function decodeLevels(encoded)
	{var levels = [];
	for (var pointIndex = 0; pointIndex < encoded.length; ++pointIndex)
		{var pointLevel = encoded.charCodeAt(pointIndex) - 63;
		levels.push(pointLevel);}
	return levels;}


function deleteAllMarkers()
	{for(var i = 0; i < point_markers.length; ++i)
		{document.map.removeOverlay(point_markers[i]);}

	point_markers = [];}


function createPoint(point)
	{var newPoint = {Latitude: point.lat(),
			Longitude: point.lng(),
			Level: defaultLevel};

	points.push(newPoint);

	var point_marker = createPointMarker(point);

	document.map.addOverlay(point_marker);
	point_markers.push(point_marker);}


function createPointMarker(point)
	{var point_marker = createMarker(point);

	return point_marker;}


function createMarker(point)
	{var f = new GIcon();
	f.image = defaultPointImage;
	f.shadow = defaultPointShadow;
	f.iconSize = new GSize(12,20);
	f.shadowSize = new GSize(22,20);
	f.iconAnchor = new GPoint(6,20);
	f.infoWindowAnchor = new GPoint(6,1);
	f.infoShadowAnchor = new GPoint(13,13);

	newMarker = new GMarker(point, {icon: f, draggable: defaultPointIsDraggable});
	return newMarker;}


function overlayPolyline(EncodedPolyline, EncodedLevels)
	{if (document.overlay)
		{document.map.removeOverlay(document.overlay);}

	if (points.length > 1)
		{document.overlay = GPolyline.fromEncoded({	color: "#0000FF",
								weight: 10,
								points: EncodedPolyline,
								zoomFactor: 32,
								levels: EncodedLevels,
								numLevels: 4});
// temporairement retire
	document.map.addOverlay(document.overlay);
		}}


function unloadGoogleMaps()
	{GUnload();}
