/* readyState values
0	The request is not initialized
1	The request has been set up
2	The request has been sent
3	The request is in process
4	The request is complete */
function ajax() {
	this.CXMLReq = CXMLReq;
	this.get = get;
	this.post = post;
	this.xmlhttpChange = xmlhttpChange;
	this.handleResponse = handleResponse;
	this.handleError = handleError;
	this.executeJS = executeJS;
	this.onComplete = onComplete;
	this.finished = false;

	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");
		}
	}

	// Optional argument, onCompleteFunc executes some javascript code once the ajax is done loading
	function get(url,divID,onCompleteFunc) {
		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);
		}

		if (xmlreqs[pos].xmlhttp) {
			xmlreqs[pos].freed = 0;
//			xmlreqs[pos].xmlhttp.overrideMimeType('text/xml; charset=iso-8859-1');
			xmlreqs[pos].xmlhttp.open("GET",url,true);
			xmlreqs[pos].xmlhttp.onreadystatechange = function() {
				if (typeof(xmlhttpChange) != 'undefined') {
					xmlhttpChange(pos,divID,onCompleteFunc);
				}
			}

			if (window.XMLHttpRequest) {
				xmlreqs[pos].xmlhttp.send(null);
			} else if (window.ActiveXObject) {
				xmlreqs[pos].xmlhttp.send();
			}
		}
	}

	function post(url,formID,divID,onCompleteFunc) {
		var pos = -1;
		var fields = new Array();
		var skip = false;

		//loop through form elements and retrieve field NAMEs and Values
		for (var x = 0; x < eval("document.getElementById('"+formID+"').elements.length"); x++) {
			// Skip radio buttons if they are not ckecked.
			if (document.getElementById(formID).elements[x].type == "radio") {
				if (!document.getElementById(formID).elements[x].checked)
					skip = true;
				else
					skip = false;
			} else
				skip = false;

			// join them into a string.
			if (!skip)
				eval("fields.push(document.getElementById('"+formID+"').elements[x].name+'='+escape(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,onCompleteFunc);
				}
			}

			xmlreqs[pos].xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			xmlreqs[pos].xmlhttp.send(data);
		}
	}

	function xmlhttpChange(pos,divID,onCompleteFunc) {
		if (typeof(xmlreqs[pos]) != 'undefined' && xmlreqs[pos].freed == 0 && xmlreqs[pos].xmlhttp.readyState == 4) {
			ajax.finished = true;
			if (xmlreqs[pos].xmlhttp.status == 200 || xmlreqs[pos].xmlhttp.status == 304) {
				ajax.handleResponse(xmlreqs[pos].xmlhttp.responseText,divID);
				//ajax.executeJS(divID);
				ajax.onComplete(onCompleteFunc);
			} else {
				handleError();
			}

			xmlreqs[pos].freed = 1;
		}
	}

	function handleResponse(response,divID) {
		document.getElementById(divID).innerHTML = response;
	}

	function handleError() {
	}

	function executeJS(divID) {
		var scriptObj = document.getElementById(divID).getElementsByTagName('script');
		for(var i=0; i<scriptObj.length; i++) {
			var scriptText = scriptObj[i].text;
			var scriptFile = scriptObj[i].src
			var scriptTag = document.createElement('script');
			if ((scriptFile != null) && (scriptFile != '')) {
				scriptTag.src = scriptFile;
			}

			scriptTag.text = scriptText;
			if (!document.getElementsByTagName('head')[0]) {
				document.createElement('head').appendChild(scriptTag)
			} else {
				document.getElementsByTagName('head')[0].appendChild(scriptTag);
			}
		}
	}

	function onComplete(func) {
		eval(func);
	}
}

// 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();