function AjaxRequest(returnFunction, returnArgs, ajaxId) {
	
	var xmlHttpReq;
	
	if (returnFunction == null) {
		returnFunction = function () {};
	}

	if (window.XMLHttpRequest) {
		xmlHttpReq = new XMLHttpRequest();

		if (xmlHttpReq.overrideMimeType) {
			xmlHttpReq.overrideMimeType("text/html");
		}
	}
	else if (window.ActiveXObject) {
		try {
			xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e) {
			try {
				xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e) {
				try {
					xmlHttpReq = new XMLHttpRequest();
				}
				catch (e) {
				}
			}
		}
	}
	
	xmlHttpReq.onreadystatechange = function() {
		if (xmlHttpReq.readyState == 4) {
			if (xmlHttpReq.status == 200) {
				returnFunction(xmlHttpReq, returnArgs);
				
				var ajaxId = xmlHttpReq.getResponseHeader("Ajax-ID");
				AjaxTracker.remove(ajaxId);
			}
		}
	};
	
	this.getRequest = function() {
		return xmlHttpReq;
	};
	
	this.cleanUp = function() {
		xmlHttpReq.onreadystatechange = function() {};
		returnFunction = null;
		returnArgs = null;
		xmlHttpReq = null;
	};
}

var AjaxTracker = {
	add : function(path, queryString, returnFunction, returnArgs) {
		var ajaxId = (new Date()).getTime();
		var noReturn = (returnFunction == null);
		
		AjaxTracker["" + ajaxId] = new AjaxRequest(returnFunction, returnArgs, ajaxId);
		
		var xmlHttpReq = AjaxTracker["" + ajaxId].getRequest();
		
		if (queryString == null) {
			queryString = "";
		}
	
		if (!endsWith(queryString, "&")) {
			queryString += "&";
		}
	
		queryString += "no_cache=" + random() + "&ajax_id=" + ajaxId;

		try {
			if (false) {
				xmlHttpReq.open("GET", path + "?" + queryString, true);
			}
			else {
				xmlHttpReq.open("POST", path, true);
				xmlHttpReq.setRequestHeader("Method", "POST " + path + " HTTP/1.1");
				xmlHttpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				xmlHttpReq.send(queryString);
			}
		}
		catch (e) {
		}
		
		if (noReturn) {
			this.remove(ajaxId);
		}
	},
	
	remove : function(id) {
		if (id && AjaxTracker["" + id]) {
			AjaxTracker["" + id].cleanUp();
			AjaxTracker["" + id] = null;
		}
	}
}

function createJSONObject(JSONText) {
	return eval("(" + JSONText + ")");
}

function loadForm(form, action, elId, returnFunction) {
	var pos = action.indexOf("?");

	var path = action;
	var queryString = "";

	if (pos != -1) {
		path = action.substring(0, pos);
		queryString = action.substring(pos + 1, action.length);
	}

	if (!endsWith(queryString, "&")) {
		queryString += "&";
	}

	for (var i = 0; i < form.elements.length; i++) {
		var e = form.elements[i];

		if ((e.name != null) && (e.value != null)) {
			queryString += e.name + "=" + encodeURIComponent(e.value) + "&";
		}
	}

	if (elId != null) {
		document.body.style.cursor = "wait";

		pos = path.indexOf("/portal/layout");
	
		path = path.substring(0, pos) + "/portal/render_portlet";

		returnFunction =
			function (xmlHttpReq) {
				document.getElementById(elId).innerHTML = xmlHttpReq.responseText;

				document.body.style.cursor = "default";
			};
	}

	loadPage(path, queryString, returnFunction);
}

function loadPage(path, queryString, returnFunction, returnArgs) {
	AjaxTracker.add(path, queryString, returnFunction, returnArgs);
}

function printJSON(data) {
	if (data && data.id) {
		var target = document.getElementById(data.id);

		if (target) {
			target.innerHTML = data.toString();
		}
	}
}