var map;
var showPOI = true;
var showAirfields = true;
var showRoutes = true;

//function to create ajax connection
function setupXMLHttp() {
	var xmlhttp;
	if (window.XMLHttpRequest) {
		xmlhttp=new XMLHttpRequest();
	} else {
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	return xmlhttp;
}

function initialiseMap(zoom) {
	var latlng = new google.maps.LatLng(52.83111111, -1.328055556);
	var myOptions = {
	  zoom: zoom,
	  center: latlng,
	  mapTypeId: google.maps.MapTypeId.HYBRID,
	  disableDoubleClickZoom: true
	};
	map = new google.maps.Map(document.getElementById("map_canvas"),
		myOptions);

}
var airfields = new Array();
function plotAllAirfields() {
	var ajax = setupXMLHttp();
	
	//create event listener
	ajax.onreadystatechange = function(){
		//when data is ready...
		if(ajax.readyState == 4){

			var arrayIn = ajax.responseText.split("\n");
			var marker = new Array(arrayIn.length - 1);
			for (i=0; i<arrayIn.length-1; i++) {
				var data = arrayIn[i].split("\t");
				marker[i] = new google.maps.Marker({
					position: new google.maps.LatLng(data[1], data[2]),
					map: map,
					icon: "/include/marker.php?color=00CC00&text=A"
				});
				addInfoWindow(marker[i], data[0]);
			}
			airfields = marker;
		}
	}
	//open ajax connection
	ajax.open("GET","include/getAllAirfields.php",true);
	
	//send data
	ajax.send();

}

var points = new Array();
function plotAllPoints() {
		var ajax = setupXMLHttp();
	
	//create event listener
	ajax.onreadystatechange = function(){
		//when data is ready...
		if(ajax.readyState == 4){
			var arrayIn = ajax.responseText.split("\n");
			var marker = new Array(arrayIn.length - 1);
			for (i=0; i<arrayIn.length-1; i++) {
				var data = arrayIn[i].split(" ");
				marker[i] = new google.maps.Marker({
					position: new google.maps.LatLng(data[0], data[1]),
					map: map,
					icon: "/include/marker.php?color=6666FF&text=P"
				});
				addInfoWindowPoint(marker[i], data[0], data[1]);
				marker[i].setZIndex(1);
			}
			points = marker;
		}
	}
	//open ajax connection
	ajax.open("GET","include/getAllPoints.php",true);
	
	//send data
	ajax.send();
}

var openwindows = 0;
var selectedPoints = 0;
function addInfoWindow(marker, id) {
var ajax = setupXMLHttp();
	
	//create event listener
	ajax.onreadystatechange = function(){
		//when data is ready...
		if(ajax.readyState == 4){
			var info =  new google.maps.InfoWindow({
				content: ajax.responseText
			});
			google.maps.event.addListener(info, 'closeclick', function() {
				openwindows--;
			});
			google.maps.event.addListener(marker, 'click', function() {
				if (openwindows != 0) {
					return;
				}
				info.open(map, marker);
				openwindows++;
			});
		}
	}
	//open ajax connection
	ajax.open("GET","locationInfo.php?id=" + id,true);
	
	//send data
	ajax.send();
}

function getRouteFromAirfield(airfield) {
var ajax = setupXMLHttp();
	
	//create event listener
	ajax.onreadystatechange = function(){
		//when data is ready...
		if(ajax.readyState == 4){
			setNoRoutes();
			flightpathPt = new Array();
			var arrayIn = ajax.responseText.split("\n");
			var increment = 255/(arrayIn.length-1);
			var r = 255;
			var g = 0;
			var b = 0;
			for (i=0; i<arrayIn.length; i++) {
				var latlng = new Array();
				var points = arrayIn[i].split(";");
				for (j=0; j<points.length; j++) {
					var ll = points[j].split(",");
					latlng[j] = new google.maps.LatLng(ll[0], ll[1]);
				}

				flightpathPt[i] = new google.maps.Polyline({
					path: latlng,
					strokeColor: "#" + RGBtoHex(r,g,b),
					strokeOpacity: 1.0,
					strokeWeight: 2
				});
				g = g + increment;
				flightpathPt[i].setMap(map);
			}
		}
	}
	//open ajax connection
	ajax.open("GET","/include/getRoute.php?airfield=" + airfield,true);
	
	//send data
	ajax.send();
}

function addInfoWindowPoint(marker, lat, lng) {
var ajax = setupXMLHttp();
	
	//create event listener
	ajax.onreadystatechange = function(){
		//when data is ready...
		if(ajax.readyState == 4){
			var info =  new google.maps.InfoWindow({
				content: ajax.responseText
			});
			google.maps.event.addListener(info, 'closeclick', function() {
				openwindows--;
			});
//			google.maps.event.addListener(marker, 'dblclick', function() {
//				if (openwindows != 0) {
//					return;
//				}
//				info.open(map, marker);
//				openwindows++;
//			});
//			google.maps.event.addListener(marker, 'mouseover', function() {
//				
//			});
//			google.maps.event.addListener(marker, 'mouseout', function() {
//				info.close(map, marker);
//			});
			google.maps.event.addListener(marker, 'click', function() {
				if (openwindows != 0) {
					return;
				}
				info.open(map, marker);
				openwindows++;
			});

		}
	}
	//open ajax connection
	ajax.open("GET","pointInfo.php?lat=" + lat + "&lng=" + lng,true);
	
	//send data
	ajax.send();
}




var flightpathPt = new Array();
function getRouteFromPoint(lat, lng) {
var ajax = setupXMLHttp();
	
	//create event listener
	ajax.onreadystatechange = function(){
		//when data is ready...
		if(ajax.readyState == 4){
			setNoRoutes();
			flightpathPt = new Array();
			var arrayIn = ajax.responseText.split("\n");
			var increment = 255/(arrayIn.length-1);
			var r = 255;
			var g = 0;
			var b = 0;
			for (i=0; i<arrayIn.length; i++) {
				var latlng = new Array();
				var points = arrayIn[i].split(";");
				for (j=0; j<points.length; j++) {
					var ll = points[j].split(",");
					latlng[j] = new google.maps.LatLng(ll[0], ll[1]);
				}

				flightpathPt[i] = new google.maps.Polyline({
					path: latlng,
					strokeColor: "#" + RGBtoHex(r,g,b),
					strokeOpacity: 1.0,
					strokeWeight: 2
				});
				g = g + increment;
				flightpathPt[i].setMap(map);
			}
		}
	}
	//open ajax connection
	ajax.open("GET","/include/getRoute.php?lat=" + lat + "&lng=" + lng,true);
	
	//send data
	ajax.send();
}

function plotAllLocations() {
	plotAllAirfields();
	plotAllPoints();
}

function plotAllPointsSelectable(link) {
	var ajax = setupXMLHttp();
	
	//create event listener
	ajax.onreadystatechange = function(){
		//when data is ready...
		if(ajax.readyState == 4){
			var arrayIn = ajax.responseText.split("\n");
			var marker = new Array(arrayIn.length - 1);
			for (i=0; i<arrayIn.length-1; i++) {
				var data = arrayIn[i].split(" ");
				marker[i] = new google.maps.Marker({
					position: new google.maps.LatLng(data[0], data[1]),
					map: map,
					icon: "/include/marker.php?color=6666FF&text=P"
				});
				addClickEvent(marker[i]);

			}
		}
	}
	//open ajax connection
	ajax.open("GET","include/getAllPoints.php",true);
	
	//send data
	ajax.send();
}

function addClickEvent(marker) {
	google.maps.event.addListener(marker, 'click', function(event) {
		var latlng = marker.getPosition();
		dmarker.setPosition(marker.getPosition());
		document.getElementById("lat").innerHTML = latlng.lat();
		document.getElementById("lng").innerHTML = latlng.lng();
		document.upload.elements['latitude'].value = latlng.lat();
		document.upload.elements['longitude'].value = latlng.lng();
	});
}
var dmarker;
function addDragMarker(link, lat, lng) {
	google.maps.event.clearListeners(map, 'click');
	var latlng = new google.maps.LatLng(lat, lng);
	dmarker = new google.maps.Marker({
      position: latlng, 
      map: map, 
      title:"Draggable Marker",
	  draggable: true
	});
	link.innerHTML = "<TABLE><TR><TD class='form'>Latitude:&nbsp;</TD><TD id='lat'>" + lat + "</TD></TR><TR><TD class='form'>Longitude:&nbsp;</TD><TD id='lng'>" + lng + "</TD></TR></TABLE>";
	document.upload.elements['latitude'].value = lat;
	document.upload.elements['longitude'].value = lng;
	google.maps.event.addListener(dmarker, 'dragend', function(event) {
		document.getElementById("lat").innerHTML = event.latLng.lat();
		document.getElementById("lng").innerHTML = event.latLng.lng();
		document.upload.elements['latitude'].value = event.latLng.lat();
		document.upload.elements['longitude'].value = event.latLng.lng();
	});
	dmarker.setZIndex(9999);
	link.onclick = "";
}

function addDragMarkerDefault(link) {
	try {
		addDragMarker(link, document.getElementById("lat").innerHTML, document.getElementById("lng").innerHTML);
	} catch(err) {
		addDragMarker(link, 52.83111111, -1.328055556);
	}
}

function createRoute(link) {
	if (document.getElementsByName('arrival_id')[0].value == -1 ||
		document.getElementsByName('departure_id')[0].value == -1) {
		alert("Please select a departure and arrival airfield first!");
		$("a#inline").fancybox({
		'hideOnContentClick': false,
		'onStart': function() {
				if (document.getElementsByName('arrival_id')[0].value == -1 ||
					document.getElementsByName('departure_id')[0].value == -1) {
					$("a#inline").fancybox.cancel();
				}
			}
		});
		return false;
	}
	initialiseMap(7);
	link.onclick = function(){plotRoute()};
	link.innerHTML = "View Route";
	google.maps.event.addListener(map, 'dblclick', function(event) {
		if (document.logbook.elements['route_lat'].value == -1) {
			document.logbook.elements['route_lat'].value = event.latLng.lat();
			document.logbook.elements['route_long'].value = event.latLng.lng();
		} else {
			document.logbook.elements['route_lat'].value = 
				document.logbook.elements['route_lat'].value + "," + event.latLng.lat();
			document.logbook.elements['route_long'].value = 
			 document.logbook.elements['route_long'].value + "," + event.latLng.lng();
		}
		plotRoute()
	});
	plotRoute();
}

var flightPath;
var marker = new Array();
function plotRoute() {
	var latlng = new Array();
	try {
		for (i=0; i<marker.length; i++) {
			marker[i].setMap(null);
		}
	} catch(err) {}
	latlng[0] = new google.maps.LatLng(
			document.logbook.elements['departure_lat'].value,
			document.logbook.elements['departure_long'].value);
	marker[0] = new google.maps.Marker({
      position: latlng[0], 
      map: map, 
      title:"Departure Airfield",
	  icon: "/include/marker.php?color=00CC00&text=D",
	  draggable: false
	});
	marker[0].setZIndex(1);
	if (document.logbook.elements['route_lat'].value != -1) {
		var lat_split = document.logbook.elements['route_lat'].value.split(",");
		var long_split = document.logbook.elements['route_long'].value.split(",");
		for (i=0; i<lat_split.length; i++) {
			latlng[i+1] = new google.maps.LatLng(lat_split[i], long_split[i]);	
			marker[i+1] = new google.maps.Marker({
			  position: latlng[i+1], 
			  map: map, 
			  title:"Waypoint",
			  icon: "/include/marker.php?color=6666FF&text=P",
			  draggable: true
			});
			setRouteDrag(marker[i+1], i);
			marker[i+1].setZIndex(2);
		}
	}
	latlng[latlng.length] = new google.maps.LatLng(
			document.logbook.elements['arrival_lat'].value,
			document.logbook.elements['arrival_long'].value);
	marker[latlng.length-1] = new google.maps.Marker({
      position: latlng[latlng.length-1], 
      map: map, 
      title:"Arrival Airfield",
	  icon: "/include/marker.php?color=00CC00&text=A",
	  draggable: false
	});
	marker[latlng.length-1].setZIndex(3);
	try {
		flightPath.setMap(null);
	} catch(err) {
	}
	flightPath = new google.maps.Polyline({
		path: latlng,
		strokeColor: "#FF0000",
		strokeOpacity: 1.0,
		strokeWeight: 2
	});
	flightPath.setMap(map);
}

function setRouteDrag(marker, index) {
	google.maps.event.addListener(marker, 'dragend', function(event) {
		var lat_split = document.logbook.elements['route_lat'].value.split(",");
		var long_split = document.logbook.elements['route_long'].value.split(",");
		lat_split[index] = event.latLng.lat();
		long_split[index] = event.latLng.lng();
		document.logbook.elements['route_lat'].value = lat_split.join(",");
		document.logbook.elements['route_long'].value = long_split.join(",");
		plotRoute();
	});
	google.maps.event.addListener(marker, 'dblclick', function(event) {
		var lat_split = document.logbook.elements['route_lat'].value.split(",");
		var long_split = document.logbook.elements['route_long'].value.split(",");
			if (lat_split.length > 1) {
			var j = 0;
			var lat_split_new = new Array();
			var long_split_new = new Array();
			for (i=0; i<lat_split.length; i++) {
				if (i != index) {
					lat_split_new[j] = lat_split[i];
					long_split_new[j] = long_split[i];
					j++;
				}
			}
			document.logbook.elements['route_lat'].value = lat_split_new.join(",");
			document.logbook.elements['route_long'].value = long_split_new.join(",");
		} else {
			document.logbook.elements['route_lat'].value = -1;
			document.logbook.elements['route_long'].value =  -1;
		}
		plotRoute();
	});
}

var flightpath = new Array();
function plotAllRoutes() {
	var ajax = setupXMLHttp();
	
	//create event listener
	ajax.onreadystatechange = function(){
		//when data is ready...
		if(ajax.readyState == 4){
			flightpath = new Array();
			var arrayIn = ajax.responseText.split("\n");
			var increment = 255/(arrayIn.length-1);
			var r = 255;
			var g = 0;
			var b = 0;
			for (i=0; i<arrayIn.length; i++) {
				var latlng = new Array();
				var points = arrayIn[i].split(";");
				for (j=0; j<points.length; j++) {
					var ll = points[j].split(",");
					latlng[j] = new google.maps.LatLng(ll[0], ll[1]);
				}

				flightpath[i] = new google.maps.Polyline({
					path: latlng,
					strokeColor: "#" + RGBtoHex(r,g,b),
					strokeOpacity: 1.0,
					strokeWeight: 2
				});
				flightpath[i].setMap(map);
//				b = b + increment;
//				r = r - increment;
				g = g + increment;
			}
		}
	}
	//open ajax connection
	ajax.open("GET","include/getRoute.php?count=5",true);
	
	//send data
	ajax.send();
}
function clearMarkers(markers) {
	for (i=0; i<markers.length; i++) {
		markers[i].setMap(null);
	}
}
function clearRoutes() {
	clearMarkers(flightpath);
	clearMarkers(flightpathPt);
	flightpath = new Array();
	flightpathPt = new Array();
}
function clearPoints() {
	clearMarkers(points);
	points = new Array();
}
function clearAirfields() {
	clearMarkers(airfields);
	airfields = new Array();
}
function updateMap() {
	clearRoutes();
	clearAirfields();
	clearPoints();	
	if (showRoutes) {
		plotAllRoutes();
	}
	if (showPOI) {
		plotAllPoints();
	}
	if (showAirfields) {
		plotAllAirfields();
	}
}
function togglePOI() {
	showPOI = !showPOI;
	updateMap();
}
function toggleAirfields() {
	showAirfields = !showAirfields;
	updateMap();
}
function toggleRoutes() {
	showRoutes = !showRoutes;
	updateMap();
}

function RGBtoHex(R,G,B) {return toHex(R)+toHex(G)+toHex(B)}
function toHex(N) {
 if (N==null) return "00";
 N=parseInt(N); if (N==0 || isNaN(N)) return "00";
 N=Math.max(0,N); N=Math.min(N,255); N=Math.round(N);
 return "0123456789ABCDEF".charAt((N-N%16)/16)
      + "0123456789ABCDEF".charAt(N%16);
}
function setNoRoutes() {
	document.userio.routes.checked = false;
	showRoutes = false;
	updateMap();
}
function setRoutes() {
	document.userio.routes.checked = true;
	showRoutes = true;
	updateMap();
}


