// ajax.js: Simple AJAX library
//
// Functions:
// Name              Method  Request-Format  Response-Format
// ----------------------------------------------------------
// sendRequest()     POST    URL-Encoded     Text
// sendRequestXml()  POST    URL-Encoded     XML
// sendXmlRequest()  POST    XML             XML
// download()        GET     URL-Encoded     Text
// downloadXml()     GET     URL-Encoded     XML

// Which function to use:
// Method:
//  - POST: If you primary send data to the server (requests can be large)
//  - GET:  If you primary download (mostly static) content from the server
//          (parameters are limited to 2KB; GET requests are often cached)
// Request-Format:
//  - URL-Encoded: For standard requests; does not need special
//                 server-side handling
//  - XML: For complex requests; needs special server-side handling
// Response-Format:
//  - Text: For simple responses (e.g. a HTML snippet)
//  - XML:  For complex responses

// Parameters:
//  - Functions with Request-Format "URL-Encoded":
//    (url, params, callbackFunc)
//  - Functions with Request-Format "XML":
//    (url, doc, callbackFunc)
//
//    - url: URL to which the request is sent (can be relative).
//    - params: Request parameters (Object-Array) that are sent
//      in the form "key=value&key2=value2".
//      You can define them either as:
//        var params = { key : 'value',  key2 : 'value2' };
//      or as:
//        var params = new Object();
//        params["key"]  = "value";
//        params["key2"] = "value2";
//    - doc: XML DOM tree to send.
//    - callbackFunc: User defined function that is called when the
//                    response is available (see next).

// Callback function:
//  - This is a user defined function with one parameter, e.g.:
//    function handleResponse(response)
//  - If the Response-Format is "Text", this is the text-data returned
//    by the server. If the Response-Format is "XML", this is the
//    parsed DOM tree.


function sendRequest(url, params, callbackFunc)
{
  var requestString = getRequestString(params);
  sendRequestRaw("POST", url, null, requestString, callbackFunc, false);
}

function sendRequestXml(url, params, callbackFunc)
{
  var requestString = getRequestString(params);
  sendRequestRaw("POST", url, null, requestString, callbackFunc, true);
}

function sendXmlRequest(url, doc, callbackFunc)
{
  var requestString = getXmlRequestString(doc);
  sendRequestRaw("POST", url, 'text/xml', requestString, callbackFunc, true);
}

function download(url, params, callbackFunc)
{
  var requestUrl = getRequestUrl(url, params);
  sendRequestRaw("GET", requestUrl, null, null, callbackFunc, false);
}

function downloadXml(url, params, callbackFunc)
{
  var requestUrl = getRequestUrl(url, params);
  sendRequestRaw("GET", requestUrl, null, null, callbackFunc, true);
}


function getRequestUrl(url, params)
{
  var requestUrl = getRequestString(params);

  if(requestUrl != "")
  {
    var delimiter = "?";

    if(url.indexOf("?") != -1)
      delimiter = "&";

    requestUrl = delimiter + requestUrl;
  }

  return url + requestUrl;
}

function getRequestString(params)
{
  var requestString = "";

  if(params != null)
  {
    for(var key in params)
    {
      if(requestString != "")
        requestString += "&";

      requestString += key + "=" + encodeURIComponent(params[key]);
    }
  }

  return requestString;
}

function getXmlRequestString(doc)
{
  var requestString = "";

  if(doc.xml)
    requestString = doc.xml;
  else
    requestString = (new XMLSerializer()).serializeToString(doc);

  return requestString;
}


function sendRequestRaw(method, url, mimeType, requestString, callbackFunc, responseIsXml)
{
  var request = getRequestInstance();

  if(request != null)
  {
    if(mimeType == null)
      mimeType = 'application/x-www-form-urlencoded';

    request.onreadystatechange = function() { requestEvent(request, callbackFunc, responseIsXml); };
    request.open(method, url);

    if(method == "POST")
      request.setRequestHeader('Content-Type', mimeType);

    request.send(requestString);
  }
}

function requestEvent(request, callbackFunc, responseIsXml)
{
  if(request.readyState == 4)
  {
    if(request.status != 200)
      requestError("HTTP " + request.status + " " + request.statusText);
    else
    {
      if(!responseIsXml)
      {
        callbackFunc(request.responseText);
      }
      else
      {
        if(request.responseXML == null || request.responseXML.documentElement == null)
          requestError("XML response not available (e.g. parse error)");
        else
        {
          if(request.responseXML.documentElement.nodeName == 'parsererror')
            requestError("Could not parse XML response");
          else
          {
            callbackFunc(request.responseXML);
          }
        }
      }
    }
  }
}

function getRequestInstance()
{
  var request = null;

  if(window.XMLHttpRequest)
    request = new XMLHttpRequest();
  else if(window.ActiveXObject)
  {
    request = new ActiveXObject("Msxml2.XMLHTTP");
  }

  if(request == null)
    requestError("No implementation of XMLHttpRequest found");

  return request;
}


function createDocument()
{
  var doc = null;

  if(document.implementation && document.implementation.createDocument)
    doc = document.implementation.createDocument("", "", null);
  else if(window.ActiveXObject)
    doc = new ActiveXObject("Microsoft.XMLDOM");

  if(doc == null)
    requestError("No implementation of DOM createDocument() found");

  return doc;
}

function requestError(message)
{
  alert("Request error: " + message + ".");
}

 function onSiteReceived(response) {
 	// alert(response);
    document.getElementById('firmenmenue').innerHTML = response;
}
