// Ziel-Datum in MEZ
var jahr=2005, monat=4, tag=14, stunde=10, minute=20, sekunde=00;
var zielDatum=new Date(jahr,monat-1,tag,stunde,minute,sekunde);

function countdown() {
  startDatum=new Date(); // Aktuelles Datum

  // Countdown berechnen und anzeigen, bis Ziel-Datum erreicht ist
  if(startDatum<=zielDatum)  {

    var jahre=0, monate=0, tage=0, stunden=0, minuten=0, sekunden=0;

    /* Allgemeines Vorgehen:
     * Zunächst werden die vollen Jahre gezählt
     * und anschließend der Start- und Ziel-Monat auf den jeweiligen 1. gesetzt.
     * Nun werden erst die vollen Monate vom 1. zum 1. des Start- bzw. Ziel-Monats
     * berechnet und danach die tatsächlichen Monatstage wieder mit einbezogen.
     * Dieses Vorgehen vermeidet Probleme mit den verschiedenen Monatslängen.
     * Was übrig bleibt, wird in Tagen, Stunden, Minuten und Sekunden ausgedrückt.*/

    // Jahre
    if(startDatum<zielDatum) {
      while(startDatum<zielDatum) {
        if(startDatum.setFullYear(startDatum.getFullYear()+1)<=zielDatum) jahre++;
      }
      startDatum.setFullYear(startDatum.getFullYear()-1);
    }

    // Restliche Tage zum Monatsende ermitteln
    var restTage=0;
    var m=startDatum.getMonth();
    if(m==1-1|| m==3-1||m==5-1||m==7-1||m==8-1||m==10-1||m==12-1)
        restTage=31-startDatum.getDate();
    else if(m==4-1|| m==6-1||m==9-1||m==11-1) restTage=30-startDatum.getDate();
    else if(m==2-1) {
      if(startDatum.getFullYear()%4==0 && (startDatum.getFullYear()%100!=0
          || startDatum.getFullYear()%400==0))
              restTage=29-startDatum.getDate(); // Schaltjahr
      else restTage=28-startDatum.getDate();
    }

    // Start- und Ziel-Tag merken und auf 1 setzen
    var startTag=startDatum.getDate();
    var zielTag=zielDatum.getDate();
    startDatum.setDate(1);
    zielDatum.setDate(1);

    // Monate
    if(startDatum<zielDatum) {
      while(startDatum<zielDatum) {
        if(startDatum.setMonth(startDatum.getMonth()+1)<=zielDatum) monate++;
      }
      startDatum.setMonth(startDatum.getMonth()-1);
    }

    // Tatsächlichen Start- und Ziel-Tag berücksichtigen
    if(startDatum.getMonth()==zielDatum.getMonth()) {
      if(startTag<=zielTag) startDatum.setDate(startTag);
      else {
        monate--;
        tage=restTage+1;
      }
    }
    else {
      startDatum.setMonth(startDatum.getMonth()+1);
      if(startTag>=zielTag) tage=restTage+1;
      else {
        monate++;
        startDatum.setDate(startTag);
      }
    }
    zielDatum.setDate(zielTag);

    // Tage
    restTage=Math.floor((zielDatum-startDatum)/(24*60*60*1000));
    startDatum.setTime(startDatum.getTime()+restTage*24*60*60*1000);
    tage+=restTage;

    // Stunden
    stunden=Math.floor((zielDatum-startDatum)/(60*60*1000));
    startDatum.setTime(startDatum.getTime()+stunden*60*60*1000);

    // Minuten
    minuten=Math.floor((zielDatum-startDatum)/(60*1000));
    startDatum.setTime(startDatum.getTime()+minuten*60*1000);

    // Sekunden
    sekunden=Math.floor((zielDatum-startDatum)/1000);

    // Anzeige formatieren
    if (jahre==0) jahre='';
    else (jahre!=1)?jahre=jahre+" Jahre, ":jahre=jahre+" Jahr, ";
    if (monate==0) monate='';
    else (monate!=1)?monate=monate+" Monate,  ":monate=monate+" Monat, ";
    if (tage==0) tage='';
    else (tage!=1)?tage=tage+" Tage, ":tage=tage+" Tag, ";
    if (stunden==0) stunden='';
    else (stunden!=1)?stunden=stunden+" Stunden, ":stunden=stunden+" Stunde, ";
    if (minuten==0) minuten='';
    else (minuten!=1)?minuten=minuten+" Minuten und ":minuten=minuten+" Minute und ";
    if(sekunden<10) sekunden="0"+sekunden;
    (sekunden!=1)?sekunden=sekunden+" Sekunden":sekunden=sekunden+" Sekunde";

    window.status="Noch "+jahre+monate+tage+stunden+minuten+sekunden+" bis zum Schulende";

    setTimeout('countdown()',200);
  }
  else window.status="Countdown beendet";
}