// JavaScript Document
/* funkcja wyświetlająca komunikat o błędzie */
function displayError(err_str){
  // wyświetla komunikat błędu - bardziej szczegółowy jeśli debugMode ma wartość true
  alert("Błąd podczas dostępu do serwera! " + "\n" + err_str );
}

//tworzy instancję obiektu XMLHttpRequest
function createXmlHttpRequestObject(){
  // przechowa odowłanie do obiektu XMLHttpRequest
  var xmlHttp;
  // powinno zadziałać dla wszystkich przeglądarem z wyjątkiem IE6 i starszych
  try{
      // próbuje utworzyć obiekt XMLHttpRequest
      xmlHttp = new XMLHttpRequest();
  } catch(e) {
    // zakładając, ż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");
    // próbuje wszystkie wartości progId, aż jedna zadziała
    for (var i = 0; i < XmlHttpVersions.length && !xmlHttp; i++)
    {
      try
      {
        // próbuje stworzyć obiekt XMLHttpRequest
        xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
      }
      catch (e) {}
    }
  }
  // zwraca utworzony obiekt lub wyświetla komunikat o błędzie
  if (!xmlHttp)
    alert("Błąd podczas tworzenia obiektu XMLHttpRequest.");
  else
    return xmlHttp;
}

function server_connect( o_http, url, handle_response ){
    if( !o_http || o_http == null ){
        //tworze nowy obiekt, dzieki temu mozna wywołać tą funkcę z nullem
        if ( !(o_http = createXmlHttpRequestObject()) ) {
            alert ('Nie udało się utworzyć obiektu: XMLHttpRequest. Funcja: server_connect w pliku ajax.js.');
        }
    }


    if( o_http ){
        try{
          /* jeśli obiekt XMLHttpRequest nie jest zajęty obsługą poprzedniego żądnia... */
          if ( o_http.readyState == 4 || o_http.readyState == 0){
            //debug.pisz('Łącze sie z adresem: kontrahenci1.php?id='+ contact_id);
            o_http.open("GET", url, true);

            o_http.onreadystatechange = function(){
                server_odp(o_http, handle_response );
            }

            o_http.send( null );
          }else{
            setTimeout( function(){
                server_connect( o_http, url, handle_response );
            }, 500);
          }
        }catch(e){
            alert("Nie mogę połączyć się z serwerem:\n" + e.toString());
        }
    }
}


function server_odp(o_http, handle_response ){
    if ( !o_http  ){
        return ;
    }

    if ( o_http.readyState == 4 ){
        // tylko jeśli status żądania HTTP jest "OK"
        try{
            if ( o_http.status == 200 ){

                if( o_http.responseXML && o_http.responseXML.documentElement ){
                    var xmlRoot =  o_http.responseXML.documentElement;

                    var o_errors_xml = [];
                    
                    try{
                        o_errors_xml = xmlRoot.getElementsByTagName('error');
                    }catch( e ){
                        displayError("Wystąpił błąd w funkcji: server_odp(o_http, handle_response). Komunikat błędu: "+ e.toString() +", jest związany z brakiem funckji: getElementsByTagName() w objekcie xmlRoot. Być może odpowiedź zwrócona z serwera nie jest w formacie xml: \n" + o_http.responseText );
                        return false;
                    }

                    if( o_errors_xml && o_errors_xml.length > 0 ){

                        var errors = [];

                        var err_str = 'Wystąpiły następujące błędy: '+ "\n";

                        // przeszukuje w pętli wszystkie węzły XML, pobierając ich zawartość
                        for(var i = 0; i < o_errors_xml.length; i++){
                            errors[i] = o_errors_xml.item(i).getAttribute('str');
                            err_str += errors[i] + "\n";
                        }

                        alert( err_str );
                        return false;
                    }
                    
                    if( typeof(handle_response) != 'function' ){
                        return;
                    }
                
                    handle_response( o_http.responseXML.documentElement, o_http.responseText );
                    
                }else{

                    if( typeof(handle_response) != 'function' ){
                        return;
                    }
                    
                    handle_response( o_http.responseText );
                }
                
                return true;
            }else{
                displayError("Wystąpił problem podczas pobierania danych:\n" + o_http.responseText);
            }
        }catch( e ){
            // wyświetla komunikat o błędzie
            displayError( 'Funkcja server_odp(o_http, handle_response ) błąd: ' +  e.toString() );
        }
    }
}



//funkcja wysyła formularz za pomocą obiektu xmlHttpRequest i jako funkcję obslugującą
//odpowiedz wzywa funkcję response_function
function send_form( oXmlHttpRequest, formularz, response_function ){
    if( oXmlHttpRequest ){
        try{
        /* jeśli obiekt XMLHttpRequest nie jest zajęty obsługą poprzedniego żądnia... */
            if (oXmlHttpRequest.readyState == 4 || oXmlHttpRequest.readyState == 0){
              
              var uri = new String(formularz.getAttribute('action'));

              if( uri == '' ){
                  uri = new String(window.location);
              }

              var data = '';

              var znak_zapytania_pos = uri.indexOf('?');
              if( znak_zapytania_pos > 0){
                  //uri = uri.substring(0, znak_zapytania_pos );
                  data = uri.substring(znak_zapytania_pos + 1) + '&ajax=1';
                  uri  += '&ajax=1';
              }else{
                  //zeby skrypt wiedział jak ma zwrócić odpowiedzc
                  data = 'ajax=1';
                  uri  += '?ajax=1';
              }
              
              var pole = null;

              for ( pole_nazwa in formularz.elements ){
                  pole = formularz.elements[pole_nazwa];

                  try{
                  if( typeof(pole) == 'object' && pole.type ){
                      if( pole.type.toLowerCase() == 'checkbox' ){
                          if( pole.checked ) data += '&' + pole.name + '=' + pole.value;
                      }else{
                          data += '&' + pole.name + '=' + pole.value;
                      }
                  }
                  }catch(o_err){
                      //nic nie robie z tym błedem, tutaj jest tylko problem pod ie, występują jakies dodatkowe pola które powoduja wystapienie błedu, takie jak onmouseover
                  }
              }

              oXmlHttpRequest.onreadystatechange = response_function;

              if( formularz.method.toUpperCase() == 'POST' ){
                oXmlHttpRequest.open('POST', uri, true);

          			try{
                  oXmlHttpRequest.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
                  oXmlHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
          			}
          			catch(e){
                  displayError("Your browser does not appear to  support asynchronous requests using POST.");
                  return false;
          			}

                oXmlHttpRequest.send( data );
              }else{
                  oXmlHttpRequest.open('GET', uri + '?' + data, true);
                  oXmlHttpRequest.send(null);
              }

              return true;
            }else{
                // jeśli jest zajęty...
                displayError("Nie mogę połączyć się z serwerem, ponieważ jest serwer zajęty...\n" );
                return false;
            }
        }catch(e){
            displayError("Nie mogę połączyć się z serwerem:\n" + e.toString());
            return false;
        }
    }else{
        displayError("Nieprawidłowy obiekt XmlHttpRequest przekazany do funkcji: ajax_send_form\n" );
        return false;
    }
}


function send_post( oXmlHttpRequest, uri, data, response_function ){
    if( oXmlHttpRequest ){
        try{
        /* jeśli obiekt XMLHttpRequest nie jest zajęty obsługą poprzedniego żądnia... */
            if (oXmlHttpRequest.readyState == 4 || oXmlHttpRequest.readyState == 0){
                if( data.indexOf('&ajax=1') == -1 ){
                    data += '&ajax=1';
                }

                oXmlHttpRequest.onreadystatechange = function(){
                    server_odp(oXmlHttpRequest, response_function );
                }

                oXmlHttpRequest.open('POST', uri, true);

          			try{
                  oXmlHttpRequest.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
                  oXmlHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
          			}
          			catch(e){
                  displayError("Your browser does not appear to  support asynchronous requests using POST.");
                  return false;
          			}

                oXmlHttpRequest.send( data );

                return true;
            }else{
                // jeśli jest zajęty...
                displayError("Nie mogę połączyć się z serwerem, ponieważ jest serwer zajęty...\n" );
                return false;
            }
        }catch(e){
            displayError("Nie mogę połączyć się z serwerem:\n" + e.toString());
            return false;
        }
    }else{
        displayError("Nieprawidłowy obiekt XmlHttpRequest przekazany do funkcji: ajax_send_form\n" );
        return false;
    }
}


function ajax_send_form( f ){

  if( adminXmlHttpRequest ){
    try{
      /* jeśli obiekt XMLHttpRequest nie jest zajęty obsługą poprzedniego żądnia... */
      if (adminXmlHttpRequest.readyState == 4 || adminXmlHttpRequest.readyState == 0){
        //debug.pisz('Łącze sie z adresem: kontrahenci1.php?id='+ contact_id);
        var uri  = 'admin.php';

        var data = 'ajax=1';
        for (var i=0; i < f.length; i++){
            current = f.elements[i];
            data += '&' + current.name + '=' + current.value;
        }

        adminXmlHttpRequest.onreadystatechange = function(){ ajax_get_form_response(); }

        if( f.method.toUpperCase() == 'POST' ){
          adminXmlHttpRequest.open('POST', uri, true);

    			try{
      //http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      //http_request.setRequestHeader("Content-length", parameters.length);
      //http_request.setRequestHeader("Connection", "close");

            adminXmlHttpRequest.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
            adminXmlHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    			}
    			catch(e){
            alert("Your browser does not appear to  support asynchronous requests using POST.");
            return false;
    			}

          adminXmlHttpRequest.send( data );
        }else{
          adminXmlHttpRequest.open('GET', uri + '?' + data, true);
          adminXmlHttpRequest.send(null);
        }
        showTlo();
        showLoading();
      }else{
        // jeśli jest zajęty...
        alert("Nie mogę połączyć się z serwerem, ponieważ jest serwer zajęty...\n" );
      }
    }
    catch(e){
      alert("Nie mogę połączyć się z serwerem:\n" + e.toString());
      return false;
    }
  }
}


function ajax_get_form_response(){

  //po ukończeniu procesu, decyduje co zrobić z otrzymanymi danymi
  if (adminXmlHttpRequest.readyState == 4){
    // tylko jeśli status żądania HTTP jest "OK"
    if (adminXmlHttpRequest.status == 200){
      try{
        hideLoading();

        hideTlo();

        if( adminXmlHttpRequest.responseText == 'OK'){
            alert('Ustawienia zostały zapisane!');
        }else{
            // pobiera element dokumentu
            var err_str = xml_get_errors(adminXmlHttpRequest);
            if( err_str ){
                err_div.innerHTML = err_str;
            }else{
                err_div.innerHTML = adminXmlHttpRequest.responseText;
            }
        }
      }
      catch(e){
        // wyświetla komunikat o błędzie
        displayError(e.toString());
      }
    }
    else{
      displayError("Wystąpił problem podczas pobierania danych:\n" + this.xmlHttpGetSuggestions.responseText);
    }
  }

}

function  xml_get_errors( xmlHttp ){

    if( xmlHttp.responseXML
          && xmlHttp.responseXML.documentElement
              /* && typeof (xmlHttp.responseXML.documentElement.getElementsByTagName) == 'function' nie działa pod ie to sprawdzenie, typeof zwraca unknown */){
        var xmlerr = [];
        try{
            xmlerr = xmlHttp.responseXML.documentElement.getElementsByTagName('error');
        }catch( o_blad ){
            displayError("Wystąpił błąd w funkcji: xml_get_errors(o_http). Komunikat błędu: " + o_blad.message + ", jest związany z brakiem funckji: getElementsByTagName() w objekcie xmlHttp. Być może odpowiedź zwrócona z serwera nie jest w formacie xml: \n" + xmlHttp.responseText );
            return false;
        }
        

        if( xmlerr.length ){
            var  errors = [];
            // przeszukuje w pętli wszystkie węzły XML, pobierając ich zawartość
            for(i = 0; i < xmlerr.length; i++){
                errors[i] = xmlerr.item(i).getAttribute('str');
            }

            err_div = document.getElementById('errors');
            err_html = 'Wystąpiły następujące błędy: ';
            err_html += '<ol>';
            for(i = 0; i < errors.length; i++){
              err_html += '<li class=error>' + errors[i] + '</li>' + "\n";
            }
            err_html += '</ol>';

            return err_html;
        }
    }


    return false;
}




