var swx_AjaxRequest = function(method, script, mode) {
			
	// Private methods ////////////////////////////////////////////////////////////

	var createRequestObject = function() {
		try {
			requestObject = new XMLHttpRequest();
		}
		catch (e) {
			try {
				requestObject = new ActiveXObject("MSXML2.XMLHTTP");
			}
			catch (e) {
				try {
					requestObject = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (e) {
					throw "Unable to create requestObject.";
				}
			}
		}
		
		requestObject.open(requestMethod, requestScript, requestMode);
		if (requestMethod == "POST")
			requestObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		requestObject.onreadystatechange = onReadyStateChange;
	}

	var onReadyStateChange = function() {
			// INFO: For some reason requestObject.status is not
			//       avaiable here if you put this code in a separate
			//       file (.js). However, it seems to be available for
			//       the ResponseHandlers.
	
			if (this.handlerWait == true) {
				if (responseHandler[requestObject.readyState] != null)
					responseHandler[requestObject.readyState](requestObject);
				if (requestObject.readyState == 4)
					sendMutex--;
			}
			else {
				var requestCopy = requestObject;
				if (requestObject.readyState == 4)
					sendMutex--;
				if (responseHandler[requestCopy.readyState] != null)
					responseHandler[requestCopy.readyState](requestCopy);
			}
	}
	
	// Public methods /////////////////////////////////////////////////////////////
	
	this.block = function() {
		sendBlock++;
	}
	
	this.clearResponseHandler = function() {
		responseHandler = new Array(null, null, null, null, null);
	}
	
	this.getResponseHandler = function(state) {
		if ((state < 0) || (state > 4))
			throw "Unknown readyState: " + state + ".";

		return responseHandler[state];
	}
	
	this.isBlocked = function() {
		if (sendMutex > 0)
			return true;

		return false;
	}

	this.processForm = function(form, moredata) {
			var data = "";
	
			for (var idx = 0; idx < form.elements.length; idx++) {
				//window.alert(form.elements[idx].name + "("+form.elements[idx].type+"): " + form.elements[idx].checked); // DEBUG
				if ((form.elements[idx].name != "") && (form.elements[idx].disabled == false) && 
				   ((form.elements[idx].type == "text") || (form.elements[idx].type == "hidden") || !(form.elements[idx].checked == false))) {
					var field = encodeURIComponent(form.elements[idx].name);
					var value = encodeURIComponent(form.elements[idx].value);
					data += field + "=" + value + "&";
				}
			}
			//alert(data + moredata); // DEBUG

			this.sendRequest(data + moredata);
	}

	this.removeResponseHandler = function(state) {
		if ((state < 0) || (state > 4))
			alert("Unknown readyState: " + state + ".");
		else
			responseHandler(state, null);
	}

	this.sendRequest = function(data) {
		sendMutex++;
		if ((sendMutex == 1) && (sendBlock == 0)) {
			createRequestObject();
			if (responseHandler[0] != null)
				responseHandler[0]();
			requestObject.send(data);
		}
		else {
			sendMutex--;
		}
	}
	
	this.setResponseHandler = function(state, func) {
		if ((state < 0) || (state > 4))
			alert("Unknown readyState: " + state + ".");
		else
			responseHandler[state] = func;
	}
	
	this.unblock = function unblock() {
		sendBlock--;
	}

	// Private properties /////////////////////////////////////////////////////////
	
	var formProcessed = false;
	var requestMethod = method;
	var requestMode = mode;
	var requestObject = null;
	var requestScript = script;
	var responseHandler = new Array(null, null, null, null, null);
	var sendBlock = 0;
	var sendMutex = 0;
	
	// Public properties //////////////////////////////////////////////////////////
	
	this.onAjaxReturn = null;
	this.handlerWait = true;
}
