var gmarkers = [];
var gpolygons = [];

function onMarkerClick(marker, html) {
	marker.openInfoWindowHtml(html);
}

function onMarkerInfoWindowOpen(i) {
	highlightPolygons(i);
}

function onMarkerInfoWindowClose(i) {
	unhighlightPolygons(i);
}

function onPolygonClick(i) {
	GEvent.trigger(gmarkers[i], "click")
}

function sidebarClick(i) {
	GEvent.trigger(gmarkers[i], "click");
}

function highlightPolygons(i) {
	modifyPolygons(i, {
		color: "#0000FF",
		weight: 2,
		opacity: 0.3
	});
}

function unhighlightPolygons(i) {
	modifyPolygons(i, {
		color: "#FF0000",
		weight: 1,
		opacity: 0.2
	});
}

function modifyPolygons(i, style) {
	polygons = gpolygons[i];
	for (var j = 0; j < polygons.length; j++) {
		poly = polygons[j];
		poly.setStrokeStyle(style);
	}
}

function load(xmlfile) {
	if (GBrowserIsCompatible()) {
		function loadXMLfile(doc, response) {
			var xmlDoc = GXml.parse(doc);
			var markers = xmlDoc.documentElement.getElementsByTagName("marker");

			bounds = [360, 360, -360, -360];

			side_bar_html = '<ul>\n';
			for (var i = 0; i < markers.length; i++) {
				var lat = parseFloat(markers[i].getAttribute("lat"));
				var lon = parseFloat(markers[i].getAttribute("lon"));
				updateBounds(bounds, lat, lon);
				var point = new GLatLng(lat, lon);
				var contents = markers[i].getElementsByTagName("content");
				var html = '';
				for (var j = 0; j < contents.length; j++) {
					for (var k = 0; k < contents[j].childNodes.length; k++) {
						html += contents[j].childNodes[k].nodeValue;
					}
				}
				var label = markers[i].getAttribute("label");
				var marker = createMarker(point, label, html);
				map.addOverlay(gmarkers[i]);

				createPolygonSet(map, markers[i].getElementsByTagName("polygon"));
			}
			centerMap(map, bounds);

			side_bar_html += '</ul>\n';
			document.getElementById("side_bar").innerHTML = side_bar_html;
		}

		function createMarker(point,name,html) {
			var marker = new GMarker(point);
			gmarkers.push(marker);
			var index = gmarkers.length - 1;

			title = '<b>' + name + '</b><br />';
			html = title + html;

			GEvent.addListener(marker, "click", function() {
				onMarkerClick(marker, html);
			});
			GEvent.addListener(marker, "infowindowopen", function() {
				onMarkerInfoWindowOpen(index);
			});
			GEvent.addListener(marker, "infowindowclose", function() {
				onMarkerInfoWindowClose(index);
			});

			side_bar_html += '<li><a href="javascript:sidebarClick(' +
				(index) + ')">' + name + '</a></li>\n';
			
			return index;
		}

		function createPolygonSet(map, polyNodes) {
			var polygons = [];
			var index = gpolygons.length;
			for (var i = 0; i < polyNodes.length; i++) {
				var levels = polyNodes[i].getAttribute("levels");
				var points = polyNodes[i].getAttribute("points");
				var polygon = new GPolygon.fromEncoded({
					polylines: [
					            {
					            	points: points,
					            	levels: levels,
					            	zoomFactor: 32,
					            	numLevels: 4,
					            	color: "#FF0000",
					            	weight: 1,
					            	opacity: 0.2
					            }
					            ],
					            fill: false,
					            outline: true
				});
				polygons.push(polygon);
				map.addOverlay(polygon);
    			GEvent.addListener(polygon, "click", function() {
    				onPolygonClick(index);
    			});
    		}
			gpolygons.push(polygons); 
		}

		function centerMap(map, bounds) {
			var sw = new GLatLng(bounds[0], bounds[1]);
			var ne = new GLatLng(bounds[2], bounds[3]);
			var gmbounds = new GLatLngBounds(sw, ne);
			var zoom = map.getBoundsZoomLevel(gmbounds);
			var avg_lat = 0.5 * (bounds[0] + bounds[2]);
			var avg_lon = 0.5 * (bounds[1] + bounds[3]);
			var center = new GLatLng(avg_lat, avg_lon);
			map.setCenter(center, zoom);
		}

		function updateBounds(bounds, lat, lon) {
			bounds[0] = Math.min(bounds[0], lat);
			bounds[1] = Math.min(bounds[1], lon);
			bounds[2] = Math.max(bounds[2], lat);
			bounds[3] = Math.max(bounds[3], lon);
		}

		var side_bar_html = '';
		var map = new GMap2(document.getElementById("map"));

		// Map must be centered before certain other actions can be taken
		map.setCenter(new GLatLng(0, 0), 9);

		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.enableScrollWheelZoom();

		GDownloadUrl(xmlfile, loadXMLfile);
	} else {
		alert("Sorry, the Google Maps API is not compatible with this browser.");
	}
}