//*****************************************************************
//
// IceColdinAlex.co.uk javascript functions for Google Maps
//
//*****************************************************************
//
// function ...
//
//*****************************************************************


//*****************************************************************
//
// Functions to set and clear Location Details on add / update form
//
var locDetails = [];
var nonSysAdmin;
var newLoc;
var newAuthorUserId;
var newMapLevel;
var newAuthor;
var clearLink;

function copyLocDetails(locRowNo)
{
	var locDetail = locDetails[locRowNo];
	writeLocDetails(locDetail['locId'], locDetail['locId'], locDetail['authorUserId'], locDetail['name'], locDetail['lat'], locDetail['lng'], locDetail['mapLevel'], locDetail['iconFilename'], locDetail['author'], clearLink)
	showMarker(locDetail['locId']);
	return;
}

function clearLocDetails()
{
	writeLocDetails("", newLoc, newAuthorUserId, "", "", "", newMapLevel, "", newAuthor, "");
	return;
}

function writeLocDetails(locId, locIdDisp, authorUserId, name, lat, lng, mapLevel, iconFilename, author, clearLink)
{
	document.getElementById("gLocId").value = locId;
	document.getElementById("fLocIdDisp").innerHTML = locIdDisp;
	document.getElementById("fAuthorUserId").value = authorUserId;
	document.getElementById("fName").value = name;
	document.getElementById("fLat").value = lat;
	document.getElementById("fLng").value = lng;
	document.getElementById("fMapLevel").value = mapLevel;
	document.getElementById("fIconFilename").value = iconFilename;
	if (nonSysAdmin)
		document.getElementById("fAuthorDisp").innerHTML = author;
	document.getElementById("fClearLink").innerHTML = clearLink;
	return;
}

function showMarker(locId)
{
	var marker = locnMarkers[locnMarkerLookup[locId]];
	map.setCenter(marker.getLatLng(), Math.max(map.getZoom(), locnMinZoom));
//	marker.openInfoWindowHtml(marker.infoWindowHtml);
	map.openInfoWindowHtml(marker.getLatLng(), marker.infoWindowHtml, {pixelOffset:new GSize(2, -15)}); 
	return;
}


//*****************************************************************
//
// Function to set up Google Maps
//
var markerDetails = [];
var locnMarkerLookup = [];
var graphicDir;
var ctryFlagDir;
var showAll;
var adminMap;
var newLocMsg;
var movedLocMsg;
var ctryMarkers = [];
var locnMarkers = [];
var initialMaxZoom = 10;
var ctryMaxZoom = 4;
var locnMinZoom = ctryMaxZoom + 1;
var map;

function mapLoad()
{
	if (GBrowserIsCompatible())
	{
		var newMarker;
		var bounds = new GLatLngBounds();
		var icon;
		var locnIcons = [];

		// Create L1 marker icons (image added later)
		var ctryIcon = new GIcon();
		ctryIcon.shadow = "/" + graphicDir + "/flag-shadow.png";
		ctryIcon.iconSize = new GSize(24, 24);
		ctryIcon.shadowSize = new GSize(37, 24);
		ctryIcon.iconAnchor = new GPoint(12, 12);
		ctryIcon.infoWindowAnchor = new GPoint(12, 12);
   
		// Create L2 marker icons (image added later)
		var locnIcon = new GIcon();
		locnIcon.shadow = "/" + graphicDir + "/marker_shadow.png";
		locnIcon.iconSize = new GSize(12, 20);
		locnIcon.shadowSize = new GSize(22, 20);
		locnIcon.iconAnchor = new GPoint(6, 20);
		locnIcon.infoWindowAnchor = new GPoint(8, 5);

		locnIcons[-1] = new GIcon(locnIcon, "/" + graphicDir + "/marker_yellow.png");	// no trips
		locnIcons[0] = new GIcon(locnIcon, "/" + graphicDir + "/marker_blue.png");		// all trips
		locnIcons[1] = new GIcon(locnIcon, "/" + graphicDir + "/marker_red.png");		// selected trip
		locnIcons['new'] = new GIcon(locnIcon, "/" + graphicDir + "/marker_green.png");	// new location

		// Add markers
		for (var i in markerDetails)
		{
			var markerDetail = markerDetails[i];

			// Set icon
			if (markerDetail['mapLevel'] == 'CTRY')
				icon = new GIcon(ctryIcon, "/" + ctryFlagDir + "/" + markerDetail['iconFilename']);
			else
				icon = locnIcons[markerDetail['markerType']];

			// Create marker
			var marker = createMarker(new GLatLng(markerDetail['lat'], markerDetail['lng']), markerDetail['name'], markerDetail['label'], icon, markerDetail['markerType']);
			marker.markerNo = i;

			// Add marker to appropriate 'batch'
			if (markerDetail['mapLevel'] == 'CTRY')
				ctryMarkers.push(marker);
			else
				locnMarkers.push(marker);

			// Extend bounds
			if (showAll || markerDetail['markerType'] == 1)
				bounds.extend(marker.getPoint());
		}

		// Set up map with controls and set the initial location 
		map = new GMap2(document.getElementById("mapcanvas"));
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.addControl(new GOverviewMapControl());
		map.enableDoubleClickZoom();
        map.setCenter(new GLatLng(0, 0), 0);

		// Determine center and zoom according to bounds of markers
		map.setCenter(bounds.getCenter(), Math.min(map.getBoundsZoomLevel(bounds)-1, initialMaxZoom));

		// Add listener to create new marker on click
		if (adminMap)
		{
			// Create new marker on click
			GEvent.addListener(map, "click",
				function(marker, point)
				{
					if (!marker)
					{
						if (newMarker) mgr.removeMarker(newMarker, 0, 17);
						newMarker = createMarker(point, 'New Location', newLocMsg, locnIcons['new'], 2);
					    mgr.addMarker(newMarker, 0, 17);
						writeLocation(newMarker);
					}
				});
		}

		// Use marker manager to display map
		var mgr = new MarkerManager(map, {trackMarkers:true, borderPadding:1});
		if (adminMap)
		{
			mgr.addMarkers(ctryMarkers, 0, 17);
			mgr.addMarkers(locnMarkers, 0, 17);
		}
		else
		{
			mgr.addMarkers(ctryMarkers, 0, ctryMaxZoom);
			mgr.addMarkers(locnMarkers, locnMinZoom, 17);
		}
		mgr.refresh();
    }

    // Display a warning if the browser was not compatible
    else
	{
		alert("Sorry, the Google Maps API is not compatible with this browser");
    }


	//*****************************************************************
	//
	// Function to create a marker at a given lat/lng with a given label
	//
	function createMarker(latLng, title, label, icon, importance)
	{
		var markerOpts = {};
		markerOpts.icon = icon;
		markerOpts.title = title;
		markerOpts.zIndexProcess = importanceOrder;
		if (adminMap) markerOpts.draggable = true;

		var marker = new GMarker(latLng, markerOpts);
		marker.importance = importance;
		marker.infoWindowHtml = "<BR>" + label;

		// Open info window and write marker details to input form on click
		GEvent.addListener(marker, "click",
			function()
			{
				if (adminMap)
				{
					if (newMarker && this != newMarker) mgr.removeMarker(newMarker, 0, 17);
					writeLocation(this);
				}
				if (label)
				{
//					this.openInfoWindowHtml(this.infoWindowHtml);
					map.openInfoWindowHtml(this.getLatLng(), this.infoWindowHtml, {pixelOffset:new GSize(2, -15)}); 
				}
			});

		if (adminMap)
		{
			// Close info window on drag start
			GEvent.addListener(marker, "dragstart",
				function()
				{
					if (newMarker && this != newMarker) mgr.removeMarker(newMarker, 0, 17);
					map.closeInfoWindow();
				});

			// Write marker details to input form and change colour on drag end
			GEvent.addListener(marker, "dragend",
				function()
				{
					writeLocation(this);
					if (this != newMarker)
					{
//						this.setImage("/" + graphicDir + "/marker_green.png");	// change doesn't stick - reverts to original icon when zoom level changed
						this.infoWindowHtml = "<BR>" + movedLocMsg + "<BR>" + label;
//						this.openInfoWindowHtml(this.infoWindowHtml);
						map.openInfoWindowHtml(this.getLatLng(), this.infoWindowHtml, {pixelOffset:new GSize(2, -15)}); 
					}
				});
		}

		return marker;

		// Function to set order of marker display
		function importanceOrder()
		{
			return GOverlay.getZIndex(marker.getPoint().lat()) + marker.importance*1000000;
		}
	}


	//*****************************************************************
	//
	// Function to set up location details for new or existing marker and write back to input form
	//
	function writeLocation(marker)
	{
		var latLng = marker.getLatLng();
		var lat = latLng.lat().toFixed(4);
		var lng = latLng.lng().toFixed(4);

		if (marker == newMarker)
			writeLocDetails('', newLoc, newAuthorUserId, '', lat, lng, newMapLevel, '', newAuthor, clearLink);
		else
		{
			var markerDetail = markerDetails[marker.markerNo];
			writeLocDetails(markerDetail['locId'], markerDetail['locId'], markerDetail['authorUserId'], markerDetail['name'], lat, lng, markerDetail['mapLevel'], markerDetail['iconFilename'], markerDetail['author'], clearLink);
		}

		return;
	}
}
