function prepareMaps()
{
	if (!document.getElementById) return false;
	googleMap();
	prepareMapControls();
}
function googleMap()
{
	// Maps
	var maps = [];
	maps[0] = [];
	maps[0]['id']		= "hoMap";
	maps[0]['lat']		= 53.513526;
	maps[0]['lng']		= -1.131694;
	maps[0]['zoom']		= 14;
	maps[1] = [];
	maps[1]['id']		= "weatherMap";
	maps[1]['lat']		= 28;
	maps[1]['lng']		= -83;
	maps[1]['zoom']		= 6;
	maps[2] = [];
	maps[2]['id']		= "webcamsMap";
	maps[2]['lat']		= 28;
	maps[2]['lng']		= -83;
	maps[2]['zoom']		= 6;
	maps[3] = [];
	maps[3]['id']		= "coastMap";
	maps[3]['lat']		= 26.00;
	maps[3]['lng']		= -81.30;
	maps[3]['zoom']		= 8;
	maps[4] = [];
	maps[4]['id']		= "orlandoMap";
	maps[4]['lat']		= 28.50;
	maps[4]['lng']		= -81.30;
	maps[4]['zoom']		= 9;
	
	// Markers
	var attractions = ["attraction", "/data/attractions.xml", "mm", "blue", "click", true];
	var villas = ["area", "/data/holidayrentalhomes.xml", "mm", "red", "click", true];
	var weatherstations = ["weatherstation", "/data/weatherstations.xml", "mm", "yellow", "click", true];
	var webcams = ["webcam", "/data/webcams.xml", "mm", "green", "click", true];

	// Polygons
	var wdwr = ["/data/wdwr.xml", "#0000ff", 2, 1, "#0000ff", 0.2];

	// Select map
	for (var i=0; i<maps.length; i++) {
		if (document.getElementById(maps[i]['id']) !== null) {
			switch(maps[i]['id']) {
				case "hoMap":
					var map = new GMap2(document.getElementById(maps[i]['id']));
					map.setCenter(new GLatLng(maps[i]['lat'], maps[i]['lng']), maps[i]['zoom']);
					standardMapControls(map);
					// Display marker for DBIC, Doncaster
					var point = new GLatLng(maps[i]['lat'], maps[i]['lng']);
					var event = 'click';
					var windowText = "<img class=\"windowImg\" src=\"images/dbic.jpg\" alt=\"Doncaster Business Innovation Centre\" width=\"200\" height=\"100\" /><br />Doncaster Business Innovation Centre";
					addDefaultMarker(map, point, event, windowText);
					break;
				case "weatherMap":
					var map = new GMap2(document.getElementById(maps[i]['id']));
					map.setCenter(new GLatLng(maps[i]['lat'], maps[i]['lng']), maps[i]['zoom']);
					standardMapControls(map);
					addMarkers(map, weatherstations[0], weatherstations[1], weatherstations[2], weatherstations[3], weatherstations[4], weatherstations[5]);
					break;
				case "webcamsMap":
					var map = new GMap2(document.getElementById(maps[i]['id']));
					map.setCenter(new GLatLng(maps[i]['lat'], maps[i]['lng']), maps[i]['zoom']);
					standardMapControls(map);
					addMarkers(map, webcams[0], webcams[1], webcams[2], webcams[3], webcams[4], webcams[5]);
					break;
				case "coastMap":
					var coast = new GMap2(document.getElementById(maps[i]['id']));
					coast.setCenter(new GLatLng(maps[i]['lat'], maps[i]['lng']), maps[i]['zoom']);
					standardMapControls(coast);
					addMarkers(coast, villas[0], villas[1], villas[2], villas[3], villas[4], villas[5]);
					addMarkers(coast, attractions[0], attractions[1], attractions[2], attractions[3], attractions[4], attractions[5]);
					break;
				case "orlandoMap":
					var orlando = new GMap2(document.getElementById(maps[i]['id']));
					orlando.setCenter(new GLatLng(maps[i]['lat'], maps[i]['lng']), maps[i]['zoom']);
					standardMapControls(orlando);
					addMarkers(orlando, villas[0], villas[1], villas[2], villas[3], villas[4], villas[5]);
					addPolygon(orlando, wdwr[0], wdwr[1], wdwr[2], wdwr[3], wdwr[4], wdwr[5]);
					addMarkers(orlando, attractions[0], attractions[1], attractions[2], attractions[3], attractions[4], attractions[5]);
					break;
			}
		}
	}	
}
function standardMapControls(map) {
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.addControl(new GOverviewMapControl());
	map.addControl(new GScaleControl());
}
function addMarkers(map, item, datafile, markerType, markerColor, event, infoWindowRequired)
{
	GDownloadUrl(datafile, function(data, responseCode)
	{
		// Check status code is equal to 200 before processing data to
		// ensure against HTTP errors that result in null or bad data.
  		if(responseCode == 200)
		{
			var xml = GXml.parse(data);
			if (xml.documentElement.getElementsByTagName(item))
			{
				var items = xml.documentElement.getElementsByTagName(item);
				for (var i = 0; i < items.length; i++)
				{
					var point = new GLatLng(parseFloat(items[i].getAttribute("lat")), parseFloat(items[i].getAttribute("lng")));
					var windowText = '';
					if (infoWindowRequired)
					{
						switch(item)
						{
							case "area":
								var areaName = items[i].getAttribute("areaName");
								var file = items[i].getAttribute("file");
								var numOfVillas = items[i].getAttribute("numOfVillas");
								windowText = "<a href=\"" + file + "\"><b>" + areaName + " (" + numOfVillas + ")</b></a>";
								break;
							case "airport":
								var name = items[i].getAttribute("name");
								var faa = items[i].getAttribute("faa");
								var url = items[i].getAttribute("url");
								windowText = "<b>" + faa + " - " + name + "</b><br />" + "<a href=\"" + url + "\">" + url + "</a>";
								break;
							case "attraction":
								var name = items[i].getAttribute("name");
								var address = items[i].getAttribute("address");
								var url = items[i].getAttribute("url");
								windowText = "<b>" + name + "</b><br />" + address + "<br />" + "<a href=\"" + url + "\" target=\"_blank\">" + url + "</a><br/>(link opens in a new window).";
								break;
							case "condo":
								var name = items[i].getAttribute("name");
								var description = items[i].getAttribute("description");
								var url = items[i].getAttribute("url");
								windowText = "<b>" + name + "</b><br/>" + description + "<br/><a href=\"" + url + "\">" + "Learn more..." + "</a>";
								break;
							case "hotel":
								var name = items[i].getAttribute("name");
								var address = items[i].getAttribute("address");
								var url = items[i].getAttribute("url");
								windowText = "<b>" + name + "</b><br/>" + address + "<br/><a href=\"" + url + "\">" + "Learn more..." + "</a>";
								break;
							case "villa":
								var name = items[i].getAttribute("name");
								//var description = items[i].getAttribute("description");
								var url = items[i].getAttribute("url");
								//windowText = "<b>" + name + "</b><br/>" + description + "<br/><a href=\"" + url + "\">" + "Learn more..." + "</a>";
								windowText = "<b><a href=\"" + url + "\">" + name + "</a></b>";
								break;
							case "weatherstation":
								var name = items[i].getAttribute("name");
								var filename = name.replace(/ /g, "_");
								var file = filename + ".html";
								var img =  filename + ".gif";
								windowText = "<a target=\"_blank\" href=\"http://www.wunderground.com/US/FL/" + file + "?bannertypeclick=infobox\"><img src=\"http://banners.wunderground.com/weathersticker/infobox_both/language/www/US/FL/" + img + "\" alt=\"Click for " + name + ", Florida Forecast\" height=\"108\" width=\"144\"/></a>";								
								break;
							case "webcam":
								var location = items[i].getAttribute("location");
								var comments = items[i].getAttribute("comments");
								var url = items[i].getAttribute("url");
								windowText = "<b>" + location + "</b><br/>" + comments + "<br/><a target=\"_blank\" href=\"" + url + "\">" + url + "</a>";	
								break;
						}
					}
					switch(markerType)
					{
						case "lettered":
							var letter = String.fromCharCode("A".charCodeAt(0) + i);
							addLetteredMarker(map, point, letter, event, windowText);
							break;
						case "mm":
							addMMMarker(map, point, markerColor, event, windowText)
							break;
						default:
							addDefaultMarker(map, point, event, windowText);
					}
				}
			}
		}
		else if (responseCode == -1)
		{
			alert("Data request timed out. Please try later.");
		}
		else
		{ 
			alert("Request resulted in error. Check XML file is retrievable.");
		}
	});
}
function addDefaultMarker(map, point, event, windowText)
{
	var dimensions = [];
	var image = "marker.png";
	var shadow = "shadow50.png";
	dimensions["iconSizeWidth"] = 20;
	dimensions["iconSizeheight"] = 34;
	dimensions["shadowSizeWidth"] = 37;
	dimensions["shadowSizeHeight"] = 34;
	dimensions["iconAnchorLeft"] = 9;
	dimensions["iconAnchorTop"] = 34;
	dimensions["infoWindowAnchorLeft"] = 9;
	dimensions["infoWindowAnchorTop"] = 2;
	dimensions["infoShadowAnchorLeft"] = 18;
	dimensions["infoShadowAnchorTop"] = 25;
	map.addOverlay(createMarker(point, setIcon(image, shadow, dimensions), event, windowText));
}
function addBlueMarker(map, point, event, windowText)
{
	var dimensions = [];
	var image = "marker-blue.png";
	var shadow = "shadow50.png";
	dimensions["iconSizeWidth"] = 20;
	dimensions["iconSizeheight"] = 34;
	dimensions["shadowSizeWidth"] = 37;
	dimensions["shadowSizeHeight"] = 34;
	dimensions["iconAnchorLeft"] = 9;
	dimensions["iconAnchorTop"] = 34;
	dimensions["infoWindowAnchorLeft"] = 9;
	dimensions["infoWindowAnchorTop"] = 2;
	dimensions["infoShadowAnchorLeft"] = 18;
	dimensions["infoShadowAnchorTop"] = 25;
	map.addOverlay(createMarker(point, setIcon(image, shadow, dimensions), event, windowText));
}
function addLetteredMarker(map, point, letter, event, windowText)
{
	var dimensions = [];
	var image = "marker" + letter + ".png";
	var shadow = "shadow50.png";
	dimensions["iconSizeWidth"] = 20;
	dimensions["iconSizeheight"] = 34;
	dimensions["shadowSizeWidth"] = 37;
	dimensions["shadowSizeHeight"] = 34;
	dimensions["iconAnchorLeft"] = 9;
	dimensions["iconAnchorTop"] = 34;
	dimensions["infoWindowAnchorLeft"] = 9;
	dimensions["infoWindowAnchorTop"] = 2;
	dimensions["infoShadowAnchorLeft"] = 18;
	dimensions["infoShadowAnchorTop"] = 25;
	map.addOverlay(createMarker(point, setIcon(image, shadow, dimensions), event, windowText));
}
function addMMMarker(map, point, color, event, windowText)
{
	var dimensions = [];
	var image = "mm_20_" + color + ".png";
	var shadow = "mm_20_shadow.png";
	dimensions["iconSizeWidth"] = 12;
	dimensions["iconSizeheight"] = 20;
	dimensions["iconAnchorLeft"] = 6;
	dimensions["iconAnchorTop"] = 20;
	dimensions["shadowSizeWidth"] = 22;
	dimensions["shadowSizeHeight"] = 20;
	dimensions["infoWindowAnchorLeft"] = 5;
	dimensions["infoWindowAnchorTop"] = 1;
	map.addOverlay(createMarker(point, setIcon(image, shadow, dimensions), event, windowText));
}
function setIcon(image, shadow, dimensions)
{
	var icon = new GIcon();
	icon.image = "/images/map/markers/" + image;
	icon.shadow = "/images/map/markers/" + shadow;
	icon.iconSize = new GSize(dimensions["iconSizeWidth"], dimensions["iconSizeheight"]);
	icon.shadowSize = new GSize(dimensions["shadowSizeWidth"], dimensions["shadowSizeHeight"]);
	icon.iconAnchor = new GPoint(dimensions["iconAnchorLeft"], dimensions["iconAnchorTop"]);
	icon.infoWindowAnchor = new GPoint(dimensions["infoWindowAnchorLeft"], dimensions["infoWindowAnchorTop"]);
	icon.infoShadowAnchor = new GPoint(dimensions["infoShadowAnchorLeft"], dimensions["infoShadowAnchorTop"]);
	return icon;
}
function createMarker(point, icon, event, text)
{
	var marker = new GMarker(point, icon);
	if (text != "")
	{
		GEvent.addListener(marker, event, function()
		{
			marker.openInfoWindowHtml(text);
		}
		);
	}
	return marker;
}
function addPolyline(map, datafile, color, weight, opacity)
{
	GDownloadUrl(datafile, function(data, responseCode)
	{
		// Check status code is equal to 200 before processing data to
		// ensure against HTTP errors that result in null or bad data.
  		if(responseCode == 200)
		{
			var xml = GXml.parse(data);
			if (xml.documentElement.getElementsByTagName("coordinate"))
			{
				var coordinates = xml.documentElement.getElementsByTagName("coordinate");
				var points = [];
				for (var i = 0; i < coordinates.length - 1; i++)
				{
					points.push(new GLatLng(parseFloat(coordinates[i].getAttribute("lat")), parseFloat(coordinates[i].getAttribute("lng"))));
				}
				var polyline = new GPolyline(points, color, weight, opacity);
				map.addOverlay(polyline);
			}
		}
		else if (responseCode == -1)
		{
			alert("Data request timed out. Please try later.");
		}
		else
		{ 
			alert("Request resulted in error. Check XML file is retrievable.");
		}
	});
}
function addPolygon(map, datafile, strokeColor, strokeWeight, strokeOpacity, fillColor, fillOpacity)
{
	GDownloadUrl(datafile, function(data, responseCode)
	{
		// Check status code is equal to 200 before processing data to
		// ensure against HTTP errors that result in null or bad data.
  		if(responseCode == 200)
		{
			var xml = GXml.parse(data);
			if (xml.documentElement.getElementsByTagName("coordinate"))
			{
				var coordinates = xml.documentElement.getElementsByTagName("coordinate");
				var points = [];
				for (var i = 0; i < coordinates.length - 1; i++)
				{
					points.push(new GLatLng(parseFloat(coordinates[i].getAttribute("lat")), parseFloat(coordinates[i].getAttribute("lng"))));
				}
				var polygon = new GPolygon(points, strokeColor, strokeWeight, strokeOpacity, fillColor, fillOpacity);
				map.addOverlay(polygon);
			}
		}
		else if (responseCode == -1)
		{
			alert("Data request timed out. Please try later.");
		}
		else
		{ 
			alert("Request resulted in error. Check XML file is retrievable.");
		}
	});
}
function prepareMapControls()
{
	var controls = document.getElementsByTagName("input");
	for (var i = 0; i < controls.length; i++)
	{
		if (controls[i].type == "button")
		{
			controls[i].onclick = function()
			{
				mapControls(this);
			}
		}
	}
}
function mapControls(control)
{
	googleMap(control.id);
}
// Cleanup internal data structures to release memory
function cleanup()
{
	GUnload(); // Google map API
}
