///////////////////////////////////////////////////////////////////////////////////////////////////
//	Javascript code to handle a route.
///////////////////////////////////////////////////////////////////////////////////////////////////
//	Program Updates
//
//	02.12.2007	2.0.0	DJV		Created from original Routes code.
//	19.07.2008	2.0.1	DJV		Now checks for an empty route setting to prevent markers from
//								appearing.
//	01.11.2008	2.1.0	DJV		Added replace calls so that the text can contain tags.
//	03.11.2008	2.1.1	DJV		Added replace to handle &quot; as well.
//	04.11.2008	2.1.2	DJV		Ships log additions started.
//	17.11.2008	2.1.3	DJV		Added G_SATELLITE_3D_MAP setting.
//
///////////////////////////////////////////////////////////////////////////////////////////////////

// Main variables

var map;
var mapId;
var mgr;
var done = new Array ();
var maxDone = 0;
var count = 0;
var clearNextTime = false;
var baseIcon;
var mX = 0;
var mY = 0;
var mapPos = -1;
var namepop;
var currentPt;
var stmm = null;
var lastMk = null;
var scaleCtrl = 0;
var mapTypeCtrl = 0;
var mapMenuType = 0;
var overviewCtrl = 0;
var mapSearch = 0;
var markLevel = 8;
var markStore = [];
var nophoto = 0;
var linectrl = 0;
var linecol = "#008800";

// Main variables that need setting from PHP

var level = 0;
var gmLat;
var gmLng;
var host;
var route;
var popType = 0;			// 0 = none, 1 = Name Popup, 2 = Info Window
var doJumpTo = false;		// If true then jumps to specified location in ref
var defaultPic = "";		// If not set then will use awaiting150.gif
var defmark = "";			// Default marker

// Overlay settings

var inserts;
var olStates
var olTypes;
var olBtn;
var imgNames;

// Overlay variables that need setting from PHP

var insQty;
var doOverlay = false;
var startMode;
var btnWidth;
var btnX;
var btnY;
var olLat;
var olLng;
var olRef;
var olWidth;
var olHeight;
var olMapSize;

// KML Overlay handling

var doKml = false;
var kmlQty = 0;
var kmlFiles;
var kmlXml = new Array ();
var kmlBtn;
var kmlState;
var kmlAdded;

function startupmm ()
{
	clearTimeout (stmm);
	mapId = document.getElementById ("map");
	mapId.onmousemove = mapMove;
	onresize = handleResize;
	mapPos = findPos (mapId);
}

function load ()
{
	if (GBrowserIsCompatible ())
	{
		mapId = document.getElementById ("map");
		mapPos = findPos (mapId);
		stmm = setTimeout ("startupmm()", 3500);
		map = new GMap2 (document.getElementById ("map"));

		if (kmlQty > 0)
		{
			for (i = 0; i < kmlQty; i++)
			{
		        kmlXml [i] = new GGeoXml ("http://www.poppyland.co.uk/kml/" + kmlFiles [i]);

		        if (kmlState [i] == 1)
		        {
	   				map.addOverlay (kmlXml [i]);
	   				kmlAdded [i] = true;
	   			}
			}
		}

		switch (scaleCtrl)
		{
			case 0 :
				map.addControl (new GLargeMapControl ());
				break;

			case 1 :
				map.addControl (new GSmallMapControl ());
		}

		map.enableScrollWheelZoom ();

		if (mapTypeCtrl == 0 || mapTypeCtrl > 1)
		{
			var mmt = (mapMenuType == 0 ? new GMapTypeControl () : new GMenuMapTypeControl ());
			map.addControl (mmt);
		}

		if (overviewCtrl == 0) map.addControl (new GOverviewMapControl ());

		map.setCenter (new GLatLng (gmLat, gmLng), level);

		if (mapTypeCtrl > 1) map.addMapType (G_PHYSICAL_MAP);
		if (mapTypeCtrl > 2) map.addMapType (G_SATELLITE_3D_MAP);
		if (mapSearch == 1) map.enableGoogleBar ();

//		mgr = new MarkerManager (map);

		// Create a base icon for all of our markers that specifies the
		// shadow, icon dimensions, etc.

		baseIcon = new GIcon ();
		baseIcon.shadow = "http://" + host + "/images/icons/shadow.png";
		baseIcon.iconSize = new GSize (20, 34);
		baseIcon.shadowSize = new GSize (37, 34);
		baseIcon.iconAnchor = new GPoint (9, 34);
		baseIcon.infoWindowAnchor = new GPoint (9, 2);
		baseIcon.infoShadowAnchor = new GPoint (18, 25);

		if (doOverlay)
		{
			map.addControl (new OverlayControl());

			for (i = 0; i < insQty; i++)
			{
				inserts [i] = new EInsert (new GLatLng (olLat, olLng),
					"/images/gm/overlays/" + olRef + "/" + imgNames [i],
					new GSize (olWidth, olHeight), olMapSize, 10 + i);
				map.addOverlay (inserts [i]);

				if (startMode == 0)
				{
					inserts [i].hide ();
				}
			}
		}

		if (doKml)
		{
			for (i = 0; i < kmlQty; i++)
			{
				map.addControl (kmlBtn [i]);
			}
		}

		GEvent.addListener (map, "moveend", function ()
		{
			addNewMarkers ();
		});

		GEvent.addListener (map, "zoomend", function (oldlevel, newlevel)
		{
			level = newlevel;

			if (level < 8)
			{
				for (i = 1; i <= maxDone; i++)
				{
					done [i] = 0;
				}

				map.clearOverlays ();
				count = 0;
				maxDone = 0;
			}
		});

		addNewMarkers ();
	}
}

function handleResize ()
{
	mapPos = findPos (mapId);
}

function mapMove (eo)
{
	if (mapPos < 0)
	{
		return;
	}

	mX = null;
	mY = null;

	if (eo != null)
	{
		mX = eo.clientX;
		mY = eo.clientY;
	}
	else
	{
		mX = event.clientX;
		mY = event.clientY;
	}

	mX -= mapPos [0];
	mY -= mapPos [1];

	mX += filterResults (window.pageXOffset ? window.pageXOffset : 0,
		document.documentElement ? document.documentElement.scrollLeft : 0,
		document.body ? document.body.scrollLeft : 0);

	mY += filterResults (window.pageYOffset ? window.pageYOffset : 0,
		document.documentElement ? document.documentElement.scrollTop : 0,
		document.body ? document.body.scrollTop : 0);
}

// Pop up names

function NamePopup (txt)
{
	this.txt = txt;
}

NamePopup.prototype = new GControl ();

// Creates one DIV for each of the buttons and places them in a container DIV which is
// returned as our control element. We add the control to the map container and return
// the element for the map class to position properly.

NamePopup.prototype.initialize = function (map)
{
	var container = document.createElement ("div");

	this.setButtonStyle_ (container);

	var e = document.createElement("div");
	e.innerHTML = this.txt;
	container.appendChild (document.createTextNode (e.innerHTML));
	map.getContainer ().appendChild (container);
	return container;
}

NamePopup.prototype.getDefaultPosition = function ()
{
	return new GControlPosition (G_ANCHOR_TOP_LEFT, new GSize (mX + 10, mY - 10));
}

NamePopup.prototype.setButtonStyle_ = function (button)
{
	button.style.color = "black";
	button.style.backgroundColor = "#ffe";
	button.style.font = "small Arial";
	button.style.fontSize = "7pt";
	button.style.border = "1px solid black";
	button.style.padding = "1px";
	button.style.marginBottom = "2px";
	button.style.textAlign = "center";
	button.style.cursor = "pointer";
}

// KML File Mode Buttons

var kmlInd = -1;

function KmlButton (txt, x, y, w, state, ind)
{
	this.txt = txt;
	this.x = x;	// Position and width
	this.y = y;
	this.w = w;
	this.state = state;
	this.ind = ind;
}

KmlButton.prototype = new GControl ();

// Creates one DIV for each of the buttons and places them in a container DIV which is
// returned as our control element. We add the control to the map container and return
// the element for the map class to position properly.

KmlButton.prototype.initialize = function (map)
{
	var container = document.createElement ("div");

	var btn = document.createElement ("div");
	btn.id = "kmlbtn" + this.ind;
	this.setButtonStyle_ (btn);
	container.appendChild (btn);
	btn.appendChild (document.createTextNode (this.txt));

	GEvent.addDomListener (btn, "click", function ()
	{
		kmlChangeState (btn.id);
	});

	map.getContainer ().appendChild (container);
	return container;
}

KmlButton.prototype.getDefaultPosition = function ()
{
	var x = this.x;
	var anchor = G_ANCHOR_TOP_LEFT;

	if (x < 0)
	{
		x = Math.abs (x);
		anchor = G_ANCHOR_TOP_RIGHT;
	}

	return new GControlPosition (anchor, new GSize (x, this.y));
}

KmlButton.prototype.setButtonStyle_ = function (button)
{
	button.style.font = "small Arial";
	button.style.border = "1px solid black";
	button.style.padding = "0";
	button.style.marginBottom = "3px";
	button.style.textAlign = "center";
	button.style.width = this.w + "px";
	button.style.height = "17px";
	button.style.cursor = "pointer";

	if (this.state == 1)
	{
		button.style.color = "black";
		button.style.backgroundColor = "white";
		button.style.fontWeight = "bold";
	}
	else
	{
		button.style.color = "#999";
		button.style.backgroundColor = "#ddd";
		button.style.fontWeight = "normal";
	}
}

function kmlChangeState (btn)
{
	var i = parseInt (btn.substring(6));

	if (i > -1 && i < kmlQty)
	{
		kmlState [i] = 1 - kmlState [i];
		var btnc = document.getElementById ("kmlbtn" + i);

		if (kmlState [i] == 1)
		{
			if (!kmlAdded [i])
			{
				map.addOverlay (kmlXml [i]);
				kmlAdded [i] = true;
			}

			kmlXml [i].show ();
			btnc.style.fontWeight = "bold";
			btnc.style.backgroundColor = "white";
			btnc.style.color = "black";
		}
		else
		{
			kmlXml [i].hide ();
			btnc.style.fontWeight = "normal";
			btnc.style.backgroundColor = "#ddd";
			btnc.style.color = "#999";
		}
	}
}

// Marker functions

function addNewMarkers ()
{
	if (level >= markLevel)
	{
		if (clearNextTime)
		{
			document.getElementById ("info").innerHTML = "Clearing. Please wait...";
			clearNextTime = false;

			for (i = 1; i <= maxDone; i++)
			{
				done [i] = 0;
			}

			map.clearOverlays ();
			count = 0;
			maxDone = 0;
		}

		if (route != '')
		{
			document.getElementById ("info").innerHTML = "Retrieving new information. Please wait...";

			var bounds = map.getBounds ();
			var southWest = bounds.getSouthWest ();
			var northEast = bounds.getNorthEast ();
			var lngSpan = northEast.lng () - southWest.lng ();
			var latSpan = northEast.lat () - southWest.lat ();
			var url = "/getroutes.php?l=" + southWest.lng () + "&r=" +
				northEast.lng () + "&t=" + northEast.lat () + "&b=" + southWest.lat () +
				"&rt=" + route + "&lc=" + linectrl;

			GDownloadUrl (url, function (data, responseCode)
			{
				document.getElementById ("info").innerHTML = "Adding new data. Please wait...";
				var xml = GXml.parse (data);
				var markers = xml.documentElement.getElementsByTagName ("route");

				for (var i = 0; i < markers.length; i++)
				{
					var ref = markers [i].getAttribute ("ref");

					if (done [ref] == null || done [ref] == 0)
					{
						var point = new GLatLng (parseFloat (markers [i].getAttribute ("lat")),
							parseFloat (markers [i].getAttribute ("lng")));

						var md = markers [i].getAttribute ("minidesc");
						var popup = markers [i].getAttribute ("rname");

						if (popType == 2)
						{
							popup = "<strong>" + popup + "<\/strong>";

							if (md.length > 0)
							{
								popup += "<br\/><br\/>" + md;
							}

							popup = "<div style='width: 250px'>" + popup + "<\/div>";
						}

						var cmRef = (doJumpTo ? md : ref);

						map.addOverlay (createMarker (point, popup, cmRef, markers [i].getAttribute ("icon")));
						done [ref] = ++count;

						if (ref > maxDone)
						{
							maxDone = ref;
						}

						if (ref == defmark)
						{
							lastMk.openInfoWindowHtml (popup);
							doMarker (ref, -1);
						}

						if (parseInt (markers [i].getAttribute ("addline")) == 1)
						{
							var points = [];

							points.push (point);
							points.push (new GLatLng (parseFloat (markers [i].getAttribute ("llat")),
								parseFloat (markers [i].getAttribute ("llng"))));

							var poly = new GPolyline (points, linecol, 2, 0.7);
							map.addOverlay (poly);
						}
					}
				}

				if (count > 250)
				{
					clearNextTime = true;
				}

				//document.getElementById ("info").innerHTML = "Count=" + count + " CNT=" + clearNextTime;
				document.getElementById ("info").innerHTML = " ";
			});
		}
	}
}

function createMarker (point, popup, ref, ic)
{
	var icon = new GIcon (baseIcon);
	icon.image = "http://" + host + "/images/icons/" + ic + ".png";
	var marker = new GMarker (point, icon);
	lastMk = marker;
	var mkSt = new Array (marker, ref);

	markStore.push (mkSt);

	if (popType == 1)
	{
		GEvent.addListener (marker, "mouseover", function ()
		{
			mapPos = findPos (mapId);
			namepop = new NamePopup (popup);
			map.addControl (namepop);
		});

		GEvent.addListener (marker, "mouseout", function ()
		{
			map.removeControl (namepop);
		});
	}

	if (doJumpTo)
	{
		// Load a location page

		GEvent.addListener (marker, "click", function ()
		{
			window.location = "/index.php?s=" + ref;
		});
	}
	else
	{
		GEvent.addListener (marker, "click", function ()
		{
			if (popType == 2) marker.openInfoWindowHtml (popup);
			currentPt = marker.getPoint ();
			doMarker (ref, -1);
		});
	}

	return marker;
}

function doMarker (ref, mklevel)
{
	GDownloadUrl ("/getroute.php?r=" + ref, function (data, responseCode)
	{
		var xml2 = GXml.parse (data);
		var mk = xml2.documentElement.getElementsByTagName ("route");

		if (mk.length > 0)
		{
			if (mklevel > -1)
			{
				var point = new GLatLng (parseFloat (mk [0].getAttribute ("lat")),
					parseFloat (mk [0].getAttribute ("lng")));
				map.setCenter (point, mklevel);

				// Retrieve original marker

				for (i = 0; i < markStore.length; i++)
				{
					if (markStore [i][1] == ref)
					{
						var m = markStore [i][0];
						m.openInfoWindowHtml (mk [0].getAttribute ("rname") + "<br\/><br\/>" +
							mk [0].getAttribute ("bearing"));
					}
				}
			}

			var rname = mk [0].getAttribute ("rname");
			var txt = "<strong>" + rname + "<\/strong><br\/><br\/>";

			var md = mk [0].getAttribute ("minidesc");

			if (popType == 1 && md.length > 2)
			{
				txt += md + "<br\/><br\/>";
			}

			var info = mk [0].getAttribute ("info");

			if (info.length > 0)
			{
				txt += info;
			}

			var pic = mk [0].getAttribute ("tinypic");
			var mtype = parseInt (mk [0].getAttribute ("mediatype"));
			var picw = mk [0].getAttribute ("picw");
			var pich = mk [0].getAttribute ("pich");
			var panw = mk [0].getAttribute ("panw");
			var plinks = mk [0].getAttribute ("plinks");
			var cap = "";

			if (pic.length == 0)
			{
				if (defaultPic == "") defaultPic = "awaiting150.gif";

				pic = "images/gm/" + defaultPic;
				cap = "Awaiting photograph";
				picw = 150;
				pich = 150;
				mtype = 0;
			}
			else
			{
				pic = "images/gm/" + pic;
				cap = rname;
			}

			if (nophoto == 0 && picw > 0 && pich > 0)
			{
				displayMedia (document.getElementById ("rpic"), mtype, picw, pich, pic, cap, panw);
			}

//			if (plinks.length > 5) plinks = "<br\/>" + plinks;

			var rdata = document.getElementById ("rdata");
			txt += plinks;
			txt = txt.replace (/&lt;/g, "<");
			txt = txt.replace (/&gt;/g, ">");
			txt = txt.replace (/&quot;/g, '"');

			rdata.innerHTML = txt;
			map.panTo (currentPt);
			mapPos = findPos (mapId);
		}
	});
}


