var maps = new Object;
var markers = new Object;
var markerIcons = new Object;
var maps_loaded = false;

function addMap(mapId, centerLat, centerLng, zoom) {
	var mapData = new Object;
	mapData.mapId = mapId;
	mapData.centerLat = centerLat;
	mapData.centerLng = centerLng;
	mapData.zoom = zoom;
	maps[mapId] = mapData;
	if (maps_loaded) {
		createMap(mapData);
	}
}

function createMap(mapData) {
	if (!mapData.initialized) {
		var map = new google.maps.Map2(document.getElementById(mapData.mapId));

		map.setCenter(new google.maps.LatLng(mapData.centerLat,
				mapData.centerLng), mapData.zoom,
				google.maps.MapType.G_NORMAL_MAP);

		map.setUIToDefault();

		mapData.initialized = true;
		mapData.map = map;
		for ( var key in markers) {
			var markerData = markers[key];
			if (markerData.mapId == mapData.mapId) {
				createMarker(markerData);
			}
		}
	}
}

function addMarker(mapId, markerId, iconId, lat, lng, markerTitle, markerText) {
	var markerData = new Object;
	markerData.mapId = mapId;
	markerData.markerId = markerId;
	markerData.iconId = iconId;
	markerData.lat = lat;
	markerData.lng = lng;
	markerData.markerTitle = markerTitle;
	markerData.markerText = markerText;
	markers[markerId] = markerData;
	if (maps_loaded && maps[mapId] && maps[mapId].map) {
		createMarker(markerData);
	}
}

function createMarker(markerData) {
	var point = new google.maps.LatLng(markerData.lat, markerData.lng);
	var opts;
	if (markerData.markerTitle) {
		opts = {
			title : markerData.markerTitle
		};
	}
	if (markerData.iconId && markerIcons[markerData.iconId])
	{
		if (!markerIcons[markerData.iconId].icon)
		{
			var iconData = markerIcons[markerData.iconId];
			var icon = new google.maps.Icon();
			icon.image = iconData.image;
			
			icon.iconSize = new google.maps.Size(iconData.imageW,iconData.imageH);
			icon.iconAnchor = new google.maps.Point(iconData.imageW / 2,iconData.imageH / 2);
			icon.infoWindowAnchor = new google.maps.Point(iconData.imageW / 2,iconData.imageH / 2);
			
			if (iconData.shadow)
			{
				icon.shadow = iconData.shadow;
				icon.shadowSize = new google.maps.Size(iconData.shadowW,iconData.shadowH);
			}
				
			iconData.icon = icon;
		}
		opts.icon = markerIcons[markerData.iconId].icon;
	}
	var marker = new google.maps.Marker(point, opts);
	if (markerData.markerText) {
		google.maps.Event.addListener(marker, "click", function() {
			marker.openInfoWindowHtml(markerData.markerText);
		});
	}
	maps[markerData.mapId].map.addOverlay(marker);

}

function mapsLoaded() {
	for ( var key in maps) {
		createMap(maps[key]);
	}

	if (window.addEventListener) {
		window.addEventListener("unload", google.maps.Unload, false);
	} else if (window.attachEvent) {
		window.attachEvent("onunload", google.maps.Unload);
	}
	maps_loaded = true;
}

function loadMaps() {
	var mapCount = 0;
	for (var m in maps){
		mapCount++;
	}
	if (mapCount > 0 && typeof google != 'undefined' && typeof google.load != 'undefined')
	{
		var opts = {"other_params" : "sensor=false",
				"callback" : mapsLoaded};
		
		google.load("maps", "2", opts);
	}
}

