// ==================================================================
// Klasa:      Odliczanie
// Opis:       Ogólna klasa służąca do odliczania czasu od/do danej
//             daty. Wymaga przedefiniowania metody odswiez.
// Konstruktor:Odliczanie([data])
//                data - obiekt typu Date, do/od którego liczymy czas
//                       (opcjonalny, domyslna wartość: moment 
//                       wywołania konstruktora)
// Metody:     odliczaj([nowa_data]) - start i/lub zmiana daty
//                nowa_data - nowa data dla odliczania (opcjonalna,
//                            jeśli brak wartości, data nie zostanie
//                            zmieniona)
//             odswiez() - uaktualnie wskazania. Metoda pusta - wymaga
//                         zastąpienia odpowiednią funkcją.
// Pola:       znak, y, mon, d, h, min, s - bieżące wskazanie zegara
//             nr - numer kolejny w tablicy Odliczanie.lista -tablicy
//                  referencji do wszystkich obiektów tej klasy
//             data - obiekt typu Date, do/od którego liczymy czas

function Odliczanie(data) {   // konstruktor obiektu
// METODY:
// publiczne:
   this.odliczaj = odliczaj;  // odliczaj([data]) - start / zmiana
   this.odswiez = odswiez;    //odświeżenie wyświetlanej wartości
// prywante:
   this.tik = tik;   // tyknięcie zegara

// POLA:
   this.data=(typeof(data)=='object') ? data : new Date();
   //ile zostało lat, miesięcy,...
   this.znak='+';
   this.y=0;
   this.mon=0;
   this.d=0;
   this.h=0;
   this.min=0;
   this.s=0;
   this.nr=(Odliczanie.liczba++);   //unikalny numer
   this.timerID=0;

   Odliczanie.lista[this.nr]=this;  //zachowaj skrot

// IMPLEMENTACJA METOD:
   function odliczaj(nowa_data) {
      if (typeof(nowa_data)=='object')
         this.data=nowa_data;
      if (!this.timerID)
         this.tik();
   }

   function tik() {
      var a = new Date();
      var b;
      with (this) {
         if (a<data) {
            znak='-';
            b=data;
         } else {
            znak='+';
            b=a;
            a=data;
         }
         s=b.getSeconds()-a.getSeconds();
         min=b.getMinutes()-a.getMinutes();
         h=b.getHours()-a.getHours();
         d=b.getDate()-a.getDate();
         mon=b.getMonth()-a.getMonth();
         y=b.getFullYear()-a.getFullYear();
         if (s<0) { s+=60; min--; }
         if (min<0) { min+=60; h--; }
         if (h<0) { h+=24; d--; }
         if (d<0) {
            //tu mamy problem, bo nie wiemy ile dni ma miesiac daty a.
            //musimy to sprawdzic:
            var temp=new Date(a);
            temp.setDate(32); 
            //w tym momencie 32-temp.getDate() to szukana liczba
            d=d+32-temp.getDate();
            mon--;
         }
         if (mon<0) { mon+=12; y--; }

         this.odswiez();   //wywołaj funkcję obsługi tego zdarzenia

         this.timerID=setTimeout('Odliczanie.lista['+nr+'].tik()',975);
      }
   }

   function odswiez() { }

}

// Automatycznie utrzymywane zmienne: liczba i lista wszystkich
// obiektów typu Odliczanie:
Odliczanie.liczba=0;
Odliczanie.lista = new Array();

// ==================================================================
// Klasa:      OdliczanieWOkienku, dziedziczy po: Odliczanie
// Opis:       Klasa pochodna po klasie Odliczanie - wyświetla czas
//             w okienku tekstowym (<input type=text>)
// Konstruktor:OdliczanieWOkienku([data])
//                data - obiekt typu Date, do/od którego liczymy czas
//                       (opcjonalny, domyslna wartość: moment 
//                       wywołania konstruktora)
// Metody:     odliczaj([nowa_data]) - odziedziczona
//             odswiez() - przedefiniowana: uaktualnia treść okienka
//             buduj([extra_arg]) - wypisz (document.writeln) kod
//                                  HTML okienka
//                extra_arg - dodatkowe argumenty HTML dla tagu <input>
//                            (opcjonalny, domyślna wartość: "")
// Pola:       znak, y, mon, d, h, min, s, nr, data - odziedziczone
//             okienko - referencja do obiektu reprezentującego
//                       odpowiedni znacznik <input>

function OdliczanieWOkienku(data) { //dziedziczy po Odliczanie
   // wywołaj konstruktor klasy podstawowej:
   // (wykorzystujemy sztuczkę polegającą utworzeniu metody o nazwie
   // 'base' poprzez przypisanie jej konstruktowa klasy podstawowej)
   this.base = Odliczanie;
   this.base(data);

// METODY:
   this.buduj = buduj;        // nowa metoda, której nie ma w Odliczanie
   this.odswiez = odswiez;    // przedefiniowanie metody z klasy Odliczanie
// POLA:
   this.okienko = null;

// IMPLEMENTACJA METOD:
   function buduj(extra_arg) {
      extra_arg = extra_arg||'';
      document.write('<form name="odliczanie_form_'+this.nr+'">');
      document.write('<input name="okienko" '+extra_arg+'></form>');
      this.okienko=eval('document.odliczanie_form_'+this.nr+'.okienko');
   }

   function odswiez() {
      with (this) {
         if (okienko)
            okienko.value=znak+y+'r '+mon+'m '+d+'d '+
                          pad(h)+':'+pad(min)+':'+pad(s);
      }
   }
}
OdliczanieWOkienku.prototype = new Odliczanie;

// ================================== //

// Stałe - oznaczenia miesięcy:
sty=0; lut=1; mar=2; kwi=3; maj=4; cze=5;
lip=6; sie=7; wrz=8; paz=9; lis=10; gru=11;

// Funkcja pomocnicza: do liczb < 10 dokleja zero na początku:
function pad(toto)
{
   if (toto < 10) {toto = "0" + toto};
   return toto;
}
