/* 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 */
// If you want to do something when the ajax is finished create a function called ajaxOnComplete(pos)
function ajax() {
	this.CXMLReq = CXMLReq;
	this.get = get;
	this.post = post;
	this.xmlhttpChange = xmlhttpChange;
	this.handleResponse = handleResponse;
	this.handleError = handleError;
	this.executeJS = executeJS;
	this.finished = new Array();
	this.ti = new Array();
	this.loadTime = 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");
		}
	}

	// Optional argument, onCompleteFunc executes some javascript code once the ajax is done loading
	function get(url,divID) {
		var pos = -1;
		// The follow random argument is added to the query string as a trick to prevent caching
		var randStr = new Date().getTime();
		if (url.search("\\?") != -1)
			url += '&';
		else
			url += '?';

		url += randStr;

		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);
				}
			}

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

		ajax.finished[pos] = false;
		return pos;
	}

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

		// The follow random argument is added to the query string as a trick to prevent caching
		var randStr = new Date().getTime();
		if (url.search("\\?") != -1)
			url += '&';
		else
			url += '?';

		url += randStr;

		//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) {
				if (document.getElementById(formID).elements[x].type == "select-multiple") {
					for (var i = 0; i < document.getElementById(formID).elements[x].length; i++) {
						if (document.getElementById(formID).elements[x].options[i].selected) {
							eval("fields.push(document.getElementById('"+formID+"').elements[x].name+'='+escape(document.getElementById('"+formID+"').elements[x].options["+i+"].value))");						
						}
					}
				} else
					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);
				}
			}

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

		ajax.finished[pos] = false;
		return pos;
	}

	function xmlhttpChange(pos,divID) {
		if (typeof(xmlreqs[pos]) != 'undefined' && xmlreqs[pos].freed == 0 && xmlreqs[pos].xmlhttp.readyState == 4) {
			if (xmlreqs[pos].xmlhttp.status == 200 || xmlreqs[pos].xmlhttp.status == 304) {
				ajax.handleResponse(xmlreqs[pos].xmlhttp.responseText,divID);
				if (typeof ajaxOnComplete == 'function') ajaxOnComplete(pos);
				//ajax.executeJS(divID);
			} else {
				handleError();
			}
			ajax.finished[pos] = true;
			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);
			}
		}
	}
}

// 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();