

	var mapExpand = false;
	var showControls = true;
	var mapDivID = "map";
	var map;
	var lastLat = 0;
	var lastLon = 0;
	var minLat = 180;
	var minLon = 180;
	var maxLat = -180;
	var maxLon = -180;
	var cancelZoom = false;
	
	var markerHash = new Object();
	var request;


	
	// NOTE: If this breaks on IE and nothing else, it's probably a problem with the HTML tag.
	function initMap()
	{
		if (!window.GXmlHttp)
		{
			// no connectivity to GMaps.  Best bail.
			return;
		}
		
		request = GXmlHttp.create();

		initOverlayControls(true, false);

		map = new GMap2(document.getElementById(mapDivID));
		//initCrosshair();

		// drop the simple satellite type and replace it with Terrain
		map.removeMapType(G_SATELLITE_MAP);
		map.addMapType(G_PHYSICAL_MAP);

		map.setCenter(new GLatLng(15, 88), 15);
		map.setMapType(G_PHYSICAL_MAP);

		// Drop itinerary markers and path
		overlayFeatureMarkers();

		setCenter();

		GEvent.bind(map, "click", this, zoomIn);
		//map.addControl(new GSmallMapControl());
		//map.addControl(new GMapTypeControl());

		if(window.ItineraryMap_PostInit)
		{
			window.ItineraryMap_PostInit();
		}
	}

	//function renderFeature(lat, lon, id, name, markerType, zoomCalc)
	function renderFeature(feature)
	{

//alert(lat + ", " + lon + ", " + id + ", " + name + ", " + markerType + ", " + zoomCalc);
		if (isNaN(feature.lat) || isNaN(feature.lon) || isNaN(feature.id))
		{
			return;
		}

		var markerIcon = commentMarker;
		if (feature.markerType == "photo")
		{
			markerIcon = cameraMarker;
		}
		else if (feature.markerType == "waypoint")
		{
			markerIcon = dotMarker;
		}
		
		var point = new GLatLng(feature.lat, feature.lon);
		var marker = new GMarker(point, markerIcon);
		marker.locationName = feature.name;

		map.addOverlay(marker);
		markerHash[feature.id] = marker;

		if (feature.markerType != "waypoint")
		{
			GEvent.addListener(marker, "click", function() {
				//marker.openInfoWindowHtml(marker.locationName);
				//cancelZoom = true;
				
				// HACK - map click is firing before marker click.  Need to undo what just happened.
				// TODO - check if we're already max zoomed in.  
				zoomOut();
				LoadContentService.LoadUserContentByLocation(viewingUserID, feature.id, "divContentInner");
			});
		}

		if (!feature.isNewTrip && lastLat != 0 && lastLon != 0 && feature.markerType != "photo")
		{
			var polyline = new GPolyline([new GLatLng(lastLat, lastLon),
							new GLatLng(feature.lat, feature.lon)],
							"#000080", 4);
			map.addOverlay(polyline);

			polyline = new GPolyline([new GLatLng(lastLat, lastLon),
							new GLatLng(feature.lat, feature.lon)],
							"#ff8000", 2, 1);
			map.addOverlay(polyline);
		}

		lastLat = feature.lat;
		lastLon = feature.lon;
		
		if (feature.zoomCalc == 1)
		{
			if (feature.lat < minLat)
				minLat = feature.lat;
			if (feature.lon < minLon)
				minLon = feature.lon;
			if (feature.lat > maxLat)
				maxLat = feature.lat;
			if (feature.lon > maxLon)
				maxLon = feature.lon;
		}
			
	}	
	
	function overlayFeatureMarkers(markerXML)
	{

	
		var markerXML = document.getElementById("divMarkerXML").innerHTML;

		markerHash = new Object();
		var xmlDoc = GXml.parse(markerXML);
		if (xmlDoc && xmlDoc.documentElement)
		{

			var markers = xmlDoc.documentElement.getElementsByTagName("marker");
			if (markers.length == 0)
			{
				// FireFox doesn't like uppercase tagnames.  IE doesn't like lowercase.
				markers = xmlDoc.documentElement.getElementsByTagName("MARKER");
			}

			for (var i = 0; i < markers.length; i++) 
			{
				var feature = new ItineraryFeature(parseFloat(markers[i].getAttribute("lat"))
								, parseFloat(markers[i].getAttribute("lon"))
								, parseInt(markers[i].getAttribute("locationid"))
								, markers[i].getAttribute("locationname") 
								, markers[i].getAttribute("markertype")
								, markers[i].getAttribute("zoomcalc")
								, markers[i].getAttribute("isnewtrip")
								, parseInt(markers[i].getAttribute("commentid"))
								, parseInt(markers[i].getAttribute("imageid"))
								);
				renderFeature(feature);
/*								
				renderFeature( parseFloat(markers[i].getAttribute("lat"))
								, parseFloat(markers[i].getAttribute("lon"))
								, parseInt(markers[i].getAttribute("locationid"))
								, markers[i].getAttribute("locationname") 
								, markers[i].getAttribute("markertype")
								, markers[i].getAttribute("zoomcalc")
								);
*/								
			}
		}
	}
	
	function setCenter()
	{
		if (window.itineraryMapCenter)
		{
			map.setCenter(new GLatLng(itineraryMapCenter.lat, itineraryMapCenter.lon), 6);
			return;
		}
	
		var center = new GLatLng( (maxLat+minLat)/2, (maxLon+minLon)/2 );
		var bounds = new GLatLngBounds(
							new GLatLng(maxLat, minLon)
							, new GLatLng(minLat, maxLon)
							);
							
		var minZoom = map.getBoundsZoomLevel(bounds);
		if (minZoom < 2)
		{
			minZoom = 2;
		}
		if (minZoom > 8)
		{
			minZoom = 8;
		}
		
		map.setCenter(center, minZoom);
	}
	
	function zoomIn(overlay, point)
	{
//alert("zoomin click");

		if (!cancelZoom)
		{
			var newZoom = parseInt(map.getZoom()) + 1
			if (point)
			{
				map.setCenter(point, newZoom);
			}
			else
			{
				map.setZoom(newZoom);
			}
		}
		else
		{
			//alert("not zooming");
		}
		
		cancelZoom = false;
	}
	
	function zoomOut()
	{
		map.setZoom(parseInt(map.getZoom()) - 1);
	}
	
	function setMapType(index)
	{
		map.setMapType(map.getMapTypes()[index]);
	}

	

	function chillASec()
	{
		setTimeout("initMap()", 500);
	}
	
	
	window.onload = chillASec;
	if (window.GUnload) {window.onunload = window.GUnload;}



function ItineraryFeature(lat, lon, id, name, markerType, zoomCalc, isNewTrip, commentID, imageID)
{
	this.lat = parseFloat(lat);
	this.lon = parseFloat(lon);
	this.id = id;
	this.name = name;
	this.markerType = markerType;
	this.zoomCalc = zoomCalc;
	this.isNewTrip = (isNewTrip=="true") ? true : false;
	this.commentID = commentID;
	this.imageID = imageID;
}

