var cmarkers = new Array();
var refmarker = null;
var infoWin = null;
var _mkr_icon = createIcon("red");
var _mkr_grp  = createIcon("orange_p");
function lazyLoadData(map) {
	autoMapOverview(map);
	var bounds = map.getBounds();
	var ne = bounds.getNorthEast();
	var sw = bounds.getSouthWest();
	var url = "/gallery/mapdata/?x="+Math.floor(10*sw.lng())/10+"&y="+Math.ceil(10*ne.lat())/10+"&x2="+Math.ceil(10*ne.lng())/10+"&y2="+Math.floor(10*sw.lat())/10+"&z="+map.getZoom()+"&b=18";
	GDownloadUrl(url, function(data, responseCode) {
		var xml = GXml.parse(data);
		cmarkers = new Array();
		var markers = xml.documentElement.getElementsByTagName("marker");
		if (markers.length > 0) {
			if (infoWin) {
				for (i=0; i<cmarkers.length; i++) {
					map.removeOverlay(cmarkers[i]);
				}
				infoWin = null;
			} else {
				map.clearOverlays();
				if (refmarker)
					map.addOverlay(refmarker);
			}
		}
		for (i=0; i<markers.length; i++) {
			var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
									parseFloat(markers[i].getAttribute("lng")));
			var itemID = markers[i].getAttribute("id");
			var title = markers[i].getAttribute("title");
			var url = markers[i].getAttribute("url");
			var groupsize = markers[i].getAttribute("groupsize");
			var info = GXml.value(markers[i].getElementsByTagName("info")[0]);
			var icon = _mkr_icon;
			if (groupsize) {
				title = groupsize+" panoramas";
				icon = _mkr_grp;
			}
			addMarker(map, icon, point, title, url, info, itemID, groupsize);
		}
	});
}
function autoMapOverview(map) {
	if (map.overviewMap && map.getZoom() < 2) {
		map.removeControl(map.overviewMap);
		map.overviewMap = null;
	} else if (!map.overviewMap && map.getZoom() > 1) {
		map.overviewMap = new GOverviewMapControl();
		map.addControl(map.overviewMap, new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10, 10)));
	}
}
function addRefMarker(map, point, itemID, title) {
	var marker = createPanoMarker(point, {draggable: false, title: title}, null, null, itemID, null);
	map.addOverlay(marker);
	refmarker = marker;
}
function addMarker(map, icon, point, title, url, info, itemID, groupsize) {
	var found = false;
	if (refmarker && refmarker.getPoint().toUrlValue() == point.toUrlValue() && refmarker.itemID == itemID) {
		return;
	}
	for (j=0; j<cmarkers.length; j++) {
		if (cmarkers[j].getPoint().toUrlValue() == point.toUrlValue() && cmarkers[i].itemID == itemID) {
			found = true;
		}
	}
	if (!found) {
		var m = createPanoMarker(point, {icon: icon, draggable: false, title: title}, url, info, itemID, groupsize);
		cmarkers.push( m );
		map.addOverlay( m );
	}
}
function createPanoMarker(point, options, url, info, itemID, gsize) {
	var m = new GMarker(point, options);
	m.itemID = itemID;
	m.url = url;
	m.info = info;
	m.groupsize = gsize;
	return m;
}
function createIcon(col) {
	var i = new GIcon();
	i.image = "/images/google/mm_20_"+col+".png";
	i.shadow = "/images/google/mm_20_shadow.png";
	i.iconSize = new GSize(12, 20);
	i.shadowSize = new GSize(22, 20);
	i.iconAnchor = new GPoint(6, 20);
	i.infoWindowAnchor = new GPoint(5, 1);
	return i;
}
function autoZoom(map, overlay, point) {
	if (!overlay && point) {
		map.setCenter(point, map.getZoom()+1);
	} else if (overlay.url) {
		window.location=overlay.url;
	} else if (overlay.info && map.getZoom() > 10) {
		overlay.openInfoWindowHtml(overlay.info);
		infoWin=1;
	} else if (overlay.groupsize) {
		map.setCenter(overlay.getPoint(), map.getZoom()+1);
	}
}
function createmap(n) {
	var m = new GMap2(getEl(n), {draggableCursor: 'crosshair', draggingCursor: 'pointer'});
	m.enableContinuousZoom();
	m.enableDoubleClickZoom();
	m.addControl(new GLargeMapControl());
	m.addControl(new GMapTypeControl());
	return m;
}
function getEl(n) {
	return document.getElementById(n);
}
function show(n) {
	var e = getEl(n);
	e.style.display = 'block';
}
function nomap() {
	var m = getEl("map");
	m.innerHTML = "<p><small>The interactive Google map normally shown here is incompatible with your web browser</small></p>";
	m.style.height="2.5em;";
}
function isLocation() {
	var e = getEl("nolocation");
	if (getEl("longitude").value || getEl("lattitude").value) {
		e.checked = false;
	} else {
		e.checked = true;
	}
}
function clkLocation(lat, lng) {
	getEl("longitude").value=lng;
	getEl("lattitude").value=lat;
	isLocation();
}
function typLocation() {
	var lng = getEl("longitude").value;
	var lat = getEl("lattitude").value;
	var oor=0;
	if (lat && (lat > 90 || lat < -90)) {
		lat=null;
		oor=1;
	}
	if (lng && (lng > 180 || lng < -180)) {
		lng=null;
		oor=1;
	}
	clkLocation(lat,lng);
	if (oor) {
		alert("Co-ordinates are out of range!\nLongitude must be between -180 and +180 degrees.\nLattitude must be between -90 and +90 degrees.");
	}
	else if (lat && lng && map)
	{
		var pos = new GLatLng(lat, lng);
		map.clearOverlays();
		var marker = new GMarker(pos, {draggable: true});
		GEvent.addListener(marker, "dragstart", function() {
			map.closeInfoWindow();
		});
		GEvent.addListener(marker, "dragend", function() {
			map.panTo(marker.getPoint());
			clkLocation(marker.getPoint().lat(), marker.getPoint().lng());
		});
		map.addOverlay(marker);
		if (map.getZoom() < 8) {
			map.setCenter(pos, 10);
		} else {
			map.panTo(pos);
		}
	}
}
function removeLocation() {
	var sure = false;
	if (getEl("longitude").value) {
		if (confirm("Are you sure you want to remove the currently selected geo-coordinates for this panorama?")) {
			sure = true;
		}
	} else {
		sure = true;
	}
	if (sure) {
		if (map) {
			map.clearOverlays();
			var center = new GLatLng(0, 0);
			map.setCenter(center, 1);
		}
		getEl("longitude").value="";
		getEl("lattitude").value="";
	}
}
function markableMap(map) {
	GEvent.addListener(map, "click", function(marker, point) {
		if (marker) {
			map.removeOverlay(marker);
		} else {
			map.clearOverlays();
			var marker = new GMarker(point, {draggable: true});
			GEvent.addListener(marker, "dragstart", function() {
				map.closeInfoWindow();
			});
			GEvent.addListener(marker, "dragend", function() {
				map.panTo(marker.getPoint());
				clkLocation(marker.getPoint().lat(), marker.getPoint().lng());
			});
			map.addOverlay(marker);
			map.panTo(marker.getPoint());
			clkLocation(marker.getPoint().lat(), marker.getPoint().lng());
		}
	});
}
