function ajax(sURL, sMetodo, sDIV, bAsync, event_on_complete)
{
	// Propiedades pasadas en el constructor de la clase
	var sURL = sURL;
	var sMetodo = sMetodo;
	var sDIV = sDIV;

	// Propiedades pasadas por metodos de clase
	var sParametros = new String();
	var sPeticionParada = new String();
	var sPeticionIniciando = new String();
	var sPeticionEnviando = new String();
	var sPeticionRecuperando = new String();
	var sPeticionError = new String();

	// Inicializamos XMLHttpRequest
	var HTTPRequest = false;

	try
	{
		HTTPRequest = new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch (e1)
	{
		try
		{
			HTTPRequest = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (e2)
		{
			HTTPRequest = false;
		}
	}

	if (!HTTPRequest && typeof XMLHttpRequest != 'undefined')
	{
		HTTPRequest = new XMLHttpRequest();
	}

	// Setter de parametros
	this.setParametro = function(sClave, sValor)
	{
		if (sMetodo == "POST")
		{
			sValor = encodeURIComponent(sValor);
		}
		eval("sTemp = '" + sClave + "=" + sValor + "&';");

		sParametros += sTemp;
	}

	// Setter de HTML para el mensaje de peticion no iniciada
	this.setPeticionParada = function(sValor)
	{
		sPeticionParada = sValor;
	}

	// Setter de HTML para el mensaje de iniciando peticion
	this.setPeticionIniciando = function(sValor)
	{
		sPeticionIniciando = sValor;
	}

	// Setter de HTML para el mensaje de enviando peticion
	this.setPeticionEnviando = function(sValor)
	{
		sPeticionEnviando = sValor;
	}

	// Setter de HTML para el mensaje de recuperando datos
	this.setPeticionRecuperando = function(sValor)
	{
		sPeticionRecuperando = sValor;
	}

	// Setter de HTML para el mensaje de error en la peticion
	this.setPeticionError = function(sValor)
	{
		sPeticionError = sValor;
	}

	// Metodo de envio de la query al servidor
	this.enviar = function()
	{
		if (sPeticionParada == "")
		{
			sPeticionParada = "Peticion parada.";
		}

		if (sPeticionIniciando == "")
		{
			sPeticionIniciando = "Iniciando peticion...";
		}

		if (sPeticionEnviando == "")
		{
			sPeticionEnviando = "Enviando peticion...";
		}

		if (sPeticionRecuperando == "")
		{
			sPeticionRecuperando = "Recuperando datos...";
		}

		if (sPeticionError == "Error en la peticion.")
		{
			sPeticionError = "";
		}

		if (HTTPRequest.readyState == 4 || HTTPRequest.readyState == 0)
		{
			if (sMetodo == "GET")
			{
				sURL = sURL + "?" + sParametros;
			}

			if (bAsync == null)
			{
				bAsync = false;
			}

			HTTPRequest.open(sMetodo, sURL, bAsync);
			HTTPRequest.onreadystatechange = function()
			{
				switch (HTTPRequest.readyState)
				{
					case 0:
						document.getElementById(sDIV).innerHTML = sPeticionParada;
					break;

					case 1:
						document.getElementById(sDIV).innerHTML = sPeticionIniciando;
					break;

					case 2:
						document.getElementById(sDIV).innerHTML = sPeticionEnviando;
					break;

					case 3:
						document.getElementById(sDIV).innerHTML = sPeticionRecuperando;
					break;

					case 4:
						if (HTTPRequest.status == 200)
						{
                                                    if(event_on_complete!="" && event_on_complete!=null)
                                                    {
                                                        // Llamamos a una función js (con otra llamada ajax sería lo lógico) cuando esta petición este completa
                                                        eval(event_on_complete);
                                                    }
                                                    else
                                                    {
							var sRespuesta = HTTPRequest.responseText;
							document.getElementById(sDIV).innerHTML = sRespuesta;
                                                    }
						}
						else
						{
							document.getElementById(sDIV).innerHTML = sPeticionError;
						}
					break;
				}
			}

			if (sMetodo == "POST")
			{
				HTTPRequest.setRequestHeader("Cache-Control", "no-cache");
				HTTPRequest.setRequestHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT");
				HTTPRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded;");
				HTTPRequest.setRequestHeader("Content-length", sParametros.length);
				HTTPRequest.setRequestHeader("Connection", "close");

				HTTPRequest.send(sParametros);
			}
			else
			{
				HTTPRequest.setRequestHeader("Cache-Control", "no-cache");
				HTTPRequest.setRequestHeader("Cache-Control", "must-revalidate");
				HTTPRequest.setRequestHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT");

				HTTPRequest.send(null);
			}
		}
	}
}