if(!Array.indexOf){
	Array.prototype.indexOf = function(obj){
		for(var i=0; i<this.length; i++){
			if(this[i]==obj){
				return i;
			}
		}
		return -1;
	}
}

var iconGreen = new GIcon(); 
iconGreen.image = 'graphics/green-dot.png';
iconGreen.iconSize = new GSize(32, 32);
iconGreen.iconAnchor = new GPoint(16, 32);
//iconGreen.shadow = 'graphics/shadow-dot.png';
//iconGreen.shadowSize = new GSize(49.0, 32.0);
iconGreen.infoWindowAnchor = new GPoint(13.0, 14.0);

var iconRed = new GIcon(); 
iconRed.image = 'graphics/red-dot.png';
iconRed.iconSize = new GSize(32, 32);
iconRed.iconAnchor = new GPoint(16, 32);
//iconRed.shadow = 'graphics/shadow-dot.png';
//iconRed.shadowSize = new GSize(49.0, 32.0);
iconRed.infoWindowAnchor = new GPoint(13.0, 14.0);

var iconYellow = new GIcon();
iconYellow.image = 'graphics/yellow-dot.png';
iconYellow.iconSize = new GSize(32, 32);
iconYellow.iconAnchor = new GPoint(16, 32);
iconYellow.shadow = 'graphics/shadow-dot.png';
iconYellow.shadowSize = new GSize(49.0, 32.0);
iconYellow.infoWindowAnchor = new GPoint(13.0, 14.0);

var iconFlag = new GIcon();
iconFlag.image = 'graphics/flag.png';
iconFlag.shadow = 'graphics/flag.shadow.png';
iconFlag.iconSize = new GSize(32, 32);
iconFlag.iconAnchor = new GPoint(11, 30);
iconFlag.shadowSize = new GSize(59, 32);

var iconUser = new GIcon(); 
iconUser.image = 'graphics/icon60.png';
iconUser.iconSize = new GSize(32, 32);
iconUser.iconAnchor = new GPoint(16, 32);
//iconUser.shadow = 'graphics/icon60s.png';
//iconUser.shadowSize = new GSize(49.0, 32.0);
iconUser.infoWindowAnchor = new GPoint(13.0, 14.0);

var customIcons = [];
customIcons["green"] = iconGreen;
customIcons["red"] = iconRed;
customIcons["yellow"] = iconYellow;
customIcons["flag"] = iconFlag;
customIcons["user"] = iconUser;

var contextmenu = document.createElement("div");
contextmenu.style.visibility="hidden";
contextmenu.style.background="#ffffff";
contextmenu.style.border="1px solid #8888FF";

contextmenu.innerHTML = '<a href="javascript:setFlagRightClick()"><div class="context">&nbsp;&nbsp;Set Flag Here&nbsp;&nbsp;</div></a>'
						+ '<a href="javascript:zoomIn()"><div class="context">&nbsp;&nbsp;Zoom in&nbsp;&nbsp;</div></a>'
						+ '<a href="javascript:zoomOut()"><div class="context">&nbsp;&nbsp;Zoom out&nbsp;&nbsp;</div></a>'
						+ '<a href="javascript:zoomInHere()"><div class="context">&nbsp;&nbsp;Zoom in here&nbsp;&nbsp;</div></a>'
						+ '<a href="javascript:zoomOutHere()"><div class="context">&nbsp;&nbsp;Zoom out here&nbsp;&nbsp;</div></a>'
						+ '<a href="javascript:centreMapHere()"><div class="context">&nbsp;&nbsp;Centre map here&nbsp;&nbsp;</div></a>';

var map;
var myPoints = [];
var myDistances = [];
var flagDistances = [];
var lastMarker;
var lastPoint;
var flagPoint;
var flagMarker;
var geocoder;
var clickedPixel;
var reloadInterval;

function unload() {
	clearInterval(reloadInterval);
	GUnload();
}

function load() {
	for (var x = 0; x < 31; x++) {
		var myDate=new Date();
		myDate.setDate(myDate.getDate() - x);
		var myValue = "" + (myDate.getMonth() + 1) + "-" + myDate.getDate() + "-" + myDate.getFullYear();
		if (x == 0) document.addrform.date.options[x] = new Option("Today",myValue);
		if (x > 0) document.addrform.date.options[x] = new Option(myValue,myValue);
	}

	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map"));
		map.setCenter(new GLatLng(41.31, -75.41), 6);
		map.setMapType(G_NORMAL_MAP);
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
		map.enableDoubleClickZoom();
        map.enableScrollWheelZoom();
		geocoder = new GClientGeocoder();

		GEvent.addListener(map, "mousemove", function(point){
			var latLngStr8 = point.lat().toFixed(8) + ', ' + point.lng().toFixed(8);
			document.getElementById("precision").innerHTML = latLngStr8;
			lastPoint = point;
			nearBases();
		});

		GEvent.addListener(map,"singlerightclick",function(pixel,tile) {
        // store the "pixel" info in case we need it later
        // adjust the context menu location if near an egde
        // create a GControlPosition
        // apply it to the context menu, and make the context menu visible
			clickedPixel = pixel;
			var x=pixel.x;
			var y=pixel.y;
			if (x > map.getSize().width - 120) { x = map.getSize().width - 120 }
			if (y > map.getSize().height - 100) { y = map.getSize().height - 100 }
			var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(x,y));  
			pos.apply(contextmenu);
			contextmenu.style.visibility = "visible";
		});
		
		GEvent.addListener(map,"click", function() {
			contextmenu.style.visibility="hidden";
		});

		map.getContainer().appendChild(contextmenu);
		
		refreshMarkers();
		reloadInterval = setInterval("refreshMarkers();",120000);
	}
	
	var W3CDOM = (document.createElement && document.getElementsByTagName);
	if (W3CDOM) {
		document.getElementById("addr").onfocus = clearAddress;
		document.getElementById("gobutton").onclick = showAddress;
		document.getElementById("addrform").onsubmit = showAddress;
		document.getElementById("setflagbutton").onclick = setFlagButton;
		document.getElementById("refreshbutton").onclick = refreshMarkers;
		document.getElementById("clearbutton").onclick = removeFlag;
		document.getElementById("zoombutton").onclick = zoomToFlag;
		document.getElementById("findbutton").onclick = findFlag;
		document.getElementById("check").onclick = refreshMarkers;
		document.getElementById("date").onchange = refreshMarkers;
	}
}

function zoomIn() {
	// perform the requested operation
	map.zoomIn();
	// hide the context menu now that it has been used
	contextmenu.style.visibility="hidden";
}

function zoomOut() {
	// perform the requested operation
	map.zoomOut();
	// hide the context menu now that it has been used
	contextmenu.style.visibility="hidden";
}

function zoomInHere() {
	// perform the requested operation
	var point = map.fromContainerPixelToLatLng(clickedPixel);
	map.zoomIn(point,true);
	// hide the context menu now that it has been used
	contextmenu.style.visibility="hidden";
}

function zoomOutHere() {
	// perform the requested operation
	var point = map.fromContainerPixelToLatLng(clickedPixel);
	map.setCenter(point,map.getZoom()-1); // There is no map.zoomOut() equivalent
	// hide the context menu now that it has been used
	contextmenu.style.visibility="hidden";
}

function centreMapHere() {
	// perform the requested operation
	var point = map.fromContainerPixelToLatLng(clickedPixel);
	map.setCenter(point);
	// hide the context menu now that it has been used
	contextmenu.style.visibility="hidden";
}
	  
function setFlagButton() {
	flagPoint = map.getCenter();
	setFlag();
}
function setFlagRightClick() {
	flagPoint = map.fromContainerPixelToLatLng(clickedPixel);
	setFlag();
	contextmenu.style.visibility="hidden";
}

function setFlag() {
	if(!flagMarker) {
		flagMarker = new GMarker(flagPoint, customIcons["flag"]);
		GEvent.addListener(flagMarker, "contextmenu", function() {removeFlag()})
		map.addOverlay(flagMarker);
	} else {
		flagMarker.setPoint(flagPoint)
	}
	map.panTo(flagPoint);
	var latLngStr8 = flagPoint.lat().toFixed(8) + ', ' + flagPoint.lng().toFixed(8);
	document.getElementById("flaglatlng").innerHTML = latLngStr8;
	flagDistances.length = 0;
	for (var i=0; i < myPoints.length; i++) {
		var newPoint = myPoints[i][0];
		var newName = myPoints[i][1];
		var newMarker = myPoints[i][2];
		var newDistance = newPoint.distanceFrom(flagPoint);
		flagDistances.push([newDistance,newName,newMarker]);
	}
	flagDistances = flagDistances.sort(function (a,b) {return a[0] - b[0];});
	document.getElementById("flagtitle").innerHTML = "<b>Flag Lat/Long:</b>";
	document.getElementById("flagbasetitle").innerHTML = "<b>Three Nearest Bases</b>";	
	document.getElementById("flagdistance1").innerHTML = (flagDistances[0][0] / 1000).toFixed(2) + " km";
	document.getElementById("flagstation1").innerHTML = "<a href='javascript:go(0)'>" + flagDistances[0][1] + "</a>";
	document.getElementById("flagdistance2").innerHTML = (flagDistances[1][0] / 1000).toFixed(2) + " km";
	document.getElementById("flagstation2").innerHTML = "<a href='javascript:go(1)'>" + flagDistances[1][1] + "</a>";
	document.getElementById("flagdistance3").innerHTML = (flagDistances[2][0] / 1000).toFixed(2) + " km";
	document.getElementById("flagstation3").innerHTML = "<a href='javascript:go(2)'>" + flagDistances[2][1] + "</a>";
	document.getElementById("clearbutton").style.visibility = "visible";
	document.getElementById("flaginfo").style.visibility = 'visible';
}
function removeFlag() {
	if(flagMarker) {
		map.removeOverlay(flagMarker);
		flagMarker = "";
		document.getElementById("flagtitle").innerHTML = "";
		document.getElementById("flaglatlng").innerHTML = "";
		document.getElementById("flagbasetitle").innerHTML = "";
		document.getElementById("flagdistance1").innerHTML = "";
		document.getElementById("flagstation1").innerHTML = "";
		document.getElementById("flagdistance2").innerHTML = "";
		document.getElementById("flagstation2").innerHTML = "";
		document.getElementById("flagdistance3").innerHTML = "";
		document.getElementById("flagstation3").innerHTML = "";
		document.getElementById("clearbutton").style.visibility = 'hidden';
		document.getElementById("flaginfo").style.visibility = 'hidden';
	}
}

function findFlag() {
	if(flagMarker) {
		map.closeInfoWindow();
		map.setZoom(10);
		map.panTo(flagMarker.getPoint());
	}
}

function zoomToFlag() {
	if(flagMarker) {
		map.closeInfoWindow();
		map.setZoom(18);
		map.panTo(flagMarker.getPoint());
	}	
}

function go(marker) {
	GEvent.trigger(flagDistances[marker][2], "click");
}

function nearBases() {
	var latLngStr8 = lastPoint.lat().toFixed(8) + ', ' + lastPoint.lng().toFixed(8);
	myDistances.length = 0;
	for (var i=0; i < myPoints.length; i++) {
		var newPoint = myPoints[i][0];
		var newName = myPoints[i][1];
		var newMarker = myPoints[i][2];
		var newDistance = newPoint.distanceFrom(lastPoint);
		myDistances.push([newDistance,newName,newMarker]);
	}
	myDistances = myDistances.sort(function (a,b) {return a[0] - b[0];});
	document.getElementById("cursorbasetitle").innerHTML = "<b>Three Nearest Bases</b>";
	document.getElementById("cursordistance1").innerHTML = (myDistances[0][0] / 1000).toFixed(2) + " km";
	document.getElementById("cursorstation1").innerHTML = myDistances[0][1];
	document.getElementById("cursordistance2").innerHTML = (myDistances[1][0] / 1000).toFixed(2) + " km";
	document.getElementById("cursorstation2").innerHTML = myDistances[1][1];
	document.getElementById("cursordistance3").innerHTML = (myDistances[2][0] / 1000).toFixed(2) + " km";
	document.getElementById("cursorstation3").innerHTML = myDistances[2][1];
};

function refreshMarkers() {
	clearInterval(reloadInterval);
	myPoints.length = 0;
	lastMarker = "";
	var servers = ["pavrssvr1","pavrssvr2"];
	var stationName = [];
	var noShow = [];
	removeFlag();
	map.clearOverlays();
	for ( var z = 0; z < servers.length; z++) {
		var myurl = "getmapdata.php?server=" + servers[z];
		GDownloadUrl(myurl, function(data) {
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName("marker");
			for (var i = 0; i < markers.length; i++) {
				var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
										parseFloat(markers[i].getAttribute("lng")));
				var name =  markers[i].getAttribute("name");
				var device = markers[i].getAttribute("device");
				var sat = markers[i].getAttribute("sat");
				var plat = markers[i].getAttribute("plat");
				var plng = markers[i].getAttribute("plng");
				var elev = markers[i].getAttribute("elev");
				var url = markers[i].getAttribute("url");
				var mydate = markers[i].getAttribute("timestamp");
				if (sat == 0) {
					var color = "red";
				} else if (sat < 5) {
					var color = "yellow";
				} else {
					var color = "green";
				}
				if (stationName.indexOf(name) == -1 && noShow.indexOf(name) == -1) {
					stationName.push(name);
					map.addOverlay(createMarker(point, name, device, sat, plat, plng, elev, color, mydate, url));
				}
			}
			document.getElementById("bases").innerHTML = myPoints.length;
		});
	}
	refreshUsers();
	reloadInterval = setInterval("refreshMarkers();",120000);
}

function refreshUsers() {
	if (document.getElementById("check").checked) {
		var userServers = ["pawebsvr","mdwebsvr"];
		for ( var y = 0; y < userServers.length; y++) {
		var myurl = "getusernmea.php?server=" + userServers[y] + "&date=" + document.addrform.date.options[document.addrform.date.selectedIndex].value;
			GDownloadUrl(myurl, function(data) {
				var xml = GXml.parse(data);
				var markers = xml.documentElement.getElementsByTagName("marker");
				for (var i = 0; i < markers.length; i++) {
					var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
											parseFloat(markers[i].getAttribute("lng")));
					var name =  markers[i].getAttribute("name");
					var start = markers[i].getAttribute("start");
					var end = markers[i].getAttribute("end");
					var lat = markers[i].getAttribute("lat");
					var lng = markers[i].getAttribute("lng");
					map.addOverlay(createUserMarker(point, name, start, end, lat, lng));
				}
			});
		}
	}
}

function createMarker(point, name, device, sat, plat, plng, elev, color, mydate, url) {
    var marker = new GMarker(point, customIcons[color]);
    var html = "<b>" + name + "</b> <br>" + device + "<br>" + sat + " Satellites Tracked.<BR>" + "Latitude: " + plat + "<br>" + "Longitude: " + plng + "<br>" + "Ellipsoid Height: " + elev + "  meters<br>" + "<a href='" + url + "'>Detailed Information</a>" + "<br><font size=1>" + mydate + "</font>";
	var html2 = "<b>" + name + "</b>";
	
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(html);
	});
	
	GEvent.addListener(marker, "mouseover", function() {
		document.getElementById("curbase").innerHTML = "<B>Current Base:</B> " + name;
	});
	
	GEvent.addListener(marker, "mouseout", function() {
		document.getElementById("curbase").innerHTML = "";
	});
	myPoints.push([point,name,marker]);
	return marker;
}

function createUserMarker(point, name, start, end, lat, lng) {
    var marker = new GMarker(point, customIcons["user"]);
	var html2 = "<b>Username:</b> " + name + "<br><b>Logon:</b> " + start + "<br><b>Logoff:</b> " + end + "<br><b>Location:</b> " + lat + "," + lng;
	
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(html2);
	});
	GEvent.addListener(marker, "mouseover", function() {
		document.getElementById("curbase").innerHTML = "<B>Current User:</B> " + name;
	});
	
	GEvent.addListener(marker, "mouseout", function() {
		document.getElementById("curbase").innerHTML = "";
	});
	return marker;
}

function clearAddress() {
	if (document.getElementById('addr').value == 'Type an address') document.getElementById('addr').value = '';
}

function showAddress() {
	if (geocoder) {
		address = document.getElementById("addr").value;
		geocoder.getLatLng(address, function(point) {
			if (!point) {
				alert(address + " not found");
			} else {
				map.setCenter(point, 17);
				flagPoint = point;
				setFlag();
			}
		});
	}
	return false;
}