// JavaScript Document - ajax.js

//----------------------------------------------------------------------------------------------------
function nuevoAjax(){
	
	// Valido para Explorer y Firefox
	//--------------------------- Functión que crea un nuevo objeto ---------------------------------//
	// Crear el objeto XMLHTTPREQUEST con JavaScript.
	// El objeto XMLHttpRequest es uno de los componentes de Ajax, y es el que se encarga de realizar la 
	// conexión con el servidor, enviarle los datos y recibir la respuesta que después será procesada por 
	// el código JavaScript.
	
	var xmlhttp=false;
	try {
		/*Para navegadores distintos a internet explorer*/
	 	xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	 } catch (e) {
	 	try {
	 		/*Para explorer*/
	 		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	 	} catch (E) {
	 		xmlhttp = false;
	 	}
	 }
	
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
	 xmlhttp = new XMLHttpRequest();
	}
	return xmlhttp;
}
//--------------------------------------------------------------------------------------------
function URLEncode(texto)
{
	// Tratamiento de caracteres especiales cuando pasas un texto por POST/GET a través de Ajax
	//
	// parametro texto : Requerido. Cualquier expresión de cadena válida. 

	var SAFECHARS = "0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "!~*'()";
	var HEX = "0123456789ABCDEF";

	var plaintext = texto.split("€").join("&euro;");
	plaintext = plaintext.split("\"").join("&quot;");
	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
	    if (ch == " ") {
		    encoded += "+";
		} else if (SAFECHARS.indexOf(ch) != -1) {
		    encoded += ch;
		} else {
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
			    alert( "Unicode Character '" 
                        + ch 
                        + "' cannot be encoded using standard URL encoding.\n" +
				          "(URL encoding only supports 8-bit characters.)\n" +
						  "A space (+) will be substituted." );
				encoded += "+";
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for
	
	return encoded;
}
//--------------------------------------------------------------------------------------------
function procesoRequestAjax(vajax, metodo, url, argumentos, objretorno, objtipo) 
{	
	// Ejecuta un script que recoge datos a través del parametro 'argumentos' y los 
	// procesa en segundo plano mediante ajax, pasados bien por metodo GET o POST y si se desea
	// se puede visualizar el resultado del proceso en una capa.
	//
	// parametro vajax  	 : Requerido. Variable para crear y  ejecutar la instancia de creación del 
	//				           objeto ajax.
	// parametro metodo 	 : Requerido. Valores GET ó POST ... cualquier otro valor hará que por 
	//					       defecto se ejecute POST.
	// parametro url	     : Requerido. La pagina (script) que se ejecuta en segundo plano a traves de 
	//                         ajax.
	// parametro argumentos  : Requerido. Parametros que necesita la pagina que se ejecuta en segundo
	//						   plano para procesar los datos. Para metodo GET este valor deberá ser null
	//						   ya que por el método GET, hay que concatenar las variables y valores al 
	//						   parámetro url.
	// parametro objretorno  : Requerido. Nombre del objeto contenedor que mostrará el resultado del script. 
	//		                   Si no queremos que el resultado se muestre, simplemente sera poner este parámetro
	//						   a null.
	// parametro objtipo	 : Requerido. Tipo de objeto contenedor, para saber que propiedad del mismo usar
	//						   para mostrar el resultado del script.
	//						   Valores ...
	//						   0 - Capa. Propiedad innerHTML.
	//						   1 - Caja de texto, Textarea. Propiedad value.
	//						   Si objretorno=null, objtipo puede tener cualquier valor por ejemplo null.	
	//
	// Ejemplo de llamadas a la funcion en funcion del metodo GET / POST a usar ...
	// Declarar variable  var ajax;
	// GET	->	procesoRequestAjax(ajax, 'GET', 'proceso.asp?campo1='+v1+'&campo2='+v2, null, document.getElementById('capa'), 0); 
	//		    ( GET necesita la url concatenada con las variables y valores, por lo que los valores no se pueden 
	//            mandar por separado y por eso el valor de los argumentos debe ser null )
	// POST ->	procesoRequestAjax(ajax, 'POST', 'proceso.asp', 'campo1='+v1+'&campo2='+v2, null, null); 

	
	metodo=metodo.toUpperCase();
	if (metodo!='GET' && metodo!='POST'){
		metodo='POST'
	}
	if (metodo=='GET'){
		if (argumentos!=null){
			argumentos=null;
		}
	}

    vajax = nuevoAjax();
	vajax.open(metodo, url,true);
	vajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");	
	vajax.send(argumentos);	
	if (objretorno!=null)
	{
		vajax.onreadystatechange=function() {		
			if (vajax.readyState==4) {
				switch (objtipo) { 
					case 1: 
       					objretorno.value=vajax.responseText				
      					break
					default:
						objtipo=0;						
						objretorno.innerHTML=vajax.responseText
				}												
			}
		}		
	}
}
//--------------------------------------------------------------------------------------------
function procesoAjax(vajax, metodo, url, objretorno, objtipo)
{	
	// Ejecuta un script en segundo plano mediante ajax y si se desea se puede visualizar el resultado del 
	// proceso en una capa.
	//
	// parametro vajax  	 : Requerido. Variable para crear y  ejecutar la instancia de creación del 
	//				           objeto ajax.
	// parametro metodo 	 : Requerido. Valores GET ó POST ... cualquier otro valor hará que por 
	//					       defecto se ejecute POST.
	// parametro url	     : Requerido. La pagina (script) que se ejecuta en segundo plano a traves de 
	//                         ajax.
	// parametro objretorno  : Requerido. Nombre del objeto contenedor que mostrará el resultado del script. 
	//		                   Si no queremos que el resultado se muestre, simplemente sera poner este parámetro
	//						   a null.
	// parametro objtipo	 : Requerido. Tipo de objeto contenedor, para saber que propiedad del mismo usar
	//						   para mostrar el resultado del script.
	//						   Valores ...
	//						   0 - Capa. Propiedad innerHTML.
	//						   1 - Caja de texto, Textarea. Propiedad value.
	//						   Si objretorno=null, objtipo puede tener cualquier valor por ejemplo null.
	//
	// Ejemplo de llamadas a la funcion en funcion del metodo GET / POST a usar ...
	// Declarar variable  var ajax;
	// GET	->	procesoAjax(ajax, 'GET', 'proceso.asp, document.getElementById('capa'), 0); 
	// POST ->	procesoAjax(ajax, 'POST', 'proceso.asp', null, null); 
	
	metodo=metodo.toUpperCase();
	if (metodo!='GET' && metodo!='POST'){
		metodo='POST'
	}
	
	vajax = nuevoAjax();
	vajax.open(metodo, url, true);	
	vajax.setRequestHeader("Content-Type", "text/plain");
	vajax.send("leer=true");
	if (objretorno!=null)
	{
		var resultado = "";
		vajax.onreadystatechange=function() {	
			if (vajax.readyState==4) {				
				switch (objtipo) { 
					case 1: 
       					objretorno.value=vajax.responseText				
      					break
					default:
						objtipo=0;						
						objretorno.innerHTML=vajax.responseText
				}
			}
		}
	}	
}
//------------------------------------------------------------------------------------------