
function makeRouteTable( xmlDoc) {
  var routeTable = document.getElementById( "routedata");
  var passages = xmlDoc.getElementsByTagName( "passage");
  var cell = 0;
  var dataRows = 0;
  for( var i = 0; i < passages.length; i++) {
    var table = document.createElement( "table");
    routeTable.appendChild( table);
    var caption = table.createCaption();
    caption.appendChild( document.createTextNode( passages[i].getAttribute( "name")));
    var lastLng = 0;
    var lastLat = 0;
    var distTotal = 0;
    var row = table.insertRow( 0);
    
	//Create the header row	
    row.insertCell(0).appendChild( document.createTextNode( "Date"));
  	row.insertCell(1).appendChild( document.createTextNode( "Latitude"));
 	row.insertCell(2).appendChild( document.createTextNode( "Longitude"));
  	row.insertCell(3).appendChild( document.createTextNode( "Run\(nm\)"));
  	row.insertCell(4).appendChild( document.createTextNode( "Total\(nm\)"));
    row.setAttribute( "class", "header");
    
    row = table.insertRow(1);
    var coords = passages[i].getElementsByTagName( "coord");    
    for( var x = 0; x < coords.length; x++) {

      var date = coords[x].getAttribute( "date");
      var lat = coords[x].getAttribute( "lat");
      var lng = coords[x].getAttribute( "lng");
      var dist = calcDistance( lastLng, lastLat, lng, lat);
      distTotal = distTotal + dist;
      
      row.insertCell( 0).appendChild( document.createTextNode( date));
      row.insertCell( 1).appendChild( document.createTextNode( convertLat(lat)));
      row.insertCell( 2).appendChild( document.createTextNode( convertLng(lng)));
      row.insertCell( 3).appendChild( document.createTextNode( dist.toFixed(1)));
      row.insertCell( 4).appendChild( document.createTextNode( distTotal.toFixed(1)));
      row = table.insertRow( x + 2);
      lastLng = lng;
      lastLat = lat;
    }

  }
}

function calcDistance( lastLng, lastLat, lng, lat) {
  
  if( lastLng == 0 && lastLat == 0) {
    return 0;
  }
  //using the great circle formula, first convert to radians
  var phi_1 = toRadians( lastLat);
  var lambda_1 = toRadians( lastLng);
  var phi_2 = toRadians( lat);
  var lambda_2 = toRadians( lng);
  var dl = lambda_1 - lambda_2;
  var s1 = Math.sin( phi_1);
  var s2 = Math.sin( phi_2);
  var sd = Math.sin( dl); 
  var c1 = Math.cos( phi_1);
  var c2 = Math.cos( phi_2);
  var cd = Math.cos( dl); 
  
  var temp1 = Math.pow((c2 * sd), 2);
  var temp2 = Math.pow(((c1 * s2) - (s1 * c2 * cd)), 2);  
  var temp3 = Math.sqrt( temp1 + temp2);
  var temp4 = s1 * s2 + c1 * c2 * cd;
  
  var raddist = Math.atan( temp3 / temp4);
  
  var distance = raddist * 3437.7387; //convert to nautical miles
  return distance;
}

function toRadians( x) {
  return ( x * Math.PI) / 180;
}

function convertToDegrees( x)  {
  var retVal;
  var local = Math.abs( x);
  var degrees = Math.floor( local);
  var degrees = degrees.toFixed(0);
  retVal = degrees + String.fromCharCode( 176)+ " ";
  var minutes = local - degrees;
  minutes =  Math.abs( minutes * 60);
  if( minutes < 10) {
    minutes = "0"+minutes.toFixed(3);
  }
  else {
    minutes = minutes.toFixed(3);
  }
  retVal += minutes+ "\'"; 
  return retVal;

}

function convertLat( lat) {
  var retVal;
  if( lat < 0) {
    retVal = "S ";
  } else {
    retVal = "N ";
  }  
  retVal += convertToDegrees( lat);
  return retVal;
}


function convertLng( lng) {
  var retVal;
  if( lng < 0) {
    retVal = "W ";
  } else {
    retVal = "E ";
  }    
  retVal += convertToDegrees( lng);
  return retVal;
}
