/**

@desc
  AJAX libary. All functions and variable names are prefixed with "ajax_".

@requires JSLib.js

@provides

@function ajax_call(url, output_id, parameters, cache_id)
  write result of HTTP GET/POST queries to id="output_id", e.g.
  ajax_call('index.php?dir=xxx', 'ajax_output', null, null) // uncached GET  
  ajax_call('index.php', 'ajax_output', 'dir=xxx', 'x7') // cached (ajax_cache['x7']) POST

@var ajax_cache hash
  ajax_call() query cache

 */


var ajax_cache = { 'wait.gif' : 
  '<table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%">' +
  '<tr><td valign="middle" align="center">' +
  '<img src="ajax/wait.gif" border="0" align="center">' +
  '</t></tr></table>'
};


var ajax__request = false;

ajax__init();


//-----------------------------------------------------------------------------
function ajax__init() {

  if (window.XMLHttpRequest) { 
    // Mozilla, Safari,...
    ajax__request = new XMLHttpRequest();

    if (ajax__request.overrideMimeType) {
      // set type accordingly to anticipated content type
      // ajax__request.overrideMimeType('text/html');
      ajax__request.overrideMimeType('text/html;charset=iso-8859-1')
    }
  }  
  else if (window.ActiveXObject) { 
    // IE
    try {
      ajax__request = new ActiveXObject("Msxml2.XMLHTTP");
    } 
    catch (e) {
      try {
        ajax__request = new ActiveXObject("Microsoft.XMLHTTP");
      } 
      catch (e) {
        JSLib.error('No AJAX Support', e);
      }
    }
  }
  else {
    alert('No XMLHttp instance');
  }
}


//-----------------------------------------------------------------------------
function ajax_call(url, output_id, parameters, cache_id) {

  if (cache_id && cache_id.substr(0, 1) == '!') {
    rc = parseInt(cache_id.substr(1,1)) + 1;
    cache_id = cache_id.substr(2);
  }
  else {
    rc = 1;
  }

  if (!ajax__request) {
    return false;
  }
  else if (ajax__request.readyState == 1 || 
           ajax__request.readyState == 2 || 
           ajax__request.readyState == 3) {

    if (rc < 6) {
      // previous ajax request is not finished ... try max 5 times
      setTimeout("ajax_call('" + url + "','" + output_id + "','" + parameters + 
        "','!" + rc + cache_id + "')", rc * 500);
    }

    return false;
  }

  try {

    if (parameters) {
      ajax__request.open('POST', url, true);
      ajax__request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
      ajax__request.setRequestHeader('Content-length', parameters.length);
      ajax__request.setRequestHeader('Connection', 'close');
    }
    else {
      ajax__request.open('GET', url, true);
    }

    ajax__request.onreadystatechange = function() {

      if (ajax__request.readyState == 4) {
        out = document.getElementById(output_id);

        if (!out) {
          alert('No such output element ' + output_id);
          return false;
        }

        if (out.innerHTML) {
          out.innerHTML = ajax__request.responseText;
        }
        else {
          out.value = ajax__request.responseText;
        }

        if (cache_id && ajax__request.responseText) {
          ajax_cache[cache_id] = ajax__request.responseText;
        }
      }
    }

    ajax__request.send(parameters);
  }
  catch (e) {
    if (parameters) {
      JSLib.error('POST: ' + url + '?' + parameters + ' failed (' + cache_id + ')', e);
    }
    else {
      JSLib.error('GET: ' + url + ' failed (' + cache_id + ')', e);
    }
  }

  return false;
}
