function AJAXCrearObjeto() { 
	try {
		http_request = new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch (e) {
		try {
			http_request = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (e) {
			try {
				http_request = new XMLHttpRequest();
			}
			catch (e) {
			}
		}
	}
	if (!http_request) {
		return false;
	}
	return http_request;
} 

function ejecutaAjax(pValorOrigen, pDestino, pOpcion, pCampoValor, pCampoTexto, pTextoSelecciona, pTextoSinRegistros, pParametros) {
	var vEstado;
	
	//Array donde se cargarán los nombres de los campos de la select (2 como máximo)
	aCampo = new Array();
	
	//Array donde se cargarán los valores devueltos por la select. Tendrá 1 o 2 dimensiones según el número de campos en la select
	aValor = new Array();

	oXML = AJAXCrearObjeto(); 
	if (!oXML) {
		vEstado = 'error';
	}
	else {
		var vURL = 'ajax.aspx?valorOrigen=' + pValorOrigen + '&opcion=' + pOpcion + pParametros;
		oXML.open('get', vURL, true); 
		oXML.onreadystatechange = function (){
			if (oXML.readyState == 4) {
				if (oXML.status == 200) {
					var xml  = oXML.responseXML.documentElement;
					var numeroCampos = xml.getElementsByTagName('campo').length;
					var numeroRegistros = xml.getElementsByTagName('fila').length;
					if (numeroRegistros == 0 || numeroCampos == 0) {
						vEstado = 'vacio';
						rellenaCombo(pValorOrigen, pDestino, pOpcion, pCampoValor, pCampoTexto, pTextoSelecciona, pTextoSinRegistros, aCampo, aValor, vEstado);
					}
					else {
						for (i=0; i<numeroCampos; i++) {
							aCampo[i] = xml.getElementsByTagName('campo')[i].firstChild.data;
						}
						if (numeroCampos>1) {
							for (i=0; i<numeroRegistros; i++) {
								aValor[i] = new Array(numeroCampos-1);
							}
						}
						for (i=0; i<numeroRegistros; i++) {
							var item = xml.getElementsByTagName('fila')[i];
							if (numeroCampos > 1) {
								for (j=0; j<numeroCampos; j++) {
									aValor[i][j] = item.getElementsByTagName(aCampo[j])[0].firstChild.data;
								}
							}
							else {
								aValor[i] = item.getElementsByTagName(aCampo[0])[0].firstChild.data;
							}
						}
						

						rellenaCombo(pValorOrigen, pDestino, pOpcion, pCampoValor, pCampoTexto, pTextoSelecciona, pTextoSinRegistros, aCampo, aValor, vEstado);
					}
				}
				else {
					vEstado = 'vacio';
					rellenaCombo(pValorOrigen, pDestino, pOpcion, pCampoValor, pCampoTexto, pTextoSelecciona, pTextoSinRegistros, aCampo, aValor, vEstado);
				}
			}
		}
		oXML.send('');
	}
}

function rellenaCombo(pValorOrigen, pDestino, pOpcion, pCampoValor, pCampoTexto, pTextoSelecciona, pTextoSinRegistros, aCampo, aValor, pEstado) {
	//Con esta variable controlamos si la interactuación con el XML ha sido correcta
	var vEstado = pEstado;
	//A continuación se ejecutan todas las instrucciones necesarias, teniendo ya los arrays de campos y valores cargados
	document.getElementById(pDestino).options.length = 0;
	if (vEstado == 'error') {
		document.getElementById(pDestino).options[0] = new Option('Error','');
	}
	else if (vEstado == 'vacio') {
		document.getElementById(pDestino).options[0] = new Option(pTextoSelecciona,'');
	}
	else {
		document.getElementById(pDestino).options[0] = new Option(pTextoSelecciona,'');
		for (i=0; i<aCampo.length; i++) {
			if (aCampo[i] == pCampoValor) {
				var vNumeroValor = i;
			}
			else if (aCampo[i] == pCampoTexto) {
				var vNumeroTexto = i;
			}
		}
		for (i=0; i<aValor.length; i++) {
			document.getElementById(pDestino).options[i+1] = new Option(aValor[i][vNumeroTexto],aValor[i][vNumeroValor]);
		}
	}
	document.getElementById(pDestino).disabled = false;
}

function ajaxCombo(pValorOrigen, pDestino, pOpcion, pCampoValor, pCampoTexto, pTextoSelecciona, pTextoSinRegistros, pParametros,pTextoOpcion) {
	//Vaciamos el combo, y ponemos un mensaje temporal indicando que se está cargando
	document.getElementById(pDestino).options.length = 0;
	document.getElementById(pDestino).options[0] = new Option(pTextoOpcion,'');
	document.getElementById(pDestino).disabled = true;
	
	//Llamada a la función que interactuará con el XML.
	//pValorOrigen = Valor del objeto HTML de origen. Puede ser nulo. PE: --> this.value
	//pDestino = Nombre del objeto donde se aplicarán los resultados devueltos por el Ajax
	//pOpcion = Nº de opción del "switch" a ejecutar en el generador de XML (por defecto genXML.aspx)
	ejecutaAjax(pValorOrigen, pDestino, pOpcion, pCampoValor, pCampoTexto, pTextoSelecciona, pTextoSinRegistros, pParametros);
}
