var swx_IframeRequest = function(method, script) {

	// Private methods ////////////////////////////////////////////////////////////

	function createRequestForm(data) {
		if ((typeof data == "object") && (data.nodeName == "FORM")) {
			requestForm = data.parentNode ? data.cloneNode(true) : data;
			requestForm.setAttribute("action", location.href.substring(0, location.href.lastIndexOf("/")+1)+requestScript);
			requestForm.setAttribute("method", requestMethod);
		}
		else if (typeof data == "string") {
			requestForm = document.createElement("FORM");
			requestForm.setAttribute("action", location.href.substring(0, location.href.lastIndexOf("/")+1)+requestScript);
			requestForm.setAttribute("method", requestMethod);
			var pairs = data.split("&");
			for (count in pairs) {
				var splitter = pairs[count].indexOf("=");
				if (splitter >= 0) {	
					var inputNode = document.createElement("INPUT");
					inputNode.setAttribute("name", pairs[count].substr(0, splitter));
					inputNode.setAttribute("type", "text");
					inputNode.setAttribute("value", pairs[count].substr(splitter+1));
					requestForm.appendChild(inputNode);
				}
			}
		}
		else {
			requestForm = null;
			throw "swx_IframeRequest: Illegal request data format ("+(typeof data)+", "+data.nodeName+")";
		}

		frames[iframeName].document.body.innerHTML = "";
		frames[iframeName].document.body.appendChild(requestForm);
	}

	function onloadHandler(name) {
		iframeNode.onload = null;
		if (this.handlerWait == true) {
			if (responseHandler[1] != null)
				responseHandler[1]({responseText: frames[iframeName].document.body.innerHTML});
			sendMutex--;
		}
		else {
			sendMutex--;
			if (responseHandler[1] != null)
				responseHandler[1]({responseText: frames[iframeName].document.body.innerHTML});
		}
		frames[iframeName].document.body.innerHTML = "";
	}

	// Public methods /////////////////////////////////////////////////////////////

	this.block = function() {
		sendBlock++;
	}

	this.clearResponseHandler = function() {
		responseHandler = new Array(null, null);
	}
	
	this.getResponseHandler = function(state) {
		if ((state < 0) || (state > 1))
			throw "Unknown readyState: " + state + ".";

		return responseHandler[state];
	}

	this.isBlocked = function() {
		if (sendMutex > 0)
			return true;

		return false;
	}

	this.processForm = function(form, moredata) {
			var data = form.cloneNode(true);
			var pairs = moredata.split("&");

			for (count in pairs) {
				var splitter = pairs[count].indexOf("=");
				if (splitter >= 0) {	
					var inputNode = document.createElement("INPUT");
					inputNode.setAttribute("name", pairs[count].substr(0, splitter));
					inputNode.setAttribute("type", "text");
					inputNode.setAttribute("value", pairs[count].substr(splitter+1));
					data.appendChild(inputNode);
				}
			}

			this.sendRequest(data);
	}

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

	this.sendRequest = function(data) {
		sendMutex++;
		if ((sendMutex == 1) && (sendBlock == 0)) {
			createRequestForm(data);
			if (responseHandler[0] != null)
				responseHandler[0]();
			iframeNode.onload = onloadHandler;
			requestForm.submit();
		}
		else {
			sendMutex--;
		}
	}

	this.setResponseHandler = function(state, func) {
		if ((state < 0) || (state > 1))
			alert("Unknown readyState: " + state + ".");
		else
			responseHandler[state] = func;
	}

	this.unblock = function() {
		sendBlock--;
	}

	// Private properties /////////////////////////////////////////////////////////

	var iframeName = "swx_IframeRequest";
	var iframeNode = document.createElement("IFRAME");
	var requestForm = null;
	var requestMethod = method;
	var requestScript = script;
	var responseHandler = new Array(null, null);
	var sendBlock = 0;
	var sendMutex = 0;

	// Public properties //////////////////////////////////////////////////////////
	
	this.handlerWait = true;

	// Constructor ////////////////////////////////////////////////////////////////

	var count = 0;
	while (document.getElementsByName(iframeName + count)[0] != null)
		count++;
	iframeName = iframeName+count;

	iframeNode.setAttribute("name", iframeName);
	iframeNode.style.display = "none";
	document.body.appendChild(iframeNode);
}
