var startflag = 0;
var SunAzimuth, SunHeight;
var sitenum = 19;
var latlist  = new Array
 ("","-22","52.5","50.07","47.59","53.36","50.56","48.08","48.46",
  "48.5","43.42","41.54","59.55","38.43","59.2","40.24","39.55","37.09",
  "40.45");
var lonlist = new Array
 ("","-42.3","13.5","8.4","7.51","10","6.59","11.34","9.11",
  "2.15","7.15","12.29","10.45","-9.08","18.05","-3.41","2.65","-2.35",
  "-73.55");
var timezonelist = new Array
 ("","-3","1","1","1","1","1","1","1",
  "1","1","1","1","1","1","1","1","1","-5");

function selectbox ()
{ var f=0;

  with (window.document.zon)
  { for (var i=0; i<sitenum; i++)
      if (Sel_Site.options[i].selected==true) f = i;
    p_lat.value = latlist[f];
    p_lon.value = lonlist[f];
    p_timezone.value = timezonelist[f];
  }
}

function setuserdef ()
{ with (window.document.zon)
  {  Sel_Site.options[0].selected=true;}
}


function trunc(x)
{ return (Math.round(x - 0.5));
}


function atan2(y, x)
{ var PI2 = 1.5707963267949;
  var temp;

  if (x == 0)
  { if (y>0) {return (PI2);}
      else {if (y<0) {return(-PI2);} else {return(0);}}
  }
  else
  { temp = Math.atan (y/x)
    if (x>0){ return(temp) }
      else {if (y>=0) {return(temp + Math.PI)} else { return(temp - Math.PI)}}
  }
}


function rad(grad)
{ return( grad * Math.PI / 180);
}


function grad(rad)
{ return( rad * 180 / Math.PI);
}


function DayOfYear(year, month, day)
{ var x;
  var monthday = new
  Array(0,31,59,90,120,151,181,212,243,273,304,334);

  x = monthday[month-1] + day;
  if ((year%4 == 0) && ((year%100!=0)||(year%400==0)) && (month>2)) x++;
  return(x);
}

function SunPosition(year, month, day, hour, min, sec, lat, lon, timezone)
{ var  PI2 = 2 * Math.PI;
  var delyr, leap
  var T, TM
  var theta, g, el, eps
  var ra, decl, phi
  var ST, S, H, E, A, ETS, R
  var asETS, asA

  delyr = year - 1980
  leap = delyr%4
  T = hour + 1 * (min + sec/60) / 60 - timezone
  TM = delyr * 365 + leap + DayOfYear(year, month, day) - 1 + T / 24
  if (delyr == leap * 4) {TM = TM - 1}
  if ((delyr < 0) && (delyr != leap*4)) {TM = TM - 1}
  theta = rad(360 * TM / 365.25)
  g = -0.031271 - 0.000000453963 * TM + theta
  el = 4.900968 + 0.000000367474 * TM + (0.033434 - 0.0000000023 * TM) * Math.sin(g) + 0.000349 * Math.sin(2 * g) + theta
  eps = 0.40914 - 0.0000000062149 * TM
  ra = atan2(Math.sin(el) * Math.cos(eps), Math.cos(el))
  if (ra < 0) {ra = ra + PI2}
  decl = Math.asin(Math.sin(el) * Math.sin(eps))
  ST = 1.759335 + PI2 * (TM / 365.25 - delyr) + 0.0000003694 * TM
  if (ST > PI2) {ST = ST - PI2}
  S = ST + rad(T * 15 + lon)
  if (S > PI2) {S = S - PI2}
  H = ra - S
  phi = rad(lat)
  asETS = Math.sin(phi) * Math.sin(decl) + Math.cos(phi) * Math.cos(decl) * Math.cos(H)
  if (asETS > 1) {asETS = 1}
  if (asETS < -1) {asETS = -1}
  ETS = grad(Math.asin(asETS))
  R = 3.51561 * (0.1594 + 0.0196 * ETS + 0.00002 * ETS * ETS) / (1 + 0.505 * ETS + 0.0845 * ETS * ETS)
  E = ETS + R
  asA = Math.cos(decl) * Math.sin(H) / Math.cos(rad(ETS))
  if (asA > 1) {asA = 1}
  if (asA < -1) {asA = -1}
  A = grad(Math.asin(asA))
  if (Math.sin(rad(E)) <= (Math.sin(decl) / Math.sin(phi)))
  { if (A < 0) {A = A + 360}
    A = 180 - A
  }
  SunAzimuth = 180 - A
  SunHeight = E
}

function TimeToStr (hour, min, sec)
{ var s = "";

  if (sec>59) {min+=1; sec=0};
  if (min>59) {hour+=1; min=0};
  if (hour>24) {hour-=24};
  if (hour<10) s="";
  s = s + hour+":";
  if (min<10) s+="0";
  s = s + min + "";
  return (s);
}


function SunRise (year, month, day, lat, lon, timezone)
{ var DeltaT = 900; // 15 Min
  var TD1 = 0 - DeltaT;
  var TD3 = 86400;
  var TD2;
  var hour, min, sec;

  do 
  { TD1 = TD1 + DeltaT;
    hour = trunc(TD1/3600); min = trunc((TD1%3600)/60); sec = TD1%60;
    SunPosition (year, month, day, hour, min, sec, lat, lon, timezone);
  }
  while ((SunHeight>0) && (TD1 > TD3));

  TD2 = TD1 - DeltaT;
  do 
  { TD2 = TD2 + DeltaT;
    hour = trunc(TD2/3600); min = trunc((TD2%3600)/60); sec = TD2%60;
    SunPosition (year, month, day, hour, min, sec, lat, lon, timezone);
  }
  while (((SunHeight < 0) || (TD2<TD1)) && (TD2<TD3));

  if ((TD1 <= TD3) && (TD2 <= TD3))
  { DeltaT = TD2 - TD1;
    TD1 = TD1 + DeltaT / 2;
    while (DeltaT > 1)
    { DeltaT = DeltaT / 2;
      hour = trunc(TD1/3600); min = trunc((TD1%3600)/60); sec = TD1%60;
    SunPosition (year, month, day, hour, min, sec, lat, lon, timezone);
      if (SunHeight> 0) {TD1 = TD1 - DeltaT;} else {TD1 = TD1 + DeltaT;}
    }
    hour = trunc(TD1/3600); min = trunc((TD1%3600)/60); sec = TD1%60;
    return(TimeToStr(hour,min,sec));
  }
  else return ("");
}


function SunSet (year, month, day, lat, lon, timezone)
{ var DeltaT = 900; 
  var TD1;
  var TD3 = 0;
  var TD2 = 86400 + DeltaT;
  var hour, min, sec;

  do 
  { TD2 = TD2 - DeltaT;
    hour = trunc(TD2/3600); min = trunc((TD2%3600)/60); sec = TD2%60;
    SunPosition (year, month, day, hour, min, sec, lat, lon, timezone);
  }
  while ((SunHeight>0) && (TD2 > TD3));

  TD1 = TD2 + DeltaT;
  do 
  { TD1 = TD1 - DeltaT;
    hour = trunc(TD1/3600); min = trunc((TD1%3600)/60); sec = TD1%60;
    SunPosition (year, month, day, hour, min, sec, lat, lon, timezone);
  }
  while (((SunHeight < 0) || (TD1>TD2)) && (TD1>TD3));

  if ((TD1 >= TD3) && (TD2 >= TD3))
  { DeltaT = TD2 - TD1;
    TD1 = TD1 + DeltaT / 2;
    while (DeltaT > 1)
    { DeltaT = DeltaT / 2;
      hour = trunc(TD1/3600); min = trunc((TD1%3600)/60); sec = TD1%60;
      SunPosition (year, month, day, hour, min, sec, lat, lon, timezone);
      if (SunHeight> 0) {TD1 = TD1 + DeltaT;} else {TD1 = TD1 - DeltaT;}
    }
    hour = trunc(TD1/3600); min = trunc((TD1%3600)/60); sec = TD1%60;
    return(TimeToStr(hour,min,sec));
  }
  else return ("");
}


function berechnen ()
{ with (window.document.zon)
  { var lat, lon, timezone;
    var day, month, year, hour, min, sec;
    var sday, shour, smin, ssec;
    var dayok;

    lat = parseFloat(p_lat.value);
    lon = parseFloat(p_lon.value);
    day = parseFloat(p_day.value);
    month = parseFloat(p_month.value);
    year = parseFloat(p_year.value);
    hour = parseFloat(p_hour.value);
    min = parseFloat(p_min.value);
    sec = parseFloat(p_sec.value);
    sday = parseFloat(p_sday.value);
    shour = parseFloat(p_shour.value);
    smin = parseFloat(p_smin.value);
    ssec = parseFloat(p_ssec.value);
    timezone = parseFloat(p_timezone.value);

    p_sunrise.value = SunRise (year, month, day, lat, lon, timezone);
    p_sunset.value = SunSet (year, month, day, lat, lon, timezone);

    SunPosition (year, month, day, hour, min, sec, lat, lon, timezone);

    sec = sec + ssec;
    if (sec>59) {sec = sec-60; min++;}
    min = min + smin;
    if (min>59) {min = min-60; hour++};
    hour = hour + shour;
    if (hour>23) {hour = hour-24; day++};
    day = day + sday;
    dayok = 0;
    while (dayok==0)
    { if ((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
      { if (day>31) {day = day-31; month++;} else dayok=1;}
      if ((month==4)||(month==6)||(month==9)||(month==11))
      { if (day>30) {day = day-30; month++;} else dayok=1;}
      if (month==2)
      { if ((year%4!=0)||((year%100==0)&&(year%400!=0)))
        { if(day>28){day=day-28; month++} else dayok=1; }
        else
        { if(day>29){day=day-29; month++} else dayok=1; }
      }
      if (month>12) {month=month-12; year++};
      dayok=1;
    }
    WriteDateTime (year, month, day, hour, min, sec)
  }
}

function WriteDateTime (year, month, day, hour, min, sec)
{ with (window.document.zon)
  { p_year.value  = year;
    p_month.value = month;
    if (month<10) p_month.value = "0" + p_month.value;
    p_day.value   = day;
    if (day<10) p_day.value = "0" + p_day.value;
    p_hour.value  = hour;
    if (hour<10) p_hour.value = "0" + p_hour.value;
    p_min.value   = min;
    if (min<10) p_min.value = "0" + p_min.value;
    p_sec.value   = sec;
    if (sec<10) p_sec.value = "0" + p_sec.value;
  }
}

function systemtime()
{ with (window.document.zon)
  { var jetzt = new Date();
    var day, month, year, hour, min, sec;
    year = jetzt.getFullYear();
    month = jetzt.getMonth()+1;
    day = jetzt.getDate();
    hour = jetzt.getHours();
    min = jetzt.getMinutes();
    sec = jetzt.getSeconds();
    WriteDateTime (year, month, day, hour, min, sec);
  }
}

function turntimeround ()
{ systemtime();
  berechnen();
  if (startflag==1) setTimeout('turntimeround()',200);
}


function startstop(sprache)
{ with (window.document.zon)
  { if (startflag==0)
    { p_sday.value  = "0";
      p_shour.value = "00";
      p_smin.value  = "00";
      p_ssec.value  = "00";
      startflag = 1;
      if (sprache==0) {b_startstop.value = "Stopp"} else b_startstop.value = "Stop";
      turntimeround ();
    }
    else
    { startflag = 0;
      if (sprache==0) {b_startstop.value = "Start"} else b_startstop.value = "Start";
    }
  }
}
