//----------------------------
// Riedel Computer Systeme
// Tangstedter Strasse 51
// D-25462 Rellingen, Germany
//
// Last modified: 01-AUG-1999 / 29-MAY-2000 / 18-NOV-2009 / 31-DEC-2010
//----------------------------

function checkNSWE(item, min, max, bText, lCode)
{
  var checkVal = item.value
  var returnVal = false
  var aText1 = "Please enter " + min + " or " + max

  if(lCode == 1)
  {
    aText1 = "Bitte geben Sie nur " + min + " oder " + max + " ein."
  }

  if (checkVal == min || checkVal == max)
    returnVal = true
  else
    alert(bText + ":\n\n" + aText1)

  return returnVal

} // End of checkInt()


function checkInt(item, min, max, bText, lCode)
{
  var checkVal = parseInt(item.value)
  var returnVal = false

  var aText1 = "Please enter a number"
  var aText2 = "Please enter a number >= " + min
  var aText3 = "Please enter a number <= " + max

  if(lCode == 1)
  {
    aText1 = "Bitte geben Sie eine Ganzzahl ein."
    aText2 = "Bitte geben Sie eine Zahl größer >= " + min + " ein."
    aText3 = "Bitte geben Sie eine Zahl kleiner <= " + max + " ein."
  }

  if ( isNaN(checkVal) )
     alert(bText + ":\n\n" + aText1)

  else if (checkVal < min)
    alert(bText + ":\n\n" + aText2)

  else if (checkVal > max)
    alert(bText + ":\n\n" + aText3)

  else
    returnVal = true

  return returnVal

} // End of checkInt()


function checkFloat(item, min, max, bText, lCode)
{
  var checkVal = parseFloat(item.value)
  var returnVal = false

  var aText1 = "Please enter a number"
  var aText2 = "Please enter a number >= " + min
  var aText3 = "Please enter a number <= " + max

  if(lCode == 1)
  {
    aText1 = "Bitte geben Sie eine Zahl ein. Verwenden Sie als Dezimaltrennzeichen einen Punkt (kein Komma!)."
    aText2 = "Bitte geben Sie eine Zahl größer >= " + min + " ein."
    aText3 = "Bitte geben Sie eine Zahl kleiner <= " + max + " ein."
  }

  if ( isNaN(checkVal) )
      alert(bText + ":\n\n" + aText1)

  else if (checkVal < min)
      alert(bText + ":\n\n" + aText2)

  else if (checkVal > max)
      alert(bText + ":\n\n" + aText3)

  else
      returnVal = true

  return returnVal

} // End of checkFloat()


function Trunc(aNumber)
// Liefert den Vorkommateil einer Zahl
{
  var result = 0.0;
  var aStr = String(aNumber);
  if (aStr.indexOf(".") < 0)
     aStr += ".0";
  var aStrAry = aStr.split(".");
  result = Number(aStrAry[0]);
  return result;
}

function Frac(aNumber)
// Liefert den Nachkommateil einer Zahl
{
  var result = 0.0;
  var aStr = String(aNumber);
  if (aStr.indexOf(".") < 0)
     aStr += ".0";
  var aStrAry = aStr.split(".");
  result = Number("0." + aStrAry[1]);
  return result;
}

function ValToDegMin(aNumber, aFlag)
//
// Geographische Koordinate in String umwandeln
//
// aNumber = Koordinate als Gleitkommazahl in Grad
// aFlag: 0=Latitude  1=Longitude
// Result = "Hddd°mm.m"
// where "H"    = N or S if aFlag = 0
//       "H"    = W or E if aFlag = 1
//       "ddd"  = degree, 2 digits if aFlag = 0
//       "ddd"  = degree, 3 digits if aFlag = 1
//       "mm.m" = minutes with one fractional digit
//
// Note: Due to the limited accuracy of JavaScript floating point
// operations it is not possible to calculate the seconds of a
// given coordinate. On certain coordinates there would be an
// error of -1 second.
{
  var result = "";
  if (aFlag == 0)
     if (aNumber < 0.0)
        result = "S "
     else
        result = "N "
  else
     if (aNumber < 0.0)
        result = "W "
     else
        result = "E "
  aNumber = Math.abs(aNumber);
  var aDeg    = Trunc(aNumber);
  var aDegStr = String(aDeg);
  if (aDeg < 10)
      aDegStr = "0" + aDegStr;
  if (aFlag != 0)
     if (aDeg < 100)
        aDegStr = "0" + aDegStr;
  var aFrac = Frac(aNumber);
  var aMin = 60.0 * aFrac;
  aMin = Math.round(aMin * 10.0) / 10.0;
  var aMinStr = String(aMin);
  if (aMin < 10)
     aMinStr = "0" + aMinStr;
  if (aMinStr.indexOf(".") < 0)
     aMinStr += ".0";
  result += aDegStr + "°" + aMinStr + "'";
  return result;
}


//---------------------------------------------------------
// Stunden, Minuten in String im Format "hh:mm" umwandeln
//---------------------------------------------------------

function hhmmToStr (hh, mm)
{
  var resultText = ""
  if (hh < 10)
     resultText += "0"
  resultText += hh + ":"
  if (mm < 10)
     resultText += "0"
  resultText += mm
  return resultText
}


//---------------------------------------------------------
// Dezimalstunden in String im Format "hh:mm" umwandeln
//---------------------------------------------------------

function TimeToStr (AValue)
{
  var resultText = ""
  var hh = Math.floor(AValue)
  var mm = Math.floor((AValue - hh)*60)
  if (hh < 10)
     resultText += "0"
  resultText += hh + ":"
  if (mm < 10)
     resultText += "0"
  resultText += mm
  return resultText
}

//-------------------------------------
// Alle Einträge einer ComboBox löschen
//-------------------------------------

function clearComboBox (item)
{
 do
   item.options[0] = null;
 while (item.options.length > 0)
}

//-------------------------------------
// Eintrag zu einer ComboBox hinzufügen
//-------------------------------------

function ComboBoxAdd (item, ADisplayText, AReturnText)
{
 item.options[item.options.length] = new Option(ADisplayText, AReturnText);
}


//------------------------------------------------------------------------
// Erzeugen einer Tabelle mit Dämmerungs-, Sonnenauf- und Untergangszeiten
//
// Die Tabelle wird auf einer dynamisch erzeugten neuen HTML-Seite
// angezeit, wobei der im Browser angezeigte Dateiname unverändert bleibt.
//------------------------------------------------------------------------

function CreateSunrisePage (year,month,lat,lon,location)
{
  var sFontB  = "<font face=\"Courier New\" size=\"2\">"
  var sFontE  = "</font>"
  var tagTD1a = "<TD align=center width=12% bgcolor=#D0D0D0>"
  var tagTD1b = "<TD align=center width=22% bgcolor=#D0D0D0>"
  var tagTD2  = "<TD align=center bgcolor=#F8F8F8>"
  var tagTD3  = "<TD colspan=4 align=center bgcolor=#EBEBEB>"

  var day = 1
  var tempText = ""
  var htmlText = ""

  // check for leap year and assign month lengths and start days
  leapyear = (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) ?1:0
  month_length = new Array(12)
    month_length[0] = 31;
    month_length[1] = leapyear ? 29 : 28;
    month_length[2] = 31;
    month_length[3] = 30;
    month_length[4] = 31;
    month_length[5] = 30;
    month_length[6] = 31;
    month_length[7] = 31;
    month_length[8] = 30;
    month_length[9] = 31;
    month_length[10] = 30;
    month_length[11] = 31;

  month_names = new Array(12)
    month_names[0] = "Januar";
    month_names[1] = "Februar";
    month_names[2] = "März";
    month_names[3] = "April";
    month_names[4] = "Mai";
    month_names[5] = "Juni";
    month_names[6] = "Juli";
    month_names[7] = "August";
    month_names[8] = "September";
    month_names[9] = "Oktober";
    month_names[10] = "November";
    month_names[11] = "Dezember";

  htmlText += "<html><head>"
  htmlText += "<title>Sunrise Sunset by RCS</title>"
  htmlText += "</head>"

  htmlText += "<body BGCOLOR=#FFFFFF TEXT=#000000 LINK=#0000FF VLINK=#663399 ALINK=#FF0000>"

  htmlText += "<div align=\"center\"><center>"
  htmlText += "<TABLE width=75% border=1 cellpadding=4 cellspacing=0 bordercolor=#FFFFFF>"

  htmlText += "<TR>"
  htmlText += "<TD COLSPAN=5 align=center bgcolor=#EBEBEB> <strong>" + sFontB + location + "<br>" + ValToDegMin(lat,0) + " - " + ValToDegMin(lon,1) + "<br>" + month_names[month-1] + " " + year + sFontE + "</strong> </TD>"
  htmlText += "</TR>"

  htmlText += "<TR>"
  htmlText += tagTD1a + "<strong>" + sFontB + "Tag" + sFontE + "</strong> </TD>"
  htmlText += tagTD1b + "<strong>" + sFontB + "Beginn der<br>Dämmerung" + sFontE + "</strong> </TD>"
  htmlText += tagTD1b + "<strong>" + sFontB + "Sonnen-<br>aufgang" + sFontE + "</strong> </TD>"
  htmlText += tagTD1b + "<strong>" + sFontB + "Sonnen-<br>untergang" + sFontE + "</strong> </TD>"
  htmlText += tagTD1b + "<strong>" + sFontB + "Ende der<br>Dämmerung" + sFontE + "</strong> </TD>"
  htmlText += "</TR>"

  for (day = 1; day <= month_length[month-1]; day++)
      {
       sunRiseSet(year,month,day,lat,lon);
       civTwilight(year,month,day,lat,lon);

       htmlText += "<TR>"
       htmlText += tagTD2 + sFontB + day + sFontE + "</TD>"

       if (twStatus > 0 && srStatus <= 0)
          {
           htmlText += tagTD3 + sFontB + "Dauernde Dämmerung" + sFontE + "</TD>"
          }
       else
          {
          if (srStatus > 0)
             {
              htmlText += tagTD3 + sFontB + "Dauernd Tag" + sFontE + "</TD>"
             }
          else
             if (srStatus < 0)
                {
                 htmlText += tagTD3 + sFontB + "Dauernd Nacht" + sFontE + "</TD>"
                }
             else
                {
                 htmlText += tagTD2 + sFontB + TimeToStr(twStartT) + sFontE + "</TD>"
                 htmlText += tagTD2 + sFontB + TimeToStr(sRiseT) + sFontE + "</TD>"
                 htmlText += tagTD2 + sFontB + TimeToStr(sSetT) + sFontE + "</TD>"
                 htmlText += tagTD2 + sFontB + TimeToStr(twEndT) + sFontE + "</TD>"
                }
          }

       htmlText += "</TR>"
      }

  htmlText += "<TR>"
  htmlText += "<TD COLSPAN=5 align=center bgcolor=#EBEBEB> <strong>" + sFontB + "Zeiten in UTC (Angaben ohne Gewähr)" + sFontE + "</strong> </TD>"
  htmlText += "</TR>"
  htmlText += "</TABLE>"

  htmlText += "<TABLE width=75% border=1 cellpadding=4 cellspacing=0 bordercolor=#FFFFFF>"
  htmlText += "<TD align=center bgcolor=#EBEBEB><strong>" + sFontB + "&nbsp;<br>Ein Online-Service von "
  htmlText += "<a href=http://www.generalaviation.de>www.GeneralAviation.de</a><br><br>" + sFontE + "</strong></TD>"
  htmlText += "</TABLE>"

  htmlText += "</center></div>"

  htmlText += "<center>&nbsp<form><input type=button value=\"Diese Seite drucken...\" onClick=\"javascript:window.print()\"></form></center>"
  htmlText += "<center><font size=\"1\" color=\"#808080\">(Alternativ bitte Menü \"Datei | Drucken\" oder Strg+P benutzen)</font></center>"
  htmlText += "</body></html>"

  document.open();
  document.write(htmlText);
  document.close();
} // End of CreateSunrisePage()


//--------------------------------------------------------------
// Formulareingaben auslesen, SRSS-Tabelle erzeugen und anzeigen
//--------------------------------------------------------------

function formValues(form, lCode)
{
  var sgn = "X"

  var latTextSgn = "Sign of Latitude"
  var latTextDeg = "Degrees of Latitude"
  var latTextMin = "Minutes of Latitude"
  var latTextSec = "Seconds of Latitude"
  var lonTextSgn = "Sign of Longitude"
  var lonTextDeg = "Degrees of Longitude"
  var lonTextMin = "Minutes of Longitude"
  var lonTextSec = "Seconds of Longitude"
  var yearText = "Year"
  var monthText = "Month"
  var dayText = "Date"

  if(lCode == 1)
  {
    latTextSgn = "Breitengrad 'Vorzeichen'"
    latTextDeg = "Breitengrad 'Grad'"
    latTextMin = "Breitengrad 'Minuten'"
    latTextSec = "Breitengrad 'Sekunden'"
    lonTextSgn = "Längengrad 'Vorzeichen'"
    lonTextDeg = "Längengrad 'Grad'"
    lonTextMin = "Längengrad 'Minuten'"
    lonTextSec = "Längengrad 'Sekunden'"
    yearText = "Jahr"
    monthText = "Monat"
    dayText = "Tag"
  }

  if( !checkNSWE(form.inpLatSgn, "N", "S", latTextSgn, lCode) )
    return
  if( !checkFloat(form.inpLatDeg, -90.0, 90.0, latTextDeg, lCode) )
    return
  if( !checkFloat(form.inpLatMin, 0.0, 59.9, latTextMin, lCode) )
    return
  if( !checkFloat(form.inpLatSec, 0.0, 59.9, latTextSec, lCode) )
    return

  var lat = parseFloat(form.inpLatDeg.value)
  sgn = form.inpLatSgn.value
  if (sgn == "S")
     lat = -lat
  if (lat < 0)
     {
      lat = lat - parseFloat(form.inpLatMin.value) / 60
      lat = lat - parseFloat(form.inpLatSec.value) / 3600
     }
  else
     {
      lat = lat + parseFloat(form.inpLatMin.value) / 60
      lat = lat + parseFloat(form.inpLatSec.value) / 3600
     }
  var absLat = Math.abs(lat)

  if( !checkNSWE(form.inpLonSgn, "W", "E", lonTextSgn, lCode) )
    return
  if( !checkFloat(form.inpLonDeg, -180.0, 180.0, lonTextDeg, lCode) )
    return
  if( !checkFloat(form.inpLonMin, 0.0, 59.9, lonTextMin, lCode) )
    return
  if( !checkFloat(form.inpLonSec, 0.0, 59.9, lonTextSec, lCode) )
    return

  var lon = parseFloat(form.inpLonDeg.value)
  sgn = form.inpLonSgn.value
  if (sgn == "W")
     lon = -lon
  if (lon < 0)
     {
      lon = lon - parseFloat(form.inpLonMin.value) / 60
      lon = lon - parseFloat(form.inpLonSec.value) / 3600
     }
  else
     {
      lon = lon + parseFloat(form.inpLonMin.value) / 60
      lon = lon + parseFloat(form.inpLonSec.value) / 3600
     }

  var absLon = Math.abs(lon)

  if( !checkInt(form.inpYear, 1901, 2099, yearText, lCode) )
    return

  var year = parseInt(form.inpYear.value)

  if( !checkInt(form.inpMonth, 1, 12, monthText, lCode) )
    return

  var month = parseInt(form.inpMonth.value)
  var monthMax

  if(month == 2 && (year % 4) == 0)
    monthMax = 29
  else if(month == 2)
    monthMax = 28
  else if( (month == 4) || (month == 6) || (month == 9) ||
           (month == 11) )
    monthMax = 30
  else
    monthMax = 31

CreateSunrisePage(year, month, lat, lon, form.inpLocation.value)
}  // End of formValues()


//------------------------------
// Formularfelder initialisieren
//------------------------------

function formInit (form)
{
 var curDate = new Date();
 var aYear = curDate.getYear()
 if (aYear < 200)
    aYear += 1900;
 form.inpYear.value = aYear;
 form.inpMonth.value = curDate.getMonth()+1;
 form.inpLocation.value = "Irgendwo in Deutschland";
 form.inpLatDeg.value = 53;
 form.inpLatMin.value = 38;
 form.inpLatSec.value = 28;
 form.inpLonDeg.value = 9;
 form.inpLonMin.value = 48;
 form.inpLonSec.value = 37;
 InitAirportList(form.inpAirpSelection);
}

//--------------------------------------------------------
// ComboBox Flugplätze - Auswahl auswerten und die Daten
// in die entsprechenden Formularfelder schreiben
//--------------------------------------------------------

function SetSelection (form, value)
{
 var Ary = value.split(",");
 if (Ary[0] == "")
 {
 form.inpLocation.value = "Riedel Computer Systeme, Pinneberg";
 form.inpLatDeg.value = 53;
 form.inpLatMin.value = 38;
 form.inpLatSec.value = 28;
 form.inpLonDeg.value = 9;
 form.inpLonMin.value = 48;
 form.inpLonSec.value = 37;
 form.inpLatSgn.value = "N";
 form.inpLonSgn.value = "E";
 }
 else
 {
 form.inpLocation.value = Ary[0];
 form.inpLatDeg.value = Math.abs(Ary[1]);
 form.inpLatMin.value = Math.abs(Ary[2]);
 form.inpLatSec.value = Math.abs(Ary[3]);
 form.inpLonDeg.value = Math.abs(Ary[4]);
 form.inpLonMin.value = Math.abs(Ary[5]);
 form.inpLonSec.value = Math.abs(Ary[6]);
 if (Ary[1] < 0.0)
    form.inpLatSgn.value = "S"
 else
    form.inpLatSgn.value = "N";

 if (Ary[4] < 0.0)
    form.inpLonSgn.value = "W"
 else
    form.inpLonSgn.value = "E";
 }
}

