google.load("maps", "2");
google.load("search", "1");

var map = null;
var localSearch = null;

var icon = null;

var MapMarkers = [];

function ReleaseMap()
{
	map = null;
	MapMarkers = [];
}

function ShowMap(MapType)
{
	if (google.maps.BrowserIsCompatible() && map === null)
	{
		map = new google.maps.Map2(document.getElementById("map"));
		map.setUIToDefault();
		
		if (MapType == "Terrain")
		{
			map.setMapType(G_PHYSICAL_MAP);
		}

		map.disableScrollWheelZoom();

		var point = new google.maps.LatLng(52.586288, -1.545682);
		map.setCenter(point, 6);

		icon = new google.maps.Icon();
		icon.image = "http://www.google.com/mapfiles/marker.png";
		//icon.shadow = "http://www.google.com/mapfiles/shadow50.png";
		icon.iconSize = new google.maps.Size(20, 34);
		//icon.shadowSize = new google.maps.Size(37, 34);
		icon.iconAnchor = new google.maps.Point(10, 34);
		icon.infoWindowAnchor = new google.maps.Point(9, 1);
		
		if (localSearch === null)
		{
			localSearch = new google.search.LocalSearch();
		}
	}
}

function ShowMarker(Name, Address, Lat, Lng, Zoom)
{
	if (map !== null)
	{
		var point = new google.maps.LatLng(Lat, Lng);

		CreateMarker(point, Name, Address);

		if (Zoom === undefined)
		{
			map.setCenter(point, 6);
		}
		else
		{
			map.setCenter(point, Zoom);
			map.disableDragging();
		}
	}
}

function ShowMarkers(JSON)
{
	var Markers = eval("(" + JSON + ")");
	
	var Point;
	var Lat;
	var Lng;
	var Name;
	var Address;
	var IconLetter;
	var EventFrequency;
	var MoreDetailsURL;
	var MapMarkerIcon;
	
	var Bounds = new google.maps.LatLngBounds();

	var TotalMarkers = Markers.Markers.Marker.length;

	for(i = 0; i < TotalMarkers; i++)
	{
		Lat = Markers.Markers.Marker[i].Lat;
		Lng = Markers.Markers.Marker[i].Lng;
		Name = Markers.Markers.Marker[i].Name;
		Address = Markers.Markers.Marker[i].Address;
		IconLetter = Markers.Markers.Marker[i].IconLetter;
		EventFrequency = Markers.Markers.Marker[i].EventFrequency;
		MoreDetailsURL = Markers.Markers.Marker[i].MoreDetailsURL;
		MapMarkerIcon = Markers.Markers.Marker[i].MapMarkerIcon;

		Point = new google.maps.LatLng(Lat, Lng);

		if (i == 0)
		{
			// Need to set the map's centre before creating any markers so
			// use the first Point and with a "country" zoom setting
			map.setCenter(Point,6);
		}
		
		Bounds.extend(Point);

		CreateMarker(Point, Name, Address, IconLetter, EventFrequency, MoreDetailsURL, MapMarkerIcon);
	}
	
	var Zoom = map.getBoundsZoomLevel(Bounds);
	
	if (Zoom > 15)
	{
		Zoom = 15;
	}

	map.setZoom(Zoom);
	map.setCenter(Bounds.getCenter());
}

function CreateMarker(point, Name, Address, IconLetter, EventFrequency, MoreDetailsURL, MapMarkerIcon)
{
	var MarkerCount = 0;
	var MarkerExists = false;
	var html = null;
	var MarkerItem = null;
	
	if ((Name !== undefined) && (Address !== undefined))
	{
		html = "<b>" + Name + "</b><br />" + Address;
	}

	if ((EventFrequency !== undefined) && (EventFrequency !== null) && (EventFrequency !== ""))
	{
		html += "<br /><br />" + EventFrequency;
	}

	if ((MoreDetailsURL !== undefined) && (MoreDetailsURL !== null) && (MoreDetailsURL !== ""))
	{
		html += "<a style='float:right;' href='" + MoreDetailsURL + "'" +
			(MoreDetailsURL.indexOf("http://") == 0 ? " target='_blank'" : "") + ">more details</a>";
	}

	while (MarkerExists == false && MarkerCount < MapMarkers.length)
	{
		MarkerItem = MapMarkers[MarkerCount];
		
		if (point.lat() == MarkerItem.getLatLng().lat()
			&& point.lng() == MarkerItem.getLatLng().lng())
		{
			MarkerExists = true;
		}
		else
		{
			MarkerCount++;
		}
	}

	if (!MarkerExists)
	{
		if (MapMarkerIcon !== undefined)
		{
			icon.image = MapMarkerIcon;
		}
		else if (IconLetter === undefined)
		{
			icon.image = "http://www.google.com/mapfiles/marker.png";
		}
		else
		{
			icon.image = "http://www.google.com/mapfiles/marker" + IconLetter + ".png";
		}

		var marker = new google.maps.Marker(point, icon);

		if (html != null)
		{
			marker.HTML = html;
		
			google.maps.Event.addListener(marker, 'click', function()
			{
				marker.openInfoWindowHtml(html);
			});
		}

		map.addOverlay(marker);

		MapMarkers.push(marker);
	}
	else if (html != null)
	{
		/* HR tag in IE7 extends beyond where it should so specify a width for all */
		MarkerItem.HTML = MarkerItem.HTML + "<br /><hr style='width:250px;'/>" + html;

		MarkerItem.bindInfoWindowHtml(MarkerItem.HTML);
	}
}

function ShowPostcodeMarker(Name, Address, Postcode, CallBack)
{
	localSearch.setSearchCompleteCallback(null, function()
	{
		if (localSearch.results[0])
		{		
			var Lat = localSearch.results[0].lat;
			var Lng = localSearch.results[0].lng;

			StoreAddressCoordinates(Lat, Lng)

			CallBack(Name, Address, Lat, Lng);
		}
		else
		{
			alert("Postcode not found");
		}
	});

	localSearch.execute(Postcode + ", UK");
}

function StoreAddressCoordinates(Lat, Lng)
{
	xmlhttp = GetXmlHttpObject();

	if (xmlhttp != null)
	{
		var Parameters = "Latitude=" + Lat + "&Longitude=" + Lng + "&sid=" + Math.random();
		
		xmlhttp.open("POST", "UpdateListingCoordinates.php", true);

		xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xmlhttp.setRequestHeader("Content-length", Parameters.length);
		xmlhttp.setRequestHeader("Connection", "close");

		xmlhttp.send(Parameters);
	}
}

function GetPostcodeCoordinates(Postcode, Name, Address, ID, Callback)
{
	if (localSearch === null)
	{
		localSearch = new google.search.LocalSearch();
	}

	localSearch.setSearchCompleteCallback(null, function()
	{
		if (localSearch.results[0])
		{
			var Lat = localSearch.results[0].lat;
			var Lng = localSearch.results[0].lng;

			if (ID !== undefined)
			{
				StoreAddressCoordinatesUsingID(ID, Lat, Lng);
			
				ShowMarker(Name, Address, Lat, Lng);
			}
		}
		
		if (Callback !== undefined)
		{
			Callback(localSearch.results[0]);
		}
	});

	localSearch.execute(Postcode + ", UK");
}

function StoreAddressCoordinatesUsingID(ID, Lat, Lng)
{
	xmlhttp = GetXmlHttpObject();

	if (xmlhttp != null)
	{
		var Parameters = "ListingID=" + ID + "&Latitude=" + Lat + "&Longitude=" + Lng + "&sid=" + Math.random();
		
		xmlhttp.open("POST", "UpdateListingCoordinatesUsingID.php", true);

		xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xmlhttp.setRequestHeader("Content-length", Parameters.length);
		xmlhttp.setRequestHeader("Connection", "close");

		xmlhttp.send(Parameters);
	}
}

function ShowMarkerHTML(Index)
{
	var Marker = MapMarkers[Index];
	
	Marker.openInfoWindowHtml(Marker.HTML);
}
