/* From Crane, Pascarello and James, Ajax in Action (pub. Manning) 
 * section 3.1
 * With minor mods by Mark Brown, 2007
 */

var net = new Object();
net.READY_STATE_UNINITIALISED = 0;
net.READY_STATE_LOADING       = 1;
net.READY_STATE_LOADED        = 2;
net.READY_STATE_INTERACTIVE   = 3;
net.READY_STATE_COMPLETE      = 4;

net.ContentLoader = function(url, onload, onerror) { 
	this.url = url;
	this.req = null;
	this.onload = onload;
	this.onerror = (onerror) ? onerror : this.defaultError;
	this.loadXMLDoc(url);
}

net.ContentLoader.prototype = {
	loadXMLDoc : function(url) {
		if (window.XMLHttpRequest) {
			this.req = new XMLHttpRequest();
		}
		else if (window.ActiveXObject) {
			this.req = new ActiveXObject("Microsoft.XMLHTTP");
			if (!this.req) {
				this.req = new ActiveXObject("Msxml2.XMLHTTP");
			}
		}
		if (this.req) {
			try {
				var loader = this;
				this.req.onreadystatechange = function() {
					loader.onReadyState.call(loader);
				}
				this.req.open('GET', url, true);
				this.req.send(null);
			} catch (err) {
				this.onerror.call(this);
			}
		}
	},

	onReadyState : function() {
		var req = this.req;
		var ready = req.readyState;

		if (net.READY_STATE_COMPLETE == ready) {
			var httpStatus = req.status;
			if (200==httpStatus || 0==httpStatus)
				this.onload.call(this);
			else
				this.onerror.call(this);
		}
	},

	defaultError : function() {
		alert("Error fetching data!" +
		      "\n\nreadyState:" + this.req.readyState +
		      "\nstatus:  " + this.req.status + 
		      "\nheaders: " + this.req.getAllResponseHeaders());
	}
}

/* end */
