/*
use with xhr.sendRequest(sourceControl, callbackFunction, targetUrl, requestData, requestType);

sourceControl can be null (but if it is not null, xhr object is be reused for faster response)
callbackFunction can be null
targetUrl MUST NOT be null
requestData can be null
requestType can be null, requestTypes.GET ist default
*/ 

var xhr =
{
	requestTypes : { GET : 0, HEAD : 1, POST : 2 },
	getXMLHttpRequest : function ()
	{
	  // standard (Mozilla, Opera, Safari, IE7)
	   if (window.XMLHttpRequest)
		{
			return new window.XMLHttpRequest();
		}
		// non-standard (IE6)
		else if (window.ActiveXObject)
		{
			return new window.ActiveXObject("Microsoft.XMLHTTP");	
		}
	},
	sendRequest : function (sourceControl, callbackFunction, targetUrl, requestData, requestType)
	{
		var currentRequest;
	
		if (sourceControl != null)
		{
			if (sourceControl.currentXmlHttpRequest == null) // create new reusable request
			{
				sourceControl["currentXmlHttpRequest"] = currentRequest = this.getXMLHttpRequest();
			}
			else // reuse (and abort potentially running) request
			{
				currentRequest = sourceControl.currentXmlHttpRequest;
				if (currentRequest.readyState < 4)
				{
					currentRequest.onreadystatechange = function() {}; // ignore state change on abort (following)
					currentRequest.abort();
				}
			}

			currentRequest.sourceControl = sourceControl;
		}
		else // create new non-reuseable request
			currentRequest = this.getXMLHttpRequest();
		
		// start delayed, because xhr object has to be released first
		window.setTimeout(function() { xhr.sendRequestDelayed(currentRequest, sourceControl, callbackFunction, targetUrl, requestData, requestType); }, 1);
		
		return currentRequest;
	},
	sendRequestDelayed : function (currentRequest, sourceControl, callbackFunction, targetUrl, requestData, requestType) // should not be called directly
	{
		// check for request type
		if (isNaN(requestType)) requestType = this.requestTypes.GET; 

		switch (requestType)
		{
			case this.requestTypes.GET:
				currentRequest.open("GET", targetUrl + (requestData ? '?' + requestData : ''), true);
				requestData = null;
				break;
			case this.requestTypes.HEAD:
				currentRequest.open("HEAD", targetUrl + (requestData ? '?' + requestData : ''), true);
				requestData = null;
				break;
			case this.requestTypes.POST:
				currentRequest.open("POST", targetUrl, true);
				currentRequest.setRequestHeader( 'content-type', 'application/x-www-form-urlencoded' );
				currentRequest.setRequestHeader( 'content-length', requestData.length );
				break;
		}
	
		// set event-handler
		currentRequest.onreadystatechange = function ()
		{
			// 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, does not work in IE6/7
			// status 4 COMPLETED finished with all operations

			switch (currentRequest.readyState)
			{
				case 0: // uninitialized
				case 1: // loading
				case 2: // loaded
				case 3: // interactive
					break;
				case 4: // complete
					if (callbackFunction && currentRequest.status) callbackFunction(currentRequest, sourceControl);
				}
			};

		// send request to server
		currentRequest.send(requestData);
		
		return currentRequest;
	}
}
