/**
* Apex Ajax
* Author: David Schreck
* 
**/

var buffer = new Array();             /* not used yet, one day, maybe one day... . */
var arAjx  = new Array();


/* ajFetch - used to do GET data */
function ajFetch( uri, dest ) {
	var curInstance;

	if(arAjx.length == 1) {
		curInstance = 1;
		arAjx[1] = new apexAjax;
	} else {
		var found = false;
		var arAjxLength = arAjx.length;
		for(i = 1; i < arAjxLength; i++) {
			if(arAjx[i].Status()) {
				curInstance = i;
				found = true;
			}
		}
		if( !found ) {
			arAjx.push(new apexAjax);
			curInstance = arAjx.length;
			arAjx[curInstance] = new apexAjax;
		}
	}
	arAjx[curInstance].GET(uri, dest);

}
/* ajPost - used to do POST data */
function ajPost(uri, dest, postdata) {
	var curInstance;

	if(arAjx.length == 1) {
		curInstance = 1;
		arAjx[1] = new apexAjax;
	} else {
		var found = false;
		var arAjxLength = arAjx.length;
		for(i = 1; i < arAjxLength; i++) {
			if(arAjx[i].Status()) {
				curInstance = i;
				found = true;
			}
		}
		if( !found ) {
			arAjx.push(new apexAjax);
			curInstance = arAjx.length;
			arAjx[curInstance] = new apexAjax;
		}
	}
	arAjx[curInstance].POST(uri, dest, postdata);
}

function apexAjax() {
	this.GET = ax_reqItem;
	this.POST = ax_postItem;
	this.Status = ax_status;

	var ajaxobj = ax_createRequest();
	var free = true;
	var dest_output = null;
	var init = false;

	function ax_status() {
		return free;
	}
	function ax_createRequest() {
		if(window.XMLHttpRequest) {
			return new XMLHttpRequest();
		} else if(window.ActiveXObject) {
			var msxmls = new Array (
				'Microsoft.XMLHTTP',
				'Msxml2.XMLHTTP.5.0',
				'Msxml2.XMLHTTP.4.0',
				'Msxml2.XMLHTTP.3.0',
				'Msxml2.XMLHTTP'
			);
			
			for(var i = 0; i < msxmls.length; i++) {
				try {
					return new ActiveXObject(msxmls[i]);
				} catch(e) {
					// do nada.
				}
			}
		}
		throw new Error("Could not intantiate XMLHttpRequest");
	}

	function ax_reqItem(uri, dest) {
		if(free && (uri != null) && (dest != null) && ((ajaxobj.readyState == 0) || (ajaxobj.readyState == 4))) {
			dest_output = dest;

			ajaxobj.open("GET", uri, true);
			ajaxobj.onreadystatechange = ax_reqCallback;
			//ajaxobj.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
			ajaxobj.send(null);
			free = false;
		} else {
			return false;
		}
	}
	function ax_postItem(uri, dest, postdata) {
		if( free && (uri != null) && (dest != null) && ((ajaxobj.readyState == 0) || (ajaxobj.readyState == 4)) ) {
			dest_output = dest;

			ajaxobj.open("POST", uri, true);
			ajaxobj.onreadystatechange = ax_reqCallback;
			//ajaxobj.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
			ajaxobj.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
			ajaxobj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			ajaxobj.send(postdata);
			free = false;
		} else {
			return false;
		}

	}

	function ax_reqCallback() {
		if(ajaxobj.readyState == 4) {
			//
			var results = ajaxobj.responseText;

			/* First answer received?, set initComplete to true */
			if(!init) {
				init = true;
			}

			if(typeof(results)=='string' && results != null && results != '') {
				/* Function callback evaluator */
				if(typeof(dest_output) == 'function') {
					/* Function detected, pass data to function */
					//eval(dest_output + "(results);");
					dest_output(results);
				} else {
					/* Not a function, pass data to the html object */
					if( typeof document.getElementById(dest_output).innerHTML != "undefined" ) {
						document.getElementById(dest_output).innerHTML = results;
					} else {
						// should throw an error here or something.
					}
				}
			}
			free = true;
		}
	}
}