
	var map;
	var mapDivID = "map";
	var markerHash = new Object();
	var cityMarkers = new Array();
	var autoCompleteMarker;
	var showControls = true;
	var showMarkers = true;
	
	var daffy;
	var lastLat = 0;
	var lastLon = 0;
	window.onload = chillASec;
	if (window.GUnload) {window.onunload = window.GUnload;}
	//initMap();
	//var request = GXmlHttp.create();
	var wideScreen = true;
	var cancelZoom = false;
	
	var mapClickListener;

	function chillASec()
	{
		setTimeout("initMap()", 500);
	}
	
	function initMap()
	{
		if (!window.GXmlHttp)
		{
			// no connectivity to GMaps.  Best bail.
			return;
		}
		
		request = GXmlHttp.create();

		document.FinderForm	= document.forms[0];
		
		var zoom = 10;
		map = new GMap2(document.getElementById("map"));
		//map.enableContinuousZoom();

		if (document.CityFinder)
		{
			zoom = parseInt(document.CityFinder.zoom.value);

			initOverlayControls(false, true);

			// drop the simple satellite type and replace it with Terrain
			map.removeMapType(G_SATELLITE_MAP);
			map.addMapType(G_PHYSICAL_MAP);

			if (document.CityFinder && document.CityFinder.x && document.CityFinder.x.value != "")
			{
				map.setCenter(new GLatLng(document.CityFinder.y.value, document.CityFinder.x.value), zoom);
			}
			else
			{
				map.setCenter(new GLatLng(13.6, 100), 10);
			}

			// order is important when initializing the map.  map type needs to come before zooming.
			if (document.CityFinder.mapType.value != "")
			{
				var mapType = map.getMapTypes()[document.CityFinder.mapType.value];
				map.setMapType(mapType);
			}
			else
			{
				map.setMapType(map.getMapTypes()[2]);
			}
		}
		else
		{
			map.setCenter(new GLatLng(13.6, 100), 10);
			map.setMapType(map.getMapTypes()[0]);
		}


		mapClickListener = GEvent.bind(map, "click", this, zoomIn);
		GEvent.bind(map, "zoomend", this, onMapZoom);
		GEvent.bind(map, "moveend", this, onMoveEnd);
		GEvent.bind(map, "maptypechanged", this, onMapTypeChanged);

		//map.addControl(new GSmallMapControl());
		//map.addControl(new GMapTypeControl());
		
		// call this to force the city list to populate
		onMoveEnd();
		
		window.onresize = onWindowResize;
		onWindowResize();	


		// fire onMapInit event if it has been hooked up
		if (window.onMapInit)
		{
			window.onMapInit(map, request);
		}
	}
	
	function onWindowResize()
	{
		// TODO - re-impliment this
		return;
		
		var mapDiv = document.getElementById("map");
		var mapControls = document.getElementById("mapControls");
		var divCities = document.getElementById("divCities");
		var divResults = document.getElementById("divResults");
		var tblNavBar = document.getElementById("navBar_tblNavBar");
		var divRightNav = document.getElementById("divRightNav");

		if ((document.body.clientWidth <= 1000) && wideScreen)
		{
		
			mapDiv.style.width = "620px";
			mapDiv.style.height = "300px";
			mapControls.style.width = "622px";
			tblNavBar.style.width = "815px";
			
			divCities.style.height = "220px";
			divResults.style.height = "220px";
			
			divRightNav.style.display = "none";
			
			map.checkResize();
			wideScreen = false;

			if (window.onCityFinderWindowResize)
			{
				window.onCityFinderWindowResize();
			}
		}
		else if ((document.body.clientWidth > 1000) && !wideScreen)
		{
			mapDiv.style.width = "805px";
			mapDiv.style.height = "500px";
			mapControls.style.width = "807px";
			tblNavBar.style.width = "1000px";
			//tblNavBar.style.marginRight = "0px";

			divCities.style.height = "420px";
			divResults.style.height = "420px";

			divRightNav.style.display = "block";

			map.checkResize();
			wideScreen = true;
			
			if (window.onCityFinderWindowResize)
			{
				window.onCityFinderWindowResize();
			}
		}
	}

	
	function onMapZoom(oldZoom, newZoom)
	{
	//alert(map.getCurrentMapType().getMinimumResolution());
	//alert(map.getCurrentMapType().getMaximumResolution());
	
	//map.getCurrentMapType().getMaximumResolution = function(){return 20;}
	

		if (newZoom > 15)
		{
			//map.setZoom(15);
		}
		if (document.CityFinder && document.CityFinder.zoom)
		{
			document.CityFinder.zoom.value = map.getZoom();
		}

		// fire onCityFinderZoom event if it has been hooked up
		if (window.onCityFinderZoom)
		{
			window.onCityFinderZoom(oldZoom, newZoom);
		}
		
		//EnsureImageryExists();
		
	}
	
	function onMoveEnd()
	{
	
		var bounds = map.getBounds();
		var url = "/FeatureList.aspx?minX=" + bounds.getSouthWest().lng() 
					+ "&minY=" +bounds.getSouthWest().lat()
					+ "&maxX=" + bounds.getNorthEast().lng()
					+ "&maxY=" + bounds.getNorthEast().lat()
					+ "&zoom=" + map.getZoom();

		request.open('GET', url, true);
		request.onreadystatechange = callback_FeatureList;
		request.send(null);
		
		if (document.CityFinder && document.CityFinder.x)
		{
			var center = map.getCenter();
			document.CityFinder.x.value = center.x;
			document.CityFinder.y.value = center.y;
			//document.CityFinder.zoom.value = map.getZoom();
		}
		
		//document.getElementById("tblResults").style.visibility = "hidden";
		//window.open(url, 'testwindow');

		// fire onCityFinderMoveEnd event if it has been hooked up
		if (window.onCityFinderMoveEnd)
		{
			window.onCityFinderMoveEnd();
		}

	}

	
	function onMapTypeChanged()
	{
		document.CityFinder.mapType.value = currentMapTypeIndex(map);

		// fire onCityFinderMapTypeChanged event if it has been hooked up
		if (window.onCityFinderMapTypeChanged)
		{
			window.onCityFinderMapTypeChanged();
		}
	}
	
	function currentMapTypeIndex(map)
	{ 
		var types = map.getMapTypes();
		for(var ix=0; ix<map.getMapTypes().length; ix++)
		{ 
			if	(types[ix] == map.getCurrentMapType())
			{ 
				return ix; 
			}
		} 
		return -1; 
	}

	function zoomIn(overlay, point)
	{
		if (!cancelZoom)
		{
			var newZoom = parseInt(map.getZoom()) + 1
			if (point)
			{
				map.setCenter(point, newZoom);
			}
			else
			{
				map.setZoom(newZoom);
			}
		}
		cancelZoom = false;
	}
	
	function zoomOut()
	{
		map.setZoom(parseInt(map.getZoom()) - 1);
	}
	
	function setMapType(index)
	{
		map.setMapType(map.getMapTypes()[index]);
	}



/*
	function addFeature(lat, lon, id, name)
	{
		//recenter(lat, lon, id, name);
		renderFeature(lat, lon, id, name);
	}
*/

	function renderFeature(lon, lat, id, name)
	{
		var point = new GLatLng(parseFloat(lat), parseFloat(lon));
		var marker = new GMarker(point, starMarker);
		marker.placeName = name;

		map.addOverlay(marker);

		if (name != "")
		{
			GEvent.clearListeners(marker, "click");
			GEvent.addListener(marker, "click", function() {
				marker.openInfoWindowHtml(marker.placeName);
			});

			//marker.openInfoWindowHtml(marker.placeName);
		}
	}
	
	function renderLinkMarker(lon, lat, cityID, locationID, name, commentCount, imageCount, index)
	{
		if (isNaN(lon) || isNaN(lat))
		{
			return;
		}

		var marker = cityMarkers[index];
		if (!marker)
		{
			var point = new GLatLng(parseFloat(lat), parseFloat(lon));
			var marker = new GMarker(point, cityMarker);
			//var marker = new CityMarker(point, cityMarker);
			marker.placeName = name;
			marker.commentCount = commentCount;
			marker.imageCount = imageCount;

			map.addOverlay(marker);
			cityMarkers[index] = marker;
			//marker.iconImage.setAttribute("title", name);

			marker.labelDiv = document.createElement("DIV");
			marker.labelDiv.className = "markerLabel"
			var anchor = document.createElement("A");
			anchor.className = "navlink";
			marker.labelDiv.appendChild(anchor);
			
			if (index == 0)
			{
				//dump(marker);
				//alert(marker.getPane);
				//dump(map.getPane(G_MAP_MARKER_PANE));
				//alert(marker.cb.src);
				//alert(map.fromLatLngToDivPixel(marker.getPoint()));
			}
/*			
*/			
		}
		else
		{
			if (index == 0)
			{
				//alert(map.fromLatLngToDivPixel(marker.getPoint()));
			}

			//marker.display(true);
			marker.setPoint(new GLatLng(lat, lon));
			marker.placeName = name;
			marker.commentCount = commentCount;
			marker.imageCount = imageCount;
			//marker.iconImage.setAttribute("title", name);
			marker.redraw(true); 

		}

		updateMarkerLabel(marker, cityID, locationID, name);


		return marker;		
	}


	function renderCountryMarker(lon, lat, id, name, commentCount, imageCount, index)
	{
		var marker = renderLinkMarker(lon, lat, id, null, name, commentCount, imageCount, index);

		updateMarkerLabel(marker, id, null, name, "selectCountry");
		
		GEvent.clearListeners(marker, "click");
		GEvent.addListener(marker, "click", function() {
			selectCountry(marker.getPoint().y, marker.getPoint().x, id, marker.placeName);
		});
		
	}	
	
	
	
	
	
	function renderCityMarker(lon, lat, cityID, locationID, name, commentCount, imageCount, index)
	{
	
		if (isNaN(lon) || isNaN(lat))
		{
			return;
		}

		var marker = renderLinkMarker(lon, lat, cityID, locationID, name, commentCount, imageCount, index);
		updateMarkerLabel(marker, cityID, locationID, name, "selectCity");

		GEvent.clearListeners(marker, "click");
		GEvent.addListener(marker, "click", function() {
			selectCity(marker.getPoint().y, marker.getPoint().x, cityID, locationID, marker.placeName);
		});
		
	}

	function updateMarkerLabel(marker, cityID, locationID, name, functionName)
	{
		marker.labelDiv.style.visibility = "visible";
		if (marker.labelDiv.childNodes.length == 1)
		{
			var nameHtml = name;
			var anchor = marker.labelDiv.childNodes[0];
			if (marker.commentCount > 0 || marker.imageCount > 0)
			{
				nameHtml = name + "<br/>";
				if (marker.commentCount > 0)
				{
					nameHtml += "<img src='/images/commentSmall.gif' border=0/> " + marker.commentCount
				}
				if (marker.imageCount > 0)
				{
					nameHtml += "&nbsp;&nbsp;<img src='/images/cameraSmall.gif' border=0/> " + marker.imageCount
				}
			}
			anchor.href="javascript:" + functionName + "(" + marker.getPoint().y + "," + marker.getPoint().x + ",'" + cityID + "','" + locationID + "','" + name.replace("'", "") + "');";
			anchor.onmousedown = new Function ("evt", "cancelZoom=true;"  ); 	// for IE
			anchor.innerHTML = nameHtml;
		}
		
		marker.labelDiv.style.position = "absolute";
		var offsetPoint = map.fromLatLngToDivPixel(marker.getPoint());
		var x = (offsetPoint.x > map.getSize().x) ? offsetPoint.x - map.getSize().x : offsetPoint.x
		marker.labelDiv.style.left = (x - 30) + "px";
		marker.labelDiv.style.top = (offsetPoint.y + 5) + "px";
		map.getPane(G_MAP_FLOAT_SHADOW_PANE).appendChild(marker.labelDiv);
		




	}
	
	function hideCityMarker(index)
	{
		var marker = cityMarkers[index];
		if (marker)
		{
			//marker.getPoint().y = -200;
			//marker.display(false);
			marker.setPoint(new GLatLng(-200, 0));
			marker.labelDiv.style.visibility = "hidden";
		}
	}

	function callback_FeatureList()
	{
		if (request && request.readyState == 4) 
		{
			var xmlDoc = GXml.parse(request.responseText);
			if (xmlDoc && xmlDoc.documentElement)
			{
				//renderContent(xmlDoc.documentElement.getElementsByTagName("content"));
				renderMarkers(xmlDoc.documentElement.getElementsByTagName("marker"));
			}
		}
	}

	function renderMarkers(markers)
	{

		for (var i = 0; i < markers.length; i++) 
		{
			if (!showMarkers)
			{
				hideCityMarker(i);
				continue;
			}
			
			var cityID = parseInt(markers[i].getAttribute("cityID")); 
			var locationID = parseInt(markers[i].getAttribute("locationID")); 
			
			if (isNaN(cityID) && isNaN(locationID))
			{				
				renderCountryMarker( parseFloat(markers[i].getAttribute("lon"))
							, parseFloat(markers[i].getAttribute("lat"))
							, markers[i].getAttribute("countryCode")
							, markers[i].getAttribute("countryName") 
							, parseInt(markers[i].getAttribute("commentCount"))
							, parseInt(markers[i].getAttribute("imageCount"))
							, i);
			}						
			else
			{
				renderCityMarker( parseFloat(markers[i].getAttribute("lon"))
							, parseFloat(markers[i].getAttribute("lat"))
							, cityID
							, isNaN(locationID) ? '0' : locationID
							, markers[i].getAttribute("cityName") 
							, parseInt(markers[i].getAttribute("commentCount"))
							, parseInt(markers[i].getAttribute("imageCount"))
							, i);
			}
	    }
	    for (var i = markers.length; i<20; i++)
	    {
			hideCityMarker(i);
	    }

	}
	
	function toggleShowMarkers()
	{
		showMarkers = !showMarkers;
		callback_FeatureList();
		
		var mapControls = document.getElementById("mapControls");
		if (mapControls)
		{
			mapControls.src = showMarkers ? "/images/mapControls_narrow_show.gif" : "/images/mapControls_narrow_hide.gif"
		}
	}
	
	function ParseCDATA(cData)
	{
		// 123456789.....123
		// <![CDATA[ ... ]]>
		return cData.substr(9, cData.length - 9 - 3);
	}	
	
	
	function SelectedFeature_onchange(cityID, displayName, lon, lat)
	{
		
		var point = new GLatLng(parseFloat(lat), parseFloat(lon));
		if (!autoCompleteMarker)
		{
			autoCompleteMarker = new GMarker(point, starMarker);
			map.addOverlay(autoCompleteMarker);
		}
		autoCompleteMarker.setPoint(new GLatLng(lat, lon));
		autoCompleteMarker.placeName = displayName;
		//autoCompleteMarker.iconImage.setAttribute("title", displayName);
		autoCompleteMarker.redraw(true); 

		if (displayName && displayName != "")
		{
			autoCompleteMarker.openInfoWindowHtml(autoCompleteMarker.placeName);
		}
		
	}


	var testImage = new Image();
//	testImage.onreadystatechange = testImage_callback;
	function EnsureImageryExists()
	{
		// get the url for the tile in the upper left hand corner for this zoom level.
		var url = map.spec.getTileURL(map.topLeftTile.x, map.topLeftTile.y, map.zoomLevel);
		//url = url.replace("mt1","mt0");
		//alert(url);

		// try to load it		
		window.testTimeout = setTimeout("testImage_timeout()", 300);
		testImage.src = url;
		testImage.onreadystatechange = function(){clearTimeout(window.testTimeout);};
		
	}
	
	function testImage_callback()
	{
		// We don't need to wait for the image to be downloaded.
		// We just need confirmation from the server that it's not 404.
		clearTimeout(window.testTimeout);
	}

	function testImage_timeout()
	{
		//alert("gave up on:" + testImage.src);
		zoomOut();
//		window.testTimeout = null;
		
	}

	var dumpWindow;
	function dump(obj)
	{
		if (dumpWindow)
		{
			dumpWindow.close();
		}
		
		dumpWindow = window.open('info.txt','dumpWindow');

//dumpWindow.document.write(map.spec.getTileURL(0,0,15) + "<br><br>");
//dumpWindow.document.write(map.spec.emptyTileUrl);

		//alert(map.createErrorTile());
		//obj=map.createErrorTile()
		//obj = map.spec;
		
		for (key in obj)
		{
			dumpWindow.document.write(key + ":" + obj[key] + "<br><br>");
			
		}
		dumpWindow.document.write("<hr><hr><hr><hr><hr>");
		
		window.focus();
	}

