function MyAjax() {
	var req = {
	'timeout'		: null,
	'url'			: window.location.href,
	'async'			: true,
	'parameters'	: new Object(),
	'requestIndex'	: MyAjax.numMyAjaxs++,
	'respReceived'	: false,
	'queryString'	: "",
	'responseText'	: null,
	'status'		: null,
	'statusText'	: null,
	'aborted'		: false,
	'HttpREQ'		: null,
	'onTimeout'		: null, 
	'onLoading'		: null,
	'onLoaded'		: null,
	'onInteractive'	: null,
	'onComplete'	: null,
	'onSuccess'		: null,
	'onError'		: null,
	'userData'		: null,
	'onState1Done'	:false,
	'onState2Done'	:false,
	'onState3Done'	:false,
	'onState4Done'	:false,
	'IsFunc'		:function(N) { return(typeof(N)=="function" ? true:false);},
	'IfCall'		:function(N) { if(req.IsFunc(N)) N(req); }
	};
	if(!(req.HttpREQ=MyAjax.getHttpOBJ()))
		return(null);
	req.HttpREQ.onreadystatechange = function() {
		if (!req || !req.HttpREQ) return;
		var state=req.HttpREQ.readyState;

		if (state==1) req.onState1(req);
		else if (state==2) req.onState2(req);
		else if (state==3) req.onState3(req);
		else if (state==4) req.onState4(req);
	};
	req.onState1 = function() {
		if (req.onState1Done) return;
		MyAjax.numActiveMyAjaxs++;
		req.IfCall(req.onLoading);
		req.onState1Done = true;
	};
	req.onState2 = function() {
		if (req.onState2Done) return;
		req.IfCall(req.onLoaded);
		req.onState2Done = true;
	};
	req.onState3 = function() {
		if (req.onState3Done) return;
		req.IfCall(req.onInteractive);
		req.onState3Done = true;
	};
	req.onState4 = function() {
		if (req.onState4Done || req.aborted) return;
		req.onState4Done = true;
		req.respReceived = true;
		MyAjax.numActiveMyAjaxs--;
		req.status = req.HttpREQ.status;
//		req.statusText = req.HttpREQ.statusText;
		req.responseText = req.HttpREQ.responseText;
		req.IfCall(req.onComplete);
		if (req.HttpREQ.status==200) req.IfCall(req.onSuccess);
		else req.IfCall(req.onError);
		delete req.HttpREQ['onreadystatechange'];
		req.HttpREQ = null;
	};
	req.onTimeoutInternal = function() {
		if (req && req.HttpREQ && !req.onState4Done) {
			req.aborted = true;
			req.HttpREQ.abort();
			MyAjax.numActiveMyAjaxs--;
			IfCall(req.onTimeout);
			delete req.HttpREQ['onreadystatechange'];
			req.HttpREQ = null;
		}
	};

	req.process = function() {
		if (req.HttpREQ!=null) {
			req.parameters['aJaX']='1';
			for (var i in req.parameters) {
				if (req.queryString.length>0) req.queryString += "&";
				req.queryString += encodeURIComponent(i) + "=" + encodeURIComponent(req.parameters[i]);
			}
			if (req.queryString.length>0) {
				req.url += ((req.url.indexOf("?")>-1)?"&":"?") + req.queryString;
			}
			req.HttpREQ.open("GET",req.url,req.async,req.username,req.password);
			if (req.timeout>0) setTimeout(req.onTimeoutInternal,req.timeout);
			req.HttpREQ.send(null);
		}
	};

	req.handleArguments = function(args) {
		for (var i in args) {
			if (typeof(req[i])=="undefined") req.parameters[i] = args[i];
			else req[i] = args[i];
		}
	};

	req.getResponseHeader = function(headerName) {
		if (req.HttpREQ) {
			if (req.respReceived)
				return req.HttpREQ.getResponseHeader(headerName);
			alert("Cannot getResponseHeader because a response has not yet been received");
		}
	};

	return req;
}

MyAjax.getHttpOBJ = function() {
	if (window.XMLHttpRequest)
		return new XMLHttpRequest();

	return null;
};

MyAjax.isActive = function() {
	return (MyAjax.numActiveMyAjaxs>0);
};

MyAjax.get = function(args) {
	MyAjax.doRequest(args);
};

MyAjax.doRequest = function(args) {
	if (typeof(args)!="undefined" && args!=null) {
		var myRequest = new MyAjax();
		myRequest.handleArguments(args);
		myRequest.process();
	}
};

MyAjax.numActiveMyAjaxs = 0;
MyAjax.numMyAjaxs = 0;


