var map = null;
var geocoder = null;

function initializeGoogleMaps(lat, lng) {
	if (GBrowserIsCompatible()) {
		if (document.getElementById("map_canvas") != null) {
			map = new GMap2(document.getElementById("map_canvas"));
			map.setCenter(new GLatLng(parseFloat(45.795278),
					parseFloat(4.847222)), 13);
			map.setUIToDefault();
			//map.disableDragging();
			geocoder = new GClientGeocoder();
			
			setMapLimits();
			
			if (lat != null && lat != "" && lng != null && lng != "") {
				var point = new GLatLng(parseFloat(lat), parseFloat(lng));
				map.addOverlay(new GMarker(point));
				map.setCenter(point, 14);
			}
		}
	}
}

function setMapLimits() {

     // ====== Restricting the range of Zoom Levels =====
    // Get the list of map types      
    var mt = map.getMapTypes();
    // Overwrite the getMinimumResolution() and getMaximumResolution() methods
    for (var i=0; i<mt.length; i++) {
      mt[i].getMinimumResolution = function() {return 13;}
     // mt[i].getMaximumResolution = function() {return 11;}
    }

    // Add a move listener to restrict the bounds range
    GEvent.addListener(map, "move", function() {
      checkBounds();
    });

    // The allowed region which the whole map must be within
    var allowedBounds = new GLatLngBounds(new GLatLng(45.729982,4.734364), new GLatLng(45.843462,4.939671));
    
    // If the map position is out of range, move it back
    function checkBounds() {
      // Perform the check and return if OK
      if (allowedBounds.contains(map.getCenter())) {
        return;
      }
      // It`s not OK, so find the nearest allowed point and move there
      var C = map.getCenter();
      var X = C.lng();
      var Y = C.lat();

      var AmaxX = allowedBounds.getNorthEast().lng();
      var AmaxY = allowedBounds.getNorthEast().lat();
      var AminX = allowedBounds.getSouthWest().lng();
      var AminY = allowedBounds.getSouthWest().lat();

      if (X < AminX) {X = AminX;}
      if (X > AmaxX) {X = AmaxX;}
      if (Y < AminY) {Y = AminY;}
      if (Y > AmaxY) {Y = AmaxY;}
      //alert ("Restricting "+Y+" "+X);
      map.setCenter(new GLatLng(Y,X));
    }

}

function createMarker(posn, info, address, pubid) {
	var marker = new GMarker(posn, {
		title : info
	});
	var myHtml = "<span style='color:  #626262;font-size: 13px;font-weight: bold;'>"
			+ info
			+ "</span><br/>"
			+ "<span style='color:  #626262;font-size: 11px;'>"
			+ address
			+ "</span>";
	if (pubid != null && pubid != "")
		myHtml = myHtml
				+ "<br/><a href='publication.jsp?currentPubId="
				+ pubid
				+ "' style='color:  #626262;font-size: 11px;font-weight: bold;' >Aller &agrave; la page</a>";
	marker.html = myHtml;
	GEvent.addListener(marker, "click", function() {
		this.openInfoWindowHtml(this.html);
	});
	return marker;
}

function displayMarker(lat,lng, info, address, pubid) {
	map.clearOverlays();
	var point = new GLatLng(parseFloat(lat), parseFloat(lng));
	var marker = createMarker(point, info,address, pubid); 
	map.addOverlay(marker);
	marker.openInfoWindowHtml(marker.html);
	map.setCenter(point, 13);
}

function loadMarkers(file) {

	if (geocoder) {
		map.clearOverlays();
		removeMarkerLinks();
		if (file != ""){
		GDownloadUrl(
				"/weblib/caluire/markers/" + file,
				function(data, responseCode) {

					if (responseCode == G_GEO_SUCCESS) {
						var xml = GXml.parse(data);
						var markers = xml.documentElement
								.getElementsByTagName("marker");

						for ( var i = 0; i < markers.length; i++) {
							(function() {
								var info = GXml.value(markers[i]
										.getElementsByTagName("infowindow")[0]);
								var address = GXml.value(markers[i]
										.getElementsByTagName("address")[0]);
								var pubid = GXml.value(markers[i]
										.getElementsByTagName("pubid")[0]);
								var point = new GLatLng(parseFloat(markers[i]
										.getAttribute("lat")),
										parseFloat(markers[i]
												.getAttribute("lng")));
								map.addOverlay(createMarker(point, info,
										address, pubid));
								createMarkerLink(markers[i].getAttribute("lat"),markers[i].getAttribute("lng"), info, address, pubid);
								//map.setCenter(point, 13);
							})();
						}
					} else if (responseCode == -1) {
						alert("Data request timed out. Please try later.");
					} else {
						alert("Request resulted in error. Check XML file is retrievable.");
					}
				});
	}
	}
}

function removeMarkerLinks(){
	while(document.getElementById("markersList").childNodes.length){
		document.getElementById("markersList").removeChild(document.getElementById("markersList").childNodes[0]);
	}
	map.setCenter(new GLatLng(parseFloat(45.795278),
			parseFloat(4.847222)), 13);
}

function createMarkerLink(lat,lng, info, address, pubid){
	var newMarker = document.createElement("li");
	var newMarkerLink = document.createElement("a");
	var newMarkerText = document.createTextNode(info);
	newMarkerLink.setAttribute("href", "javascript:displayMarker('"+lat+"','"+lng+"','"+ info+"','"+ address+"','"+ pubid+"')");
	newMarkerLink.appendChild(newMarkerText);
	newMarker.appendChild(newMarkerLink);
	document.getElementById("markersList").appendChild(newMarker);
}

function find(address) {
	if (geocoder) {
		map.clearOverlays();
		geocoder.setCache(null);
		geocoder.getLocations(address + " 69300 Caluire-et-Cuire", function(
				response) {
			if (response.Status.code == 200) {

				for ( var i = 0; i < response.Placemark.length; i++) {
					(function() {
						// Retrieve the object
				var place = response.Placemark[i];

				// Retrieve the latitude and longitude
				var point = new GLatLng(place.Point.coordinates[1],
						place.Point.coordinates[0]);

				// Set up our GMarkerOptions object literal
				markerOptions = {
					title : place.address
				};

				var marker = new GMarker(point, markerOptions);

				GEvent.addListener(marker, "click", function() {
					this.openInfoWindowHtml(place.address);
				});

				// Add the marker to map
				map.addOverlay(marker);

				// Add address information to marker
				marker.openInfoWindowHtml(place.address);

			})();
		}
		// Center the map on the first point
		place = response.Placemark[0];
		point = new GLatLng(place.Point.coordinates[1],
				place.Point.coordinates[0]);
		map.setCenter(point, 13);
	}
}		);
	}
}