var req;
var reqInProgress = false;
var pendingReqs = new Array();
var timerResetReq;
var cancelAllRequests = false;
var cancelNextRequest = false;

function fetchURL(URL,method,postVars) {
	// if req is underway, queues next request in array pendingReqs
	// alert(URL);

	if (!reqInProgress) {
		reqInProgress = true;
		// this ensures that further requests are enabled after 60 seconds
		timerResetReq = setTimeout("enableReq()", 60000);
		loadXMLdoc(URL,method,postVars);
	} else {
		pendingReqs[pendingReqs.length] = URL;
		window.status = "Still waiting for data from server...";
	}
	return false;
}

function enableReq() {
	// submits next queued req or enables timer
	clearTimeout(timerResetReq);
	reqInProgress = false;
	var URL = getNextReq();
	if (URL != "") {
		fetchURL(URL);
	}
}

function getNextReq() {
	var nextReq = "";
	if (cancelAllRequests) {
		cancelAllRequests = false;
	} else {
		for (i = 0; i < pendingReqs.length; i++) {
			if (pendingReqs[i] != "") {
				nextReq = pendingReqs[i];
				pendingReqs[i] = "";
				return nextReq;
			}
		}
	}
	// if we get here, reset the empty array
	pendingReqs = new Array();
	return "";
}

function loadXMLdoc(url,method,postVars) {
	req = false;
	// branch for native XMLHttpRequest object
	if(window.XMLHttpRequest) {
		try {
			req = new XMLHttpRequest();
		} catch(e) {
			req = false;
		}
	// branch for IE/Windows ActiveX version
	} else if(window.ActiveXObject) {
		try {
			req = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				req = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				req = false;
			}
		}
	}
	if(req) {
		req.onreadystatechange = processReqChange;
		if (method == 'post') {
			req.open("POST", url, true);
			req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			req.send(''+postVars);
		} else {
			req.open("GET", url, true);
			req.send("");
		}
		//window.status = "Requesting data from server...("+url+")";
		window.status = "Requesting data from server...";
	}
}

function processReqChange() {
	if (req) {
		// only if req shows "loaded":
		if (req.readyState == 4) {
			if (cancelNextRequest) {
				cancelNextRequest = false;
			} else {
				// only if "OK":

				// try to get req.status but catch error to avoid getting
				// tripped up by a Firefox XMLHttpRequest bug
				var status = 0;
				try {
					status = req.status;
				} catch(e) {
					status = -1;
					window.status = "Data retrieval aborted; will retry.";
				}

				if (status == 200) {
					window.status = "Processing data from server...";
					var responseText = req.responseText;
					// alert(responseText);
					processReq(req.responseXML);
				} else if (status > 0) {
					processReqFailure(req.statusText, status);
				}
			}
			enableReq();
			window.status = "";
		}
	}
}

function getElementTextNS(prefix, local, parentElem, index) {
	var result = "";
	if (prefix && isIE) {
		result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
	} else {
		result = parentElem.getElementsByTagName(local)[index];
	}
	if (result) {
		if (result.childNodes.length > 1) {
			return result.childNodes[1].nodeValue;
		} else {
			return result.firstChild.nodeValue;
		}
	} else {
		return "n/a";
	}
}