
function loadXMLDoc(url,cb) {
	var 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) {
		var stat = new Object;
		
		stat.req = req;
		stat.callback = cb;
		
		req.onreadystatechange = function() {
				processReqChange(stat);
			}
		req.open("GET", url, true);
		req.send("");
	}
}

function processReqChange(stat) {
	var req = stat.req;
	
	// only if req shows "loaded"
	if (req.readyState != 4) {
		return;
	}
	
	// only if "OK"
	if (req.status != 200) {
//		alert("There was a problem retrieving the XML data:\n" + + req.status + " " + req.statusText);
		return;
	}
	
	stat.callback(req.responseText);
}

var xmlreqs = new Array();
var xmlreqs_max = 3;

function CXMLReq(freed) {
	this.freed = freed;
	this.xmlhttp = false;
	if (window.XMLHttpRequest) {
		this.xmlhttp = new XMLHttpRequest();
	}
	else if (window.ActiveXObject) {
		try {
			this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");	
		} catch(e) {
			this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");			
		}		
	}
}

function ajax_get(uri, cb) {
 	var pos = -1;
	for (var i=0; i< xmlreqs.length; i++) {
		if (xmlreqs[i].freed == 1) {
			pos = i;
			break;
		}
	}
	if(pos == -1 && xmlreqs.length == xmlreqs_max) {	
		// Deny request, maximum requests reached.
		return;
	}
	if(pos == -1) {
		pos = xmlreqs.length;
		xmlreqs[pos] = new CXMLReq(1);
	}
	if (xmlreqs[pos].xmlhttp) {
		xmlreqs[pos].freed = 0;
		xmlreqs[pos].callback = cb;
		xmlreqs[pos].xmlhttp.open("GET",uri,true);
		xmlreqs[pos].xmlhttp.onreadystatechange = function() { if (typeof(xmlhttpChange) != 'undefined') { xmlhttpChange(pos); } }
		if (window.XMLHttpRequest) {
			xmlreqs[pos].xmlhttp.send(null);
		}
		else if (window.ActiveXObject) {
			xmlreqs[pos].xmlhttp.send();
		}
	}
}

	
function xmlhttpChange(pos) {
	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) {
			xmlreqs[pos].callback(xmlreqs[pos].xmlhttp.responseText);
		}
		else {
			//handle_error();
		}
		xmlreqs[pos].freed = 1;
	}
}


