﻿// Copyright (C) 2009 Ursula Zehlius - Kosmopeia - Astrologie 
//
// Inanspruchnahme von Urheberrechtschutz unter Registernummer 624-080821-176404547 bei http://www.notatus.de
//
// Version 1.0 vom 02.05.2008
// Version 1.1 vom 31.10.2009 
var sz=new Array(12);
sz[0]="Widder"; sz[1]="Stier"; sz[2]="Zwillinge"; sz[3]="Krebs"; sz[4]="L&ouml;we"; sz[5]="Jungfrau";
sz[6]="Waage"; sz[7]="Skorpion"; sz[8]="Sch&uuml;tze"; sz[9]="Steinbock"; sz[10]="Wassermann"; sz[11]="Fische";
var wochentage=new Array(7);
wochentage[0]="Montag"; wochentage[1]="Dienstag"; wochentage[2]="Mittwoch";
wochentage[3]="Donnerstag"; wochentage[4]="Freitag"; wochentage[5]="Samstag"; wochentage[6]="Sonntag";

function atn2 (y, x) {
  a = Math.atan(y / x);
  if (x < 0) a = a + Math.PI;
  if ((y < 0) && (x > 0))	a = a + 2*Math.PI;
  return a;
}
function range (x) {
  return  x - Math.floor(x / (2*Math.PI)) * 2*Math.PI;
}
function GetDateFromJD(jd){
  a = Math.floor(jd+0.5);
  if (a < 2299161){
  	b=0;
  	c=a+1524;
  }
  else {
  	b=Math.floor((a-1867216.25)/36524.25);
  	c=a+b-Math.floor(b/4)+1525.0;
  }
  d=Math.floor((c-122.1)/365.25);
  e=Math.floor(365.25*d);
  f=Math.floor((c-e)/30.6001);
  t=c-e-Math.floor(30.6001*f)+jd+0.5-Math.floor(jd+0.5);
  m=f-1.0-12.0*Math.floor(f/14.0);
  j=d-4715.0-Math.floor((7.0+m)/10.0);
  tt = jd-Math.floor(jd)-0.5;
  if (tt < 0)tt++;
  s = tt * 86400.0;
  h = Math.floor(s / 3600);
  min = Math.floor(s / 60)-h*60;
  s -= min * 60.0 + h * 3600.0;
  return Date.UTC(j, m-1, t, h, min, s, 0);
}
function GetJulianDay(j, m, t, h, min, s){
  var js = j;
  var ms = m;
  var tt = h/24.0+min/1440.0+s/86400.0;
  if (m < 3){js--; ms +=12;}
  var b = Math.floor(js/400.0) - Math.floor(js/100.0);
  if (j < 1582 || (j == 1582 && (m < 10 || (m == 10 && t < 15)))) {
    if (j == 1582 && t > 4 && m == 10) {
	  t = 4;
	  alert("Ungültiges Datum. Das Datum wird auf den 4.10.1582 gesetzt.");
	}
	b = -2.0;
  }
  return Math.floor(365.25*js)+Math.floor(30.6001*(ms+1))+b+1720996.5+t+tt;
}
function JulianDayToString(jd){
  var j, m, t, s, min, sec, wt;
  var zz = "";
  var jds = new Date();
  jds.setTime(GetDateFromJD(jd));
  t = jds.getUTCDate();
  m = jds.getUTCMonth() + 1;
  j = jds.getUTCFullYear();
  if (j < 1980) {
    if (j < 1893 || (j == 1893 && m < 4)) {
	  zz = "GMT";
	} else {
      var ljd = new Date(j,0,1,0,0,0);
      var tzos = ljd.getTimezoneOffset()/60;
	  jd -= tzos/24;
	}
    jds.setTime(GetDateFromJD(jd));
    t = jds.getUTCDate();
    m = jds.getUTCMonth() + 1;
    j = jds.getUTCFullYear();
    s = jds.getUTCHours();
    min = jds.getUTCMinutes();
    sec = jds.getUTCSeconds();
    wt = Math.floor(jd+0.5) % 7;
  } else {
    t = jds.getDate();
    m = jds.getMonth() + 1;
    j = jds.getFullYear();
    s = jds.getHours();
    min = jds.getMinutes();
    sec = jds.getSeconds();
	wt = (jds.getDay() + 6) % 7;
  }
  var ts  = ((t < 10) ? "0" : "") + t;
  var ms  = ((m < 10) ? "0" : "") + m;
  var ss  = ((s < 10) ? "0" : "") + s;
  var mins  = ((min < 10) ? "0" : "") + min;
  var secs  = ((sec < 10) ? "0" : "") + sec;
  return wochentage[wt]+" "+ts+"-"+ms+"-"+j+" um "+ss+":"+mins+":"+secs+" "+zz;
}
function GetJulianDayFromLocal(j, m, t, h, min, s){
  var jd;
  var dt = new Date(j, m-1, t, h, min, s);
  if (j < 1980) {
    var jds = new Date(j, 0, 1, 0, 0, 0);
    var tzos = jds.getTimezoneOffset()/60;
	jd = GetJulianDay(j, m, t, h, min, s);
	if (j > 1893 || (j == 1893 && m > 3)) {
	  jd += tzos/24;
	}
  } else {
    var ts = dt.getUTCDate();
    var ms = dt.getUTCMonth() + 1;
    var js = dt.getUTCFullYear();
    var ss = dt.getUTCHours();
    var mins = dt.getUTCMinutes();
    var secs = dt.getUTCSeconds();
	jd = GetJulianDay(js, ms, ts, ss, mins, secs);
  }
  return jd;
}
function GetJulianDayToday(){
  var jetzt = new Date();
  var t = jetzt.getUTCDate();
  var m = jetzt.getUTCMonth() + 1;
  var j = jetzt.getUTCFullYear();
  var s = jetzt.getUTCHours();
  var min = jetzt.getUTCMinutes();
  var sec = jetzt.getUTCSeconds();
  return GetJulianDay(j, m, t, s, min, sec);
}
function GetDMS(x){
  sign = sgn(x);
  x = Math.abs(x);
  d = Math.floor(x);
  m = (x - d);
  s = m * 60;
  m = Math.floor(s);
  s = s - m;
  return (d*sign)+"&deg "+m+"' "+Math.floor(s * 60)+"\"";
}
function sgn(x){
  return(x<0)?-1:((x>0)?1:0);
}
function CalcMond2R(jd) {
  d = jd-2451543.5;
  Nm = range((125.1228 - .0529538083 * d) * Math.PI/180.0);
  im = 5.1454 * Math.PI/180.0;
  wm = range((318.0634 + .1643573223 * d) * Math.PI/180.0);
  am = 60.2666;
  ecm = .0549;
  Mm = range((115.3654 + 13.0649929509 * d) * Math.PI/180.0);
  Ms = range((356.047 + .9856002585 * d) * Math.PI/180.0);
  ws = range((282.9404 + 4.70935E-05 * d) * Math.PI/180.0);
  Em = Mm + ecm * Math.sin(Mm) * (1 + ecm * Math.cos(Mm));
  e1 = Em-(Em-ecm*Math.sin(Em)-Mm)/(1-ecm*Math.cos(Em));
  Em = e1;
  xv = am * (Math.cos(Em) - ecm);
  yv = am * (Math.sqrt(1 - ecm * ecm) * Math.sin(Em));
  vm = atn2(yv, xv);
  rm = Math.sqrt(xv * xv + yv * yv);
  xh = rm * (Math.cos(Nm) * Math.cos(vm + wm) - Math.sin(Nm) * Math.sin(vm + wm) * Math.cos(im));
  yh = rm * (Math.sin(Nm) * Math.cos(vm + wm) + Math.cos(Nm) * Math.sin(vm + wm) * Math.cos(im));
  zh = rm * (Math.sin(vm + wm) * Math.sin(im));
  lon = atn2(yh, xh);
  lat = atn2(zh, Math.sqrt(xh * xh + yh * yh));
  Ls = Ms + ws;
  Lm = Mm + wm + Nm;
  dm = Lm - Ls;
  F = Lm - Nm;
  dlon = -1.274 * Math.sin(Mm - 2 * dm);
  dlon += .658 * Math.sin(2 * dm);
  dlon -= .186 * Math.sin(Ms);
  dlon -= .059 * Math.sin(2 * Mm - 2 * dm);
  dlon -= .057 * Math.sin(Mm - 2 * dm + Ms);
  dlon += .053 * Math.sin(Mm + 2 * dm);
  dlon += .046 * Math.sin(2 * dm - Ms);
  dlon += .041 * Math.sin(Mm - Ms);
  dlon -= .035 * Math.sin(dm);
  dlon -= .031 * Math.sin(Mm + Ms);
  dlon -= .015 * Math.sin(2 * F - 2 * dm);
  dlon += .011 * Math.sin(Mm - 4 * dm);
  return range(dlon * Math.PI/180 + lon);
}
function GibZeichen(jd) {
  var lon = CalcMond2R(jd);
  var dms = GetDMS(lon*180/Math.PI-Math.floor((lon*180/Math.PI)/30)*30);
  return sz[GibIndex(lon)]+" "+dms;
}
function Neumond(k){
    var JDE, e, m, m1, f, o;
    k = Math.floor(k);
    t = k / 1236.85;
    e = 1 - .002516 * t - .0000074 * t * t;
    m = 2.5534 + 29.10535669 * k - .0000218 * t * t - .00000011 * t * t * t;
    m1 = 201.5643 + 385.81693528 * k + .1017438 * t * t + .00001239 * t * t * t - .000000058 * t * t * t * t;
    f = 160.7108 + 390.67050274 * k - .0016341 * t * t - .00000227 * t * t * t + .000000011 * t * t * t * t;
    o = 124.7746 - 1.5637558 * k + .0020691 * t * t + .00000215 * t * t * t;
    JDE = 2451550.09765 + 29.530588853 * k + .0001337 * t * t - .00000015 * t * t * t + .00000000073 * t * t * t * t;
    JDE += -.4072 * SN(m1) + .17241 * e * SN(m) + .01608 * SN(2 * m1) + .01039 * SN(2 * f) + .00739 * e * SN(m1 - m) - .00514 * e * SN(m1 + m) + .00208 * e * e * SN(2 * m) - .00111 * SN(m1 - 2 * f) - .00057 * SN(m1 + 2 * f);
    JDE += .00056 * e * SN(2 * m1 + m) - .00042 * SN(3 * m1) + .00042 * e * SN(m + 2 * f) + .00038 * e * SN(m - 2 * f) - .00024 * e * SN(2 * m1 - m) - .00017 * SN(o) - .00007 * SN(m1 + 2 * m) + .00004 * SN(2 * m1 - 2 * f);
    JDE += .00004 * SN(3 * m) + .00003 * SN(m1 + m - 2 * f) + .00003 * SN(2 * m1 + 2 * f) - .00003 * SN(m1 + m + 2 * f) + .00003 * SN(m1 - m + 2 * f) - .00002 * SN(m1 - m - 2 * f) - .00002 * SN(3 * m1 + m);
    JDE += .00002 * SN(4 * m1);
    return Korrektur(JDE, t, k);
  }
function Vollmond(k){
    var JDE, e, m, m1, f, o;
    k = Math.floor(k) + .5;
    t = k / 1236.85;
    e = 1 - .002516 * t - .0000074 * t * t;
    m = 2.5534 + 29.10535669 * k - .0000218 * t * t - .00000011 * t * t * t;
    m1 = 201.5643 + 385.81693528 * k + .1017438 * t * t + .00001239 * t * t * t - .000000058 * t * t * t * t;
    f = 160.7108 + 390.67050274 * k - .0016341 * t * t - .00000227 * t * t * t + .000000011 * t * t * t * t;
    o = 124.7746 - 1.5637558 * k + .0020691 * t * t + .00000215 * t * t * t;
    JDE = 2451550.09765 + 29.530588853 * k + .0001337 * t * t - .00000015 * t * t * t + .00000000073 * t * t * t * t;
    JDE += -.40614 * SN(m1) + .17302 * e * SN(m) + .01614 * SN(2 * m1) + .01043 * SN(2 * f) + .00734 * e * SN(m1 - m) - .00515 * e * SN(m1 + m) + .00209 * e * e * SN(2 * m) - .00111 * SN(m1 - 2 * f) - .00057 * SN(m1 + 2 * f);
    JDE += .00056 * e * SN(2 * m1 + m) - .00042 * SN(3 * m1) + .00042 * e * SN(m + 2 * f) + .00038 * e * SN(m - 2 * f) - .00024 * e * SN(2 * m1 - m) - .00017 * SN(o) - .00007 * SN(m1 + 2 * m) + .00004 * SN(2 * m1 - 2 * f);
    JDE += .00004 * SN(3 * m) + .00003 * SN(m1 + m - 2 * f) + .00003 * SN(2 * m1 + 2 * f) - .00003 * SN(m1 + m + 2 * f) + .00003 * SN(m1 - m + 2 * f) - .00002 * SN(m1 - m - 2 * f) - .00002 * SN(3 * m1 + m);
    JDE += .00002 * SN(4 * m1);
    return Korrektur(JDE, t, k);
  }
function Korrektur(JDE, t, k){
    JDE += .000325 * SN(299.77 + .107408 * k - .009173 * t * t) + .000165 * SN(251.88 + .016321 * k) + .000164 * SN(251.83 + 26.651886 * k) + .000126 * SN(349.42 + 36.412478 * k) + .00011 * SN(84.66 + 18.206239 * k);
    JDE += .000062 * SN(141.74 + 53.303771 * k) + .00006 * SN(207.14 + 2.453732 * k) + .000056 * SN(154.84 + 7.30686 * k) + .000047 * SN(34.52 + 27.261239 * k) + .000042 * SN(207.19 + .121824 * k) + .00004 * SN(291.34 + 1.844379 * k);
    JDE += .000037 * SN(161.72 + 24.198154 * k) + .000035 * SN(239.56 + 25.513099 * k) + .000023 * SN(331.55 + 3.592518 * k);
    return JDE;
  }
function CS(x){
    return Math.cos(x * .0174532925199433);
  }
function SN(x){
    return Math.sin(x * .0174532925199433);
  }
function NaechsterVM(Jahr, Aktdatum, zeit){
    var tz = 0, k;
    do{
      k = (Jahr + (Aktdatum.getMonth() * 30.4 + Aktdatum.getDate() + tz) / 365 - 2000) * 12.3685;
      tz += 1;
    }
    while(Vollmond(k) < zeit);
    return Vollmond(k);
  }
function NaechsterNM(Jahr, Aktdatum, zeit){
    var tz = 0, k;
    do{
      k = (Jahr + (Aktdatum.getMonth() * 30.4 + Aktdatum.getDate() + tz) / 365 - 2000) * 12.3685;
      tz += 1;
    }
    while(Neumond(k) < zeit);
    return Neumond(k);
  }
function NaechsteMondphasen(jd, fmt){
    var jds = new Date();
	jds.setTime(GetDateFromJD(jd));
	var year = jds.getUTCFullYear();
	var jdvm = NaechsterVM(year, jds, jd);
	var jdnm = NaechsterNM(year, jds, jd);
	if (fmt == 0) {
      if (Math.abs(jd-jdvm) < 4.0/24.0) {
	    return "<br/>Es ist Vollmond<br/><br/>N&auml;chster Neumond am: "+JulianDayToString(jdnm);
	  } else if (Math.abs(jd-jdnm) < 4.0/24.0) {
	    return "<br/>Es ist Neumond<br/><br/>N&auml;chster Vollmond am: "+JulianDayToString(jdvm);
	  } else if (jdvm > jdnm) {
	    return "<br/>Es ist abnehmender Mond<br/><br/>N&auml;chster Neumond am: "+JulianDayToString(jdnm);
	  } else {
  	    return "<br/>Es ist zunehmender Mond<br/><br/>N&auml;chster Vollmond am: "+JulianDayToString(jdvm)
	  }
	} else {
	  if (jdvm > jdnm) {
	    return "<br/>N&auml;chster Neumond<br/>"+JulianDayToString(jdnm);
      } else {
  	    return "<br/>N&auml;chster Vollmond<br/>"+JulianDayToString(jdvm);
	  }
	}
  }
function GibSZZeitstempel(zi, jd) {
	var inc = 1.0/1440.0+0.000000001;
	inc = 1.0/96.0+0.000000001;
	var jds = jd;
	var lon = CalcMond2R(jds);
	var ni = GibIndex(lon);
	while (zi != ni){
	  jds += inc;
	  lon = CalcMond2R(jds);
	  ni = GibIndex(lon);
	}
	return JulianDayToString(jds)+"<br/><br/>wechselt der Mond in das Tierkreiszeichen: <br/><br/>"+sz[zi]+"<br/><br/>"+NaechsteMondphasen(jds, 0);
  }
function GibIndex(lon) {
	return Math.floor((lon*180/Math.PI)/30);
  }
function Mondkalender() {  
    document.write("<table style='border-color:#f0b050;border-width:5px;border-style:solid;font-size:11pt;color:#f0b050;' bgcolor='#461626'>");
    document.write("<th style='text-align:center'>Aktueller Mondkalender</th>");
    document.write("<tr><td style='text-align:center'>");
    document.write(JulianDayToString(GetJulianDayToday())+"<br>Der Mond steht jetzt im Zeichen:<br>>>> <font color=#ffffff>"+GibZeichen(GetJulianDayToday())+" </font><<<");
    document.write("<br><a style='color:#f0b050; font-size:10px;' href='http://www.kosmopeia.de/html/mondkalender.html' target='_blank'>mehr zum Mondkalender</a>");
    document.write("</td></tr>");
	document.write("</table>");
  }