// global xmlhttprequest object
var xmlHttp = false;

//var count = 0;
//var version = "leer";
//var req_active = false;
//var testTimeVal = 0;
/** AJAX functions **/
// constants
var REQUEST_GET        = 0;
var REQEST_POST        = 2;
var REQUEST_HEAD       = 1;
var REQUEST_XML        = 3;


/**
 * instantiates a new xmlhttprequest object
 *
 * @return xmlhttprequest object or false
 */
function getXMLRequester( )
{
    var xmlHttp = false;
            
    // try to create a new instance of the xmlhttprequest object        
    try
    {
        // Internet Explorer
        if( window.ActiveXObject )
        {
            for( var i = 5; i; i-- )
            {
		//version = "MS" + i + " ";
		//count++;
                try
                {
                    // loading of a newer version of msxml dll (msxml3 - msxml5) failed
                    // use fallback solution
                    // old style msxml version independent, deprecated
                    if( i == 2 )
                    {
                        xmlHttp = new ActiveXObject( "Microsoft.XMLHTTP" );    
                    }
                    // try to use the latest msxml dll
                    else
                    {
                        xmlHttp = new ActiveXObject( "Msxml2.XMLHTTP." + i + ".0" );
                    }
                    break;
                }
                catch( excNotLoadable )
                {                        
                    xmlHttp = false;
                }
            }
        }
        // Mozilla, Opera und Safari
        else if( window.XMLHttpRequest )
        {
            xmlHttp = new XMLHttpRequest();
            if (xmlHttp.overrideMimeType) {
              xmlHttp.overrideMimeType('text/xml');
            }
	    //version = "Mozilla...";
	    //count++;
	}
    }
    // loading of xmlhttp object failed
    catch( excNotLoadable )
    {
        xmlHttp = false;
    }
    return xmlHttp ;
}


/**
 * sends a http request to server
 *
 * @param strSource, String, datasource on server, e.g. data.php
 *
 * @param strData, String, data to send to server, optionally
 *
 * @param intType, Integer,request type, possible values: REQUEST_GET, REQUEST_POST, REQUEST_XML, REQUEST_HEAD default REQUEST_GET
 *
 * @param strData, Integer, ID of this request, will be given to registered event handler onreadystatechange", optionally
 *
 * @return String, request data or data source
 */
function sendRequest( strSource, strData, intType, intID )
{
  //req_active = true;
  //obj_busy = document.getElementById("busybild")
  //if(obj_busy){
  //  obj_busy.style.visibility="visible";	
  //}

    if( !strData )
        strData = "";

    // default type (0 = GET, 1 = xml, 2 = POST )
    if( isNaN( intType ) )
        intType = 0; // GET

    // previous request not finished yet, abort it before sending a new request
    if( xmlHttp && xmlHttp.readyState )
    {
        xmlHttp.abort( );
        xmlHttp = false;
    }
        
    // create a new instance of xmlhttprequest object
    // if it fails, return
    if( !xmlHttp )
    {
        xmlHttp = getXMLRequester( );
        if( !xmlHttp )
            return;
    }
    //set wait cursor
/*
    var obj = document.getElementById("maintable");
    if(obj){
      try{	//ie5 kennt pointer nicht
        obj.style.cursor = "wait";
      } catch(err){
        if(err) obj.style.cursor = "wait";
      }
    }
*/    
    // parse query string
    if( intType != 1 && ( strData && strData.substr( 0, 1 ) == "&" || strData.substr( 0, 1 ) == "?" ) )
        strData = strData.substring( 1, strData.length );

    // data to send using POST
    var dataReturn = strData ? strData : strSource;
    
    switch( intType )
    {
        case 1:    // xml
            strData = "xml=" + strData;
        case 2: // POST
            // open the connection 
            xmlHttp.open( "POST", strSource, true );
            xmlHttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
            xmlHttp.setRequestHeader( "Content-length", strData.length );
            break;
        case 3: // HEAD
            // open the connection 
            xmlHttp.open( "HEAD", strSource, true );
            strData = null;
            break;
        default: // GET
            // open the connection 
            var strDataFile = strSource + (strData ? "?" + strData : "" );
//alert(strDataFile);
            xmlHttp.open( "GET", strDataFile, true );
            strData = null;
    }
    
    // set onload data event-handler
    xmlHttp.onreadystatechange = new Function( "", "processResponse(" + intID + ")" ); ;

    // send request to server
    xmlHttp.send( strData );    // param = POST data
    
    return dataReturn;
}
    

/**
 * process the response data from server
 *
 * @param intID, Integer, ID of this response
 */
function processResponse( intID )
{
    // status 0 UNINITIALIZED open() has not been called yet.
    // status 1 LOADING send() has not been called yet.
    // status 2 LOADED send() has been called, headers and status are available.
    // status 3 INTERACTIVE Downloading, responseText holds the partial data.
    // status 4 COMPLETED Finished with all operations.
    //alert(xmlHttp.readyState);
    switch( xmlHttp.readyState )
    {
        // uninitialized
        case 0:
        // loading
        case 1:
        // loaded
        case 2:
        // interactive
        case 3:
            break;
        // complete
        case 4:    
            // check http status
    	    //reset wait cursor
/*
            var obj = document.getElementById("maintable");
            if(obj){
              try{	//ie5 kennt pointer nicht
                obj.style.cursor = "default";
              } catch(err){
                if(err) obj.style.cursor = "default";
              }
	    }
*/	    
            if( xmlHttp.status == 200 )    // success
            {
                processData( xmlHttp, intID );
            }
            // loading not successfull, e.g. page not available
            else
            {
                if( window.handleAJAXError )
                    handleAJAXError( xmlHttp, intID );
                //else
                    //alert( "ERROR\n HTTP status = " + xmlHttp.status + "\n" + xmlHttp.statusText ) ;
            }
    }
}

/** End AJAX functions **/



function processData( xmlHttp, intID )
{
  // process text data
  //alert("processData(" + intID + ")\n" + xmlHttp.responseText);
  var xmldoc = xmlHttp.responseXML;
  if(!xmldoc){ 
    alert("xmldoc is null");
    return;
  }    
  switch(intID){
  case 1:
      var my_node = xmldoc.getElementsByTagName("result");
      //im IE:
      //wenn im sendenden php-script die Zeile: header('Content-type: text/xml; charset=iso-8859-1');
      //fehlt gibt der Ie hier "false 0" beim alert aus und xmldoc.getElementsByTagName() ergibt NULL.
      //okay im Firefox
      //alert(xmldoc.hasChildNodes() + ' ' + xmldoc.childNodes.length)
      
      if(my_node.item(0)){
        //alert(my_node.item(0).firstChild.data);
      }
      bu_update(xmldoc);
    break;
  case 2:
    //alert("processData(" + intID + ")\n" + xmlHttp.responseText);
    bu_confirm(xmldoc);
    break;
  default:
    alert("processData(" + intID + ")\n" + xmlHttp.responseText);
  }
}


