// Variablendeklarationen
var datum, tag, wochentag, monat, dmonat, tmonat, jahr, djahr;
var listenlaenge, tage_im_monat, monatsanfangsdatum, wochentag_monatsanfang;
var zaehler_tag, tagesdatum, datum_donnerstag, jahr_kw, datum_donnerstag_kw1, kw;
// ... kombiniert mit Listeneintraegen
var name_tag = new Array("Mo", "Di", "Mi", "Do", "Fr", "Sa", "So");
var name_monat = new Array("Januar", "Februar", "M&auml;rz", "April", "Mai", "Juni", "Juli",
                          "August", "September", "Oktober", "November", "Dezember", "Januar");

/* Beschreibung der Variablen:
datum: Datumsobjekt->aktuelles Datum
tag: abgeleitet aus datum->Tag im Monat
wochentag: abgeleitet aus datum->Tag in der Woche
	-> 0: Sonntag; 1: Montag; 2: Dienstag, ... 7: wieder Sonntag
monat: abgeleitet aus datum->Monat im Jahr:
	-> 1: Januar, 2: Feburar, ...
dmonat: im Skript frei zu variierende Groesse fuer den Monat im Jahr:
	-> 1: Januar, 2: Feburar, ...
tmonat: temporaere Variable fuer den Monat im Jahr ...
jahr: abgeleitet aus datum->'FullYear'
djahr: im Skript frei zu variierende Groesse fuer das Jahr

listenlaenge: je nach dem Wochentag, an dem der Monat beginnt, kann der Kalender
		eine Laenge von 5 Zeilen oder 6 Zeilen erfordern

tage_im_monat: erklaert sich von selbst
monatsanfangsdatum: dto.
wochentag_monatsanfang: dto.

zaehler_tag: Zaehlervariable fuer die Anordnung der Tage im Kalender; bekommt erst
	einen von Null verschiedenen Wert, wenn der Wochentag des Monatsbeginns erreicht ist

tagesdatum: im Skript frei zu variierende Groesse ein Datum, das jeweils neu generiert wird.
		um die aktuelle Kalenderwoche zu berechnen

datum_donnerstag: aus einem ggb. Datum das Datum des zugehoerigen Wochentags Do errechnen
		(interessant fuer die Berechnung der Kalenderwoche)
jahr_kw: zu dem eben berechneten Donnerstag das zugehoerige Jahr berechnen
datum_donnerstag_kw1: zu dem eben berechneten Jahr das Datum des ertsen Donnerstags der ersten KW berechnen
kw: die einem Datum zugehoerige Kalenderwoche

name_tag: erklaert sich von selbst
name_monat: dto.
*/

// Variablenzuweisungen
datum = new Date();
tag = datum.getDate();
wochentag = datum.getDay();
monat = datum.getMonth() + 1;
jahr = datum.getFullYear();
zaehler_tag = 0;

// Funktionen
function pluseins() {
dmonat++;
if (dmonat > 12) {
djahr++;
dmonat = 1;
} // END IF
if (dmonat < 10) dmonat = "0" + dmonat;
/* Cookie setzen:
damit nach dem Neuladen des Dokuments
der Wert der Variablen
dmonat und djahr erhalten bleibt */
document.cookie = "m=" + dmonat;
document.cookie += "j=" + djahr;
location.reload();
} // END function pluseins()

function minuseins() {
dmonat--;
if (dmonat < 1) {
djahr--;
dmonat = 12;
} // END IF
if (dmonat < 10) dmonat = "0" + dmonat;
/* Cookie setzen:
damit nach dem Neuladen des Dokuments
der Wert der Variablen
dmonat und djahr erhalten bleibt */
document.cookie = "m=" + dmonat;
document.cookie += "j=" + djahr;
location.reload();
} // END function minuseins()

function donnerstag(gegebenes_datum) {
  var donnerstag = new Date();
  donnerstag.setTime(gegebenes_datum.getTime() + (3 - ((gegebenes_datum.getDay() + 6) % 7) ) * 24 * 3600 * 1000);
  /* Zu dieser Formel kommt man/frau so:
     Zum Wochentag (0 = Sonntag bis 7 = Samstag) wird 6 addiert.
     Teilen Modulo 7 ergibt einen Rest, der von 3 abgezogen wird.
     Damit ist die Verschiebung zum Donnerstag der Woche bereits berechnet.
     Da hier aber mit setTime in Millisekunden gerechnet wird, muss noch mal (24 * 3600 * 1000)
     multipliziert werden. */
  return donnerstag;
} // END function donnerstag(gegebenes_datum)

function kalenderwoche(gegebenes_datum) {
datum_donnerstag = donnerstag(gegebenes_datum);
jahr_kw = datum_donnerstag.getFullYear();
// Berechnung des Datums des Donnerstags der ersten Kalenderwoche
datum_donnerstag_kw1 = donnerstag(new Date(jahr_kw, 0, 4));
/* Abstand des aktuellen Donnerstags in Tagen zum ersten Donnerstag, dann durch 7 teilen
   plus 1,5 und dann runden ...
   ... ergibt die aktuelle Kalenderwoche
   Diese Formel ist vermutlich entstanden nach der Methode 'Try and Error'.
   Sie stammt von: http://www.salesianer.de/ */
return kw = Math.floor(1.5 + (datum_donnerstag.getTime() - datum_donnerstag_kw1.getTime()) / (24 * 3600 * 1000) / 7);
} // END function kalenderwoche(gegebenes_datum)


// Hauptprogramm
if (document.cookie.substring(0,2) == "m=" && document.cookie.substring(4,6) == "j=") {
// Auslesen des Cookies in die beiden Variablen dmonat und djahr
dmonat = eval(document.cookie.substring(2,3) + "* 10 + " + document.cookie.substring(3,4));
djahr = parseInt(document.cookie.substring(6,10));
} // END IF (document.cookie)
else {
dmonat = monat;
djahr = jahr;
} // END ELSE

monatsanfangsdatum = new Date(djahr, dmonat - 1, 1);
wochentag_monatsanfang = monatsanfangsdatum.getDay();
if (wochentag_monatsanfang == 0) wochentag_monatsanfang = 7;
if (wochentag_monatsanfang == 6 || wochentag_monatsanfang == 7 | wochentag_monatsanfang == 0) listenlaenge = 42;
else listenlaenge = 35;

/* Mal nachschauen:
# Hat der Cookie die richtigen Werte?
# Ist das Auslesen des Cookies korrekt gelaufen? */
// alert(document.cookie + "---" + dmonat + "---" + djahr);

switch (dmonat) {
case 1: tage_im_monat = 31;
break;
case 3: tage_im_monat = 31;
break;
case 5: tage_im_monat = 31;
break;
case 7: tage_im_monat = 31;
break;
case 8: tage_im_monat = 31;
break;
case 10: tage_im_monat = 31;
break;
case 12: tage_im_monat = 31;
break;
case 4: tage_im_monat = 30;
break;
case 6: tage_im_monat = 30;
break;
case 9: tage_im_monat = 30;
break;
case 11: tage_im_monat = 30;
break;
case 2: if ((!(jahr % 4)) && (jahr % 400)) tage_im_monat = 29; else tage_im_monat = 28;
} // END switch (monat)
