var geoMap = null;

var geoPoint = {

	// Properties
	Coord: '',
	Url: '',
	Img: '',
	Date: '',
	Caption: '',

	// Constructor
	create: function(geo, link, image, when, title)
	{
		this.Coord = geo;
		this.Url = link;
		this.Img = image;
		this.Date = when;
		this.Caption = title;
	}

};

var geoPoints = new Array();

function geoToggleMap(dmap, dtext, geo, tpin, tshow, thide)
{
	var mapDiv = document.getElementById(dmap);
	var txtDiv = document.getElementById(dtext);

	if ((mapDiv == null) || (txtDiv == null))
	{
		return;
	}

	if (geoMap == null)
	{
		geoGetMap(dmap, geo, tpin);
	}

	if (mapDiv.style.display == 'none')
	{
		// Show Map
		txtDiv.innerHTML = thide;
		mapDiv.style.display = '';
	}
	else
	{
		// Hide Map
		txtDiv.innerHTML = tshow;
		mapDiv.style.display = 'none';
	}
}

function geoMoveTo(sel)
{
	if (geoMap == null)
	{
		return;
	}

	var opts = sel.options;
	var index = sel.selectedIndex;

	var geo = ('' + opts[index].value);
	if (geo != '')
	{
		var lat_long = geoLatLong(geo);
		if (lat_long != null)
		{
			geoMap.PanToLatLong(lat_long);
		}
	}
}

function geoAddMapPoint(geo, date, url, img, title)
{
	geoPoints.push(new geoPoint.create(geo, url, img, date, title));
}

function geoGetMap(dmap, geo, txt)
{
	// Other settings - should be configurable?
	var zoom = 15;		// 1 - 19
	var style = 'r';	// a=aerial, h=hybrid, o=oblique (bird's eye), r=road
	var fixed = false;
	var allow_switch = true;

	var lat_long = geoLatLong(geo);
	if (lat_long != null)
	{
		geoMap = new VEMap(dmap);
		geoMap.LoadMap(lat_long, zoom, style, fixed, VEMapMode.Mode2D, allow_switch);

		geoPinMap(0, geo, txt);
	}
}

function geoRenderMap(dmap)
{
	// Other settings - should be configurable?
	var style = 'r';
	var fixed = false;
	var allow_switch = true;

	if (geoPoints.length > 0)
	{
		var geo = geoGetMidpoint();
		//alert('geoRenderMap: Using Midpoint: ' + geo);

		var lat_long = geoLatLong(geo);
		if (lat_long != null)
		{
			// Zoom all the way in - to start
			var zoom = 19;

			geoMap = new VEMap(dmap);
			geoMap.LoadMap(lat_long, zoom, style, fixed, VEMapMode.Mode2D, allow_switch);

			//alert("geoRenderMap: Number of points registered: " + geoPoints.length);

			for (var i = 0; i < geoPoints.length; i++)
			{
				geoAddJump(geoPoints[i]);

				//alert('geoRenderMap: Adding Pin ' + geoPoints[i].Coord);
				geoPinMap(i, geoPoints[i].Coord, geoPinHtml(geoPoints[i]));
			}

			setTimeout("geoFixZoom(19)", '200');
		}
	}
}

function geoAddJump(point)
{
	var sel = document.getElementById('lstPins');
	if (sel != null)
	{
		var text = '[' + point.Date + '] ' + point.Caption;
		var val = point.Coord;

		var index = sel.options.length;
		while (index > 1)
		{
			var opt = sel.options[index-1];
			sel.options[index] = new Option(opt.text, opt.value);

			index--;
		}

		sel.options[index] = new Option(text, val);
	}
}

function geoPinHtml(point)
{
	var html = '';

	html += '<a href="' + point.Url + '"><img src="' + point.Img + '" /></a><br />';
	html += '<p style="text-align:center;"><strong>' + point.Caption + '</strong><br />' + point.Date + '</p>';

	return (html);
}

function geoGetMidpoint()
{
	var min_lat = 1000, max_lat = -1000;
	var min_lon = 1000, max_lon = -1000;

	for (var i = 0; i < geoPoints.length; i++)
	{
		var parts = geoPoints[i].Coord.split(',');
		if (parts.length == 2)
		{
			var lat = parts[0].replace(/^\s+|\s+$/g, '');
			var lon = parts[1].replace(/^\s+|\s+$/g, '');

			if (lat < min_lat) min_lat = lat;
			if (lat > max_lat) max_lat = lat;
			if (lon < min_lon) min_lon = lon;
			if (lon > max_lon) max_lon = lon;
		}
	}

	//alert('geoGetMidpoint: Latitude range: ' + min_lat + ' to ' + max_lat);
	//alert('geoGetMidpoint: Longitude range: ' + min_lon + ' to ' + max_lon);

	// Ensure lat and lon are numbers
	var lat = (0 + (min_lat * 1) + (max_lat * 1)) / 2;
	var lon = (0 + (min_lon * 1) + (max_lon * 1)) / 2;

	return ('' + lat + ',' + lon);
}

function geoFixZoom(zoom)
{
	if (zoom <= 1)
	{
		return;
	}

	var min_lat = 1000, max_lat = -1000;
	var min_lon = 1000, max_lon = -1000;

	for (var i = 0; i < geoPoints.length; i++)
	{
		var parts = geoPoints[i].Coord.split(',');
		if (parts.length == 2)
		{
			var lat = parts[0].replace(/^\s+|\s+$/g, '');
			var lon = parts[1].replace(/^\s+|\s+$/g, '');

			if (lat < min_lat) min_lat = lat;
			if (lat > max_lat) max_lat = lat;
			if (lon < min_lon) min_lon = lon;
			if (lon > max_lon) max_lon = lon;
		}
	}

	//alert('Min: ' + min_lat + 'x' + min_lon);
	//alert('Max: ' + max_lat + 'x' + max_lon);

	var llRect = geoMap.GetMapView();

	var llTopLeft = llRect.TopLeftLatLong;
	var llBotRight = llRect.BottomRightLatLong;

	if (((min_lat * 1) < llTopLeft.Latitude) || ((min_lon * 1) < llTopLeft.Longitude))
	{
		// Zoom out
		//alert('Top Left Too Big: ' + llTopLeft.Latitude + 'x' + llTopLeft.Longitude);
	}
	else if ((llBotRight.Latitude < (max_lat * 1)) || (llBotRight.Longitude < (max_lon * 1)))
	{
		// Zoom out
		//alert('Bottom Right Too Small: ' + llBotRight.Latitude + 'x' + llBotRight.Longitude);
	}
	else
	{
		// Zoom level is fine - do final zoom out
		geoMap.ZoomOut();
		return;
	}

	zoom--;
	geoMap.SetZoomLevel(zoom);
	//alert('Zoom Level: ' + geoMap.GetZoomLevel());

	setTimeout("geoFixZoom(" + zoom + ")", '200');
}

function geoLatLong(geo)
{
	var lat_long = null;

	var parts = geo.split(',');
	if (parts.length == 2)
	{
		var lat = parts[0].replace(/^\s+|\s+$/g, '');
		var lon = parts[1].replace(/^\s+|\s+$/g, '');

		lat_long = new VELatLong(lat, lon);
	}

	return (lat_long);
}

function geoPinMap(id, geo, caption)
{
	if (geoMap != null)
	{
		var lat_long = geoLatLong(geo);
		if (lat_long != null)
		{
			var pin = new VEPushpin(id, lat_long, null, caption);
			geoMap.AddPushpin(pin);
		}
	}
}

