function EfluxAjax() {

	/**
	 * Envia peticion ajax
	 * @param pUrl Direccion
	 * @param pParams Array de arrays: [ ['p1','v1'],['p2','v2']...]
	 * @param pFunc Funcion a ejecutar
	 */
	this.send = function (pUrl, pParams, pFunc) { send(pUrl, pParams, pFunc); }
	this.isBloqueado = function () { return isBloqueado(); }
	this.getInfoExtra = function (p) { return getInfoExtra(p); }
	this.setInfoExtra = function (n, v) { setInfoExtra(n, v); }

	// ================ //

	var cAjax;
	var cInfoExtra = new Array();

	// == AJAX == //
	if (window.XMLHttpRequest) { // no es IE
		cAjax = new XMLHttpRequest();
	} else { // Es IE o no tiene el objeto
		try {
			cAjax = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (e) {
			alert('Navegador no soportado');
		}
	}
	// == LOCK == //
	var cLock = false;
	
	// == METODO SEND == //
	var send = function (pUrl, pParams, pFunc) {
		if (isBloqueado()==false) {
			bloquear();
			cAjax.open('POST', pUrl);
			cAjax.onreadystatechange = function () {
				if (this.readyState == 4) {
					pFunc(this.responseXML.documentElement, cInfoExtra);
					desbloquear();
				}
			};
			cAjax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			cAjax.send(paramsArrayToString(pParams));
			return true;
		}
		return false;
	}

	var isBloqueado = function () { return cLock; }
	
	var getInfoExtra = function (p) { return cInfoExtra[p]; }

	var setInfoExtra = function (n, v) { cInfoExtra[n] = v; }

	var bloquear = function () { cLock = true; }

	var desbloquear = function () { cLock = false; }
	
	var paramsArrayToString = function (pParams) {
		var paramsStr = '';
		var i;
		for (i=0; i<pParams.length; ++i) {
			var param = pParams[i];
			var paramName = param[0];
			var paramValue = param[1];
			if (i>0) { paramsStr += '&'; }
			paramsStr += paramName;
			paramsStr += '=';
			paramsStr += escape(paramValue);
		}
		return paramsStr;
	}
}

// AUTOCARGA DE DEPENDENCIAS
new function () {
	var DEPENDENCIAS = [];
	var dir = 'js';
	if (typeof EFLUX_JS_DIR != 'undefined') { dir = EFLUX_JS_DIR; }

	for (var i=0; i<DEPENDENCIAS.length; ++i) {
		var d = DEPENDENCIAS[i];
		var js = dir +'/'+ d +'/'+ d +'.js';
		try { eval ('new '+ d +'()'); }
		catch (e) {
			document.writeln('<SCRIPT src="'+ js +'"></SCRIPT>');
		}
	}
}
