// Copyright 1998-2006, digital dutch (info@digitaldutch.com)

function stopError() {return true;}

if (window.onerror) {window.onerror = stopError;}

// Set cookie expiration date to a year from now
var expDate = new Date();
expDate.setTime(expDate.getTime() + (1000 * 60 * 60 * 24 * 365));

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("Error: Altitude must be between -2000 and 86000 meter.");
    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('Error: Unknown temperature unit: ' + 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('Error: Unknown temperature unit: ' + 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);
}

// Retrieve a cookie (by Bill Dortch)
function getCookie(name){
  var cname = name + "=";
  var dc = document.cookie;
  if (dc.length > 0) {
    begin = dc.indexOf(cname);
    if (begin != -1) {
      begin += cname.length;
      end = dc.indexOf(";", begin);
      if (end == -1) end = dc.length;
      return unescape(dc.substring(begin, end));
    }
  }
  return null;
}

function getCookieDefault(name, defaultvalue){
  var value = getCookie(name);
  
  if (value != null) {
    return value;
  }
  else {
    return defaultvalue;
  }

}

// Save a cookie
function setCookie(name, value) {
  document.cookie = name + "=" + escape(value) + "; path=/" +
    ((expDate == null) ? "" : "; expires=" + expDate.toGMTString());
}

function getNumDigs(){
  var numDigs = getCookie("numDigs");
  if (numDigs != null) return parseInt(numDigs);
  else return 6;
}

function getUnitsIdx(){
  var i = getCookie("CBUnitsIdx");
  if (i != null) return parseInt(i);
  else return 2;
}

// Retrieve a select element selectedIndex
function getIndex(element) {
  var index = getCookie(element.name);
  if (index != null) element.selectedIndex = index;
}

// Save a select element selectedIndex
function setIndex(element) {
  setCookie(element.name, element.selectedIndex);
}
