var getOkresUrl = "http://www.e-finance-reality.cz/required/ajaxUIR/_ajax-okres.php?kraj_kod=";
var getObecUrl = "http://www.e-finance-reality.cz/required/ajaxUIR/_ajax-obec.php?okres_kod="
var getKatUzUrl = "http://www.e-finance-reality.cz/required/ajaxUIR/_ajax-katuz.php?obec_kod="

var httpRequestKrajKod = "";
var httpRequestOkresKod = "";
var httpRequestObecKod = "";
/* the last okres for which suggests have been requested */
var userOkres = "";
/* the last selected okres for which the user wants to display the towns */

var userKrajKod = "";
var userOkresKod = "";
var userObecKod = "";

/* the identifier used to cancel the evaluation with the clearTimeout method. */
var timeoutId = -1;
/* cache objects containing the retrieved data */
var oCache = new Object();
var oOkresListCache = new Object();
var oObecListCache = new Object();
var oKatUzListCache = new Object();
// when set to true, display detailed error messages

var sKraj = "";
var sOkres = "";
var sObec = "";
var sKatUz = "";

var debugMode = true;
/* the XMLHttp object(s) for communicating with the server */
var xmlHttpGetOkresList = createXmlHttpRequestObject();
var xmlHttpGetObecList = createXmlHttpRequestObject();
var xmlHttpGetKatUzList = createXmlHttpRequestObject();

// fillOkres
function fillOkres() {
  getOkresList();
} // fillOkres

// fillObec
function fillObec() {
  if(sOkres == "") {
    clearObecList();
  } else {
    getObecList();
  }  
} // fillObec

// fillKatUz
function fillKatUz() {
  if(sObec == "") {
    clearKatUzList();
  } else {
    getKatUzList();
  }
} // fillKatUz

// creates an XMLHttpRequest instance
function createXmlHttpRequestObject() {
  // will store the reference to the XMLHttpRequest object
  var xmlHttp;
  // this should work for all browsers except IE6 and older
  try {
    // try to create XMLHttpRequest object
    xmlHttp = new XMLHttpRequest();
  }
  catch(e) {
    // assume IE6 or older
    var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
                                    "MSXML2.XMLHTTP.5.0",
                                    "MSXML2.XMLHTTP.4.0",
                                    "MSXML2.XMLHTTP.3.0",
                                    "MSXML2.XMLHTTP",
                                    "Microsoft.XMLHTTP");
    // try every prog id until one works
    for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++) {
      try { 
        // try to create XMLHttpRequest object
        xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
      } 
      catch (e) {}
    }
  }
  // return the created object or display an error message
  if (!xmlHttp)
    alert("Error creating the XMLHttpRequest object.");
  else 
    return xmlHttp;
} // createXmlHttpRequestObject()

/* transforms all the children of an xml node into an array */
function xmlToArray(resultsXml) {
  // initiate the resultsArray
  var resultsArray= new Array();  
  // loop through all the xml nodes retrieving the content  
  for(i=0;i<resultsXml.length;i++)
    resultsArray[i]=resultsXml.item(i).firstChild.data;
  // return the node's content as an array
  return resultsArray;
} // xmlToArray

// addToOkresListCache
function addToOkresListCache(kraj_kod, values) {
  // create a new array entry in the cache
  oOkresListCache[kraj_kod] = new Array();
  // add all the values to the okres's entry in the cache
  for(i=0; i<values.length; i++) {
    oOkresListCache[kraj_kod][i] = values[i];
  }    
} // addToOkresListCache

// addToObecListCache
function addToObecListCache(okres_kod, values) {
  // create a new array entry in the cache
  oObecListCache[okres_kod] = new Array();
  // add all the values to the okres's entry in the cache
  for(i=0; i<values.length; i++) {
    oObecListCache[okres_kod][i] = values[i];
  }    
} // addToObecListCache

// addToKatUzListCache
function addToKatUzListCache(obec_kod, values) {
  // create a new array entry in the cache
  oKatUzListCache[obec_kod] = new Array();
  // add all the values to the okres's entry in the cache
  for(i=0; i<values.length; i++)
    oKatUzListCache[obec_kod][i] = values[i];  
}

// getOkresList
function getOkresList() {
  document.getElementById("okresy").innerHTML = 
   "<div id='ajax-loader'><img border='0' src='http://www.e-finance-reality.cz/images/ajax/ajax-loader.gif' /></div>";
  document.getElementById('tr_okresy').style.display = "";
  /* continue if kraj_kod isn't null */
  var kraj_kod = sKraj;	
  if(kraj_kod != "") {
    if(xmlHttpGetOkresList) { 
      try {
        /* if the XMLHttpRequest object isn't busy with a previous
           request... */
        if (xmlHttpGetOkresList.readyState == 4 || xmlHttpGetOkresList.readyState == 0) {    
          userKrajKod = kraj_kod;
          httpRequestKrajKod = kraj_kod;
        
          xmlHttpGetOkresList.open("GET", getOkresUrl + encode(kraj_kod), true);
          xmlHttpGetOkresList.onreadystatechange = handleGettingOkresList; 
          xmlHttpGetOkresList.send(null);
        }
        // if the XMLHttpRequest object is busy...
        else {
          // retain the okres the user wanted             
          userKrajKod = kraj_kod;
          // clear any previous timeouts already set
          if(timeoutId != -1)
            clearTimeout(timeoutId);          
          // try again in 0.6 seconds     
          timeoutId = setTimeout("getOkresList(kraj_kod);", 600);
        }
      }
      catch(e) {
        displayError("Can't connect to server:\n" + e.toString());
      }
    }    
  }
} // getOkresList

// getObecList
function getObecList() {
  document.getElementById("obce").innerHTML = 
   "<div id='ajax-loader'><img border='0' src='http://www.e-finance-reality.cz/images/ajax/ajax-loader.gif' /></div>";
  //document.getElementById('tr_obce').style.display = "";
  var okres_kod = sOkres;	
  if(okres_kod != "") {
    if(xmlHttpGetObecList) { 
      try {
        // if the XMLHttpRequest object isn't busy with a previous request... 
        if (xmlHttpGetObecList.readyState == 4 || xmlHttpGetObecList.readyState == 0) {    
          userOkresKod = okres_kod;
          httpRequestOkresKod = okres_kod;
      
          xmlHttpGetObecList.open("GET", getObecUrl + encode(okres_kod), true);
          xmlHttpGetObecList.onreadystatechange = handleGettingObecList; 
          xmlHttpGetObecList.send(null);
        } 
        else {
          // if the XMLHttpRequest object is busy...
          // retain the okres the user wanted             
          userOkresKod = okres_kod;
          // clear any previous timeouts already set
          if(timeoutId != -1)
            clearTimeout(timeoutId);          
            // try again in 0.6 seconds     
            timeoutId = setTimeout("getObecList();", 600);
          }
      }
      catch(e) {
        displayError("Can't connect to server:\n" + e.toString());
      }
    }    
  }
  return;
} // getObecList

// getKatUzList
function getKatUzList() {
  document.getElementById("katuzemi").innerHTML = 
   "<div id='ajax-loader'><img border='0' src='http://www.e-finance-reality.cz/images/ajax/ajax-loader.gif' /></div>";
  //document.getElementById('tr_katuzemi').style.display = "";
  var obec_kod = sObec;
  if(obec_kod != "") {
    if(xmlHttpGetKatUzList) { 
      try {
        // if the XMLHttpRequest object isn't busy with a previous request... 
        if (xmlHttpGetKatUzList.readyState == 4 || xmlHttpGetKatUzList.readyState == 0) {    
          userObecKod = obec_kod;
          httpRequestObecKod = obec_kod;
      
          xmlHttpGetKatUzList.open("GET", getKatUzUrl + encode(obec_kod), true);
          xmlHttpGetKatUzList.onreadystatechange = handleGettingKatUzList; 
          xmlHttpGetKatUzList.send(null);
        } 
        else {
          // if the XMLHttpRequest object is busy...
          // retain the okres the user wanted             
          userObecKod = obec_kod;
          // clear any previous timeouts already set
          if(timeoutId != -1)
            clearTimeout(timeoutId);          
            // try again in 0.6 seconds     
            timeoutId = setTimeout("getKatUzList(obec_kod);", 600);
          }
      }
      catch(e) {
        displayError("Can't connect to server:\n" + e.toString());
      }
    }    
  }
  return;
} // getKatUzList

// handleGettingOkresList
function handleGettingOkresList() {
  //if the process is completed, decide what to do with the returned data
  if (xmlHttpGetOkresList.readyState == 4) {
    // only if HTTP status is "OK"
    if (xmlHttpGetOkresList.status == 200) { 
      try {
        // process the server's response
        updateOkresList();
      }
      catch(e) {
        // display the error message
        displayError(e.toString()); 
      }  
    } 
    else {
      displayError("getOkresList: There was a problem retrieving the data:\n" + 
                   xmlHttpGetOkresList.statusText);
    }       
  }
} // handleGettingOkresList

// handleGettingObecList
function handleGettingObecList() {
  //if the process is completed, decide what to do with the returned data
  if (xmlHttpGetObecList.readyState == 4) {
    // only if HTTP status is "OK"
    if (xmlHttpGetObecList.status == 200) { 
      try {
        // process the server's response
        updateObecList();
      }
      catch(e) {
        // display the error message
        displayError(e.toString()); 
      }  
    } else {
      displayError("getObecList: There was a problem retrieving the data:\n" + 
                   xmlHttpGetObecList.statusText);
    }       
  }
} // handleGettingObecList

// handleGettingObecList
function handleGettingKatUzList() {
  //if the process is completed, decide what to do with the returned data
  if (xmlHttpGetKatUzList.readyState == 4) {
    // only if HTTP status is "OK"
    if (xmlHttpGetKatUzList.status == 200) { 
      try {
        // process the server's response
        updateKatUzList();
      }
      catch(e) {
        // display the error message
        displayError(e.toString()); 
      }  
    } else {
      displayError("getKatUzList: There was a problem retrieving the data:\n" + 
                   xmlHttpGetKatUzList.statusText);
    }       
  }
} // handleGettingObecList

// updateOkresList
function updateOkresList() {
  // retrieve the server's response 
  var response = xmlHttpGetOkresList.responseText;
  // server error?
  if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0 || response.length == 0) {
    throw(response.length == 0 ? "Void server response." : response);
  }  
  // retrieve the document element
  response = xmlHttpGetOkresList.responseXML.documentElement;
  // initialize the new array of functions' names
  nameArray = new Array();
  // check to see if we have any results for the searched okres
 
  if(response.childNodes.length) {
    /* we retrieve the new functions' names from the document element as 
       an array */
    nameArray= xmlToArray(response.getElementsByTagName("name"));       
  }
  // check to see if other okress are already being searched for
  if(httpRequestKrajKod == userKrajKod) {
    // display the results array
    displayOkresList(httpRequestKrajKod, nameArray);
  }
  else {
    // add the results to the cache
    // we don't need to display the results since they are no longer useful
    addToOkresListCache(httpRequestKrajKod, nameArray);              
  }
} // updateOkresList

// updateObecList
function updateObecList() {
  // retrieve the server's response 
  var response = xmlHttpGetObecList.responseText;
  // server error?
  if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0 || response.length == 0) {
    throw(response.length == 0 ? "Void server response." : response);
  }  
  // retrieve the document element
  response = xmlHttpGetObecList.responseXML.documentElement;
  // initialize the new array of functions' names
  nameArray = new Array();
  // check to see if we have any results for the searched okres
 
  if(response.childNodes.length) {
    /* we retrieve the new functions' names from the document element as an array */
    nameArray= xmlToArray(response.getElementsByTagName("name"));       
  }
  // check to see if other okress are already being searched for
  if(httpRequestOkresKod == userOkresKod) {
    // display the results array
    displayObecList(httpRequestOkresKod, nameArray);
  }
  else {
    // add the results to the cache
    // we don't need to display the results since they are no longer useful
    addToObecListCache(httpRequestOkresKod, nameArray);              
  }
} // updateObecList

// updateKatUzList
function updateKatUzList() {
  // retrieve the server's response 
  var response = xmlHttpGetKatUzList.responseText;
  // server error?
  if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0 || response.length == 0) {
    throw(response.length == 0 ? "Void server response." : response);
  }  
  // retrieve the document element
  response = xmlHttpGetKatUzList.responseXML.documentElement;
  // initialize the new array of functions' names
  nameArray = new Array();
  // check to see if we have any results for the searched okres
 
  if(response.childNodes.length) {
    /* we retrieve the new functions' names from the document element as an array */
    nameArray= xmlToArray(response.getElementsByTagName("name"));       
  }
  // check to see if other okress are already being searched for
  if(httpRequestObecKod == userObecKod) {
    // display the results array
    displayKatUzList(httpRequestObecKod, nameArray);
  }
  else {
    // add the results to the cache
    // we don't need to display the results since they are no longer useful
    addToKatUzListCache(httpRequestObecKod, nameArray);              
  }
} // updateKatUzList

// displayOkresList
function displayOkresList(kraj_kod, results_array) {  
  // start building the results   
  // if the searched for okres is not in the cache then add it to the cache
  if(!oOkresListCache[kraj_kod] && kraj_kod) {
    addToOkresListCache(kraj_kod, results_array);
  }  

  var v_kraj_nazev = "";
  var v_kraj_kod = "";
  var okres_nazev = "";
  var okres_kod = "";
  var value = "";
  var valueBroken = "";
  
  var div = "";
  var checked = "";
  
  var previous_kraj = "";

  // loop through all the results and generate the HTML list of results
  for (var i=0; i<oOkresListCache[kraj_kod].length; i++) {  
    // retrieve the current function
    value = oOkresListCache[kraj_kod][i];
    // start building the HTML rows
 
    valueBroken = value.split(":");
    v_kraj_nazev = valueBroken[0];
    v_kraj_kod = valueBroken[1];    
    okres_nazev = valueBroken[2];
    okres_kod = valueBroken[3];
    
    if(sOkres.match(''+okres_kod+'')) {
      checked = "checked='checked'";
    } else {
      checked = "";
    }
    
    if(previous_kraj != v_kraj_kod) {
      div += "<li>&nbsp;<b>" + v_kraj_nazev + "</b></li> \r\n";
      previous_kraj = v_kraj_kod;
    }    
      
    div += "<li id='okres" + okres_kod + "'>&nbsp;<input type='checkbox' name='ch_okres_" + okres_kod + 
           "' value='" + okres_kod + "' id='ch_okres_" + okres_kod +
           "' " + checked + " style='cursor: pointer; padding: 0px; margin: 0px;' onclick=\"evaluateOkres(this);\" />&nbsp;" + 
           okres_nazev + "</li> \r\n";  
  }
  
  // retrieve the suggest and scroll object
  var oOkresList = document.getElementById("okresy"); 
  var oOkresListScroll = document.getElementById("okresy_scroll");
  oOkresListScroll.scrollTop = 0;
  oOkresList.innerHTML = div;
} // displayOkresList

// displayObecList
function displayObecList(okres_kod, results_array) {  
  // if the searched for okres is not in the cache then add it to the cache
  if(!oObecListCache[okres_kod] && okres_kod) { 
    addToObecListCache(okres_kod, results_array);
  }  
  
  var div = "";
  var checked = "";

  var v_okres_nazev = "";
  var v_okres_kod = "";
  var obec_nazev = "";
  var obec_kod = "";
  
  var value = "";
  var valueBroken = "";
  
  var previous_okres = "";
  
  // loop through all the results and generate the HTML list of results
  for (var i=0; i<oObecListCache[okres_kod].length; i++) {  
    // retrieve the current function
    value = oObecListCache[okres_kod][i];
    // start building the HTML rows
 
    valueBroken = value.split(":");
    v_okres_nazev = valueBroken[0];
    v_okres_kod = valueBroken[1];
    obec_nazev = valueBroken[2];
    obec_kod = valueBroken[3];
    
    if(sObec.match(''+obec_kod+'')) {
      checked = "checked='checked'";
    } else {
      checked = "";
    }    
    
    if(previous_okres != v_okres_kod) {
      div += "<li>&nbsp;<b>" + v_okres_nazev + "</b></li> \r\n";
      previous_okres = v_okres_kod;
    }
    
    div += "<li id='obec" + obec_kod + "'>&nbsp;<input type='checkbox' name='ch_obec_" + obec_kod + 
           "' value='" + obec_kod + "' id='ch_obec_" + obec_kod +
           "' " + checked + " style='cursor: pointer; padding: 0px; margin: 0px;' onclick=\"evaluateObec(this);\" />&nbsp;" + 
           obec_nazev + "</li> \r\n";  
  }
  
  // retrieve the suggest and scroll object
  var oObecList = document.getElementById("obce"); 
  var oObecListScroll = document.getElementById("obce_scroll");
  oObecListScroll.scrollTop = 0;
  oObecList.innerHTML = div;
  
  //document.getElementById('tr_obce').style.display = "";
} // displayObecList

// displayKatUzList
function displayKatUzList(obec_kod, results_array) {  
  // if the searched for okres is not in the cache then add it to the cache
  if(!oKatUzListCache[obec_kod] && obec_kod) { 
    addToKatUzListCache(obec_kod, results_array);
  }  

  var div = "";
  var checked = "";

  var v_obec_nazev = "";
  var v_obec_kod = "";
  var katuz_nazev = "";
  var katuz_kod = "";
  
  var value = "";
  var valueBroken = "";

  var previous_obec = "";

  // loop through all the results and generate the HTML list of results
  for (var i=0; i<oKatUzListCache[obec_kod].length; i++) {  
    // retrieve the current function
    value = oKatUzListCache[obec_kod][i];
    // start building the HTML rows
 
    valueBroken = value.split(":");
    v_obec_nazev = valueBroken[0];
    v_obec_kod = valueBroken[1];
    katuz_nazev = valueBroken[2];
    katuz_kod = valueBroken[3];
    
    if(sKatUz.match(''+katuz_kod+'')) {
      checked = "checked='checked'";
    } else {
      checked = "";
    }    
    
    if(previous_obec != v_obec_kod) {
      div += "<li>&nbsp;<b>" + v_obec_nazev + "</b></li> \r\n";
      previous_obec = v_obec_kod;
    }
    
    div += "<li id='katuz" + katuz_kod + "'>&nbsp;<input type='checkbox' name='ch_katuz_" + katuz_kod + 
           "' value='" + katuz_kod + "' id='ch_katuz_" + katuz_kod +
           "' " + checked + " style='cursor: pointer; padding: 0px; margin: 0px;' onclick=\"evaluateKatUz(this);\" />&nbsp;" + 
           katuz_nazev + "</li> \r\n";  
  }
  
  // retrieve the suggest and scroll object
  var oKatUzList = document.getElementById("katuzemi"); 
  var oKatUzListScroll = document.getElementById("katuzemi_scroll");
  oKatUzListScroll.scrollTop = 0;
  oKatUzList.innerHTML = div;
  
  //document.getElementById('tr_katuzemi').style.display = "";
} // displayKatUzList

function clearObecList() {
  var oObecList = document.getElementById("obce"); 
  var oObecListScroll = document.getElementById("obce_scroll");
  oObecListScroll.scrollTop = 0;
  oObecList.innerHTML = "";
  
  //document.getElementById('tr_obce').style.display = "none";
}

function clearKatUzList() {
  var oKatUzList = document.getElementById("katuzemi"); 
  var oKatUzListScroll = document.getElementById("katuzemi_scroll");
  oKatUzListScroll.scrollTop = 0;
  oKatUzList.innerHTML = "";
  
  //document.getElementById('tr_katuzemi').style.display = "none";
}

// function evaluateKraj
function evaluateKraj(chbox) {
  if(chbox.checked === true) {
    sKraj = sKraj + chbox.value + ":";
  } else {
    sKraj = sKraj.replace(chbox.value + ":", "");
    // nyni jsme vyradili dany kraj ze "seznamu" vybranych kraju
    // jeste je potreba vyradit vsechny podradene okresy a obce ze "seznamu" okresu 'sOkres' a obci 'sObec'        
  }
  fillOkres();
} // evaluateKraj

// function evaluateOkres
function evaluateOkres(chbox) {
  if(chbox.checked === true) {
    sOkres = sOkres + chbox.value + ":";
  } else {
    sOkres = sOkres.replace(chbox.value + ":", "");
    // nyni jsme vyradili dany okres ze "seznamu" vybranych okresu
    // jeste je potreba vyradit vsechny podradene obce ze "seznamu" obci 'sObec'
    
  }
  fillObec();
  fillKatUz();
} // evaluateOkres

// function evaluateObec
function evaluateObec(chbox) {
  if(chbox.checked === true) {
    sObec = sObec + chbox.value + ":";
  } else {
    sObec = sObec.replace(chbox.value + ":", "");
  } 
  fillKatUz();
} // evaluateObec

// function evaluateKatUz
function evaluateKatUz(chbox) {
  if(chbox.checked === true) {
    sKatUz = sKatUz + chbox.value + ":";
  } else {
    sKatUz = sKatUz.replace(chbox.value + ":", "");
  } 
} // evaluateKatUz

/* function that escapes a string */
function encode(uri) {
  if (encodeURIComponent) {
    return encodeURIComponent(uri);
  }

  if (escape) {
    return escape(uri);
  }
} // encode

/* function that displays an error message */
function displayError(message)
{
  // display error message, with more technical details if debugMode is true
  alert("Error accessing the server! "+
        (debugMode ? "\n" + message : ""));
}

function show_element(chbox, elnum) { 
  var e = new Array();
   e[0] = document.getElementById('tr_katuzemi');
   e[1] = document.getElementById('tr_obce');
   e[2] = document.getElementById('tr_okresy');
  var c = new Array(); 
   c[0] = document.getElementById('ch_katuzemi');
   c[1] = document.getElementById('ch_obce');  
   c[2] = document.getElementById('ch_okresy');
  if(c[elnum].checked === true) {
    if(elnum == 0 && sKraj == '') {
      alert('Vyberte poľadované kraje.');
      chbox.checked = false;
      return;
    }  
    if(chbox[elnum] == 1 && sOkres == '') {
      alert('Vyberte poľadované okresy.');
      chbox.checked = false;
      return;
    }  
    if(chbox[elnum] == 2 && sObec == '') {
      alert('Vyberte poľadované obce.');
      chbox.checked = false;
      return;
    }
    
    e[elnum].style.display = "";     
  } else {
    for(var i = elnum; i >= 0; i--) {
      e[i].style.display = "none";
      c[i].checked = false;
    }
  }
}
