/**
@author :  Victor Santana
@Version : 1.0 16-05-2008 1.0
*/
function TTajax()
{
  //-- private
  var servidor = null;
  
  //-- public
  this.msg	  = "<img src='/img/ajax-loader-circle-ball.gif' alt='cargando' title='cargando' style='width:16px'>";
  this.server = "server_file.php";
  this.error  = "";
  
  
  //-- private method
  var getObjeto = function(){
  	/*
  	try {  xmlhttp = new ActiveXObject ("Msxml2.XMLHTTP");   }
  	catch(e) {
		try  {	xmlhttp = new ActiveXObject ("Microsoft.XMLHTTP");  }
	  	catch(E) {
			xmlhttp = false;
	   	}
  	}
  	if (!xmlhttp && typeof XMLHttpRequest != 'undefined'){
		xmlhttp = new XMLHttpRequest();
  	}
 	return xmlhttp;
 	*/
 	
  	var xmlhttp;
	if (window.XMLHttpRequest) {
  		xmlhttp = new XMLHttpRequest();
	} else {
  			try { 
    				xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  				} catch (e) {
    		try { 
      				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    			} catch (e) {
      				xmlhttp = false; 
    			}
  			}
		}
	return xmlhttp;
	
  	}
  
  var queryString = function(destino,variables,aux)
  {
	var query = "destino="+destino;
	
	if(variables){
		for(i=0 ; i<variables.length; i++){
			// Para todos los caracteres de Utf-8: utilizar la función escape
			query += "&"+variables[i]+"="+escape(document.getElementById(variables[i]).value); 
			//query += "&"+variables[i]+"="+encodeURIComponent(document.getElementById(variables[i]).value); 
		}	
	}
	
	return query+aux;
  }
  
  var setAtributos = function(div, attr)
  {
  	if(!attr) return;
  	var atributos = eval("("+attr+")");
  	for (var k in atributos){
  		div.setAttribute(k, atributos[k]);
  	}
  }
  
  var pintaXML = function(oDocumento)
  {
  	if(!oDocumento) return false;
  	var nodos = oDocumento.getElementsByTagName("nodo");
	for(var i=0; i<nodos.length; i++) {
  		var nodo = nodos[i];
  		switch(nodo.getElementsByTagName("accion")[0].firstChild.nodeValue){
  			case "script":
  				var script = document.createElement('script');
				script.setAttribute('type','text/javascript');
				script.text = nodo.getElementsByTagName("content")[0].firstChild.nodeValue;
				document.getElementsByTagName('head').item(0).appendChild(script);
  			break;
  			case "iframe":
  				var v_capa = nodo.getElementsByTagName("id")[0].firstChild.nodeValue.split('#');
  				var marco = document.getElementById(v_capa[0]).contentWindow;
				marco.document.getElementById(v_capa[1]).innerHTML = nodo.getElementsByTagName("content")[0].firstChild.nodeValue;
  			break;
  			case "value":
  				var valor = nodo.getElementsByTagName("id")[0].firstChild.nodeValue;
  				document.getElementById(valor).value = nodo.getElementsByTagName("content")[0].firstChild.nodeValue;
  			break;
  			case "div":
  				var div = document.createElement('div');
  				var txt = document.createTextNode(nodo.getElementsByTagName("content")[0].firstChild.nodeValue);
  				div.appendChild(txt);
  				setAtributos(div,nodo.getElementsByTagName("attr")[0].firstChild.nodeValue);
  				document.getElementById(nodo.getElementsByTagName("id")[0].firstChild.nodeValue).appendChild(div);
  			break;
  			default:
  				var capa = nodo.getElementsByTagName("id")[0].firstChild.nodeValue;
  				document.getElementById(capa).innerHTML = nodo.getElementsByTagName("content")[0].firstChild.nodeValue;
  			break;
  		}
	}
  	return true;
  }
  
  var pintaJSON = function(jDatos)
  {
  	if(!jDatos) return false;
  	var nodos = eval("("+jDatos+")");
	for(var i=0; i<nodos.length; i++) {
  		var nodo = nodos[i];
  		switch(nodo["accion"]){
  			case "script":
  				var script = document.createElement('script');
				script.setAttribute('type','text/javascript');
				script.text = nodo["content"];
				document.getElementsByTagName('head').item(0).appendChild(script);
  			break;
  			case "iframe":
  				var v_capa = nodo["id"].split('#');
  				var marco = document.getElementById(v_capa[0]).contentWindow;
				marco.document.getElementById(v_capa[1]).innerHTML = nodo["content"];
  			break;
  			case "value":
  				var valor = nodo["id"];
  				document.getElementById(valor).value = nodo["content"];
  			break;
  			case "div":
  				var div = document.createElement('div');
  				var txt = document.createTextNode(nodo["content"]);
  				div.appendChild(txt);
  				setAtributos(div,nodo["attr"]);
  				document.getElementById(nodo["id"]).appendChild(div);
  			break;
  			default:
  				var capa = nodo["id"];
  				document.getElementById(capa).innerHTML = nodo["content"];
  			break;
  		}
	}
  	return true;
  }
  
  //-- public method
  this.Carga = function(metodo,destino,variables,aux){
  	var error = this.error;
  	var servidor = getObjeto();
	switch(metodo){
		case 'get': 	servidor.open("GET",this.server+"?"+queryString(destino,variables,aux), true);	
						break;
		case 'post':
		case 'xml':	
		case 'json':	servidor.open('POST',this.server,true); 
						servidor.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
						break;	
	}
   	document.getElementById(destino).innerHTML=this.msg;
   	servidor.onreadystatechange = function(){
  		if (servidor.readyState == 4){
			if(servidor.status == 200){
				switch(metodo){
					case 'get':	
					case 'post':	document.getElementById(destino).innerHTML = servidor.responseText;
									break;
					case 'xml':		
									var oDocumento = servidor.responseXML;
									if(!pintaXML(oDocumento)) document.getElementById(destino).innerHTML = error;
									break;
					
					case 'json':
									if(!pintaJSON(servidor.responseText)) document.getElementById(destino).innerHTML = error;
									break;
				}
			}else document.getElementById(destino).innerHTML = error;
  		}
	};

	var cad = (metodo=='get') ? null : queryString(destino,variables,aux);
	cad    += "&__ajax__="+metodo; 
	
   	servidor.send(cad); 
   	return;	
  }
  
  
  var queryStringForm = function(formId, aux)
  {
  	var query = "";
  	var f = document.getElementById(formId);
	var num = f.elements.length;
	
	for (var i=0; i <= num-1; i++) {
		elemento=f.elements[i];
		switch(elemento.type)
		{
			case 'select-multiple':	for(j=0 ; j<elemento.options.length ; j++) if(elemento.options[j].selected){
										query += (query=="") ? "" : "&";
										// Para todos los caracteres de Utf-8: utilizar la función escape
										query += (elemento.name+"="+escape(elemento.options[j].value)); 
										//query += (elemento.name+"="+encodeURIComponent(elemento.options[j].value)); 
									}
			break;
			
			case 'radio':
			case 'checkbox': if(elemento.checked) { 
								query += (query=="") ? "" : "&";
								// Para todos los caracteres de Utf-8: utilizar la función escape
								query += (elemento.name+"="+escape(elemento.value)); 
								//query += (elemento.name+"="+encodeURIComponent(elemento.value)); 
							 }
					 		 break;
			default: if (!elemento.type) break;
					 query += (query=="") ? "" : "&"; 
					 // Para todos los caracteres de Utf-8: utilizar la función escape
					 query += (elemento.name+"="+escape(elemento.value));
					 //query += (elemento.name+"="+encodeURIComponent(elemento.value));
					 break;	
		}
	}
  	return query+aux;
  }
  
  
  //-- public method
  this.cargaForm = function(metodo,destino,formId,aux){
	var error = this.error;
  	var servidor = getObjeto();
	switch(metodo){
		case 'post':
		case 'xml':
		case 'json':	servidor.open('POST',this.server,true); 
						servidor.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
						break;	
	}
   	document.getElementById(destino).innerHTML=this.msg;
   	servidor.onreadystatechange = function(){
  		if (servidor.readyState == 4){
			if(servidor.status == 200){
				switch(metodo){
					case 'post':	document.getElementById(destino).innerHTML = servidor.responseText;	
									break;
					case 'xml':
									var oDocumento = servidor.responseXML;
									if(!pintaXML(oDocumento)) document.getElementById(destino).innerHTML = error;
									break;
					
					case 'json':
									if(!pintaJSON(servidor.responseText)) document.getElementById(destino).innerHTML = error;
									break;
				}
			}else document.getElementById(destino).innerHTML = error;
  		}
	};
	
	var cad = queryStringForm(formId,aux);
	cad    += "&__ajax__="+metodo;
	
	servidor.send(cad); 
   	return;	
  }
  
}
