var cache = new Array;

var top_key = null;
var prev_key = null;
var curr_cache_size = 0;

var MAX_CACHE_SIZE = 5;

//----------------------------------------------------------
// Wywietlenie w znaczniku DIV zawartoci bufora
// po stronie klienta.
//----------------------------------------------------------
function show_cache_info (answer_from) {
   var divCache = document.getElementById("divCacheContents");
   divCache.innerHTML = "";
   var curr_key = top_key; 
   while (curr_key != null) {
      divCache.innerHTML = divCache.innerHTML 
         + "Klucz: <b>" + curr_key 
         + "</b> Warto: <b>" + cache[curr_key].value 
         + "</b><br>";
      curr_key = cache[curr_key].next;
   }

   divCache.innerHTML = divCache.innerHTML
      + "<p>Ostatnia odpowied zostaa pobrana z: <b>"
      + answer_from + "</b>";
}

//----------------------------------------------------------
// Asynchroniczne (nieblokujce) zapytanie do serwera.
//----------------------------------------------------------
function async_cmd (url, parms, divname) {
   var httpreq = getHTTPObject();

   var divAnswer = document.getElementById(divname);

   // Warunek konieczny: musi by podany adres URL.
   if (url == "") return;

   var cache_key = url + parms;

   // Jeeli danie jest moliwe do umieszczenia w buforze, wtedy w pierwszej 
   // kolejnoci naley sprawdzi, czy istnieje dla niego odpowied.

   if (cache[cache_key]) {
      divAnswer.innerHTML = "Odpowied: <b>" 
         + cache[cache_key].value + "</b>";

      // Obsuga listy powizanej.
      if (cache_key != prev_key) {
         var curr_key = top_key;

         if (cache_key != top_key) {
            // Odnalezienie wza listy powizanej, poprzedzajcego 
            // wze cache[cache_key].
            while (cache[curr_key].next != cache_key) {
               curr_key = cache[curr_key].next;
            }
         }
         else {
            top_key = cache[top_key].next;
         }
         // Skierowanie wza poprzedzajcego do punktu, ktry 
         // aktualnie wskazuje wze cache[cache_key].
         cache[curr_key].next = cache[cache_key].next;

         // Przesunicie wza cache[cache_key] na koniec naszej
         // listy powizanej.
         cache[prev_key].next = cache_key;
         cache[cache_key].next = null;
         prev_key = cache_key;
      }
      show_cache_info ("bufor po stronie klienta");
   }
   else {
      // Wysanie dania do serwera.
      httpreq.open("POST", url, true);

      //--------------------------------------------------
      // Funkcja odpowiedzi.
      //--------------------------------------------------
      httpreq.onreadystatechange = function () {
         if (httpreq.readyState == 4) {
            var response = httpreq.responseText;

            if (curr_cache_size >= MAX_CACHE_SIZE) {
               // Usunicie z bufora najstarszego elementu.
               var oldest = top_key;
               top_key = cache[oldest].next;
               delete cache[oldest];

            }
            else {
               curr_cache_size++;
            }

            // Obsuga listy powizanej.
            if (top_key == null) {
               top_key = cache_key;
            }
            if (prev_key != null) {
               cache[prev_key].next = cache_key;
            }

            // Dodanie odpowiedzi, ktra zostaa pobrana z bufora.
            cache[cache_key] = { value:response, next:null };
            prev_key = cache_key;

            // Wywietlenie odpowiedzi w znaczniku DIV.
            divAnswer.innerHTML = "Odpowied: <b>" + response + "</b>";

            show_cache_info ("serwer");
         }
      }
      httpreq.send (parms);
   }
}
