//Initialise and display the initial map
var map;
function loadmap() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("mapcanvas"));
		
		// ====== Restricting the range of Zoom Levels =====
		// Get the list of map types      
		var mt = map.getMapTypes();
		// Overwrite the getMinimumResolution() and getMaximumResolution() methods
		for (var i=0; i<mt.length; i++) {
			mt[i].getMinimumResolution = function() { return 1; }
			mt[i].getMaximumResolution = function() { return 9; }
		}
		
		//map.addControl(new GSmallMapControl());
		map.addControl(new GScaleControl());
		//map.addControl(new GMapTypeControl());
		map.setCenter(new GLatLng("15","155"),1);
		map.setMapType(G_HYBRID_MAP);
	}
}

if (GBrowserIsCompatible()) {
	//Global variables for the map objects
	var points = [];
	var gmarkers = [];
	var gbeziers = [];
	var glines = [];
	var portinfo = [];
	var latlon = [];
	var returnmultiplier = [];
	var distancearray = [];
	
	//This variable tracks the number of points on the map
	var i = 0;
	
	var icon = new GIcon();	
	icon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
	icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
	icon.iconSize = new GSize(12, 20);
	icon.shadowSize = new GSize(22, 20);
	icon.iconAnchor = new GPoint(6, 20);
	icon.infoWindowAnchor = new GPoint(5, 1);
	
	//gmap_old uses the google geocoder as well as the database
	function geoCode(num) {
		var port = document.getElementById("airportsearch"+num).value;
		//airportlatlon.php accesses the database and returns a string with the result
		//makeRequest resides in airport.js
		if (port != '') {
			makeRequest("include/airportlatlon.php", "?port=" + port, 10+num);
		}
	}
	
	function airport0() {
		if (http_request.readyState == 4) {
			if (http_request.status == 200) {
				var temp = http_request.responseText.split(";");
				//alert(temp);
				addPoint(temp);
			} else {
				alert('There was a problem with the request.');
			}
		}
	}
	
	function airport1() {
		if (http_request.readyState == 4) {
			if (http_request.status == 200) {
				var temp = http_request.responseText.split(";");
				//alert(temp);
				addPoint(temp);
			} else {
				alert('There was a problem with the request.');
			}
		}
	}
	
	//This function adds a point to the map
	function addPoint(result) {		
		var lat = parseFloat(result[3]) + parseFloat(result[4]);
		if (result[5] == "S") { lat = 0 - lat; }
		var lon = parseFloat(result[6]) + parseFloat(result[7]);
		if (result[8] == "W") { lon = 0 - lon; }
		var html = "<table width='200' height='30' cellpadding='1' cellspacing='0'><tr><td align='left'>Code: </td><td align='right'>" + result[0] + "</td></tr><tr><td align='left'>Location: </td><td align='right'>" + result[1] + "</td></tr></table>";
		
		portinfo[i] = result;
		//alert(portinfo[i]);
		latlon[i] = lat + "," + lon;
		if (lat && lon) {
			//Add a point to the map
			//If two or more points have been marked then draw connecting lines, then calculate the distance	
			if (latlon[i] != latlon[i-1]) {
				points[i] = new GLatLng(lat,lon);
				gmarkers[i] = createMarker(points[i],html);
				if (i > 0) {
					i++;
					gCalc();
					//alert(document.getElementById("arrival").value);
					
					// Geodesic line
					//var polyOptions = {geodesic:true};
					var polyOptions = '';
					glines[i-1] = new GPolyline([points[i-1],points[i-2]], "#ff0000", 2, 1, polyOptions);
					map.addOverlay(glines[i-1]);
				} else i++;
			} else { alert('You cannot enter the same port twice in a row'); }
			
			// This part ensures that all the points plotted are in the viewport
			var bounds = new GLatLngBounds();
			for (j = 0; j < i; j++) bounds.extend(points[j]);
			if (map.getBoundsZoomLevel(bounds) > 5) {
				map.setZoom(5);
			} else {
				map.setZoom(map.getBoundsZoomLevel(bounds)-1);
			}
			map.panTo(bounds.getCenter());
		} else { alert('Please enter an airport code or the name of the city then click Search'); }
	}		
	
	function createMarker(point,html) {
		var marker = new GMarker(point,icon);
		GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(html); });
		map.addOverlay(marker);
		//marker.openInfoWindowHtml(html);
		return marker;
	}

	function resetTrip() {
		if (points.length > 1) {
			for (j = 0; j < i; j++) {
				map.removeOverlay(gmarkers[j]);
				if (j != 0) {
					//map.removeOverlay(gbeziers[j]);
					map.removeOverlay(glines[j]);
				}
			}
			i=0;
			points = new Array();
			gmarkers = new Array();
			gbeziers = new Array();
			glines = new Array();
			portinfo = new Array();
			latlon = new Array();
			var returnmultiplier = new Array();
			var distancearray = new Array();
			
			document.getElementById("returnTrip").checked = false;
			document.getElementById("distance").value = 0;
			document.getElementById("emissions").value = 0;
			document.getElementById("cost").value = 0;
			
			document.getElementById("vpc_MerchTxnRef").value = 'public';
			document.getElementById("vpc_OrderInfo").value = "";
			document.getElementById("vpc_Amount").value = "";
			
			document.getElementById("departure").value = "";
			document.getElementById("arrival").value = "";
			document.getElementById("passengers").value = "";
			document.getElementById("class").value = "";
			document.getElementById("percentage").value = "";
			document.getElementById("return").value = "";
			document.getElementById("legsummary1").innerHTML = "";
			document.getElementById("legsummary2").innerHTML = "";
		}
	}
	
	function gCalc() {
		var check = document.getElementById("returnTrip").checked;
		if (check) {
			returnmultiplier[i-2] = 2;
		}	else {
		  returnmultiplier[i-2] = 1;
		}
		
		var percentage = parseInt(document.getElementById("passsel").value) * document.getElementById("classsel").value * parseInt(document.getElementById("tper").value)/100;
		
		var distancearray = new Array();
		var distance = 0;
		var co2earray = new Array();
		var co2e = 0;
		for (j = 0; j < i-1; j++) {
			distancearray[j] = gmarkers[j].getPoint().distanceFrom(gmarkers[j+1].getPoint());
			distance += distancearray[j] * returnmultiplier[j];
			co2earray[j] = co2(distancearray[j]/1000) * returnmultiplier[j];
			co2e += co2earray[j];
		}
		
		//alert(distance);
		//alert(distancearray);
		//alert(returnmultiplier);
		
		var cost = Math.round(co2e * co2ecost * percentage * 100)/100;
		
		document.getElementById("distance").value = Math.round(distance/10)/100 + " km";
		document.getElementById("emissions").value = Math.round(co2e*percentage*100)/100 + " tons";
		document.getElementById("cost").value = "$" + cost.toFixed(2);
		
		document.getElementById("vpc_MerchTxnRef").value = 'public';
		document.getElementById("vpc_OrderInfo").value = "Offset " + Math.round(co2e*percentage*100)/100 + " tons CO2e";
		document.getElementById("vpc_Amount").value = Math.round((Math.round(cost*100)/100) * migsmultiplier);
		
		document.getElementById("passengers").value = document.getElementById("passsel").value;
		document.getElementById("class").value = document.getElementById("classsel").value;
		document.getElementById("percentage").value = parseInt(document.getElementById("tper").value);
		document.getElementById("return").value = returnmultiplier;
		
		//Show the portinfo...
		if (i > 0) {
			var legstring1 = "<table width='100%' cellpadding='1'><tr><td colspan='3' align='left'><b>Departure Port</b></td></tr><tr><td width='10'><b>Code</b></td><td><b>City</b></td><td><b>Country</b></td></tr>";
			var legstring2 = "<table width='100%' cellpadding='1'><tr><td colspan='6' align='left'><b>Arrival Port</b></td></tr><tr><td width='10'><b>Code</b></td><td><b>City</b></td><td><b>Country</b></td><td width='20'><b>Distance</b></td><td width='20'><b>CO2e</b></td><td width='10'><b>Return</b></td></tr>";
			
			document.getElementById("departure").value = "";
			document.getElementById("arrival").value = "";
			for (j = 1; j < i; j++) {
				document.getElementById("departure").value += portinfo[j-1] + ";";
				document.getElementById("arrival").value += portinfo[j] + Math.round(distancearray[j-1]/10 * returnmultiplier[j-1])/100 + "," + Math.round(co2earray[j-1]*100)/100 + ";";
				if (returnmultiplier[j-1] == 1) {
					returndisplay = "No</td></tr>";
				} else {
					returndisplay = "Yes</td></tr>";
				}				
				legstring1 += "<tr valign='top'><td width='10'>" + portinfo[j-1][0] + "</td><td>" + portinfo[j-1][1] + "</td><td>" + portinfo[j-1][2] + "</td></tr>";
				legstring2 += "<tr valign='top'><td width='10'>" + portinfo[j][0] + "</td><td>" + portinfo[j][1] + "</td><td>" + portinfo[j][2] + "</td><td>" + Math.round(distancearray[j-1]/10 * returnmultiplier[j-1])/100 + "</td><td>" + Math.round(co2earray[j-1]*100)/100 + "</td><td>" + returndisplay;
			}
			legstring1 += "</table>";
			legstring2 += "</table>";
			document.getElementById("legsummary1").innerHTML = legstring1;
			document.getElementById("legsummary2").innerHTML = legstring2;
			//alert(document.getElementById("departure").value);
			//alert(document.getElementById("arrival").value);
		}
	}
	
	function oldgCalc() {
		var distance = 0;
		var check = document.getElementById("returnTrip").checked;
		if (check) {
			returnmultiplier[i-2] = 2;
		}	else {
		  returnmultiplier[i-2] = 1;
		}
		
		var percentage = parseInt(document.getElementById("passsel").value) * document.getElementById("classsel").value * parseInt(document.getElementById("tper").value)/100;
		
		for (j = 0; j < i-1; j++) {
			distancearray[j] = gmarkers[j].getPoint().distanceFrom(gmarkers[j+1].getPoint()) * returnmultiplier[j];
			distance += distancearray[j];
		}
		
		//alert(distance);
		//alert(distancearray);
		//alert(returnmultiplier);
		
		var co2e = co2(distance/1000);
		var cost = Math.round(co2e * co2ecost * percentage * 100)/100;
		
		document.getElementById("distance").value = Math.round(distance/10)/100 + " km";
		document.getElementById("emissions").value = Math.round(co2e*percentage*100)/100 + " tons";
		document.getElementById("cost").value = "$" + cost.toFixed(2);
		
		document.getElementById("vpc_MerchTxnRef").value = 'public';
		document.getElementById("vpc_OrderInfo").value = "Offset " + Math.round(co2e*percentage*100)/100 + " tons CO2e";
		document.getElementById("vpc_Amount").value = Math.round((Math.round(cost*100)/100) * migsmultiplier);
		
		document.getElementById("passengers").value = document.getElementById("passsel").value;
		document.getElementById("class").value = document.getElementById("classsel").value;
		document.getElementById("percentage").value = parseInt(document.getElementById("tper").value);
		document.getElementById("return").value = returnmultiplier;
		
		//Show the portinfo...
		if (i > 0) {
			var legstring1 = "<table width='100%' cellpadding='1'><tr><td colspan='3' align='left'><b>Departure Port</b></td></tr><tr><td width='10'><b>Code</b></td><td><b>City</b></td><td><b>Country</b></td></tr>";
			var legstring2 = "<table width='100%' cellpadding='1'><tr><td colspan='6' align='left'><b>Arrival Port</b></td></tr><tr><td width='10'><b>Code</b></td><td><b>City</b></td><td><b>Country</b></td><td width='20'><b>Distance</b></td><td width='20'><b>CO2e</b></td><td width='10'><b>Return</b></td></tr>";
			
			document.getElementById("departure").value = "";
			document.getElementById("arrival").value = "";
			for (j = 1; j < i; j++) {
				document.getElementById("departure").value += portinfo[j-1] + ";";
				document.getElementById("arrival").value += portinfo[j] + Math.round(distancearray[j-1]/10)/100 + "," + Math.round(co2(distancearray[j-1]/1000)*100)/100 + ";";
				if (returnmultiplier[j-1] == 1) {
					returndisplay = "No</td></tr>";
				} else {
					returndisplay = "Yes</td></tr>";
				}				
				legstring1 += "<tr valign='top'><td width='10'>" + portinfo[j-1][0] + "</td><td>" + portinfo[j-1][1] + "</td><td>" + portinfo[j-1][2] + "</td></tr>";
				legstring2 += "<tr valign='top'><td width='10'>" + portinfo[j][0] + "</td><td>" + portinfo[j][1] + "</td><td>" + portinfo[j][2] + "</td><td>" + Math.round(distancearray[j-1]/10)/100 + "</td><td>" + Math.round(co2(distancearray[j-1]/1000)*100)/100 + "</td><td>" + returndisplay;
			}
			legstring1 += "</table>";
			legstring2 += "</table>";
			document.getElementById("legsummary1").innerHTML = legstring1;
			document.getElementById("legsummary2").innerHTML = legstring2;
			//alert(document.getElementById("departure").value);
			//alert(document.getElementById("arrival").value);
		}
	}
}