// Weight and Balance
// Nicola@Zordan.net 21:12 4/14/2009

var CGrange=[0,1000]; // [from, to]
var WeightMax=1000; // max weight

// Aircraft Data
var AircraftData=[]; // [Tail, Type, icon, maxWeight, CGfrom, CGto, dryWeight, dryArm, pilotCoPilotArm, passengersArm, baggageArm,fuelArm,oilArm]; 

var AircraftDataNew=[ 'new',		// Tail number
  'C172',		// Type
  'Cessna.gif',		// icon
  2300,			// Max weight
  35,			// CG from
  47.5,			// CG to
  1410,			// dryWeight 
  39.45,		// dryArm 
  37,			// pilotCoPilotArm
  73,			// passengersArm
  95,			// baggageArm
  47			// fuelArm  //- oilArm   
];


var Aircrafts=[];
Aircrafts=[

[ 'N75RR',		// Tail number
  'C172',		// Type
  'Cessna.gif',		// icon
  2300,			// Max weight
  35,			// CG from
  47.5,			// CG to
  1410,			// dryWeight 
  39.45,		// dryArm 
  37,			// pilotCoPilotArm
  73,			// passengersArm
  95,			// baggageArm
  47			// fuelArm  //- oilArm   
]
,
[ 'N67AP',		// Tail number
  'P28A',		// Type
  'Piper.gif',		// icon
  2550,			// Max weight
  82,			// CG from
  93,			// CG to
  1776,			// dryWeight 
  87.3,			// dryArm 
  85.5,			// pilotCoPilotArm
  118.1,		// passengersArm
  142.8,		// baggageArm
  95			// fuelArm  //- oilArm   
]


];


var FuelGallonWeight=6;
var pound4kilo=2.20462262;

function getWeightBalance (aircraftData, pilotCopilotWeight, passengersWeight, baggageWeight, fuelGallons) {
  var result=null; // [weight,CG,moment,ok,message];
  //calculate weight
  var weight=0;
  var weightAircraft=aircraftData[6];
  weight+=weightAircraft;
  weight+=pilotCopilotWeight;
  weight+=passengersWeight;
  weight+=baggageWeight;
  var fuelWeight=fuelGallons*FuelGallonWeight;
  weight+=fuelWeight;
  //TODO calculate moment 
  var moment=0;
  var armAircraft=aircraftData[7];
  var armPilotCopilot=aircraftData[8];
  var armPassengers=aircraftData[9];
  var armBaggage=aircraftData[10];
  var armFuel=aircraftData[11];
  // should check armOil
  moment+=weightAircraft*armAircraft;
  moment+=pilotCopilotWeight*armPilotCopilot;
  moment+=passengersWeight*armPassengers;
  moment+=baggageWeight*armBaggage;
  moment+=fuelWeight*armFuel;
  // calculate CG
  var cg=moment/weight;
  // calculate ok
  var message='';
  var maxWeight=aircraftData[3];
  var cgMin=aircraftData[4];
  var cgMax=aircraftData[5]
  var ok=true;
  if (weight>maxWeight) {
    ok=false;
    //message+='Too Heavy [more than '+maxWeight+']';
    message+='Too Heavy';
  };
  if (cg<cgMin || cg>cgMax) {
    ok=false;
    if (message.length>0) message+=' & ';
    //message+='CG out of range ['+cgMin+' - '+cgMax+']';
    message+='CG unbalanced';
  };
  //result=[weight, cg, moment, ok, message];
  var weightDiff=weight-maxWeight;
  result=[weight, cg, moment, ok, message,weightDiff,fuelWeight,pilotCopilotWeight,passengersWeight,baggageWeight];
  return result;
};

function isCGweightOK (aircraftData, pilotCopilotWeight, passengersWeight, baggageWeight, fuelGallons) {
  var result=''; // length=0 is OK
  var CGweight=getWeightBalance(aircraftData, pilotCopilotWeight, passengersWeight, baggageWeight, fuelGallons);
  var weight=CGweight[0];
  var cg=CGweight[1];
  var ok=CGweight[3];
  var message=CGweight[4];
  result=message;
  return result;
};


function AddAircraftData (Tail, Type, icon, maxWeight, CGfrom, CGto, dryWeight, dryArm, pilotCoPilotArm, passengersArm, baggageArm,fuelArm,oilArm) {
  var aircraftData=[Tail, Type, icon, maxWeight, CGfrom, CGto, dryWeight, dryArm, pilotCoPilotArm, passengersArm, baggageArm,fuelArm,oilArm];
  var aircraft,tail;
  for (var i=0;i<Aircrafts.length;i++) {
    aircraft=Aircrafts[i];
    tail=aircraft[0];
    if (tail==Tail) {
      // replace
      Aircrafts[i]=aircraftData;
      return aircraftData;
    };
  };
  Aircrafts[Aircrafts.length]=aircraftData;
  return aircraftData;
};


function AddAircraft(aircraft) {
  var i=0;
  var Tail=aircraft[i++];
  var Type=aircraft[i++];
  var icon=aircraft[i++];
  var maxWeight=aircraft[i++];
  var CGfrom=aircraft[i++];
  var CGto=aircraft[i++];
  var dryWeight=aircraft[i++];
  var dryArm=aircraft[i++];
  var pilotCoPilotArm=aircraft[i++];
  var passengersArm=aircraft[i++];
  var baggageArm=aircraft[i++];
  var fuelArm=aircraft[i++];
  var oilArm=aircraft[i++];
  return AddAircraftData(Tail, Type, icon, maxWeight, CGfrom, CGto, dryWeight, dryArm, pilotCoPilotArm, passengersArm, baggageArm,fuelArm,oilArm);
};



function RemoveAircraftData (Tail) {
  var aircrafts=[];
  var aircraft,tail;
  for (var i=0;i<Aircrafts.length;i++) {
    aircraft=Aircrafts[i];
    tail=aircraft[0];
    if (tail!=Tail) {
      aircrafts[aircrafts.length]=aircraft;
    };
  };
  if (Aircrafts.length!=aircrafts.length) {
    Aircrafts=aircrafts;
   } else {
    alert('Aircraft tail ['+Tail+'] tobe removed not found');
  };
  return Aircrafts;
};

// i/o


function WeightBalanceHTML (wb) {
  var html='';
  html+='<table>';

  html+='<tr><td>'+'Weight';
  html+='</td><td>'+wb[0];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'CG';
  html+='</td><td>'+wb[1];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Moment';
  html+='</td><td>'+wb[2];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'OK';
  var colorOK='green';
  if (!wb[3]) colorOK='red';
  var okText='OK';
  if (!wb[3]) okText='NOT OK';
  //html+='</td><td style="color:'+colorOK+'">'+wb[3];
  html+='</td><td style="color:'+colorOK+'"><b>'+okText+'</b>';
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Messge';
  html+='</td><td>'+wb[4];
  html+='</td></tr>'+'';


  html+='<tr><td colspan="2">'+'<hr>';
  html+='</td></tr>'+'';


  html+='<tr><td>'+'Pilots';
  html+='</td><td>'+wb[7];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Passengers';
  html+='</td><td>'+wb[8];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Baggage';
  html+='</td><td>'+wb[9];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Fuel';
  html+='</td><td>'+wb[6]+' ('+FuelGallonWeight+' x gallon)';
  html+='</td></tr>'+'';

  var wd=-wb[5];
  var color='green';
  if (wd<0) color='red';
  html+='<tr><td>'+'spare';
  //html+='</td><td>';
  html+='</td><td style="color:'+color+'">';
  if (wd>0) html+='+';
  //html+=wb[5];
  html+=wd;
  html+='</td></tr>'+'';


  html+='</table>';

  return html;
};


function AircraftsSelectionHTML (name,extra) {
  var html='';
  html+='<select name="'+name+'" ';
  if (extra!=null) html+=extra;
  html+='>';
  var aircraft, tail, type;
  for (var i=0;i<Aircrafts.length;i++) {
    aircraft=Aircrafts[i];
    tail=aircraft[0];
    type=aircraft[1];
    html+='<option value="+i+">'+tail+' ('+type+')</option>';
  };
  html+='<option value="NEW">new/edit</option>';
  html+='</select>';
  return html;
};

function AircraftHTML (aircraft) {
  var html='';
  html+='<table>';

  html+='<tr><td>'+'Tail Number';
  html+='</td><td>'+aircraft[0];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Type';
  html+='</td><td>'+aircraft[1];
  html+='</td></tr>'+'';

  
  html+='<tr><td>'+'';
  html+='</td><td>';
  if (aircraft[2]!=null && aircraft[2]!='') {
    html+='<img src="'+aircraft[2]+'" alt="'+aircraft[2]+'" />';
  };
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Max Weight';
  html+='</td><td>'+aircraft[3];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'CG from';
  html+='</td><td>'+aircraft[4];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'CG to';
  html+='</td><td>'+aircraft[5];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Aircraft Weight';
  html+='</td><td>'+aircraft[6];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Aircraft Arm';
  html+='</td><td>'+aircraft[7];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Pilot Copilot Arm';
  html+='</td><td>'+aircraft[8];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Passengers Arm';
  html+='</td><td>'+aircraft[9];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Baggage Arm';
  html+='</td><td>'+aircraft[10];
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Fuel Arm';
  html+='</td><td>'+aircraft[11];
  html+='</td></tr>'+'';

  //- oilArm   

  html+='<tr><td>'+'Direct Link';
  url=Link2Aircraft(aircraft);
  html+='</td><td>'+'<a href="'+url+'" target="_blank">'+aircraft[0]+'</a>';
  html+='</td></tr>'+'';


  html+='</table>';
  return html;
};


function AircraftHTMLinput (aircraftIn,addAction,extra) {
  var aircraft=aircraftIn;
  if (aircraft==null) aircraft=AircraftDataNew.slice(0);

  var html='';
  html+='<table>';

  html+='<tr><td>'+'Tail Number';
  html+='</td><td>'+'<input type="text" name="TailNumber" size="10" value="'+aircraft[0]+'" />';
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Type';
  html+='</td><td>'+'<input type="text" name="Type" size="10" value="'+aircraft[1]+'" />';
  html+='</td></tr>'+'';

  
  html+='<tr><td>'+'';
  html+='</td><td>';
    var icon=aircraft[2];
    html+='<input type="radio" name="icon" value="Cessna.gif" ';
    if (icon=='Cessna.gif') html+='checked';
    html+=' />';
    html+='<img src="Cessna.gif" alt="Cessna.gif" />';
    html+='<br/>';
    html+='<input type="radio" name="icon" value="Piper.gif" ';
    if (icon=='Piper.gif') html+='checked';
    html+=' />';
    html+='<img src="Piper.gif" alt="Piper.gif" />';
    html+='<br/>';
    html+='<input type="radio" name="icon" value="" 0checked ';
    if (icon!='Cessna.gif' && icon!='Piper.gif') html+='checked';
    html+=' />';
    html+='none ';   // +aircraft[2]
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Max Weight';
  html+='</td><td>'+'<input type="text" name="MaxWeight" size="6" value="'+aircraft[3]+'" />';
  html+='</td></tr>'+'';

  html+='<tr><td>'+'CG from';
  html+='</td><td>'+'<input type="text" name="CGfrom" size="5" value="'+aircraft[4]+'" />';
  html+='</td></tr>'+'';

  html+='<tr><td>'+'CG to';
  html+='</td><td>'+'<input type="text" name="CGto" size="5" value="'+aircraft[5]+'" />';
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Aircraft Weight';
  html+='</td><td>'+'<input type="text" name="AircraftWeight" size="5" value="'+aircraft[6]+'" />';
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Aircraft Arm';
  html+='</td><td>'+'<input type="text" name="AircraftArm" size="5" value="'+aircraft[7]+'" />';
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Pilot Copilot Arm';
  html+='</td><td>'+'<input type="text" name="PilotCopilotArm" size="5" value="'+aircraft[8]+'" />';
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Passengers Arm';
  html+='</td><td>'+'<input type="text" name="PassengersArm" size="5" value="'+aircraft[9]+'" />';
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Baggage Arm';
  html+='</td><td>'+'<input type="text" name="BaggageArm" size="5" value="'+aircraft[10]+'" />';
  html+='</td></tr>'+'';

  html+='<tr><td>'+'Fuel Arm';
  html+='</td><td>'+'<input type="text" name="FuelArm" size="5" value="'+aircraft[11]+'" />';
  html+='</td></tr>'+'';

  //- oilArm   

  html+='<tr><td>'+'';
  //html+='</td><td>'+'<input type="button" value="Done" onClick="SaveAircraftInput(this.form)" />';
  html+='</td><td>'+'<input type="button" value="Done" onClick="'+addAction+'" '
  if (extra!=null) html+=extra;
  html+=' />';
  html+='</td></tr>'+'';

  html+='</table>';
  return html;
};

function SaveAircraftInput (form) {
  var aircraft=[];
  var Tail=form.TailNumber.value;
  if (Tail==null || Tail=='') {
    alert('No Tail Number');
    return null;
  };

  var Type=form.Type.value;
  if (Type==null || Type=='') {
    alert('No Type');
    return null;
  };

  var icon='';
  var iconFields=form.icon;
  for (var i=0;i<iconFields.length;i++) {
    if (iconFields[i].checked) icon=iconFields[i].value;
  }; 

  var maxWeight=parseFloat('0'+form.MaxWeight.value);
  var CGfrom=parseFloat('0'+form.CGfrom.value);
  var CGto=parseFloat('0'+form.CGto.value);
  var dryWeight=parseFloat('0'+form.AircraftWeight.value);
  var dryArm=parseFloat('0'+form.AircraftArm.value);
  var pilotCoPilotArm=parseFloat('0'+form.PilotCopilotArm.value);
  var passengersArm=parseFloat('0'+form.PassengersArm.value);
  var baggageArm=parseFloat('0'+form.BaggageArm.value);
  var fuelArm=parseFloat('0'+form.FuelArm.value);
  // oilArm]; 

  var oilArm=null;

  //var aircraft=[Tail, Type, icon, maxWeight, CGfrom, CGto, dryWeight, dryArm, pilotCoPilotArm, passengersArm, baggageArm,fuelArm,oilArm]; 
  
  var aircraft=AddAircraftData(Tail, Type, icon, maxWeight, CGfrom, CGto, dryWeight, dryArm, pilotCoPilotArm, passengersArm, baggageArm,fuelArm,oilArm);

  return aircraft;
};

var WeightBalancePage='http://www.NicolaZordan.net/Nik/WeightBalance.htm';
function Link2Aircraft (aircraft) {
  var url='';
  url+=WeightBalancePage;
  url+='?Aircraft=';
  url+='[';
  url+="'"+aircraft[0]+"',";
  url+="'"+aircraft[1]+"',";
  url+="'"+aircraft[2]+"',";
  for (var i=3;i<aircraft.length;i++) {
    url+=aircraft[i]+",";
  };
  url+=']';
  return url;
};


