// -------------------------------------------------------------------------
function createXHR()
{
  if (typeof XMLHttpRequest != "undefined")
    return new XMLHttpRequest();

  var xhrVersion = [ "MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp" ];
  for (var i = 0; i < xhrVersion.length; i++)
    try
    {
      var xhrObj = new Active(xhrVersion[i]);
      return xhrObj;
    }
    catch (e) {}

  return false;
}

// -------------------------------------------------------------------------
function makeRequest(url, resultFunction)
{
  var xhr = createXHR();
  if (xhr === false)
    return false;

  xhr.open("GET", url, true);

  xhr.onreadystatechange =
    function()
    {
      if (xhr.readyState != 4)
        return;
      delete xhr['onreadystatechange'];
      if (xhr.status == 200)
        resultFunction(xhr.responseText);
      delete xhr;
    };

  xhr.send(null);
}

//-------------------------------------------------------------------------
function getRequestString(formObj)
{
  var arrayRequestString = new Array();
  for (var i = 0; i < formObj.elements.length; i++)
  {
    var obj = formObj.elements[i];
    if (obj.type.match(/^select-multiple$/i))
    {
      for (var j = 0; j < obj.length; j++)
        if (obj[j].selected)
          arrayRequestString.push(encodeURIComponent(obj.name) + "=" + encodeURIComponent(obj[j].value));
    }
    else if (obj.type.match(/^checkbox$/i))
    {
      if (obj.checked)
        arrayRequestString.push(encodeURIComponent(obj.name) + "=" + encodeURIComponent(obj[j].value));
    }
    else
      arrayRequestString.push(encodeURIComponent(obj.name) + "=" + encodeURIComponent(obj.value));
  }
  return arrayRequestString.join("&");
}

//-------------------------------------------------------------------------
function makePostRequest(url, requestString, resultFunction)
{
  var xhr = createXHR();
  if (xhr === false)
    return false;

  xhr.open("POST", url, true);

  if (typeof xhr.setRequestHeader != "undefined")
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

  xhr.onreadystatechange =
    function()
    {
      if (xhr.readyState != 4)
        return;
      delete xhr['onreadystatechange'];
      if (xhr.status == 200)
        resultFunction(xhr.responseText);
      delete xhr;
    };

  xhr.send(requestString);
}

// -------------------------------------------------------------------------
function ajaxLinkRequest(thisObj)
{
  // http://lipa.grzyb.one.pl/?akcja=ocen&kawal_id=86&ocena=4  -->
  // http://lipa.grzyb.one.pl/includes/ajax.php?akcja=ocen&kawal_id=86&ocena=4

  if (matches = thisObj.href.match(/^(https?:\/\/)?([^\/]*)\/(.*)$/i))
    var url_params = matches[3];
  else
    return true; // zostanie wykonane zwykle przeladowanie strony

  // !!!
  showWaitAjaxBox();
  
  makeRequest("includes/ajax.php" + url_params,
    function(text)
    {
	  // !!!
	  hideWaitAjaxBox();

      // pierwsza linia zwroconego wyniku powinna byc nazwa wywolanej akcji
      if (matches = text.match(/^(\w[\w\d_]*)[\n\r]+((.|[\n\r])*)$/i))
      {
        var ret_action = matches[1];
        text = matches[2];
      }
      else
        document.location.href = thisObj.href; // zwykle przeladowanie strony

      switch (ret_action)
      {
      // oooooooooooooooooooooooooooooooooooooooo
      case "ocen":
        if (text.match(/^ok[\n\r]+/i))
        {
          hideInfoErrorDiv(); // !!!

          // zwiekszenie liczby ocenionych kawalow w panelu uzytkownika
          var mistakesCount = parseInt(document.getElementById("ZALOGOWANY-OCENIONYCH").innerHTML);
          document.getElementById("ZALOGOWANY-OCENIONYCH").innerHTML = eval(mistakesCount + 1);

          thisObj.parentNode.innerHTML = "oceniłeś już ten kawał";
          if (matches = text.match(/^ok[\n\r]+(\d+);(.+)$/i))
          {
            var kawal_id = matches[1];
            var new_rate = matches[2];
            document.getElementById("OCENA_KAWAL_" + kawal_id).innerHTML = new_rate;
          }
        }
        else if (matches = text.match(/^blad[\n\r]+((.|[\n\r])*)$/i))
        {
          infoErrorUpdate(matches[1]); // !!!
//          infoErrorUpdate(matches[1], true);
        }
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      case "dodaj_do_ulubionych":
      case "usun_z_ulubionych":
        if (text.match(/^ok[\n\r]+/i))
        {
          var replace_string_part = (ret_action == "dodaj_do_ulubionych" ? "usun_z" : "dodaj_do");
          var alt_title           = (ret_action == "dodaj_do_ulubionych" ? "usuń z" : "dodaj do") + " ulubionych";
          thisObj.href = thisObj.href.replace(/(\?akcja=)[^\.]+(_ulubionych)/i, "$1" + replace_string_part + "$2");
          thisObj.firstChild.src = thisObj.firstChild.src.replace(/(ikonka_)[^\.]+(_ulubionych\.jpg)$/i, "$1" + replace_string_part + "$2");
          thisObj.firstChild.setAttribute("alt", alt_title);
          thisObj.firstChild.setAttribute("title", alt_title);
        }
        else if (matches = text.match(/^blad[\n\r]+((.|[\n\r])*)$/i))
          infoErrorUpdate(matches[1]);
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      case "pokaz_formularz_bledu":
        if (text.match(/^ok[\n\r]+/i))
        {
          var matches         = text.match(/^ok[\n\r]+(\d+);((.|[\n\r])+)$/i);
          var kawal_id        = matches[1];
          var newDivInnerHTML = matches[2];

          // dodatkowy warunek, czy nie istnieje juz box dla tego samego kawalu tylko z inna funkcja (sprawdzenie akcji formularza)
          var formAction = getActionFromInnerHTMLForm(newDivInnerHTML);

          var newDiv = toggleEmptyAdditionalBox(kawal_id, formAction);
          if (newDiv)
          {
            newDiv.innerHTML = newDivInnerHTML;
            document.getElementById("ZGLOS_BLAD-TRESC").focus();
            addMaxlengthCheckingToTextareas();
          }
          hideInfoErrorDiv();
          hideAllAdditionalErrorBoxes();
        }
        else if (matches = text.match(/^blad[\n\r]+((.|[\n\r])*)$/i))
          infoErrorUpdate(matches[1]);
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      case "pokaz_formularz_znajomego":
        if (text.match(/^ok[\n\r]+/i))
        {
          var matches         = text.match(/^ok[\n\r]+(\d+);((.|[\n\r])+)$/i);
          var kawal_id        = matches[1];
          var newDivInnerHTML = matches[2];

          // dodatkowy warunek, czy nie istnieje juz box dla tego samego kawalu tylko z inna funkcja (sprawdzenie akcji formularza)
          var formAction = getActionFromInnerHTMLForm(newDivInnerHTML);

          var newDiv = toggleEmptyAdditionalBox(kawal_id, formAction);
          if (newDiv)
          {
            newDiv.innerHTML = newDivInnerHTML;
            document.getElementById("WYSLIJ_ZNAJOMEMU-EMAIL").focus();
            addMaxlengthCheckingToTextareas();
          }
          hideInfoErrorDiv();
          hideAllAdditionalErrorBoxes();
        }
        else if (matches = text.match(/^blad[\n\r]+((.|[\n\r])*)$/i))
          infoErrorUpdate(matches[1]);
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      default:
        document.location.href = thisObj.href; // zwykle przeladowanie strony
      }

      if (!text) // jesli blad zapytania ajax (pusty wynik), to zwykle przeladowanie strony
        document.location.href = thisObj.href;
    });

  return false; // zapytanie obsluzone przez ajaxa, bez przeladowania strony
}

//-------------------------------------------------------------------------
function ajaxFormRequest(thisObj)
{
  var requestString = getRequestString(thisObj);

  // !!!
  showWaitAjaxBox();
  
  makePostRequest("includes/ajax.php", getRequestString(thisObj),
    function(text)
    {
	  // !!!
	  hideWaitAjaxBox();

      // pierwsza linia zwroconego wyniku powinna byc nazwa wywolanej akcji
      if (matches = text.match(/^(\w[\w\d_]*)[\n\r]+((.|[\n\r])*)$/i))
      {
        var ret_action = matches[1];
        text = matches[2];
      }
      else
        thisObj.submit(); // zwykle wyslanie formularza (przeladowanie strony)

      switch (ret_action)
      {
      // oooooooooooooooooooooooooooooooooooooooo
      case "zaloguj":
        if (text.match(/^ok[\n\r]+/i))
          thisObj.submit(); // przeladowanie strony (wyslanie formularza w celu zalogowania)
        else if (matches = text.match(/^blad[\n\r]+((.|[\n\r])*)$/i))
        {
          infoErrorUpdate(matches[1], true);
          document.getElementById("LOGOWANIE-LOGIN").focus();
        }
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      case "zglos_blad":
        if (text.match(/^ok[\n\r]+/i))
        {
          // zwiekszenie liczby zgloszonych bledow w panelu uzytkownika
          var mistakesCount = parseInt(document.getElementById("ZALOGOWANY-ZGLOSZONYCH_BLEDOW").innerHTML);
          document.getElementById("ZALOGOWANY-ZGLOSZONYCH_BLEDOW").innerHTML = eval(mistakesCount + 1);

          hideAllAdditionalBoxes();
          hideAllAdditionalErrorBoxes();

          hideInfoErrorDiv();
        }
        else if (matches = text.match(/^blad[\n\r]+(\d+);((.|[\n\r])*)$/i))
        {
          var kawal_id     = matches[1];
          var errorMessage = matches[2];

          hideInfoErrorDiv();

          document.getElementById("ZGLOS_BLAD-TRESC").focus();
          if (kawal_id)
          {
            var errorNewDiv = insertEmptyAdditionalErrorBox(kawal_id);
            if (errorNewDiv)
              errorNewDiv.innerHTML = '<div class="box-srodkowy-blad">' + errorMessage + '</div>';
          }
          else
            infoErrorUpdate(errorMessage, true);
        }
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      case "wyslij_znajomemu":
        if (text.match(/^ok[\n\r]+/i))
        {
          hideAllAdditionalBoxes();
          hideAllAdditionalErrorBoxes();

          hideInfoErrorDiv();
        }
        else if (matches = text.match(/^blad[\n\r]+(\d+);((.|[\n\r])*)$/i))
        {
          var kawal_id     = matches[1];
          var errorMessage = matches[2];

          hideInfoErrorDiv();

          document.getElementById("WYSLIJ_ZNAJOMEMU-EMAIL").focus();
          if (kawal_id)
          {
            var errorNewDiv = insertEmptyAdditionalErrorBox(kawal_id);
            if (errorNewDiv)
              errorNewDiv.innerHTML = '<div class="box-srodkowy-blad">' + errorMessage + '</div>';
          }
          else
            infoErrorUpdate(errorMessage, true);
        }
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      case "zmien_haslo":
        if (text.match(/^ok[\n\r]+/i))
        {
          hideAllAdditionalErrorBoxes();

          hideInfoErrorDiv();

          // !!! czyscic pola hasel takze przy korzystaniu z ajaxa?
          // document.getElementById("ZMIEN_HASLO-HASLO_STARE").value = "";
          // document.getElementById("ZMIEN_HASLO-HASLO").value = "";
          // document.getElementById("ZMIEN_HASLO-HASLO2").value = "";

          document.location.href = "?menu=zmiana_hasla_ok";
        }
        else if (matches = text.match(/^blad[\n\r]+((.|[\n\r])*)$/i))
        {
          var errorMessage = matches[1];

          hideInfoErrorDiv();

          document.getElementById("ZMIEN_HASLO-HASLO_STARE").focus();
          infoErrorUpdate(errorMessage, true);
        }
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      case "zwerbuj_znajomego":
        if (text.match(/^ok[\n\r]+/i))
        {
          hideAllAdditionalErrorBoxes();

          hideInfoErrorDiv();

          document.location.href = "?menu=zwerbowanie_znajomego_ok";
        }
        else if (matches = text.match(/^blad[\n\r]+((.|[\n\r])*)$/i))
        {
          var errorMessage = matches[1];

          hideInfoErrorDiv();

          document.getElementById("ZWERBUJ_ZNAJOMEGO-EMAIL").focus();
          infoErrorUpdate(errorMessage, true);
        }
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      case "powiadom_znajomego":
        if (text.match(/^ok[\n\r]+/i))
        {
          hideAllAdditionalErrorBoxes();

          hideInfoErrorDiv();

          document.location.href = "?menu=powiadomienie_znajomego_ok";
        }
        else if (matches = text.match(/^blad[\n\r]+((.|[\n\r])*)$/i))
        {
          var errorMessage = matches[1];

          hideInfoErrorDiv();

          document.getElementById("POWIADOM_ZNAJOMEGO-EMAIL").focus();
          infoErrorUpdate(errorMessage, true);
        }
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      case "wyslij_zgloszenie_goscia":
        if (text.match(/^ok[\n\r]+/i))
        {
          hideAllAdditionalErrorBoxes();

          hideInfoErrorDiv();

          document.location.href = "?menu=zgloszenie_goscia_ok";
        }
        else if (matches = text.match(/^blad[\n\r]+((.|[\n\r])*)$/i))
        {
          var errorMessage = matches[1];

          hideInfoErrorDiv();

          document.getElementById("ZGLOSZENIE_GOSCIA-EMAIL").focus();
          infoErrorUpdate(errorMessage, true);
        }
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      case "zglos_uwagi":
        if (text.match(/^ok[\n\r]+/i))
        {
          hideAllAdditionalErrorBoxes();

          hideInfoErrorDiv();

          document.location.href = "?menu=zgloszenie_uwag_ok";
        }
        else if (matches = text.match(/^blad[\n\r]+((.|[\n\r])*)$/i))
        {
          var errorMessage = matches[1];

          hideInfoErrorDiv();

          document.getElementById("ZGLOS_UWAGI-TRESC").focus();
          infoErrorUpdate(errorMessage, true);
        }
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      case "dodaj_dowcip":
        if (text.match(/^ok[\n\r]+/i))
        {
          hideAllAdditionalErrorBoxes();

          hideInfoErrorDiv();

          document.location.href = "?menu=dodanie_dowcipu_ok";
        }
        else if (matches = text.match(/^blad[\n\r]+((.|[\n\r])*)$/i))
        {
          var errorMessage = matches[1];

          hideInfoErrorDiv();

          document.getElementById("DODANIE_DOWCIPU-TRESC").focus();
          infoErrorUpdate(errorMessage, true);
        }
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      case "zatwierdz_kawal":
      case "usun_kawal":
      case "edytuj_kawal":
        if (matches = text.match(/^ok[\n\r]+(\d+);/i))
        {
          var kawal_id = matches[1];

          hideAllAdditionalErrorBoxes();
          hideInfoErrorDiv();

          // usuniecie boxu z kawalem
          document.getElementById("EDYCJA_KAWALU_" + kawal_id).innerHTML = "";
        }
        else if (matches = text.match(/^blad[\n\r]+(\d+);((.|[\n\r])*)$/i))
        {
          var kawal_id     = matches[1];
          var errorMessage = matches[2];

          hideInfoErrorDiv();

          document.getElementById("EDYCJA_KAWALU-TRESC_" + kawal_id).focus();
          if (kawal_id)
          {
            var errorNewDiv = insertEmptyAdditionalErrorBox(kawal_id);
            if (errorNewDiv)
              errorNewDiv.innerHTML = '<div class="box-srodkowy-blad">' + errorMessage + '</div>';
          }
          else
            infoErrorUpdate(errorMessage, true);
        }
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      case "resetuj_haslo":
        if (text.match(/^ok[\n\r]+/i))
        {
          hideAllAdditionalErrorBoxes();

          hideInfoErrorDiv();

          document.location.href = "?menu=przypomnienie_hasla_ok";
        }
        else if (matches = text.match(/^blad[\n\r]+((.|[\n\r])*)$/i))
        {
          var errorMessage = matches[1];

          hideInfoErrorDiv();

          document.getElementById("PRZYPOMNIENIE_HASLA-EMAIL").focus();
          infoErrorUpdate(errorMessage, true);
        }
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      case "zarejestruj":
        if (text.match(/^ok[\n\r]+/i))
        {
          hideAllAdditionalErrorBoxes();

          hideInfoErrorDiv();

          document.location.href = "?menu=rejestracja_ok";
        }
        else if (matches = text.match(/^blad[\n\r]+((.|[\n\r])*)$/i))
        {
          var errorMessage = matches[1];

          hideInfoErrorDiv();

          document.getElementById("REJESTRACJA-LOGIN").focus();
          infoErrorUpdate(errorMessage, true);
        }
        break;

      // oooooooooooooooooooooooooooooooooooooooo
      default:
        thisObj.submit(); // zwykle wyslanie formularza (przeladowanie strony)
      }

      if (!text) // jesli blad zapytania ajax (pusty wynik), to zwykle wyslanie formularza (przeladowanie strony)
        thisObj.submit();
    });

  return false; // zapytanie obsluzone przez ajaxa, bez przeladowania strony
}

// -------------------------------------------------------------------------
var interval_ms          = 100;
var interval_id          = 0;
var interval_counter     = -1;
var interval_max_counter = 400;

// !!!
var interval_ajax_wait_counter     = -1;
var interval_ajax_wait_max_counter = 120; // 12 sek timeout dla ajaxa
var ajax_wait_error_flag           = false;

// -------------------------------------------------------------------------
function ajaxUpdateFunction()
{
  clearInterval(interval_id);

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

  if (++interval_counter > interval_max_counter)
  {
    interval_counter = 0;

    makeRequest("includes/ajax.php?akcja=losowy_kawal",
      function(text)
      {
        // pierwsza linia zwroconego wyniku powinna byc nazwa wywolanej akcji
        if (matches = text.match(/^(\w[\w\d_]*)[\n\r]+((.|[\n\r])*)$/i))
        {
          var ret_action = matches[1];
          text = matches[2];

          var bar_string = "<div style='width: 1px; height: 2px; margin-top: 4px; border: 1px solid darkgray; background-color: #e0e0e0'></div>";
          myNextElementSibling(myFirstElementChild(document.getElementById('LOSOWY_KAWAL'))).innerHTML = bar_string + text;
        }
      });
  }


  // !!!
  if (++interval_ajax_wait_counter > interval_ajax_wait_max_counter)
  {
    interval_ajax_wait_counter = 0;
    if (ajax_wait_error_flag)
      infoErrorUpdate("Wywołanie Ajax zakończone niepowodzeniem.<hr/>Spróbuj ponownie.", true);
	hideWaitAjaxBox();
  }

  
  if (obj = document.getElementById('LOSOWY_KAWAL'))
  {
    var obj = myNextElementSibling(myFirstElementChild(obj));
    var bar_string = "<div style='width: " + (97 * interval_counter / interval_max_counter) + "%; height: 2px; margin-top: 4px; border: 1px solid darkgray; background: #e0e0e0'></div>";
    if (!obj.innerHTML.match(/^<div[^>]+><\/div>/i))
      obj.innerHTML = bar_string + obj.innerHTML;
    else
      obj.innerHTML = obj.innerHTML.replace(/^<div[^>]+><\/div>/i, bar_string);
  }

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

  interval_id = setInterval(ajaxUpdateFunction, interval_ms);
}

ajaxUpdateFunction();

//-------------------------------------------------------------------------
