// przechowuje obiekt XMLHttpRequest
var xmlHttp = createXmlHttpRequestObject();
// przechowa adres zdalnego serwera
var serverAddress = "request.php";
// kiedy ma wartose true, wyswietla szczego³owy opis bsedu
var showErrors = true;
// inicjalizuje pamiee podreczne s¼edania
var cache = new Array();
var cache2 = new Array(); 

//still loading
  var loading=0;
  var load_id;
  
  
// tworzy obiekt XMLHttpRequest
function createXmlHttpRequestObject() 
{
  // przechowa odwosanie do obiektu XMLHttpRequest
  var xmlHttp;
  // powinno dziasae dla wszystkich przegledarek z wyjetkiem IE6 i starszych
  try
  {
    // pro³buje stworzye obiekt XMLHttpRequest
    xmlHttp = new XMLHttpRequest();
  }
  catch(e)
  {
    // zaksadajec, s¼e IE6 lub starsza
    var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
                                    "MSXML2.XMLHTTP.5.0",
                                    "MSXML2.XMLHTTP.4.0",
                                    "MSXML2.XMLHTTP.3.0",
                                    "MSXML2.XMLHTTP",
                                    "Microsoft.XMLHTTP");
    // sprawdza kas¼dy prog id as¼ kto³rys zadziasa
    for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++) 
    {
      try 
      { 
        // pro³buje stworzye obiekt XMLHttpRequest
        xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
      } 
      catch (e) {} // ignoruje potencjalne bsedy
    }
  }
  // zwraca stworzony obiekt albo wyswietla komunikat o bsedzie
  if (!xmlHttp)
    displayError("Bsed podczas tworzenia obiektu XMLHttpRequest.");
  else 
    return xmlHttp;
}
// funkcja wyswietlajeca komunikat o bsedzie
function displayError($message)
{
  // ignoruje bsed, jesli zmienna showErrors ma wartose false
  if (showErrors)
  {
    // wysecza wyswietlanie bsedo³w
    showErrors = false;
    // wyswietla wiadomose o bsedzie
    cache2.shift();
    alert("Wystapil blad: \n" + $message);
    //document.getElementById("box_center").innerHTML= $message;
    // ponawia weryfikacje po 11. sek
    setTimeout("request();", 1000);
  }
}
// funkcja obssuguje wzapytania

//wywoluje zpaytanie i zwraca wynik htmlowy do konkretnego elementu o podanym id
//request(podstawowy_parametr, id_docelowego_elemntu, reszta_zmiennych, czy_mamy_wyczyscic_zawartosc_elementu_o_id_podanym_wczesniej);

//ex.:
//request('top', 'box_top_top_login', 'do=top_btns', 0);

function request(typeID, container, content, clear)
{
  // kontynuuje tylko jesli obiekt xmlHttp nie jest pusty
  if (xmlHttp)
  {
    // jesli otrzymujemy niezerowe parametry, dodajemy je do pamieci podrecznej  formularza w kolejce zapytas.
    // Po³sºniej wyslemy je do weryfikacji na serwerze
    if (container && content)
    {
      // koduje wartosci s¼eby zabezpieczye je na czas transmisji HTTP
      //content = encodeURIComponent(content);
      container = encodeURIComponent(container);
      // dodaje wartosci do kolejki
      cache.push("typeID="+typeID+"&"+content);
      cache2.push(container);
      if(clear)//jezeli mamy wyczyscic container przed zaladowaniem
      	document.getElementById(container).innerHTML='';
    }
    // pro³buje poseczye sie z serwerem
    try
    {
      // kontynuuje jesli obiekt XMLHttpRequest jest wolny a pamiee podreczna nie jest pusta
      if ((xmlHttp.readyState == 4 || xmlHttp.readyState == 0) && cache.length > 0)
      {
        // pobiera nowe parametry z pamieci
        var cacheEntry = cache.shift();
        // wysysa s¼edanie weryfikacji na serwer
        xmlHttp.open("POST", serverAddress, true);
        xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xmlHttp.onreadystatechange = handleRequestStateChange;
        xmlHttp.send(cacheEntry);
        
        //wlaczenie still loading
        loading=1;
      	clearTimeout(load_id);
      	load_id=setTimeout("stil_chk();", 8000);
  	//document.getElementById('right_4spos_cnt3').innerHTML=cacheEntry;
      }
    }
    catch (e)
    {
      // wyswietla komunikat o bsedzie, jesli nie uda sie poseczye z serwerem
      displayError(e.toString());
    }
  }
}
// funkcja obssugujeca odpowiedsº HTTP
function handleRequestStateChange() 
{
  // kiery readyState ma wartose 4, pobieramy odpowiedsº serwera
  if (xmlHttp.readyState == 4) 
  {
    // kontynuuje, jesli status HTTP jest "OK"
    if (xmlHttp.status == 200) 
    {
      try
      {
        // czyta odpowiedsº serwera
        readResponse();
      }
      catch(e)
 
      {
        // wyswietla komunikat o bsedzie
        displayError(e.toString());
      }
    }
    else
    {
      // wyswietla komunikat o bsedzie
      if(xmlHttp.statusText)
      	displayError(xmlHttp.statusText);
    }
  }
}
// czyta odpowiedsº serwera
function readResponse()
{
  // odbiera odpowiedsº serwera
  var response = xmlHttp.responseText;
  // bsed serwera?
  if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0
    || response.length == 0)
    throw(response.length == 0 ? "Server error." : response);
  // pobiera odpowiedsº w formacie XML (zaksadajec, s¼e jest to poprawny plik XML)
  responseText = xmlHttp.responseText;
  // pobiera element document
  
  //pobiera id containera
  //stilloading
  loading=0;
  
  var cacheContainer = cache2.shift();
  if(document.getElementById(cacheContainer))
  	document.getElementById(cacheContainer).innerHTML=responseText;
  // wywosuje ponownie funkcje validate() na wypadek, gdyby w pamieci pozostasy jakies wpisy
  setTimeout("request();", 100);
}
  //-----------------------------------------
  //still loading
  //poazkuje still loading
  function stil_shw() {
    document.getElementById('still_loading').style.display="block";
  }
  
  //wylacza still loading
  function stil_cls() {
    loading=0;
    document.getElementById('still_loading').style.display="none";
    
  }
  
  //sprawdza czy ma wlaczyc still loading
  function stil_chk() {
      if(loading>0) {
        stil_shw();
      	load_id=setTimeout("stil_chk();", 1000);
      	}
      else {
      	stil_cls();
      	clearTimeout(load_id);
      	}
  }
  
  //reset silnika
  function stil_rst() {
    cache=new Array();
    cache2=new Array();
    xmlHttp.abort();
  }

