//--------------------------------------------------
// Berechnet die akt Uhrzeit und die Wahre Ortszeit 
// für lamda=14 Grad 43 min
// trägt sie in die felder Time und WOZ ein
// und ruft uhr erneut auf
//--------------------------------------------------
function uhr () {
  var d  =new Date();
  if (window.document.SuhrForm.StopTime.checked){
    var stunden=window.document.SuhrForm.Time.value;
    i=stunden.indexOf(":");
    if (i>=0) 
    { minuten=stunden.substr(i+1,10); // Teil nach ":"
      stunden =stunden.substr(0,i);   // Teil vor ":"
      j=minuten.indexOf(":");
      if (j>=0) 
      { sekunden=minuten.substr(j+1,10); // Teil nach ":"
        minuten =minuten.substr(0,j);   // Teil vor ":"
      } 
      else {sekunden=""};
    } 
    else { minuten=""; sekunden="";};
    
    d.setHours(stunden,minuten,sekunden);
  }    
  var tag=d.getDate();
  var mon=d.getMonth()+1;
  
  // geogr. Länge von Krauschwitz: 14 Grad 43 Minuten
  var lambda=g2b(GradMinutenSekunden2Grad(
               window.document.SuhrForm.LaengeGrad.value,
               window.document.SuhrForm.LaengeMinuten.value,
               window.document.SuhrForm.LaengeSekunden.value
             ));
  var phi   =g2b(GradMinutenSekunden2Grad(
               window.document.SuhrForm.BreiteGrad.value,
               window.document.SuhrForm.BreiteMinuten.value,
               window.document.SuhrForm.BreiteSekunden.value
             ));
  var delta =g2b(Deklination(tag,mon));
  var z     =Zeitgleichung(tag,mon);
  var txt   =ZeitgleichungsText(z);
  var tau   =Date2Stundenwinkel(d,lambda,z);
  var a     =Azimut(phi,delta,tau);
  var h     =Hoehe(phi,delta,tau);
  var of    =-d.getTimezoneOffset();
  
  window.document.SuhrForm.Date.value         =Date2DateStr(d);
  if (!window.document.SuhrForm.StopTime.checked){
    window.document.SuhrForm.Time.value         =Date2TimeStr(d);
  }
  window.document.SuhrForm.UTCTime.value      =Date2UTCTimeStr(d);
  window.document.SuhrForm.Offset.value       =Runden(of/60);
  window.document.SuhrForm.WOZ.value          =tau2WOZStr(tau);
  window.document.SuhrForm.Stundenwinkel.value=Runden(b2g(tau));
  window.document.SuhrForm.ZGL.value          =Runden(z);
  window.document.SuhrForm.ZGLText.value      =txt;
  window.document.SuhrForm.Deklination.value  =Runden(b2g(delta));
  window.document.SuhrForm.Azimut.value       =Runden(b2g(a)); 
  window.document.SuhrForm.Hoehe.value        =Runden(b2g(h)); 
  
  // Neuen Aufruf von uhr() anmelden
  window.setTimeout ('uhr()',1000);
}

//--------------------------------------------------
// Rechnet Grad und Minuten in Grad mit Dezimalstellen um
//--------------------------------------------------
function GradMinutenSekunden2Grad(g,m,s) {
  var v;
  if (g<0){v=-1} else {v=1};
  return(v*(Math.abs(g)+Math.abs(m)/60+Math.abs(s)/3600));
};

//--------------------------------------------------
// Runden auf 1 Nachkommastelle
//--------------------------------------------------
function Runden (x) {
  return(Math.round(10*x)/10);
};


//--------------------------------------------------
// Berechnung der Zeitgleichung für den d.Tag des Monats m eines Jahres 
// in Minuten
//--------------------------------------------------
function Zeitgleichung (d,m) {
  var zgz=new Array(
  // Zeitgleichung für den
  //  1.     6.    11.    16.    21.    26.  des Monats
    -3.5,  -5.8,  -7.9,  -9.7, -11.3, -12.6, //Januar
   -13.6, -14.1, -14.3, -14.1, -13.7, -13.0,
   -12.4, -11.4, -10.1,  -8.7,  -7.3,  -5.8,
    -4.0,  -2.5,  -1.1,   0.2,   1.3,   2.2,
     2.9,   3.4,   3.7,   3.7,   3.5,   3.1,
     2.3,   1.5,   0.5,  -0.6,  -1.6,  -2.9,
    -3.7,  -4.6,  -5.4,  -6.0,  -6.3,  -6.5,
    -6.3,  -5.9,  -5.2,  -4.3,  -3.2,  -1.9,
    -0.2,   1.6,   3.3,   5.1,   6.9,   8.6,
    10.3,  11.7,  13.2,  14.4,  15.3,  16.0,
    16.4,  16.4,  16.0,  15.3,  14.2,  12.8,
    11.0,   9.1,   6.9,   4.5,   2.0,  -0.5,  //Dezember
    -3.5 
  );
  var i=(m-1)*6+Math.floor((d-1)/5); //Index des Eintrags, dessen Tag <= dem gesuchten ist
  // Die folgende Interpolation liefert für die Tage zwischen dem 26. und dem 1. des
  // Folgemonats falsche Werte, da dann die zu zwei aufeinander folgenden Tabellen-Eingängen
  // gehörende Tag-Differenz nicht 5, sondern zwischen 3=28+1-26 und 6=31+1-26 schwankt.
  //
  var k=(d-1 - 5*Math.floor((d-1)/5))/5;
  return(zgz[i]+k*(zgz[i+1]-zgz[i]));
}

//--------------------------------------------------
// Berechnung der Deklination der Sonne für den d.Tag des Monats m eines Jahres
// in Grad 
//--------------------------------------------------
function Deklination (d,m) {
  var dekl=new Array(
  // Deklination für den
  //  1.     6.    11.    16.    21.    26.  des Monats
   -23.1, -22.6, -21.9, -21.0, -20.0, -18.8,
   -17.3, -15.8, -14.2, -12.5, -10.8,  -8.9,
    -7.8,  -5.9,  -3.9,  -2.0,   0.0,   2.0,
     4.3,   6.3,   8.1,   9.9,  11.7,  13.3,
    14.9,  16.4,  17.7,  19.0,  20.1,  21.0,
    22.0,  22.6,  23.1,  23.3,  23.4,  23.4,
    23.2,  22.8,  22.2,  21.5,  20.6,  19.1,
    18.2,  16.9,  15.4,  13.9,  12.3,  10.6,
     8.2,   6.7,   4.8,   2.9,   0.9,  -1.0,
    -3.0,  -4.9,  -6.8,  -8.7, -10.5, -12.3,
   -14.3, -15.8, -17.3, -18.6, -19.8, -20.8,
   -21.7, -22.4, -23.0, -23.3, -23.4, -23.4,
   -23.1 
  );
  var i=(m-1)*6+Math.floor((d-1)/5); //Index des Eintrags, dessen Tag <= dem gesuchten ist
  // Die folgende Interpolation liefert für die Tage zwischen dem 26. und dem 1. des
  // Folgemonats falsche Werte, da dann die zu zwei aufeinander folgenden Tabellen-Eingängen
  // gehörende Tag-Differenz nicht 5, sondern zwischen 3=28+1-26 und 6=31+1-26 schwankt.
  //
  var k=(d-1 - 5*Math.floor((d-1)/5))/5;
  return(dekl[i]+k*(dekl[i+1]-dekl[i]));
}

//--------------------------------------------------
// Berechnung des Zeitgleichungstextes für z 
//--------------------------------------------------
function ZeitgleichungsText(z){
  var text;
  z=Runden(z);
  if (z==0){text="ganz genau"};
  if (z>0) {text="um "+z+" Minuten vor"};
  if (z<0) {text="um "+(-z)+" Minuten nach"};
  return(text);
}


//--------------------------------------------------
// Eintragen der Koordinaten eines Ortes in SuhrForm
//--------------------------------------------------
function KoordsEintragen(){
  var minuten;
  var sekunden;
  var i;
  var j;
  var laenge;
  var breite;
  
  var s=window.document.SuhrForm.Ort.options[window.document.SuhrForm.Ort.selectedIndex].value;

  breite=s.substr(0,10);
  i=breite.indexOf(":");
  if (i>=0) 
  { minuten=breite.substr(i+1,5); // Teil nach ":"
    breite =breite.substr(0,i);   // Teil vor ":"
    j=minuten.indexOf(":");
    if (j>=0) 
    { sekunden=minuten.substr(j+1,5); // Teil nach ":"
      minuten =minuten.substr(0,j);   // Teil vor ":"
    } 
    else {sekunden=""};
  } 
  else { minuten=""; sekunden="";};

  window.document.SuhrForm.BreiteGrad.value=breite;
  window.document.SuhrForm.BreiteMinuten.value=minuten;
  window.document.SuhrForm.BreiteSekunden.value=sekunden;
  
  laenge=s.substr(10,10);
  i=laenge.indexOf(":");
  if (i>=0) 
  { minuten=laenge.substr(i+1,5); // Teil nach ":"
    laenge =laenge.substr(0,i);   // Teil vor ":"
    j=minuten.indexOf(":");
    if (j>=0) 
    { sekunden=minuten.substr(j+1,5); // Teil nach ":"
      minuten =minuten.substr(0,j);   // Teil vor ":"
    } 
    else {sekunden=""};
  } 
  else { minuten=""; sekunden="";};
 
  window.document.SuhrForm.LaengeGrad.value=laenge;
  window.document.SuhrForm.LaengeMinuten.value=minuten;
  window.document.SuhrForm.LaengeSekunden.value=sekunden;
}


//--------------------------------------------------
// Berechnung des Sonnen-Azimuts aus geogr. Breite phi, 
// Deklination delta und Stundenwinkel tau
//--------------------------------------------------
function Azimut (phi, delta, tau){
  var k;
  with (Math) {	
    if (cos(tau)>=(tan(delta)/tan(phi))){k=0} else {k=1.0};
    var r=k*PI+atan(sin(tau)/(sin(phi)*cos(tau)-cos(phi)*tan(delta)));
    if (r>PI){r=r-2.0*PI};
    return(r);
  }
}

//--------------------------------------------------
// Berechnung der Sonnen-Höhe aus geogr. Breite phi, 
// Deklination delta und Stundenwinkel tau
//--------------------------------------------------
function Hoehe (phi, delta, tau){
  with (Math) {	
    return(asin(sin(phi)*sin(delta)+cos(phi)*cos(delta)*cos(tau)))
  }
}

//--------------------------------------------------
// Liefert die Zeichenkette tt.mm.jj
//--------------------------------------------------
function DateStr () {
  var d=new Date();
  return(Date2DateStr(d)); 
}

//--------------------------------------------------
// Fehlerhafte Werte für getYear korrigieren
//--------------------------------------------------
function getYearK(d) {
  if (d.getYear()<2000) return(d.getYear()+1900); else return(d.getYear())
}


//--------------------------------------------------
// Liefert aus dem Datums-Objekt d die Zeichenkette tt.mm.jj
//--------------------------------------------------
function Date2DateStr (d) {
  return(trim(d.getDate()," ",2)
         +"."+trim(d.getMonth()+1,"0",2)
         +"."+getYearK(d).toString() //trim(d.getYear(),"0",4)
        ); 
}


//--------------------------------------------------
// Verlängert/Verkürzt die Zeichenkette von i 
// durch Voranstellen des Zeichens ch/durch Abschneiden der ersten Zeichen
// auf n Stellen
//--------------------------------------------------
function trim(s,ch,n){
  var s1=s.toString();
  s1=s1.slice(s1.length-n,s1.length); // Alles bis auf die letzten n Zeichen abschneiden
  while (s1.length<n){s1=ch+s1};      // Vorn mit ch auffüllen, bis n Zeichen erreicht
  return(s1);
}
  

//--------------------------------------------------
// Liefert die Zeichenkette hh:mm:ss
//--------------------------------------------------
function TimeStr () {
  var d=new Date();
  return(Date2TimeStr(d)); 
}

//--------------------------------------------------
// Liefert aus dem Date-Objekt d die Zeichenkette hh:mm:ss
//--------------------------------------------------
function Date2TimeStr(d) {
  return(trim(d.getHours()," ",2)
         +":"+trim(d.getMinutes(),"0",2)
         +":"+trim(d.getSeconds(),"0",2)
        ); 
}

//--------------------------------------------------
// Liefert aus dem Date-Objekt d die Zeichenkette hh:mm:ss
//--------------------------------------------------
function Date2UTCTimeStr(d) {
  return(trim(d.getUTCHours()," ",2)
         +":"+trim(d.getUTCMinutes(),"0",2)
         +":"+trim(d.getUTCSeconds(),"0",2)
        ); 
}

//--------------------------------------------------
// Liefert zum Datumsobjekt d und der geogr. Länge lambda
// den Stundenwinkel tau für die geogr. Länge lambda (0..tau..2*PI)
//--------------------------------------------------
function Date2Stundenwinkel (d,lambda,z) {
  var tau=
    Math.PI/(12*60*60)          // 12 Zeit-Stunden entsprechen Pi=180 Grad
    *(
      60*60*d.getUTCHours()       // Greenwich-Zeit (für lamda=0)
      +60*(
           d.getUTCMinutes()      
           +4*b2g(lambda)       // 1 Grad entspricht 4 Zeitminuten
           +z                   // Zeitgleichung in Minuten
          )
      +d.getUTCSeconds()
     )
     -Math.PI;                  // 12 Uhr entspricht 0 Grad
  if (tau<0){tau=tau+2.0*Math.PI}
  return(tau);
}

//--------------------------------------------------
// Liefert aus dem Stundenwinkel tau die Wahre Ortszeit
//--------------------------------------------------
function tau2WOZStr (tau) {
  var t=tau+Math.PI; // Pi..tau..2Pi,0..tau..+Pi -> 0..t..2*Pi
  if (t>2.0*Math.PI){t=t-2.0*Math.PI}
  t=Math.round(t*((12*60*60)/Math.PI)); // 0..t..(24*60*60) Sekunden 
  var sec=Rest(t,60); t=(t-sec)/60;
  var min=Rest(t,60); t=(t-min)/60;
  var h  =t;
  return(trim(h," ",2)
         +":"+trim(min,"0",2)
         +":"+trim(sec,"0",2)
        ); 

};

//--------------------------------------------------
// Umrechnung Grad in rad
//--------------------------------------------------
function g2b (w) {
  return(w/180*Math.PI)
};

//--------------------------------------------------
// Umrechnung rad in Grad
//--------------------------------------------------
function b2g (w) {
  return(w*180/Math.PI)
};

//--------------------------------------------------
// Liefert den Rest der Division von z durch n
//--------------------------------------------------
function Rest (z,n) {
  // z=13, n=5, floor(z/n)=2; n*floor(z/n)=10; Ergebnis=3
  return(z-n*Math.floor(z/n)); 
}


