function isleapyear(Year) {
  /* (c)2000 www.diaware.de */
  /* Diese Funktion ermittelt ob Jahr ein Schaltjahr ist*/
  /* Year...gesuchte Jahr */
  /* Month...gesuchter Monat */
  if(Year%4 == 0) {
    if(Year%100 == 0) {
      if(Year%400 == 0) {
        return true;
      } else {
        return false;
      }
    } else {
      return true;
    }
  } else {
    return false;
  }
}

function daysofmonth(Year, Month) {
  /* (c)2000 www.diaware.de */
  /* Diese Funktion ermittelt die Anzahl der Tage im geg. Monat*/
  /* Year...gesuchte Jahr */
  /* Month...gesuchter Monat */
  var Count;
  switch(Month) {
  case 1: return 31;
  case 2: if(isleapyear(Year)) return 29; else return 28;
  case 3: return 31;
  case 4: return 30;
  case 5: return 31;
  case 6: return 30;
  case 7: return 31;
  case 8: return 31;
  case 9: return 30;
  case 10: return 31;
  case 11: return 30;
  case 12: return 31;
  default: return 0;
  }
}

function weekday(Year, Month, Day) {
  /* (c)2000 www.diaware.de */
  /* Diese Funktion ermittelt den Wochentag */
  /* Ausgelegt für Daten ab 1.1.1600 nach dem Gregorianischen Kalender */
  /* Year...gesuchte Jahr */
  /* Month...gesuchter Monat */
  /* Day...gesuchter Tag */
  if (Year < 1600) return 0;
  var CountLeapYears = Math.floor((Year - 1600)/4) /* Anzahl normaler Schaltjahre */
                     - Math.floor((Year - 1600)/100) /* Alle 100 Jahre kein Schaltjahr */
                     + Math.floor((Year - 1600)/400); /* dafür aber alle 400 Jahre */
  var CountDays = (Year - 1600) * 365 + CountLeapYears;
  for(i=1; i < Month; i++) {
     CountDays += daysofmonth(Year,i)
  }
  if(isleapyear(Year)) /*Korrektur wenn Schaltjahr und wenn keins */
    CountDays += Day + 4;
  else
    CountDays += Day + 5;

  return CountDays % 7;
}

function calweek(Year, Month, Day) {
  /* (c)2000 www.diaware.de */
  /* Diese Funktion ermittelt die Kalenderwoche */
  /* Ausgelegt für Daten vom 1.1.1900 bis 31.12.2099 */
  /* Year...gesuchte Jahr */
  /* Month...gesuchter Monat */
  /* Day...gesuchter Tag */

  /* Ersten Tag der ersten Kalenderwoche bestimmen */
  var FirstDayOfFirstWeek = weekday(Year, 1, 4);
  var CountDays = Day + 3 + FirstDayOfFirstWeek;
  for(i=1; i < Month; i++) { CountDays += daysofmonth(Year,i); }
  if( CountDays < 7 ) {
    return calweek(Year-1, 12, 31); }
  else {
    return Math.floor(CountDays/7);  }
}

function monthtotext(Month) {
  /* (c)2000 www.diaware.de */
  /* Diese Funktion gibt den Namen des Monats zurück */
  /* Month...gesuchter Monat */
  switch(Month) {
  case 1: return "Januar";
  case 2: return "Februar";
  case 3: return "März";
  case 4: return "April";
  case 5: return "Mai";
  case 6: return "Juni";
  case 7: return "Juli";
  case 8: return "August";
  case 9: return "September";
  case 10: return "Oktober";
  case 11: return "November";
  case 12: return "Dezember";
  default: return Month;
  }
}

function weekdaytotext(WeekDay) {
  /* (c)2000 www.diaware.de */
  /* Diese Funktion gibt den Namen des Wochentages zurück */
  /* WeekDay...gesuchter Wochentag */
  switch(WeekDay) {
  case 0: return "Montag";
  case 1: return "Dienstag";
  case 2: return "Mittwoch";
  case 3: return "Donnerstag";
  case 4: return "Freitag";
  case 5: return "Samstag";
  case 6: return "Sonntag";
  default: return WeekDay;
  }
}

function caltable(Year, Month) {
  /* (c)2000 www.diaware.de */
  /* Diese Funktion liefert eine htmltabelle des angegebenen Jahres zurück*/
  /* Ausgelegt für Daten ab 1.1.1600 */
  /* Year...gesuchte Jahr */
  /* Month...gesuchter Monat */
  /* xDays...Anzahl der Tage im Monat */
  /* xWeekDay...Tag mit dem die Woche beginnt */
  var xDays = daysofmonth(Year, Month);
  var xWeekDay = weekday(Year, Month, 1);
  var Text;
  /* wie viele Felder hat Tabelle, wenn jede Zeile 7 Spalten hat */
  var xFields = (xDays + xWeekDay - 1) - ((xDays + xWeekDay - 1) % 7) + 7;

 Text = "<table border=0 cellspacing=1 class=visible>"
 Text += "<tr><td class=body2 valign=center align=center>KW</td> <td class=head><b>Mo</b></td>  <td class=head><b>Di</b></td> <td class=head><b>Mi</b></td> <td class=head><b>Do</b></td> <td class=head><b>Fr</b></td>  <td class=head><b>Sa</b></td> <td class=head><b>So</b></td></tr><tr>";
 Text += "<td class=body2 valign=center align=center>" + calweek(Year, Month, 1) + "</td>"

 for(Days=0; Days < xFields ; Days++){
   if( Days < xWeekDay || Days >= (xDays + xWeekDay)) { /* Monat Beginnt noch nicht */
      Text += "<td class=empty>&nbsp;</td>";
   } else {
      Text += "<td class=body>" + (Days - xWeekDay + 1) + "</td>";
   }
   if( (Days % 7) == 6 && (Days + 1) < xFields) { /* Beginn einer neuen Zeile */
      Text += "</tr><tr><td class=body2 valign=center align=center>" + calweek(Year, Month, Days + 2 - xWeekDay) + "</td>";
   }
 }
 Text += "</tr></table>";
 return Text;
}

function incdate(Year, Month, Day, Inc) {
  /* (c)2000 www.diaware.de */
  /* Diese Funktion liefert ein Array zurück, welches das Datum incrementiert hat*/
  /* Ausgelegt für Daten ab 1.1.1600 */
  /* Year...gesuchte Jahr */
  /* Month...gesuchter Monat */
  /* Day...gesuchter Tag */
  for(i=0; i<Inc; i++) {
     if( Day < daysofmonth(Year, Month) ) {
         Day++;
     } else {
         Day=1;
         if( Month < 12 ) {
             Month++
         } else {
             Month=1;
             Year++;
         }
     }
  }
  return [Year, Month, Day];
}

function decdate(Year, Month, Day, Dec) {
  /* (c)2000 www.diaware.de */
  /* Diese Funktion liefert ein Array zurück, welches das Datum decrementiert hat*/
  /* Ausgelegt für Daten ab 1.1.1600 */
  /* Year...gesuchte Jahr */
  /* Month...gesuchter Monat */
  /* Day...gesuchter Tag */
  for(i=0; i<Dec; i++) {
     if( Day > 1 ) {
         Day--;
     } else {
         if( Month > 1 ) {
             Month--;
         } else {
             Month=12;
             Year--;
         }
         Day=daysofmonth(Year, Month);
     }
  }
  return [Year, Month, Day];
}