 var http_request = false;
function CrearAJAX() {
/*
	if (window.ActiveXObject) { 	 
		return new ActiveXObject("Microsoft.XMLHTTP"); 	 
	} else if (window.XMLHttpRequest) { 	 
		return new XMLHttpRequest(); 	 
	}
*/

      http_request = false;
      if (window.XMLHttpRequest) { // Mozilla, Safari,...
         http_request = new XMLHttpRequest();
         if (http_request.overrideMimeType) {
         	// set type accordingly to anticipated content type
            //http_request.overrideMimeType('text/xml');
            http_request.overrideMimeType('text/html');
         }
      } else if (window.ActiveXObject) { // IE
	  
         try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
            try {
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
         }
		 
		 //http_request = new ActiveXObject("Msxml2.XMLHTTP");
		 
      }
      if (!http_request) {
         alert('Cannot create XMLHTTP instance');
         return false;
      }
	  else {
		  return http_request;
		  }
 
}



// Constructor del objeto AJAX
function ECS_AJAX() {


// Principales propiedades del objeto AJAX
this.url = '';  // Indica la ruta a la cual seran enviados los datos, por lo general es un script o un documento nto XML
this.parametros = '';  // Indica parametros utiles para enviar variables similar al proceso que se realiza al mandar datos mediante GET
this.metodo = '';  // Metodo usado para mandar los datos   POST / GET


this.ajax = CrearAJAX();




this.DetectarCambios = function(funcion) {
					  return this.ajax.onreadystatechange = funcion;
					  }
					  

					  
this.MostrarEventosAjax = function () {
						var mensaje = '0 - No inicializado (objeto creado, pero no se ha invocado el metodo open) \n\n';
						mensaje += '1 - Cargando (objeto creado, pero no se ha invocado el metodo send) \n\n';
						mensaje += '2 - Cargado (se ha invocado el metodo send, pero el servidor aun no ha respondido) \n\n';
						mensaje += '3 - Interactivo (se han recibido algunos datos, aunque no se puede emplear la propiedad responseText) \n\n';
						mensaje += '4 - Completo (se han recibido todos los datos de la respuesta del servidor) \n\n';
						
						alert(mensaje);
					}


// Funcion que se encarga de iniciar el proceso de envio de datos en AJAX
this.Enviar = function() {
	
		if (this.eventos) {	
		this.DetectarCambios(this.eventos);
		}
		else {
		alert('Debe definir la propiedad eventos del objeto Ajax, en esa propiedad se especifica la funcion encargada de manejar los estados del objeto Ajax,  los estados se enumeran del 0 al 4 y pueden ser evaluados usando la funcion EventoActual() del objeto Ajax');	
		}
		
		//SI NO EXISTEN PARAMETROS
		if (this.parametros=='') {
		//alert('No hay parametros asignados al objeto ECS_AJAX()\nDebe asignar parametros antes de usar la funcion Enviar()');
		//return 0;
		}

		//SI NO EXISTE URL
		if (this.url=='') {
		alert('No hay una url asignada al objeto ECS_AJAX()\nDebe asignar una url antes de usar la funcion Enviar()');
		return 0;
		}
         
		 
		 if(this.metodo=="POST") {
			 
			 this.ajax.open(this.metodo,this.url,true);

		//Envia informacion de la cabecera del documento, importante para poder estructurar correctamente la informacion
		this.ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		this.ajax.setRequestHeader("Content-length", this.parametros.length);
		this.ajax.setRequestHeader("Connection", "close");

                return this.ajax.send(this.parametros);

                }
                else if (this.metodo=="GET") {
					
				this.ajax.open(this.metodo,this.url+'?'+this.parametros,true);
				
                return this.ajax.send(null);
                }
				else {
				alert('El argumento usado en la funcion Metodo() del objeto ECS_AJAX() no es valido.');
				}
        }





















//this.formulario = '';

// Funcion que se encarga de iniciar el proceso de envio de datos en AJAX
this.EnviarFormulario = function(formulario) {
	
		if (this.eventos) {	
		this.DetectarCambios(this.eventos);
		}
		else {
		alert('Debe definir la propiedad eventos del objeto Ajax, en esa propiedad se especifica la funcion encargada de manejar los estados del objeto Ajax,  los estados se enumeran del 0 al 4 y pueden ser evaluados usando la funcion EventoActual() del objeto Ajax');	
		}
		
		//SI NO EXISTEN PARAMETROS
		if (this.parametros=='') {
		//alert('No hay parametros asignados al objeto ECS_AJAX()\nDebe asignar parametros antes de usar la funcion Enviar()');
		//return 0;
		}

		//SI NO EXISTE URL
		if (this.url=='') {
		alert('No hay una url asignada al objeto ECS_AJAX()\nDebe asignar una url antes de usar la funcion Enviar()');
		return 0;
		}
         
		 
		 if(this.metodo=="POST") {


		//Recorrer cada elemento y construir sus valores como parametros automaticamente
		for (var indice = 0; indice <= (formulario.elements.length-1); indice++) {
		this.parametros += (formulario.elements.item(indice).name + '=' + formulario.elements.item(indice).value + '&');
		}			 
			 
			 //this.url = this.url + '?' + this.parametros;
			 
			 this.ajax.open(this.metodo,this.url,true);

		
		//Envia informacion de la cabecera del documento, importante para poder estructurar correctamente la informacion
		this.ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		this.ajax.setRequestHeader("Content-length", this.parametros.length);
		this.ajax.setRequestHeader("Connection", "close");

	return this.ajax.send(this.parametros);
		

                //return this.ajax.send(this.parametros);

                }
                else if (this.metodo=="GET") {
					
				this.ajax.open(this.metodo,this.url+'?'+this.parametros,true);
				
                return this.ajax.send(null);
                }
				else {
				alert('El argumento usado en la funcion Metodo() del objeto ECS_AJAX() no es valido.');
				}
        }


































// Funcion que retorna un numero del 1 al 4 el cual indica el estado actual del proceso Ajax, util para saber si se esta enviando, si fue cancelado, si esta procesando o si se ejecuto correctamente.
this.EventoActual = function() {return this.ajax.readyState;}





/////   MANEJO DE RESPUESTAS Y RESULTADOS  /////////////////////////////////////////////////////////////////////////////////
// Obtener respuesta de un proceso
this.Resultado = function() {return this.ajax.responseText;}
// Obtener respuesta en formato XML
this.ResultadoXML = function() {return this.ajax.responseXML;}





////   FUNCIONES INTERNAS PARA EL MANEJO DE DATOS EN XML    ////////////////////////////////////////////////////////////////////////

 
// Funcion para extraer los nodos XML y asignar estos a un Arreglo que almacena cada uno de los nodos	
this.ObtenerNodosXML = function(nodoXML) {
				var xml = this.ResultadoXML();
				var arreglo = new Array();
				
				//Obtiene el numero de nodos comenzando por 1
				arreglo = xml.getElementsByTagName(nodoXML);
				return arreglo;
				
				//return xml.getElementsByTagName(nodoXML).item(0).firstChild.data;
				}


// Obtener el valor de un Nodo una vez que ya se asignaron los nodos un Arreglo mediante la funcion ObtenerNodosXML
this.ObtenerValorNodoXML = function(nodoXML,numeroNodo) {
	
				var valor = '';
				
				if (numeroNodo > 0) {
					numeroNodo -= 1;
					valor = nodoXML.item(numeroNodo).firstChild.data;
					return valor;
				}
				else {
					return '';	// Si se trata de navegar por el elemento 0 que es inexistente
				}

				}					


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//return this;
}







