// A call to the object might look like this:
//    var str = "Easter";
//    var aComp = new SomeCoolComponent(...);
//    var ajaxHelper = new net.ContenLoader( aComp, "getData.cgi", "POST", ['query='+str, 'ignore_case=true'] );
// aComp must have a method named ajaxUpdate, and another method named handleError.

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 (component, url, method, requestParams) {
	this.component = component;
	this.url = url;
	this.requestParams = requestParams;
	this.method = method;
}

net.ContentLoader.prototype = {
    getTransport: function () {
				var transport;
				if (window.XMLHttpRequest) {
				    transport = new XMLHttpRequest();
				} else if (window.ActiveXObject) {
				    try {
					transport = new ActiveXObject('Msxml2.XMLHTTP');
				    }
				    catch(err) {
					transport = new ActiveXObject('Microsoft.XMLHTTP');
				    }
				}
				return transport;
    },
    sendRequest: function () {
				var requestParams = [];
				for (var i=0; i<arguments.length; i++) {
				    requestParams.push(arguments[i]);
				}
				
				var request = this.getTransport();
				if(this.method == 'GET' && requestParams && requestParams.length > 0) {
					var q = (this.url.indexOf('?') != -1) ? '&' : '?';				
					request.open( this.method, this.url + q + this.queryString(requestParams), true );
				} else {
					request.open( this.method, this.url, true );
				}			
				request.setRequestHeader( 'Content-Type',
							  'application/x-www-form-urlencoded');
				var oThis = this;
				request.onreadystatechange = function() { oThis.handleAjaxResponse(request) };
				request.send(this.queryString(requestParams) );
    },
    queryString: function (args) {
				var requestParams = [];
				for (var i=0; i<this.requestParams.length; i++) {
				    requestParams.push(this.requestParams[i]);
				}
				for (var j=0; j<args.length; j++) {
				    requestParams.push(args[j]);
				}
				var queryString = "";
				if (requestParams && requestParams.length > 0) {
				    for (var i=0; i<requestParams.length; i++) {
					queryString += requestParams[i] + '&';
				    }
				    queryString = queryString.substring(0, queryString.length-1);
				}
				return queryString;
    },
    handleAjaxResponse: function (request) {
					    if (request.readyState == net.READY_STATE_COMPLETE) {
						if (this.isSuccess(request)) {
						    this.component.ajaxUpdate(request);
						}
						else {
						    this.component.handleError(request);
						}
					    }
    },
    isSuccess: function (request) {
				return request.status==0 || (request.status >= 200 && request.status < 300);
    }
}
