// Urheber: http://www.evocomp.de/beispiele/javascript/countdown.html, kostenlose Verwendung
// Funktion berechnet die Differenz zwischen zwei Zeitstempeln
function differenz (d1, d2) {
  // Ist der Timestamp d1 < d2, dann m&uuml;ssen die beiden Werte
  // getauscht werden, da sonst negative Werte berechnet werden.
  if (d1 < d2) {
    var d = d1;
    d1 = d2;
    d2 = d;
  }
  // Vergangene Zeit in ihre Komponenten umrechnen.
  // Vergangene Tage berechnen,...
  var t = Math.floor ((d1 - d2) / (24 * 60 * 60 * 1000));
  // verstrichene Stunden berechnen,...
  var s = Math.floor (((d1 - d2) - (t * 24 * 60 * 60 * 1000)) / (60 * 60 * 1000));
  // Minuten, die zwischenzeitlich vergangen sind...
  var m = Math.floor (((d1 - d2) - (t * 24 * 60 * 60 * 1000) - (s * 60 * 60 * 1000)) / (60 * 1000));
  // und die Sekunden.
  var sec = Math.floor (((d1 - d2) - (t * 24 * 60 * 60 * 1000) - (s * 60 * 60 * 1000) - (m * 60 * 1000)) / 1000);
  // Berechnete Differenz als R&uuml;ckgabe per Objekt liefern.
  return { 't': t, 's': s, 'm': m, 'sec': sec };
}

// Funktion, welche den Countdown-Timer zyklisch im Ausgabeelement ausgibt.
function update_countdown (element_id, termin, beschreibung) {
  // Datumsobjekt mit aktuellem Datum und ktueller Zeit erzeugen.
  // Von diesem Timestamp ausgehend wird die Differenz zum Termin
  // berechnet.
  var now = new Date ();
  // Varaiable zur Speicherung der auszugebenen Zeichenkette
  // f&uuml;r den Countdown.
  var ausgabe;
  // Variable zur Speicherung der Differenz zwischen Termin und
  // aktuellem Zeitpunkt.
  var diff;
  if (now.getTime () > termin) {
    // Termin war schon
    ausgabe = 'Vor ';
    // Berechnung der Differenz zwischen dem Termin und
    // dem aktuellen Zeitpunkt.
    diff = differenz (now.getTime (), termin);
    // Zeitliche Differenz an das Ausgabestring h&auml;ngen.
    ausgabe += diff.t + ' Tage, ' + diff.s + ' Stunden, ' + diff.m + ' Minuten und ' + diff.sec + ' Sekunden';
    // Wurde keine Beschreibung des Termins angegeben, so wird
    // ein Standard-String ausgegeben.
    ausgabe += ' war ' + (beschreibung ? beschreibung : 'der Termin!');
  }
  else {
    // Termin in Zukunft
    ausgabe = ' ';
    // Wie lange dauert es noch, bis zum Termin?
    diff = differenz (termin, now.getTime ());
    // Ermittelte Werte an Ausgabe anh&auml;ngen.
    ausgabe += diff.t + 'd ' + diff.s + 'h ' + diff.m + 'm ' + diff.sec + 's';
    // Auch hier wird ein Standard-String ausgegeben, wenn keine
    // Terminbeschreibung angegeben wurde.
    ausgabe += ' ' + (beschreibung ? beschreibung : 'getting started!');
  }
  // Ausgabe der zusammengesetzten Zeichenkette
  document.getElementById (element_id).firstChild.data = ausgabe;
}

// Initialisierung des Countdown-Timers
// Als Parameter werden die ID des Anzeigeelements, ein Termin als Date-Objekt
// uns eine optionale Beschreibung des Termins &uuml;bergeben.
function countdown_timer (element_id, termin, beschreibung) {
  // Der Timer funktioniert nur, wenn ein HTML-Element mit der &uuml;bergebenen ID
  // existiert! Ist dies nicht der Fall, so passiert nichts.
  if (document.getElementById (element_id)) {
    // Hat das Element bereits ein Kindelement?
    if (!document.getElementById (element_id).firstChild)
      // Falls nicht, so wird ein leerer Textknoten erzeugt und in den
      // Elementbaum eingef&uuml;gt. Dieser Textknoten wird k&uuml;nftig mit der
      // jeweiligen Ausgabe des Countdowns &uuml;berschrieben.
      document.getElementById (element_id).appendChild (document.createTextNode (''));
    // Wurde ein g&uuml;ltiges Datum &uuml;bergeben, so dass eine Berechnung
    // des Countdown-Timers m&ouml;glich ist?
    if (termin instanceof Date) {
      // Update des Timers direkt aufrufen, damit dieser nicht erst nach Ablauf einer
      // Sekunde angezeigt wird.
      update_countdown (element_id, termin.getTime (), beschreibung);
      // Countdown Timer einmal pro Sekunde akutalisieren
      window.setInterval ('update_countdown (\'' + element_id + '\', ' + termin.getTime () +
              (beschreibung ? ', \'' + beschreibung + '\'' : '') + ')', 1000);
    }
  }
}
