var xmlHttp;
var ajax_html_element;
var ajax_responce_text;
var ajax_request_alert;
var ajax_test;
var ajax_responce_alert;

// Ajax Libraries
// http://www.devx.com/AJAXRoundup/Article/33142/0/page/2
//  http://www.prototypejs.org/
//  http://www.xajaxproject.org/
// http://www.ajaxtoolbox.com/
// http://script.aculo.us/
// http://www.whitefrost.com/reference/2003/06/17/libXmlRequest.html

// http://www.xul.fr/en-xml-ajax.html
// http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_r_2.html

// http://www.w3schools.com/Ajax/ajax_browsers.asp
function GetXmlHttpObject()
{
var xmlHttp1=null;
try
  {
  // Firefox, Opera 8.0+, Safari
  xmlHttp1=new XMLHttpRequest();
  }
catch (e)
  {
  // Internet Explorer
  try
    {
    xmlHttp1=new ActiveXObject("Msxml2.XMLHTTP");
    }
  catch (e)
    {
    xmlHttp1=new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
return xmlHttp1;
}

function ajax_call ( request_url, replace_html_element, request_variables, request_method, request_wait ) {
   var request_url = ( request_url == null || request_url == "" ) ? document.location : request_url;
   var request_method = ( request_method == null || request_method == "" ) ? "GET" : request_method;
//   var request_wait = (request_wait == null) ? false : request_wait;
   if ( request_wait == null ) {
      var request_wait = false;
   } else if ( request_wait == true || request_wait == "" ) {
      request_wait = false;
   } else if ( request_wait == false ) {
      request_wait = true;
   } else if ( request_wait.toLowerCase() == "y" || request_wait.toLowerCase() == "yes" || request_wait.toLowerCase() == "true" ) {
      request_wait = false;
   } else if ( request_wait.toLowerCase() == "n" || request_wait.toLowerCase() == "no" || request_wait.toLowerCase() == "false" ) {
      request_wait = true;
   }

   ajax_responce_text = null;

   xmlHttp=GetXmlHttpObject();
   if ( xmlHttp==null ) {
     return;
   }

   if ( request_method == "GET" ) {
//      request_url = escape( request_url );

      if ( request_variables != null ) {
         request_url = request_url + "?";
         for ( var i in request_variables ) {
            request_url = request_url + i + "=" + encodeURIComponent( request_variables[i] ) + "&";
         }
         request_url = request_url + "sid=" + Math.random();
      }
      if ( ajax_request_alert || ajax_test ) { alert( request_method + "," + request_url + "," + request_wait ); }
      if ( ajax_test ) return;
      ajax_html_element = replace_html_element;
      xmlHttp.onreadystatechange = stateChanged;
      // the third argument decides whether the request should wait for the output before continuing, wait = false
      xmlHttp.open(request_method,request_url,request_wait);
      xmlHttp.send(null);
   } else {
      // http://www.captain.at/howto-ajax-form-post-request.php
      // http://www.openjs.com/articles/ajax_xmlhttp_using_post.php
      var parameters = "";
      if ( request_variables != null ) {
         for ( var i in request_variables ) {
            parameters = parameters + i + "=" + encodeURIComponent( request_variables[i] ) + "&";
         }
         parameters = parameters + "sid=" + Math.random();
      }
      if ( ajax_request_alert || ajax_test ) { alert( request_method + "," + request_url + " [" + parameters + "]," + request_wait ); }
      if ( ajax_test ) return;

      xmlHttp.onreadystatechange = stateChanged;
      xmlHttp.open(request_method, request_url, request_wait);
      xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      xmlHttp.setRequestHeader("Content-length", parameters.length);
      xmlHttp.setRequestHeader("Connection", "close");
      xmlHttp.send(parameters);
   }
   // alert( "Yes" );

   if ( request_wait == false && navigator.appName == "Netscape" ) {
      // firefox will not call stateChanged() when request_wait is set to false (a synchronous request)
      // - http://bytes.com/forum/thread657851.html
      if ( 1 == 1 ) {
         stateChanged();
      } else {
         // was going to use this but it doesnt execute the useful code found in the stateChanged() function
         ajax_responce_text = xmlHttp.responseText;
      }
   }
}

//http://www.w3schools.com/Ajax/ajax_xmlhttprequest.asp
//0	The request is not initialized
//1	The request has been set up
//2	The request has been sent
//3	The request is in process
//4	The request is complete
function stateChanged() {
   // not possible to send the html replace element through the function
   if ( xmlHttp.readyState == 4 ) {
//      if ( xmlHttp.status == 200 ) {
//      if ( !ajax_html_element ) {
//         ajax_responce_text = xmlHttp.responseText;
//      } else {
      if ( ajax_responce_alert ) {
         alert( xmlHttp.responseText );
      }

      ajax_responce_text = xmlHttp.responseText;
      if ( ajax_html_element ) {
      	var html_element = document.getElementById(ajax_html_element);
         if ( html_element.type == "text" || html_element.type == "textarea" || html_element.type == "hidden" ) {
            // most likely a form element
            html_element.value=xmlHttp.responseText;
         } else if ( html_element.type == "select-one" || html_element.type == "select-multiple" ) {
            // drop-down or list box
            html_element.innerHTML=xmlHttp.responseText;
         } else {
            // likely a span or div
            html_element.innerHTML=xmlHttp.responseText;
         }
      }
   }
}

// Great - http://www.codeproject.com/KB/scripting/jsactb.aspx
// http://www.brandspankingnew.net/specials/ajax_autosuggest/ajax_autosuggest_autocomplete.html
// http://gadgetopia.com/autosuggest/
// http://www.webreference.com/programming/javascript/ncz/
// http://res.nodstrum.com/autoComplete/index.htm
// http://www.progtalk.com/ViewArticle.aspx?ArticleID=40
// http://woork.blogspot.com/2008/03/php-components-autosuggest.html