// JavaScript Document - Ajax 1.8

/*** CAMBIOS ENTRE LAS VERSIONES ****/
// 1.8 Se añade el parametro 'asynchronous' que por defecto es true pero que por funcionamiento de firefox
//     en algunos casos, para que funcione es necesario que sea sincrono y no anule las conexiones ajax.
// 1.7 Adaptado para que se puedan ejecutar varias instancias de ajax al mismo tiempo
//     Reordenadas las variables que se pasan a las funciones para que la variable 'method' sea opcional
//     La variable 'method' vale por defecto 'get'
// 1.6 Implementado el método post (alerta en el orden en que se pasan las variables)
//     Quuitada la restricción de realizar la conexión sin datos que enviar
// 1.5 Cambia el modo de asignar el 'response_action' para que la variable no tenga que llamarse ajax
// 1.4 No es necesario asignarle el 'response_action' si no necesitas que el servidor te devuelva nada
// 1.3 Se actualiza la ayuda para que sea más clara
//     Se renombra la clase para evitar problemas
// 1.2 Se actualiza la función 'add_var' pasandole 2 parámetros para que sea más seguro
// 1.1 Convierte los caracteres especiales a codificados

/*** METODO 1 (simple) ***/
// ajax = new class_ajax();
// ajax.set_vars_string('var_name1=value&var_name2=value&var_name3=value');
// ajax.set_response_action(function() {
//    alert(ajax.get_response_text());
// });
// ajax.query('file.php' [, method] [, asynchronous]);

/*** METODO 2 (con vars) ***/
// ajax = new class_ajax();
// ajax.add_var('var_name1', 'value');
// ajax.add_var('var_name2', 'value');
// ajax.set_response_action(function() {
//    alert(ajax.get_response_text());
// });
// ajax.query_vars('file.php' [, method] [, asynchronous]);

/*** METODO 3 (formulario) ***/
// ajax = new class_ajax();
// ajax.set_response_action(function() {
//    alert(ajax.get_response_text());
// });
// ajax.query_form(document.forms['form_name'], 'file.php' [, method] [, asynchronous]);

function class_ajax() {
   var vars = Array();
   var vars_string = '';
   var response_text;
   var connection;
   var response_action = null;
   var default_method = 'get'; // [get | post]

   parse_string = function(string) {
      string = escape(string);
      string = string.replace(/\+/g, '%2B');
      return string;
   }

   this.add_var = function(name, value) { add_var(name, value); }
   add_var = function(name, value) { vars.push(parse_string(name) +'='+ parse_string(value)); }

   this.set_vars_string = function(string) { set_vars_string(string); }
   set_vars_string = function(string) { vars_string = string; }

   this.set_response_action = function (action) { response_action = action; }

	query_state_change = function() {
		if (connection.readyState == 4) {
			response_text = connection.responseText;
         response_action();
		}
	}

   this.query = function(url, method, asynchronous) { query(url, method, asynchronous); }
   query = function(url, method, asynchronous) {
      if (method == undefined) method = default_method;
      response_text = '';

      if (window.XMLHttpRequest) {
         connection = new XMLHttpRequest();
         if (connection.overrideMimeType) connection.overrideMimeType('text/html');
      } else if (new ActiveXObject('Msxml2.XMLHTTP')) connection = new ActiveXObject('Msxml2.XMLHTTP');
      else if (new ActiveXObject('Microsoft.XMLHTTP')) connection = new ActiveXObject('Microsoft.XMLHTTP');

		if (response_action != null) connection.onreadystatechange = function() { query_state_change(); }

      if (asynchronous == undefined) var asynchronous = true;

      if (method == 'get') {
         connection.open('get', url +'?'+ vars_string, asynchronous);
         connection.send(null);
      } else if (this.method == 'post') {
         connection.overrideMimeType('text/html');
         connection.open('post', url, true);
         connection.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
         connection.setRequestHeader('Content-length', vars_string.length);
         connection.setRequestHeader('Connection', 'close');
         connection.send(vars_string);
      } else {
			alert('Method not recognized');
			return false;
		}
   }

   this.query_vars = function(url, method, asynchronous) { query_vars(url, method, asynchronous); }
   query_vars = function(url, method, asynchronous) {
		if (method == undefined) method = default_method;
      vars_string = '';

      for (i = 0; i < vars.length; i++) vars_string += vars[i] +'&';
      vars_string = vars_string.substr(0, (vars_string.length - 1));

      query(url, method, asynchronous);
      vars = Array();
   }

   this.query_form = function(form, url, method, asynchronous) {
		if (method == undefined) method = default_method;
		vars_string = '';

      for (i = 0; i < form.elements.length; i++) {
         e = form.elements[i];
         if ((e.tagName.toLowerCase() == 'input') && (e.type.toLowerCase() == 'text')) {
            vars_string += e.name +'='+ parse_string(e.value) +'&';
         } else if ((e.tagName.toLowerCase() == 'input') && (e.type.toLowerCase() == 'hidden')) {
            vars_string += e.name +'='+ parse_string(e.value) +'&';
         } else if ((e.tagName.toLowerCase() == 'input') && (e.type.toLowerCase() == 'password')) {
            vars_string += e.name +'='+ parse_string(e.value) +'&';
         } else if ((e.tagName.toLowerCase() == 'input') && (e.type.toLowerCase() == 'checkbox') && (e.checked == true)) {
            vars_string += e.name +'='+ parse_string(e.value) +'&';
         } else if ((e.tagName.toLowerCase() == 'input') && (e.type.toLowerCase() == 'radio') && (e.checked == true)) {
            vars_string += e.name +'='+ parse_string(e.value) +'&';
         } else if (e.tagName.toLowerCase() == 'select') {
			 // Añado las condiciones para que se envie por Ajax los formularios con select multiple
			 if(!e.multiple)
            	vars_string += e.name +'='+ parse_string(e.value) +'&';
			 else
			 {
				 for(j = 0; j < e.length; j++)
				 {
					 if(e.options[j].selected)
						 vars_string += e.name +'='+ parse_string(e.options[j].value) +'&';
				 }
			 }
         } else if (e.tagName.toLowerCase() == 'textarea') {
            vars_string += e.name +'='+ parse_string(e.value) +'&';
         }
      } vars_string = vars_string.substr(0, (vars_string.length - 1));

      query(url, method, asynchronous);
   }

   this.get_response_text = function() { return response_text; }
}
