function GMInit ( elem_id, w, h, lat, lng )
{
	if(!GBrowserIsCompatible())
		return null;

	var map = new GMap2(document.getElementById(elem_id), { size: new GSize(w,h) });
	map.setCenter(new GLatLng(lat,lng));
	
	return map;
}

function GMConfControls ( map, small_map, large_map, small_zoom, scale, map_type )
{
	if(small_map)
		map.addControl(new GSmallMapControl());
	
	if(large_map)
		map.addControl(new GLargeMapControl());
		
	if(small_zoom)
		map.addControl(new GSmallZoomControl());
		
	if(scale)
		map.addControl(new GScaleControl());
		
	if(map_type)
		map.addControl(new GMapTypeControl());
}

function GMSetPos ( map, lat, lng )
{
	var latlng = new GLatLng(lat, lng);
	map.setCenter(latlng);
}

function GMSetPosAlt ( map, lat, lng, alt )
{
	var latlng = new GLatLng(lat, lng);
	map.setCenter(latlng, alt);
}

function GMAddMarker ( map, lat, lng )
{
	var latlng = new GLatLng(lat, lng);
	map.addOverlay(new GMarker(latlng));
}

function GMAddMarkerWithMessage ( map, lat, lng, message, icon )
{
	var marker_icon = new GIcon(G_DEFAULT_ICON);
	marker_icon.image = icon;
	
	var markerOptions = { icon:marker_icon };
	
	var latlng = new GLatLng(lat, lng);
	var marker = new GMarker(latlng, markerOptions);
	map.addOverlay(marker);
	
	GEvent.addListener(marker,"click", function() {
        map.openInfoWindowHtml(latlng, message);
	});
}

function GMAddCircle ( map, lat, lng, rad )
{
	var latlng = new GLatLng(lat, lng);
	map.addOverlay(GMCreateCircle(latlng, rad));
}

function GMEnableCentering ( map )
{
	GEvent.addListener(map, "click", GMOnClickCentering);
}

var g_marker = null;
function GMShowCenteredMarker ( map )
{
	if(g_marker != null)
		map.removeOverlay(g_marker);
		
	g_marker = new GMarker(map.getCenter());
	map.addOverlay(g_marker);
}

var g_circle = null;
var g_circle_rad = null;
function GMShowCenteredCircle ( map, rad )
{
	if(g_circle != null)
		map.removeOverlay(g_circle);
	
	g_circle = GMCreateCircle(map.getCenter(), rad);	
	g_circle_rad = rad;
	map.addOverlay(g_circle);
}

function GMOnClickCentering ( overlay, newlatlng )
{
	if(overlay != null)
		return;

	map.setCenter(newlatlng);
	
	if(g_marker != null)
		GMShowCenteredMarker(map);
	
	if(g_circle != null)
		GMShowCenteredCircle(map, g_circle_rad);
}

function GMCreateCircle ( latlng, rad )
{
	var points = Array();
	var bounds = new GLatLngBounds();
	
	with(Math)
	{
		var d = rad / 6378.8; // To radians
		var lat = (PI/180) * latlng.lat(); // To radians
		var lng = (PI/180) * latlng.lng(); // To radians
		
		for(var a = 0; a < 361; ++a)
		{
			var tc = (PI/180)*a;
			var y = asin(sin(lat)*cos(d)+cos(lat)*sin(d)*cos(tc));
			var dlng = atan2(sin(tc)*sin(d)*cos(lat),cos(d)-sin(lat)*sin(y));
			var x = ((lng-dlng+PI)%(2*PI))-PI;
			
			var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
			points.push(point);
			bounds.extend(point);
		}
	}
	
	map.setZoom(map.getBoundsZoomLevel(bounds));
	
	if (d < 1.5678565720686044)
		return new GPolygon(points, '#000000', 2, 1, '#000000', 0.25);
	else
		return new GPolygon(points, '#000000', 2, 1);
}

