function ajax() {
	this.CXMLReq = CXMLReq;
	this.get = get;
	this.post = post;
	this.xmlhttpChange = xmlhttpChange;
	this.handleResponse = handleResponse;
	this.handleError = handleError;
	this.pos;
	this.finished = new Array();

	function CXMLReq(freed) {
		this.freed = freed;
		this.xmlhttp = false;
	
		if (window.XMLHttpRequest) {
			this.xmlhttp = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}

	function get(url,divID) {
		var pos = -1;

		for (var i=0; i<xmlreqs.length; i++) {
			if (xmlreqs[i].freed == 1) {
				pos = i;
				break;
			}
		}

		if (pos == -1) {
				pos = xmlreqs.length;
				xmlreqs[pos] = new CXMLReq(1);
		}

		this.pos = pos;
		this.finished[pos] = false;

		if (xmlreqs[pos].xmlhttp) {
			xmlreqs[pos].freed = 0;
			xmlreqs[pos].xmlhttp.open("GET",url,true);
			xmlreqs[pos].xmlhttp.onreadystatechange = function() {
				if (typeof(xmlhttpChange) != 'undefined') {
					xmlhttpChange(pos,divID);
				}
			}

			if (window.XMLHttpRequest) {
				xmlreqs[pos].xmlhttp.send(null);
			} else if (window.ActiveXObject) {
				xmlreqs[pos].xmlhttp.send();
			}
		}
	}

	function post(url,formID,divID) {
		var pos = -1;
		var fields = new Array();

		//loop through form elements and retrieve field NAMEs and Values
		for (var x = 0; x < eval("document.getElementById('"+formID+"').elements.length"); x++) {
			// join them into a string.
			eval("fields.push(document.getElementById('"+formID+"').elements[x].name+'='+document.getElementById('"+formID+"').elements[x].value)");
		}

		//data looks like "username=myusername&password=mypass"
		var data = fields.join('&');

		for (var i=0; i<xmlreqs.length; i++) {
			if (xmlreqs[i].freed == 1) {
				pos = i;
				break;
			}
		}

		if (pos == -1) {
			pos = xmlreqs.length;
			xmlreqs[pos] = new CXMLReq(1);
		}

		if (xmlreqs[pos].xmlhttp) {
			xmlreqs[pos].freed = 0;
			xmlreqs[pos].xmlhttp.open("POST",url,true);
			xmlreqs[pos].xmlhttp.onreadystatechange = function() {
				if (typeof(xmlhttpChange) != 'undefined') {
					xmlhttpChange(pos,divID);
				}
			}

			xmlreqs[pos].xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			xmlreqs[pos].xmlhttp.send(data);
		}
	}

	function xmlhttpChange(pos,divID) {
		if (typeof(xmlreqs[pos]) != 'undefined' && xmlreqs[pos].freed == 0 && xmlreqs[pos].xmlhttp.readyState == 4) {
			ajax.finished[pos] = true;
			if (xmlreqs[pos].xmlhttp.status == 200 || xmlreqs[pos].xmlhttp.status == 304) {
				ajax.handleResponse(xmlreqs[pos].xmlhttp.responseText,divID);
//				if (window.ajaxComplete) ajaxComplete();
			} else {
				handleError(xmlreqs[pos].xmlhttp.responseText,divID);
			}

			xmlreqs[pos].freed = 1;
		}
	}

	function handleResponse(response,divID) {
		document.getElementById(divID).innerHTML = response;
	}

	function handleError(response,divID) {
		document.getElementById(divID).innerHTML = response;
	}
}

// Required to bypass Firefox security
try {
	netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
} catch (e) {
	//alert("Permission UniversalBrowserRead denied.");
}

var xmlreqs = new Array();
var ajax = new ajax();
