﻿// just to make it faster for the next calls:
//getXMLRequester();


// constants

/**
 * sends a http request to server
 *
 * @param targetUrl, String, datasource on server, e.g. data.php
 *
 * @param requestData, String, data to send to server, optionally
 *
 * @param requestType, Integer,request type, possible values: REQUEST_GET, REQUEST_POST, REQUEST_XML, REQUEST_HEAD default REQUEST_GET
 *
 * @param intID, Integer, ID of this request, will be given to registered event handler onreadystatechange', optionally
 *
 * @return String, request data or data source
 */

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("MSXML2.XMLHTTP");	
		}
	},
	sendRequest : function (sourceControl, callbackFunction, targetUrl, requestData, requestType)
	{
		// check for previous request to abort
		if (sourceControl != null && sourceControl.currentXmlHttpRequest != null) sourceControl.currentXmlHttpRequest.abort();

		// check for request type
		if(isNaN(requestType)) requestType = this.requestTypes.GET; 

		// create a new instance of xmlhttprequest object
		// if it fails, return
		var currentRequest = this.getXMLHttpRequest();
		if (!currentRequest) return false;

		if (sourceControl != null) sourceControl["currentXmlHttpRequest"] = currentRequest;

		switch (requestType)
		{
			case this.requestTypes.GET:
				currentRequest.open("GET", targetUrl + (requestData ? '?' + requestData : ''), true);
				currentRequest.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT');
				requestData = null;
				break;
			case this.requestTypes.HEAD:
				currentRequest.open("HEAD", targetUrl + (requestData ? '?' + requestData : ''), true);
				currentRequest.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT');
				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.
			// 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 (sourceControl != null && sourceControl.currentXmlHttpRequest != null) sourceControl.currentXmlHttpRequest = null;
					if (callbackFunction != null) callbackFunction(currentRequest, sourceControl);
				}
			};

		// send request to server
		currentRequest.send(requestData);

		return currentRequest;
	}
}



