
// global xmlhttprequest object
var xmlHttp =  new Array();

/** 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 xmlHttpObj = false;
           
    // try to create a new instance of the xmlhttprequest object       
    try
    {
        // Internet Explorer
        if( window.ActiveXObject )
        {
            for( var i = 5; i; i-- )
            {
                try
                {
                    // loading of a newer version of msxml dll (msxml3 -msxml5) failed
                    // use fallback solution
                    // old style msxml version independent, deprecated
                    if( i == 2 )
                    {
                        xmlHttpObj = new ActiveXObject("Microsoft.XMLHTTP" );
                    }
                    // try to use the latest msxml dll
                    else
                    {

                        xmlHttpObj = new ActiveXObject("Msxml2.XMLHTTP." + i + ".0" );
                    }
                    break;
                }
                catch( excNotLoadable )
                {                       
                    xmlHttpObj = false;
                }
            }
        }
        // Mozilla, Opera und Safari
        else if( window.XMLHttpRequest )
        {
            xmlHttpObj = new XMLHttpRequest();
        }
    }
    // loading of xmlhttp object failed
    catch( excNotLoadable )
    {
        xmlHttpObj = false;
    }
    return xmlHttpObj;
}


/**
 * 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, returnToofunction,clipboard)
{
    if( !strData )
        strData = '';

    // default type (0 = GET, 1 = xml, 2 = POST )
    if( isNaN( intType ) )
        intType = 0; // GET
       
    var requestId = xmlHttp.length;

    // previous request not finished yet, abort it before sending a new request
    if( xmlHttp[requestId] && xmlHttp[requestId].readyState )
    {
        xmlHttp[requestId].abort( );
        xmlHttp[requestId] = false;
    }
       
    // create a new instance of xmlhttprequest object
    // if it fails, return
    if( !xmlHttp[requestId] )
    {
        xmlHttp[requestId] = getXMLRequester( );
        if( !xmlHttp[requestId] )
            return false;
    }
   
    // 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;
   
    xmlHttp[requestId].returnToofunction = returnToofunction;
    xmlHttp[requestId].clipboard = clipboard;
   
    switch( intType )
    {
        case 1:    // xml
            strData = "xml=" + strData;
        case 2: // POST
            // open the connection
            xmlHttp[requestId].open( "POST", strSource, true );
            xmlHttp[requestId].setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
            xmlHttp[requestId].setRequestHeader( 'Content-length', strData.length );
            break;
        case 3: // HEAD
            // open the connection
            xmlHttp[requestId].open( "HEAD", strSource, true );
            strData[requestId] = null;
            break;
        default: // GET
            // open the connection
            var strDataFile = strSource + (strData ? '?' + strData : '' );
            xmlHttp[requestId].open( "GET", strDataFile, true );
            strData = null;
    }
   
    // set onload data event-handler
    xmlHttp[requestId].onreadystatechange = new Function( "", "processResponse(" + requestId + ")" ); ;

    // send request to server
    xmlHttp[requestId].send( strData );    // param = POST data
   
    return dataReturn;
}

function call_user_func(cb, parameters) {
    // http://kevin.vanzonneveld.net
    // +   original by: Brett Zamir (http://brettz9.blogspot.com)
    // *     example 1: call_user_func('isNaN', 'a');
    // *     returns 1: true
 
    var func;
 
    if (typeof cb == 'string') {
        if (typeof this[cb] == 'function') {
            func = this[cb];
        } else {
            func = (new Function(null, 'return ' + cb))();
        }
    } else if (cb instanceof Array) {
        func = eval(cb[0]+"['"+cb[1]+"']");
    }
   
    if (typeof func != 'function') {
        throw new Error(func + ' is not a valid function');
    }

  //  return func.apply(null, Array.prototype.slice.call(parameters, 1));
 
    return func.apply(null, new Array(parameters) );
}
   

function processResponse( requestId )
{
    // 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.
    switch( xmlHttp[requestId].readyState )
    {
        // uninitialized
        case 0:
        // loading
        case 1:
        // loaded
        case 2:
        // interactive
        case 3:
            break;
        // complete
        case 4:   
            // check http status
            if( xmlHttp[requestId].status == 200 )    // success
            {
                //eval(xmlHttp[requestId].returnToofunction+'("'+xmlHttp[requestId].responseText+'");');

                call_user_func(xmlHttp[requestId].returnToofunction,xmlHttp[requestId] );
            }
            // loading not successfull, e.g. page not available
            else
            {
                if( window.handleAJAXError )
                    handleAJAXError( xmlHttp[requestId], intID );
                else
                    alert( "ERROR\n HTTP status = " + xmlHttp[requestId].status + "\n" + xmlHttp[requestId].statusText ) ;
            }
    }
}