// global xmlhttprequest object
var xmlHttp = false;

/** AJAX functions **/

// constants
var REQUEST_GET        = 0;
var REQUEST_XML        = 1;
var REQEST_POST        = 2;
var REQUEST_HEAD       = 3;

function getXMLRequester() {
    var xmlHttp = false;

    // try to create a new instance of the xmlhttprequest object        
    try {
        // Internet Explorer version < 7
	if (window.ActiveXObject && !window.XMLHttpRequest) {
            for( var i = 4; 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 ) {
                        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();
        }
    }
    // 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 ajax(strSource,strData,intType,returnfunction) {
    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;
    }

    // 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 : '' );
            xmlHttp.open("GET",strDataFile, true );
            strData = null;
    }

    // set onload data event-handler
    xmlHttp.onreadystatechange = new Function( "", "processResponse(" + returnfunction + ",'"+strSource+"')" ); ;

    // 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( returnfunction,strSource) {
    // 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.readyState) {
        // uninitialized
        case 0:
        // loading
        case 1:
        // loaded
        case 2:
        // interactive
        case 3:
            break;
        // complete
        case 4:
            // check http status
            if( xmlHttp.status == 200 )    // success
            {
		    debugcontent = xmlHttp.responseText;
                if (returnfunction == -1) {
                }
                else if (returnfunction) {
                	returnfunction(xmlHttp);
                }
                else {
                	processData( xmlHttp );
                }
            }
            // loading not successfull, e.g. page not available
            else {
//			if( window.handleAJAXError ) {
//				handleAJAXError( xmlHttp, intID );
//			}
//			else {
//				if (accountid == 1) {
//					alert("ERROR\n HTTP status = " + xmlHttp.status + "\n"+strSource) ;
//				}
//			}
		}
	}
}

/** End AJAX functions **/



/** real application functions **/





function urlencode(plaintext) {
	var SAFECHARS = "0123456789" +					// Numeric
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*()";					// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";

	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
	    if (ch == " ") {
		    encoded += "+";				// x-www-urlencoded, rather than %20
		}
		else if (SAFECHARS.indexOf(ch) != -1) {
		    encoded += ch;
		}
		else {
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
//			    alert( "Unicode Character '" 
//                        + ch 
//                        + "' cannot be encoded using standard URL encoding.\n" +
//				          "(URL encoding only supports 8-bit characters.)\n" +
//						  "A space (+) will be substituted." );
				encoded += "?";
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for

	return encoded;
}

var HEXCHARS = "0123456789ABCDEFabcdef"; 

function urldecode(encoded) {
   var plaintext = "";
   var i = 0;
   while (i < encoded.length) {
       var ch = encoded.charAt(i);
	   if (ch == "+") {
	       plaintext += " ";
		   i++;
	   }
	   else if (ch == "%") {
			if (i < (encoded.length-2) 
					&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1 
					&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
				plaintext += unescape( encoded.substr(i,3) );
				i += 3;
			} else {
				alert('Bad escape combination near ...' + encoded.substr(i) );
				plaintext += "%[ERROR]";
				i++;
			}
		}
		else {
		   plaintext += ch;
		   i++;
		}
	}
   return plaintext;
}

