var g_known_google_maps = new Object();

function loadGoogleMap(uid, address, latitude, longitude, zoom, mapType, showLargeMapControl, showSmallMapControl, showSmallZoomControl, showScaleControl, showMapTypeControl, showOverviewMapControl, infoWindowText, infoWindowMaxWidth) {
	if (GBrowserIsCompatible()) {
		var div = document.getElementById(uid);
		var map = new GMap2(div);
		g_known_google_maps[uid] = map;
		if (address) {
			var geocoder = new GClientGeocoder();
			geocoder.getLatLng(address, function(point) {
				if (!point) {
					div.innerHTML = GoogleMapAddressNotFound;
					div.style.padding = '3px';
				} else {
					initMap(map, point, zoom, mapType, showLargeMapControl, showSmallMapControl, showSmallZoomControl, showScaleControl, showMapTypeControl, showOverviewMapControl, infoWindowText, infoWindowMaxWidth);
				}
			});
		} else {
			var point = new GLatLng(latitude, longitude);
			initMap(map, point, zoom, mapType, showLargeMapControl, showSmallMapControl, showSmallZoomControl, showScaleControl, showMapTypeControl, showOverviewMapControl, infoWindowText, infoWindowMaxWidth);
		}
	}
}

function setMapCenterLatAndLong(map, latitude, longitude, zoom) {
	var point = new GLatLng(latitude, longitude);
	setMapCenter(map, point, zoom);
}

function setMapCenter(map, point, zoom) {
	map.setCenter(point, zoom);
}

function initMap(map, point, zoom, mapType, showLargeMapControl, showSmallMapControl, showSmallZoomControl, showScaleControl, showMapTypeControl, showOverviewMapControl, infoWindowText, infoWindowMaxWidth) {
	map.setCenter(point, zoom);
	var marker = new GMarker(point);
	map.addOverlay(marker);
	if (showLargeMapControl) {
		map.addControl(new GLargeMapControl());
	}
	if (showSmallMapControl) {
		map.addControl(new GSmallMapControl());
	}
	if (showSmallZoomControl) {
		map.addControl(new GSmallZoomControl());
	}
	if (showScaleControl) {
		map.addControl(new GScaleControl());
	}
	if (showMapTypeControl) {
		map.addControl(new GMapTypeControl());
	}
	if (showOverviewMapControl) {
		map.addControl(new GOverviewMapControl());
	}
	map.setMapType(eval(mapType));
	if (infoWindowText) {
		var opts = {maxWidth: infoWindowMaxWidth, noCloseOnClick: true};
		marker.openInfoWindowHtml(infoWindowText, opts);
	}
}

function createEmptyMap(uid) {
	if (GBrowserIsCompatible()) {
		var div = document.getElementById(uid);
		var map = new GMap2(div);
		g_known_google_maps[uid] = map;
		return(map);
	}
	return(null);
}

function initEmptyMap(map, mapType, showLargeMapControl, showSmallMapControl, showSmallZoomControl, showScaleControl, showMapTypeControl, showOverviewMapControl) {
	map.setCenter(new GLatLng(0.0, 0.0), 13);

	if (showLargeMapControl) {
		map.addControl(new GLargeMapControl());
	}
	if (showSmallMapControl) {
		map.addControl(new GSmallMapControl());
	}
	if (showSmallZoomControl) {
		map.addControl(new GSmallZoomControl());
	}
	if (showScaleControl) {
		map.addControl(new GScaleControl());
	}
	if (showMapTypeControl) {
		map.addControl(new GMapTypeControl());
	}
	if (showOverviewMapControl) {
		map.addControl(new GOverviewMapControl());
	}
	map.setMapType(eval(mapType));
}

var g_google_multi_map_geocoder = false;
function getMultimapGeocoder() {
	if(g_google_multi_map_geocoder) return g_google_multi_map_geocoder;
	g_google_multi_map_geocoder = new GClientGeocoder();
	return(g_google_multi_map_geocoder);
}

function addAddressMarker(map, address, htmlContent, pinImageUrl, zoom, infoWindowMaxWidth, setmapcenter) {
	var geocoder = getMultimapGeocoder();
	geocoder.getLatLng(address, function(point) {
		if (!point) {
			alert("Can't find position of address '"+address+"'");
		} else {
			getJSONRPCBridge().googlemapajaxhelper.addToCache(address, point.lat(), point.lng());
			addCoordinateMarker(map, point, htmlContent, pinImageUrl, zoom, infoWindowMaxWidth, setmapcenter);
		}
	});

}

function addLatitudeLongitudeMarker(map, latitude, longitude, htmlContent, pinImageUrl, zoom, infoWindowMaxWidth, setmapcenter) {
	var point = new GLatLng(latitude, longitude);
	addCoordinateMarker(map, point, htmlContent, pinImageUrl, zoom, infoWindowMaxWidth, setmapcenter);
}

function addCoordinateMarker(map, point, htmlContent, pinImageUrl, zoom, infoWindowMaxWidth, setmapcenter) {

	if(setmapcenter) setMapCenter(map, point, zoom);

	var marker = new GMarker(point);
	map.addOverlay(marker);

	if(pinImageUrl && pinImageUrl != "") {
		marker.setImage(pinImageUrl);
	}

	if (htmlContent) {
		var opts = {maxWidth: infoWindowMaxWidth, clickable:true};
		marker.bindInfoWindowHtml(htmlContent, opts);
	}

}

var g_known_pins = new Object();
function setPin(divid, fieldid) {
	var map = g_known_google_maps[divid];
	if(!map) {
		alert("Can't find map with id "+divid);
		return;
	}

	var point = map.getCenter();
	document.getElementById(fieldid).value = (point.lat()+"/"+point.lng());
	if(g_known_pins[divid]) {
		g_known_pins[divid].setPoint(point);
	} else {
		var opts = {draggable:true};
		var marker = new GMarker(point, opts);
        marker.enableDragging();
        GEvent.addListener(marker, "dragend", function()
        {
	        document.getElementById(fieldid).value = (marker.getPoint().lat()+"/"+marker.getPoint().lng());
        });
		map.addOverlay(marker);

		g_known_pins[divid] = marker;
	}
}

