// 

function stopError() {return true;}

if (window.onerror) {window.onerror = stopError;}

// 

var altitude;
var pressure;
var density;
var speedOfSound;
var altitudeValue;
var deltaTemperature = 0;  // Deviation from standard temperature

var airMolWeight     = 28.9644;  // Molecular weight of air
var densitySL        = 1.225;    // Density at sea level [kg/m3]
var pressureSL       = 101325;   // Pressure at sea level [Pa]
var temperatureSL    = 288.15;   // Temperature at sea level [deg K]
var gamma            = 1.4;
var gravity          = 9.80665;  // Acceleration of gravity [m/s2]
var tempGrad         = -0.0065;  // Temperature gradient [deg K/m]
var RGas             = 8.31432;  // Gas constant [kg/Mol/K]
var R                = 287.053;  //

var altitudes    = new Array(0, 11000, 20000, 32000, 47000, 51000, 71000, 84852);
var pressureRels = new Array(1, 2.23361105092158e-1, 5.403295010784876e-2,
  8.566678359291667e-3, 1.0945601337771144e-3, 6.606353132858367e-4,
  3.904683373343926e-5, 3.6850095235747942e-6);
var temperatures = new Array(288.15, 216.65, 216.65, 228.65, 270.65, 270.65, 214.65, 186.946);
var tempGrads    = new Array(-6.5, 0, 1, 2.8, 0, -2.8, -2, 0);
var gMR = gravity * airMolWeight / RGas;

function CalcAtmos(){

  // Make sure altitude is valid
  if ((altitude < -2000) || (altitude > 86000)) {
    window.alert("Blad: Wysokosc musi byc pomiedzy -2000 a 86000 metrow.");
    return;
  }

  // Make deltaTemperature zero if NaN  
  if ( isNaN(deltaTemperature) ) {
    deltaTemperature = 0;
  }
  
  i = 0;

  // Find correct altitude values 
  if (altitude > 0) {
    while (altitude > altitudes[i+1]) i = i + 1; 
  }

  baseTemp        = temperatures[i];
  tempGrad        = tempGrads[i] / 1000;
  pressureRelBase = pressureRels[i];
  deltaAltitude   = altitude - altitudes[i];
  temperature     = baseTemp + tempGrad * deltaAltitude;

  // Calculate relative pressure
  if (Math.abs(tempGrad) < 1e-10) {
    pressureRel = pressureRelBase * Math.exp(-gMR * deltaAltitude/1000 / baseTemp);
  }
  else {
    pressureRel = pressureRelBase * Math.pow(baseTemp / temperature, gMR/tempGrad/1000);
  }
  
  // Add temperature offset
  temperature  = temperature + deltaTemperature;

  speedOfSound = Math.sqrt(gamma * R * temperature);
  pressure     = pressureRel * pressureSL;
  density      = densitySL * pressureRel * temperatureSL / temperature ;

}

function ConvertTemperatureFromSI(aTemperature, aTemperatureUnit)
{
  if      (aTemperatureUnit == "Celsius")    return aTemperature - 273.15;
  else if (aTemperatureUnit == "Fahrenheit") return 9/5 * aTemperature - 459.67;
  else if (aTemperatureUnit == "Kelvin")     return aTemperature;
  else if (aTemperatureUnit == "Rankine")    return 9/5 * aTemperature;
  else if (aTemperatureUnit == "Réaumure")   return 4/5 * (aTemperature - 273.15);
  else {
    window.alert('Blad: Nieznana jednostka temperatury: ' + aTemperatureUnit);
    return 0;
  }
}

function ConvertDeltaTemperatureToSI(aTemperature, aTemperatureUnit)
{
  if      (aTemperatureUnit == "CelsiusKelvin")     return aTemperature;
  else if (aTemperatureUnit == "FahrenheitRankine") return 5/9 * aTemperature;
  else if (aTemperatureUnit == "Réaumure")           return 5/4 * aTemperature;
  else {
    window.alert('Blad: Nieznana jednostka temperatury: ' + aTemperatureUnit);
    return 0;
  }
}

function formatFloat(number,X) {
// rounds number to X decimal places, default is 6
    X = (!X ? 6 : X);
    return Math.round(number*Math.pow(10,X))/Math.pow(10,X);
}

