/*
	Athene Map client scripts
	
	Google Maps implementation.
*/

var mouseX;
var mouseY;

var isOnMarker = false;
var map;
var geocoder;

var overlays = new Array();

/*
	Load the maps on startup
*/
document.onload = setTimeout('loadMaps();', 200);

function loadMaps() 
{	
	// Record the mouse position
	document.onmousemove = recordMouse;
	document.onunload = GUnload();
	
	if (GBrowserIsCompatible()) 
	{
		if (markerCreateMode)
		{
			// Set alternative cursor
			map = new GMap2(document.getElementById("map"), {draggableCursor: 'pointer'});
		}
		else
		{
			map = new GMap2(document.getElementById("map"));
		}
		map.enableDoubleClickZoom();
		map.enableContinuousZoom();
		map.enableScrollWheelZoom();
		map.enableInfoWindow();
		
		// Prevent scrolling the webpage when scrolling on the map		
		GEvent.addDomListener(map.getContainer(), "DOMMouseScroll", preventPageScroll);
		document.getElementById("map").onmousewheel = preventPageScroll;
		
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl(true));
		
		// Center the map on Europe
		map.setCenter(new GLatLng(initLat, initLng), initZoom); // TODO: error? initLat = not defined
		
		// Create a marker on click modus
		if (markerCreateMode)
		{
			GEvent.addListener(map, "click", function(marker, point)
			{
				// Transform point, so you click exactly in the middle.
				gPoint = map.fromLatLngToDivPixel(point);
				gPoint = new GPoint(gPoint.x + 6, gPoint.y + 6);
				point = map.fromDivPixelToLatLng(gPoint);
				
				clearAllMarkers();
				var marker = addHTMLMarker(point.lat(), point.lng(), '', URL_MARK_PLACED_HERE, 0);
				
				// Fire event
				eventMarkerAdded(marker.getPoint().lat(), marker.getPoint().lng());
			});
		}
		else
		{			
			retrieveMarkers();
			
			// Add event to retrieve markers each time
			GEvent.addListener(map, "moveend", function()
			{
				// Fires both with move and with zoom
				retrieveMarkers();
			});
		}
		
		// Load the geocoder
		geocoder = new GClientGeocoder();
		
		// Broadcast event
		mapLoaded();
	}
}

function markersLoaded()
{			
	setMarkerBorders();
}

function setMarkerBorders()
{				
	// Set marker borders (hack)				
	var elements = document.getElementsByTagName('img');
	var i = 0;
		
	for (i = 0; i < elements.length; i++)
	{
		if (elements[i].id.substring(0, 12) == 'mtgt_unnamed')
		{
			elements[i].style.border = 'solid 1px white';
		}
	}
}

function preventPageScroll(e)
{
	if (navigator.userAgent.indexOf("MSIE") == -1)
	{		
		if (e.preventDefault)
		{
			e.preventDefault();
		}
		if (e.returnValue)
		{
			e.returnValue = false;
		}
	}
	else
	{
		return false;
	}
}
	
/*
	Record window mouse positions 
*/
function recordMouse(e)
{
	if (!e) {e = window.event}
	var m = document.getElementById("map");
	
	if (e.pageX)
	{
		mouseX = e.pageX;
		mouseY = e.pageY;
	}
	else
	{
		mouseX = window.event.x + document.body.scrollLeft + getX(m);
		mouseY = window.event.y + document.body.scrollTop + getY(m);
	}
	
	if (isOnMarker)
	{	
	}
}

/*
	Mouse over flying div
*/
document.getElementById("flydiv").onmouseover = function onMouseOverFlyDiv()
{
	showFlyDiv();
}
document.getElementById("flydiv").onmouseout = function onMouseOutFlyDiv()
{
	hideFlyDiv();
}

/*
	Creates a marker
*/

function addMarker(lat, lng, url, id, name, description, image)
{		
	var displayUrl = url;
	if (displayUrl.length > 50)
	{
		displayUrl = displayUrl.substring(0, 50) + '...';
	}
	
	var html = "<table cellspacing='0' cellpadding='0'><tr><td valign='top' width='200'>"
				+ "<strong>" + name + "</strong><br />"
		 		+ description + "...<br />";
		 		
	html += "</td><td>";
	
	if (image != "layout/" + layout + "/images/NoMarkerImage.png")
	{
		html += "&nbsp;<img style='max-width : 150px; -width : 150px;' alt='" + description + "' src='" + image + "' />"
		 		+ "";
	}
	html += "</td></tr></table>";
	html += "<a target='_blank' href='redirect.php?marker=" + id + "&url=" + escape(url) + "'>" + displayUrl + "</a>";
		 		
	if (image == "layout/" + layout + "/images/NoMarkerImage.png")
	{
		html += "<br />&nbsp;";
	}
	
	return addHTMLMarker(lat, lng, url, html, id, image);
}

function addHTMLMarker(lat, lng, url, html, id, image)
{								
	// Create our Athene default marker icon
	var icon = new GIcon();
	var point = new GLatLng(lat, lng);
	
	if (image == "layout/" + layout + "/images/NoMarkerImage.png" || image == "" || image == null)
	{
		icon.image = "layout/" + layout + "/icons/athene_small.png";
		icon.iconSize = new GSize(14, 14);
		icon.iconAnchor = new GPoint(14, 14);
	}
	else
	{
		icon.image = image;
		icon.iconSize = new GSize(40, 40);
		icon.iconAnchor = new GPoint(40, 40);
	}
	
	var marker = new GMarker(point, icon);
	var m = document.getElementById("map");
		
	GEvent.addListener(marker, "click", function()
	{
		map.openInfoWindowHtml(new GLatLng(lat, lng), html);
	}
	);
	
	map.addOverlay(marker);
	overlays.push(marker);
	
	return marker;
}

/*
	Clears all markers
*/
function clearAllMarkers()
{	
	var i = 0;
	for (i = 0; i < overlays.length; i++)
	{
		map.removeOverlay(overlays[i]);
	}
	//map.clearOverlays();
}

/*
	Returns the current map bounds
*/
function neLng()
{	
	var bounds = map.getBounds();
	var ne = bounds.getNorthEast();
	return ne.lng();
}

function swLng()
{
	var bounds = map.getBounds();
	var sw = bounds.getSouthWest();
	return sw.lng();
}

function neLat()
{
	var bounds = map.getBounds();
	var ne = bounds.getNorthEast();
	return ne.lat();
}

function swLat()
{
	var bounds = map.getBounds();
	var sw = bounds.getSouthWest();
	return sw.lat();
}

function getLat()
{
	return map.getCenter().lat();
}

function getLng()
{
	return map.getCenter().lng();
}

function getZoom()
{
	return map.getZoom();
}

function ExtendMapRange()
{
	map.setZoom(map.getZoom() - 2);
}

/*
	Goto a marker/location
*/
function gotoLocation(lat, lng, zoom)
{
	return map.setCenter(new GLatLng(lat, lng), zoom);
}

/*
	Geocode/location search
*/
function locationSearch()
{
	search = document.getElementById('location-search').value;
	
	geocoder.getLatLng(
	search,
	function(point)
	{
		if (!point)
		{
			alert("'" + search + "'" + NOT_FOUND);
		} 
		else 
		{
			map.setCenter(point, 14);
		}
	}
	);
}