var net = new Object();

net.READY_STATE_UNINITIALIZED = 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, params, onload, encoding, onerror ) {
	this.url = url;
	this.encoding = encoding;
	this.req = null;
	this.params = params;
	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 ) {
			try {
				var loader = this;
				this.req.onreadystatechange = function () {
					loader.onReadyState.call ( loader );
				}
				this.req.open ( 'POST', url, true );
				var contentType = "application/x-www-form-urlencoded; charset=utf-8";
				if ( ! this.encoding ) {
					contentType = "application/x-www-form-urlencoded";
				}
				this.req.setRequestHeader (
					"Content-Type",
					contentType
				);
				this.req.send ( this.params );
			}
			catch ( err ) {
				this.onerror.call ( this );
			}
		}
	},
	onReadyState:function () {
		var req = this.req;
		var ready = req.readyState;
		if ( ready == net.READY_STATE_COMPLETE ) {
			var httpStatus = req.status;
			if ( httpStatus == 200 || httpStatus == 0 ) {
				this.onload.call ( this );
			}
			else {
				this.onerror.call ( this );
			}
		}
	},
	defaultError:function () {
		alert(
			"Error: " 
			+ "\n\nreadyState: " + this.req.readyState 
 			+ "\n\nstatus: " + this.req.status
			+ "\n\nheaders: " + this.req.getAllResponseHeaders () 
		);
	}

}