	function makePointFromEntry(entry){
		var latd = parseFloat(entry["gsx$latd"].$t);
		var latm = parseFloat(entry["gsx$latm"].$t);
		var lngd = parseFloat(entry["gsx$lngd"].$t);
		var lngm = parseFloat(entry["gsx$lngm"].$t);
		var ew = entry["gsx$ew"].$t;
		var ns = entry["gsx$ns"].$t;

		return makePoint(latd, latm, ns, lngd, lngm, ew);
	}

	function getIcon(type){
		if (type == 'A'){return airfield_icon;}
		if (type == 'V'){return vor_icon;}
		if (type == 'N'){return ndb_icon;}
		if (type == 'R'){return vrp_icon;}
		return null
	}
	
    	function getBearing( from, to ) {
		var lat1 = from.latRadians();
		var lon1 = from.lngRadians();
		var lat2 = to.latRadians();
		var lon2 = to.lngRadians();
		var degreesPerRadian = 180.0 / Math.PI;
		var radiansPerDegree = Math.PI / 180.0;

	       // Compute the angle.
		var angle = - Math.atan2( Math.sin( lon1 - lon2 ) * Math.cos( lat2 ), Math.cos( lat1 ) * Math.sin( lat2 ) - Math.sin( lat1 ) * Math.cos( lat2 ) * Math.cos( lon1 - lon2 ) );
		if ( angle < 0.0 ){
				angle  += Math.PI * 2.0;
			}
		// And convert result to degrees.
		angle = angle * degreesPerRadian;
		angle = angle.toFixed(1);

		return angle;
     	}
     	
	function createIcons(){
		airfield_icon = new GIcon();
		airfield_icon.image = "mm_20_red.png";
		airfield_icon.shadow = "mm_20_shadow.png";
		airfield_icon.iconSize = new GSize(12, 20);
		airfield_icon.shadowSize = new GSize(22, 20);
		airfield_icon.iconAnchor = new GPoint(6, 20);
		airfield_icon.infoWindowAnchor = new GPoint(5, 1);

		vor_icon = new GIcon();
		vor_icon.image = "mm_20_green.png";
		vor_icon.shadow = "mm_20_shadow.png";
		vor_icon.iconSize = new GSize(12, 20);
		vor_icon.shadowSize = new GSize(22, 20);
		vor_icon.iconAnchor = new GPoint(6, 20);
		vor_icon.infoWindowAnchor = new GPoint(5, 1);

		ndb_icon = new GIcon();
		ndb_icon.image = "mm_20_blue.png";
		ndb_icon.shadow = "mm_20_shadow.png";
		ndb_icon.iconSize = new GSize(12, 20);
		ndb_icon.shadowSize = new GSize(22, 20);
		ndb_icon.iconAnchor = new GPoint(6, 20);
		ndb_icon.infoWindowAnchor = new GPoint(5, 1);

		vrp_icon = new GIcon();
		vrp_icon.image = "mm_20_yellow.png";
		vrp_icon.shadow = "mm_20_shadow.png";
		vrp_icon.iconSize = new GSize(12, 20);
		vrp_icon.shadowSize = new GSize(22, 20);
		vrp_icon.iconAnchor = new GPoint(6, 20);
		vrp_icon.infoWindowAnchor = new GPoint(5, 1);

		wp_icon = new GIcon();
		wp_icon.image = "mm_20_purple.png";
		wp_icon.shadow = "mm_20_shadow.png";
		wp_icon.iconSize = new GSize(12, 20);
		wp_icon.shadowSize = new GSize(22, 20);
		wp_icon.iconAnchor = new GPoint(6, 20);
		wp_icon.infoWindowAnchor = new GPoint(5, 1);
	}

	function makePoint(latd, latm, ns, lngd, lngm, ew){
		var lat = latd + (latm/60);
		var lng = lngd + (lngm/60);
		if (ew == 'W'){
			lng = lng * -1;
		}
		if (ns == 'S'){
			lat = lat * -1;
		}
		return new GLatLng(lat,lng);
	}

	// This function handles what happens when the main map moves
	// If we arent moving it (i.e. if the user is moving it) move the minimap to match
	// and reposition the crosshair back to the centre
	function Move(){
		minimap_moving = true;
		if (map_moving == false) {
			minimap.setCenter(map.getCenter());
			xhair.setPoint(map.getCenter());
			xhair.redraw(true);
		}
		minimap_moving = false;
	}

	// This function handles what happens when the mini map moves
	// If we arent moving it (i.e. if the user is moving it) move the main map to match
	// and reposition the crosshair back to the centre
	function MMove(){
		map_moving = true;
		if (minimap_moving == false) {
			map.setCenter(minimap.getCenter());
			xhair.setPoint(minimap.getCenter());
			xhair.redraw(true);
		}
		map_moving = false;
	}

	function getRange(point1, point2){
		var d=point1.distanceFrom(point2)/1000;
    		return ((d * 5)/8)/1.15;
	}

	function changeHomeBase(i){
	    	homeId = i-1;
	    	homePoint = gmarkers[homeId];
    	}

    	function buildDynamicInfoTab(pointName, thisPoint, i){
	    	var label = "User defined Point";
		var html = "<b><u>" + pointName + "</b></u><p>";
		var d = getRange(homePoint.getPoint(), thisPoint);
		html += "Distance from EGSX = " + d.toFixed(2) + " Nm <br>";
		html += "Bearing from EGSX = " + getBearing(homePoint.getPoint(), thisPoint) + " Deg. <p>";

		html += "Make this airfield your home base <input type='button' value='Click' onClick=changeHomeBase(" + i + ")><br>";
		html += "Add this airfield your planned route <input type='button' value='Click' onClick=addToRoute(" + i + ");window.close();>";


		return new GInfoWindowTab(label,html);
    	}

    	function buildDetailTab(node){

		var ppr=node.getAttribute("ppr");
		var rw1_d=node.getAttribute("rw1_d");
		var rw1_l=node.getAttribute("rw1_l");
		var rw1_s=node.getAttribute("rw1_s");
		var rw2_d=node.getAttribute("rw2_d");
		var rw2_l=node.getAttribute("rw2_l");
		var rw2_s=node.getAttribute("rw2_s");
		var avgas=node.getAttribute("avgas");
		var alt=node.getAttribute("alt");

	    	var label = "Detail";

		var html = "<table>";

		html += "<tr><td>PPR Required?</td><td>";
		if (ppr != ""){
			if (ppr != "N"){
				html += "Yes, on: " + ppr;
			}else{
				html += "No";
			}
		}else{
			html += "Unknown";
		}
		html += "</td></tr>";

		html += "<tr><td>Runway";
		if (rw2_d != ""){
			html += "s";
		}
		html += "</td><td>";
		if (rw1_d != ""){
				html += rw1_d + " : " + rw1_l + "m : " + rw1_s;
		    }else{
				html += "Unknown";
		    }
		html += "</td></tr>";

		if (rw2_d != ""){
			html += "<tr><td></td><td>";
				html += rw2_d + " : " + rw2_l + "m : " + rw2_s;
			html += "</td></tr>";
		    }

		html += "<tr><td>Airfiels Alt?</td><td>";
			if (alt == ""){alt = "Unknown";}
			html += alt;
		html += "</td></tr>";

		html += "<tr><td>Avgas avail?</td><td>";
			if (avgas == ""){avgas = "Unknown";}
			html += avgas;
		html += "</td></tr>";

		html += "</table>";

		return new GInfoWindowTab(label,html);
    	}
    	
    	function hidePane(paneId) {
		document.getElementById(paneId).style.display='none';
		document.getElementById(paneId+'Tab').style.color='#ff0000';
	}
	function showPane(paneId) {
		document.getElementById(paneId).style.display='';
		document.getElementById(paneId+'Tab').style.color='#0000ff';
	}
	
	function rebuildPlan(){
		var speed = document.getElementById("speed");
		var fuelConsumption = document.getElementById("fuelConsumption");
		var windSpeed = document.getElementById("wspeed");
		var windDir = toRad(document.getElementById("wdir"));
		var totalDistance = 0;
		var totalFuelBurn = 0;
		var totalTime = 0;
	
		var html='<table>';
		html += '<tr><th>Leg</th><th>Distance(Nm)</th><th>Bearing</th><th>Magnetic Variation</th><th>Track</th><th>Ground Speed</th><th>Time(hrs)</th><th>Fuel Burn(lt)</th></tr>';

		if (route.length >= 2){
			for(var i=0;i<route.length-1;i++){
				var start_idx = route[i];
				var end_idx = route[i+1];
				
				var start_marker = gmarkers[start_idx]; 
				var start_wpId = markerIds[start_idx];
				var end_marker = gmarkers[end_idx];
				var end_wpId = markerIds[end_idx];
				
				var distance = getRange(start_marker.getPoint(), end_marker.getPoint());
				var bearing = getBearing(start_marker.getPoint(), end_marker.getPoint());
				var time = distance/speed;
				var fuelBurn = fuelConsumption * time; 
				
				var CRS = toRad(bearing);
				var MAGVAR = getMagVariation(start_marker.getPoint());
				
				window.alert(MAGVAR);
				
				var pi=Math.PI;
				var pi2=pi*2;
				var SWC=(windSpeed/speed)*Math.sin(windDir-CRS);	
				var GS=0;
				var HD=0;
				var msg="";
				
				window.alert(SWC);
				
				if (Math.abs(SWC)>1){
					msg="course cannot be flown-- wind too strong";
				}else{
					HD = CRS + Math.asin(SWC);
					if (HD<0) {HD=HD+pi2;}
					if (HD>pi2) {HD=HD-pi2;}
					HD = HD + toRad((MAGVAR));

					GS=speed*Math.sqrt(1-(SWC*SWC))-windSpeed*Math.cos(windDir-CRS);
					if (GS < 0)  {
						msg="course cannot be flown-- wind too strong";
					}else{
						HD = toDeg(HD);
					}
				}
				
				
				
				totalDistance += distance;
				totalFuelBurn += fuelBurn;
				totalTime += time;
				
				
				
				html += "<tr><td>" + start_wpId + " to " + end_wpId + "</td><td align='center'>" + distance.toFixed(2) + "</td><td align='center'>" + bearing + "&deg;</td><td align='center'>" + MAGVAR.toFixed(2) + "&deg;</td><td align='center'>" + HD.toFixed(2) + "&deg;</td><td align='center'>" + GS.toFixed(2) + "kts</td><td align='center'>" + time.toFixed(2) + "</td><td align='center'>" + fuelBurn.toFixed(2) + "</td></tr>";
			}
		}

		html += "<tr><td>Totals</td><td align='center'>" + totalDistance.toFixed(2) + "</td><td></td><td align='center'>" + totalTime.toFixed(2) + "</td><td align='center'>" + totalFuelBurn.toFixed(2) + "</td></tr>";

		document.getElementById('plan').innerHTML = html;
	}
	
	function getMagVariation( point ) {
	
		var latr = point.latRadians();
		var lonr = point.lngRadians();
		var degreesPerRadian = 180.0 / Math.PI;
		var latd = latr * degreesPerRadian;
		var lond = lonr * degreesPerRadian;

		var baseMagVar = 2.61667;
		var latDiff = (latd - 50)*0.25;
		var lonDiff = lond*0.45;
		var magVar = baseMagVar + latDiff + lonDiff;

		return magVar;
	}
	
	
	function toRad(deg){
		return (Math.PI/180)*deg;
	}

	function toDeg(rad){
		return (180/Math.PI)*rad;
	}

