
//Script von http://www.rabich.de, Dietmar Rabich
// Monatsnamen und Tage
var Monate=
[
{name:"Januar",tage:31},
{name:"Februar",tage:28},
{name:"M&auml;rz",tage:31},
{name:"April",tage:30},
{name:"Mai",tage:31},
{name:"Juni",tage:30},
{name:"Juli",tage:31},
{name:"August",tage:31},
{name:"September",tage:30},
{name:"Oktober",tage:31},
{name:"November",tage:30},
{name:"Dezember",tage:31}
]



// 4stellige Jahreszahl

function get4DigitYear(theDate)
{
if(theDate.getFullYear)
return theDate.getFullYear()
var y= theDate.getYear()
return y + ((y < 1900) ? 1900 : 0)
}



// --- Feiertagsberechnung ---

// Ostersonntag nach Gauss'scher Formel

function Ostersonntag(Jahr)
{
// Bem.: intern darf nicht einmal vor dem 1.1.1970 datiert werden
if((Jahr < 1583) || (Jahr > 2299))
return null


var m, n

if(Jahr <= 1699)
{
m = 22
n = 2
}

else if(Jahr <= 1799)

{
m = 23
n = 3
}

else if(Jahr <= 1899)

{
m = 23
n = 4
}

else if(Jahr <= 2099)

{
m = 24
n = 5
}

else if(Jahr <= 2199)

{
m = 24
n = 6
}

else

{
m = 25
n = 0
}

var a= Jahr % 19
var b= Jahr % 4
var c= Jahr % 7
var d= (19 * a + m) % 30
var e= (2 * b + 4 * c + 6 * d + n) % 7
var t= 22 + d + e

if(t > 31)
{
t= t - 31
if(t == 26)
t = 19
else if(t == 25)
{
if((d == 28) && (e == 6) && (a > 10))
t = 18
}

return new Date(Jahr, 3, t, 12, 0, 0)
}



return new Date(Jahr, 2, t, 12, 0, 0)
}



// 4. Advent in Abhaengigkeit des 1. Weihnachtstags berechnen

function VierterAdvent(Jahr)

{
var StartDatum= new Date(Jahr, 11, 25, 12, 0, 0)
var WTag= StartDatum.getDay()
var Temp= StartDatum.getTime()

StartDatum.setTime(Temp - ((WTag == 0) ? 7 : WTag) * 86400000)
return StartDatum
}



// Feiertag anlegen mit Datum und Name

function feiertag(datum, name)
{
this.datum= datum
this.datum.setHours(12)
this.datum.setMinutes(0)
this.datum.setSeconds(0)
this.name= name
return this
}



// Feiertag anlegen mit Datum (aus Zeit in Millisekunden) und Name

function feiertag_time(time, name, flag)
{
var TempDate= new Date()
TempDate.setTime(time)
this.datum= TempDate
this.datum.setHours(12)
this.datum.setMinutes(0)
this.datum.setSeconds(0)
this.name= name
return this
}



// Vergleichsfunktion zur Sortierung nach Datum

function compare_date(d1, d2)
{
if(d1.datum.getTime() < d2.datum.getTime())
return -1
if(d1.datum.getTime() > d2.datum.getTime())
return 1
return 0
}



// Anlage eines Felds mit allen Feiertagen zum angegebenen Jahr

function feiertage(Jahr)
{
var TagMS= 86400000// Anzahl Millisekunden pro Tag
var Feiertag= new Array()// Feld fuer Feiertage
var cnt= 0// Zaehler fuer Feiertage



// Von Ostern abhaengige Feiertage

var Ostern= Ostersonntag(Jahr)
var OTime= Ostern.getTime()

Feiertag[cnt]= new feiertag(Ostern, "Ostersonntag")
Feiertag[++cnt]= new feiertag_time(OTime + TagMS, "Ostermontag")
Feiertag[++cnt]= new feiertag_time(OTime + 39 * TagMS, "Christi Himmelfahrt")
Feiertag[++cnt]= new feiertag_time(OTime + 49 * TagMS, "Pfingstsonntag")
Feiertag[++cnt]= new feiertag_time(OTime + 50 * TagMS, "Pfingstmontag")
Feiertag[++cnt]= new feiertag_time(OTime + 60 * TagMS, "Fronleichnam")
Feiertag[++cnt]= new feiertag_time(OTime - 48 * TagMS, "Rosenmontag", true)
Feiertag[++cnt]= new feiertag_time(OTime - 47 * TagMS, "Fastnacht")
Feiertag[++cnt]= new feiertag_time(OTime - 46 * TagMS, "Aschermittwoch")
Feiertag[++cnt]= new feiertag_time(OTime - 2 * TagMS, "Karfreitag")



// Vom 4. Advent abhaengige Feiertage

var Advent4= VierterAdvent(Jahr)
var A4Time= Advent4.getTime()

Feiertag[++cnt]= new feiertag(Advent4, "4. Advent")
Feiertag[++cnt]= new feiertag_time(A4Time - 7 * TagMS, "3. Advent")
Feiertag[++cnt]= new feiertag_time(A4Time - 14 * TagMS, "2. Advent")
Feiertag[++cnt]= new feiertag_time(A4Time - 21 * TagMS, "1. Advent")
Feiertag[++cnt]= new feiertag_time(A4Time - 28 * TagMS, "Totensonntag")
Feiertag[++cnt]= new feiertag_time(A4Time - 35 * TagMS, "Volkstrauertag")
Feiertag[++cnt]= new feiertag_time(A4Time - 32 * TagMS, "Bu&szlig;- und Bettag")



// Feste Feiertage

Feiertag[++cnt]= new feiertag(new Date(Jahr, 0, 1), "Neujahr")
Feiertag[++cnt]= new feiertag(new Date(Jahr, 0, 6), "Heilige 3 K&ouml;nige")
Feiertag[++cnt]= new feiertag(new Date(Jahr, 1, 14), "Valentinstag")
Feiertag[++cnt]= new feiertag(new Date(Jahr, 4, 1), "Maifeiertag")
Feiertag[++cnt]= new feiertag(new Date(Jahr, 7, 15), "Maria Himmelfahrt")
Feiertag[++cnt]= new feiertag(new Date(Jahr, 9, 3), "Tag der Deutschen Einheit")
Feiertag[++cnt]= new feiertag(new Date(Jahr, 9, 31), "Reformationstag")
Feiertag[++cnt]= new feiertag(new Date(Jahr, 10, 1), "Allerheiligen")
Feiertag[++cnt]= new feiertag(new Date(Jahr, 11, 24), "Heiligabend")
Feiertag[++cnt]= new feiertag(new Date(Jahr, 11, 25), "1. Weihnachtstag")
Feiertag[++cnt]= new feiertag(new Date(Jahr, 11, 26), "2. Weihnachtstag")
Feiertag[++cnt]= new feiertag(new Date(Jahr, 11, 31), "Silvester")



// Feiertage nach Datum sortieren
Feiertag.sort(compare_date)
// und zurueck!
return Feiertag
}


// --- Kalenderaufbereitung und -ausgabe ---
// Kalender

function Kalender(monat, jahr)

{
var pct= 0
var Monat= new Date(jahr, monat - 1, 1)
var Heute= new Date()
var DieserTag= null

function pcta(p)
{
status= "Aufbereitung Kalender " + String(p) + "% fertig."
}



pcta(pct)



// Vorbereitung/Schaltjahr

if((Heute.getMonth() == Monat.getMonth()) &&
(get4DigitYear(Heute) == get4DigitYear(Monat)))
DieserTag= Heute.getDate()

var Jahr= get4DigitYear(Monat)

if((!(Jahr % 4) && (Jahr % 100)) || !(Jahr % 400))
Monate[1].tage = 29
AnzahlTage= Monate[Monat.getMonth()].tage
var StartTag = Monat.getDay() - 1

if(StartTag < 0)
StartTag= 6



// Feiertage

var Feiertage= feiertage(Jahr)
var RelevanteFeiertage= new Array()
pct+= 5
pcta(pct)

// Feiertage dieses Monats

var j
var cnt= 0
for(j = 0; j < Feiertage.length; j++)
if(Feiertage[j].datum.getMonth() == Monat.getMonth())
RelevanteFeiertage[cnt++]= Feiertage[j]



// Ausgabe Kalenderblatt

document.open("text/html")
document.writeln("<TABLE BORDER=1 CELLPADDING=2 CELLSPACING=0 BORDERCOLOR=\"#006699\">")
document.writeln("<CAPTION>" + Monate[Monat.getMonth()].name + " " + Jahr + "</STRONG>")
// farbe zeile wochentag
document.write("<TR ALIGN=CENTER VALIGN=MIDDLE BGCOLOR=\"#658CB2\"><TD WIDTH=\"14%\">Mo</TD>")
document.write("<TD WIDTH=\"14%\">Di</TD>")
document.write("<TD WIDTH=\"14%\">Mi</TD>")
document.write("<TD WIDTH=\"14%\">Do</TD>")
document.write("<TD WIDTH=\"14%\">Fr</TD>")
document.write("<TD WIDTH=\"15%\">Sa</TD>")
document.writeln("<TD WIDTH=\"15%\">So</TD></TR>")

var column= StartTag

document.write("<TR ALIGN=CENTER>")
var i
for(i = 0; i < StartTag; i++)
// farbe kalendertag leer
document.write("<TD BGCOLOR=\"#CEEFFF\">&nbsp;</TD>")

for(i = 1; i <= AnzahlTage; i++)
{
pct+= Math.floor(90 / AnzahlTage)
pcta(pct)

var clr= ""

for(j = 0; j < RelevanteFeiertage.length; j++)
{
if(i == RelevanteFeiertage[j].datum.getDate())
{
clr= " BGCOLOR=\"#CEEFFF\""
break
}
}



document.write("<TD BGCOLOR=\"#FFFFFF\"" + clr + ">")
if(i == DieserTag)
// farbe aktueller tag
document.write("<FONT COLOR=\"#FF0000\"><STRONG>")
if(column >= 5)
document.write("<STRONG>")
document.write(i)

if(i == DieserTag)
document.write("</STRONG></FONT>")
if(column >= 5)
document.write("</STRONG>")
document.write("</TD>")
column++

if((column == 7) && (i != AnzahlTage))
{
document.write("</TR>\n<TR ALIGN=CENTER>")
column = 0
}
}



if(column != 0)
for(i = column; i < 7; i++)
document.write("<TD BGCOLOR=\"#CEEFFF\">&nbsp;</TD>")
document.writeln("</TR></TABLE>")

// Ausgabe Feiertage
var ausg= false
for(j = 0; j < RelevanteFeiertage.length; j++)
{
if(!ausg)
{
document.write("<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=1>")
ausg= true
}

document.write("<TR ALIGN=LEFT VALIGN=MIDDLE><TD><SMALL>" +
String(RelevanteFeiertage[j].datum.getDate()) +
".</SMALL></TD><TD><SMALL>&nbsp;</SMALL></TD><TD><SMALL>" +
RelevanteFeiertage[j].name +
"</SMALL></TD></TR>")
}

if(ausg)
document.write("</TABLE>")
document.close()

pct= 100
pcta(pct)
}
