
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * 
 * JavaScript Sun Table Calculator
 * 2002 Juergen Giesen
 * http://www.GeoAstro.de
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * 
 * Einbinden des Java-Scripts:
 
  <script src="./js/Sonne.js"  type="text/javascript"></script>
  <script src="../js/Sonne.js" type="text/javascript"></script>
 
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * 
 *  -->  C O N T E N T  <--                                                              *
 
    [  1 ]  calcDayOfYear()
    [  2 ]  daysInM(m, y)
    [  3 ]  frac( X )
    [  4 ]  HoursMinutesSeconds(time)
    [  5 ]  dayOfYear()
    [  6 ]  equationTime()
    [  7 ]  declination()
    [  8 ]  hourAngleRiseSet()
	[  9 ]  RiseSet()
	[ 10 ]  getInput()
	[ 11 ]  isSummerTime()
	[ 12 ]  writeForm()
	[ 13 ]  calculate()
	
	[ 14 ]  DO JOB !!!
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */



 var doy, eqtime, declin, time_offset, tst, ha, Phi, Phi1, Theta, hars;
 var sun_rise, sun_set, snoon;
 var date, month, hours, minutes, offset, lat, longitude, sa, su;
 var jetzt = new Date();
 
/* [ 1 ]  calcDayOfYear(mn, dy, lpyr)  ----------------------- */
 function calcDayOfYear(mn, dy, lpyr)
 {
   var k = (lpyr ? 1 : 2);
   var doy = Math.floor((275 * mn)/9) - k * Math.floor((mn + 9)/12) + dy -30;
   return doy;
 }
 
 
/* [ 2 ]  daysInM(m, y)  ------------------------------------- */
 function daysInM(m, y)
 {
   var n=31
   m=m-1
   if ((m==0) || (m==2) || (m==4) || (m==6) || (m==7) || (m==9) || (m==11)) n=31
   if ((m==3) || (m==5) || (m==8) || (m==10)) n=30;
   if (m==1) 
   {
     n=28;
     if ((y %   4) == 0) n=29
     if ((y % 100) == 0) n=28
     if ((y % 400) == 0) n=29
   }
   return n;
  }
  
  
/* [ 3 ]   frac(X)  ------------------------------------------ */
  function frac(X) 
  {
    X = X - Math.floor(X);
    if (X<0) X = X + 1.0;
    return X;
  }
  
  
/* [ 4 ]   HoursMinutesSeconds(time)  ------------------------ */
  function HoursMinutesSeconds(time)
  {
     var h = Math.floor(time);
     var min = Math.round(60.0*frac(time));
     var str;
     if (h>=10) str=h+":";
     else str="0"+h+":";
     if (min>=10) str=str+min;
     else str=str+"0"+min;
     return " " + str;
  }
  
  
/* [ 5 ]   dayOfYear()  -------------------------------------- */
  function dayOfYear() // calculate the fractional day of the year
  {
    var sum=0;
    for (var i=1; i<month; i++) sum=sum+daysInM(i,2002);
    sum=sum+date;
    var h=hours + offset + minutes/60;
    doy=sum-1+(h-12)/24;
  }
  
  
/* [ 6 ]   equationTime()  ----------------------------------- */
  function equationTime() // equation of time (in minutes)
  {
    var x=doy*2*Math.PI/365;
    eqtime = 229.18*(0.000075+0.001868*Math.cos(x)-0.032077*Math.sin(x)-0.014615*Math.cos(2*x)-0.040849*Math.sin(2*x));
  }
  
  
/* [ 7 ]   declination()  ------------------------------------ */
  function declination() // declination (in degrees)
  {
    var x=doy*2*Math.PI/365; // fractional year in radians
    declin=0.006918-0.399912*Math.cos(x)+0.070257*Math.sin(x)-0.006758*Math.cos(2*x);
    declin=declin+0.000907*Math.sin(2*x)-0.002697*Math.cos(3*x)+0.00148*Math.sin(3*x);
    declin=declin*180/Math.PI;
  }
  
  
/* [ 8 ]   hourAngleRiseSet()  ------------------------------- */
  function hourAngleRiseSet() // solar azimuth angle for sunrise & sunset corrected for atmospheric refraction (in degrees),
  {
    var K=Math.PI/180;
    hars = Math.cos(K*90.833)/(Math.cos(K*lat)*Math.cos(K*declin)) - Math.tan(K*lat)*Math.tan(K*declin);
    hars = Math.acos(hars)/K;
  }
  
  
/* [ 9 ]   RiseSet()  ---------------------------------------- */
  function RiseSet() // sunrise and sunset (local time)
  {
    sun_rise = 720 + 4*(longitude-hars) - eqtime;
    sun_rise = sun_rise/60 + offset;
    sun_set = 720 + 4*(longitude+hars) - eqtime;
    sun_set = sun_set/60 + offset;
  }
  
/* [ 10 ]  getInput()  --------------------------------------- */
  function getInput() 
  {
    date  = jetzt.getDate();
    month = jetzt.getMonth()+1;
    hours = jetzt.getHours();
    minutes = jetzt.getMinutes();
    offset = 1;
    lat = 50.01;
    longitude = -8.16;
  }
  
  
/* [ 11 ]  isSummerTime()  ----------------------------------- */
  function isSummerTime()
  {
    var first=new Date();
    var last=new Date();
    first.setMonth(2);
    first.setDate(31);
    first.setHours(3);
    first.setMinutes(0);
    first.setDate(31-first.getDay()); //last Sunday!
    last.setMonth(9);
    last.setDate(31);
    first.setHours(3);
    first.setMinutes(0);
    last.setDate(31-last.getDay()); //last Sunday!
    if(jetzt>=first && jetzt<=last) return 1;
    else return 0;
  }
  
  
/* [ 12 ]  writeForm()  -------------------------------------- */
  function writeForm() 
  {
    var summer=isSummerTime();
    sa=HoursMinutesSeconds(sun_rise+summer);
    su=HoursMinutesSeconds(sun_set+summer);
    document.write("Sonnenaufgang "+sa+" Uhr, ");
    document.write("Sonnenuntergang "+su+" Uhr");
  }
  
  
/* [ 13 ]  calculate()  -------------------------------------- */
  function calculate() 
  {
    getInput();
    dayOfYear();
    equationTime();
    declination();
    hourAngleRiseSet();
    RiseSet();
    writeForm();
   }
   
   
   
/* [ 14 ]  DO JOB !!! ---------------------------------------- */

   calculate();


