if(typeof(XMLHttpRequest) == 'undefined')
	var XMLHttpRequest = function() {
		var request = null;
		try {
			request = new ActiveXObject('Msxml2.XMLHTTP');
		} catch(e) {
			try	{
				request = new ActiveXObject('Microsoft.XMLHTTP');
			} catch(ee) {}
		}
		return request;
	}
	
var AjaxQueueRequests = new Array();
var AjaxLocked = 0;

var Ajax = {

	getVersion:function() {
		return '5.6.3.4';
	},
	stop:function() {
		for(var i=0; i<AjaxQueueRequests.length; i++) {
			if(AjaxQueueRequests[i] != null) AjaxQueueRequests[i].abort();
		}
	},
	doRequest:function(url, data, callback, context) {
		var r = Ajax.createRequest(context);
		var async = typeof(callback) == 'function';
		if(async) r.obj.onreadystatechange = function() {
			if(r.obj.readyState == 4)
				callback(new AjaxResponse(r));
		}
		
		r.obj.open('POST', url, async);
		r.obj.send(data);
		
		if(!async)
			return new AjaxResponse(r);
	},
	doRequestForDestination:function(url, data, callback, context, cible) {
		var r = Ajax.createRequest(context);
		var async = typeof(callback) == 'function';
		if(async) r.obj.onreadystatechange = function() {
			if(r.obj.readyState == 4)
			{
				callback(new AjaxResponse(r), cible);
			}
		}
		r.obj.open('POST', url, async);
		r.obj.send(data);
		if(!async)
			return new AjaxResponse(r);
	},
	createRequest:function(context) {
		for(var i=0; i<AjaxQueueRequests.length; i++) {
			if(AjaxQueueRequests[i].readyState == 4)	{
				AjaxQueueRequests[i].abort();
				AjaxQueueRequests[i].context = null;
				return AjaxQueueRequests[i];
			}
		}

		var pos = AjaxQueueRequests.length;
		
		AjaxQueueRequests[pos] = Object();
		AjaxQueueRequests[pos].obj = new XMLHttpRequest();
		AjaxQueueRequests[pos].context = context;
		
		return AjaxQueueRequests[pos];
	}	
}

function AjaxError(name, description, number) {
	this.name = name;
	this.description = description;
	this.number = number;
	return this;
}


function AjaxResponse(request) {
	this.request = request.obj;
	this.error = null;
	this.value = null;
	this.context = request.context;
			
	if(request.obj.status == 200) {
		try	{
			this.value = request.obj.responseText;
		} catch(e) {
			this.error = new AjaxError(e.name, e.description, e.number);
		}
	} else	{
		this.error = new AjaxError('HTTP request failed with status: ' + request.obj.status, request.obj.status);
	}
	
	return this;
}

var AjaxUtil = {
	enc:function(s) {
		return escape(s.toString());
		//return s.toString().replace(/\%/g, "%26").replace(/=/g, "%3D").replace(/#/g,"%35");
	}	
}

