/*

Esta fucion permite hacer las conexiones con ajax de forma facil
solo pasar la url, vars, metodos, objeto xml y las fucion que realizara cuando 
el status se pase a 200

este metodo diseñado por mi(J Fco Díaz A.) al cual denominé ajas el lugar de ajax, 
el final es una 's' en lugar de la 'x' de xml, 
por que usamos un simple string (por eso la 's') y luego se parsea y no necesitas de xml
para desarrollar la aplicacion


*/

function obj(id)
{
	return document.getElementById(id);
}
/*
v.1.0 24/marzo&2008
tablaRes(titulo,res,elementosRes,funtionrows);
retorna una tabla generada meditate el array res de string2vars que llama en la funcion 
ajas(), este recibie los paramentros siguientes:
titulos, un array con los titulos de las columnas
res, el resultado de string2vars o bien del paramenrametro recibido en una funcion Fsate200 en la funcion ajas
elementosRes: un array con los idices a tomar en cuenta del arreglo res
functionrows: una funcion que devera devolver un array con cada uno de los elementos de la tabla, devera retornar un array con el contenido de las celdas en el orden que seran mostradas, 
*/
function tablaRes(titulos,res,elementosRes,functionrows){
		var row;
		var tb='<table border="1" class="tableAdmin">'+
		'<tr>';
		var titulo;
		var objeto=new Object();
		for(var i=0;i<titulos.length;i++)
			tb+='<th class="tbAdminTh">'+titulos[i]+'</th>';			
		tb+='</tr>\n';
		var elemento=new Array();
		if(res[elementosRes[0]]){
		for(var i=0;i<res[elementosRes[0]].length;i++){
				for(var j=0;j<elementosRes.length;j++){
					objeto[elementosRes[j]]=res[elementosRes[j]][i];
				}
				row=functionrows(objeto);				
				tb+='<tr class="tbAdminTr'+((i%2)?2:1)+'">';
				for(e in row){
					tb+='<td class="tbAdminTd'+((i%2)?2:1)+'">'+row[e]+'</td>';
				}
				tb+='</tr>\n';				
			}
		}else{
			tb+='<tr><td colspan="'+titulos.length+'">No se encotrar&oacute;n Registros</td></tr>\n';
		}		
		return tb+'</table>';
	}
	
/*------------------------*/
function objXml() {
    try {
	    objXML = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
	    try {
		    objXML = new ActiveXObject("Microsoft.XMLHTTP");
	    } catch (E) {
		    objXML = false;
	    }
    }
    if (!objXML && typeof XMLHttpRequest!='undefined') {
	    objXML = new XMLHttpRequest();
    }
    return objXML;
}
/*
V.1.4 25/marzo/2008
se agrega la posibilidad de pasar un array como elmento de hast de parametros, esto ara posible enviar un 
array a php desde javascript
funcion ajas()
V.1.3 23/marzo/2008
se agrega la opcion de resibir un array asociativo o hash como parametro de variables
se agrega el parametro otrosParametros que nos servira para pasar un ojeto de parametros a la funcion receptora Fstate200
en el caso de que se envia parseAutomatico en false, otrosParametros sera enviado como primer parametro de la funcion Fstate200 en 
el caso de ser verdadero el parseAutomatico se enviará como segundo parametro de la funcion Fstate200 en este caso el de requerir parseAutomatico en 
false se deve realizar este de manera explicita si es que se requiere pasar otros parametros a la funcion Fstate200

V.1.1 May/2006
V.1.2 20,25/Oct/2007
	Se Agrega El Parseo Automatico llamando a  la funcion string2vars(), cuando el stuatus sea 200 y
	la unica forma de evitar el parseo automatico es mandando un false, como 4to parametro, se elmina
	la posibilidad del envio de variables x get en el 2do parametro y la definicion del metodo en el 3ro,
	esto por que las valiables get, se pueden agregar directo en el primer parametro de URL, y quedado
	el segundo paramentro para enviar las variables por POST, y recore la el objeto xml al 3er parametro
	mientras que el cuato sera la funcion a ejecutar en al responderece la funcion satisfactoriamente
	el utlimo paramentro es para el parse automatico este se prevee se omita si es que se decide el pareseo 
	automatico, dejado este parametro solo como interfas para evitar este enviandose un false en cuyo
	caso no se quiera parsear el resutlado de la petición.	
*/
function ajas(url,vars,objxml,Fstate200,parseAutomatico,otrosParametros){
	if(vars.constructor==Object){//si var es un objeto
			var varsStr="";
			for(index in vars){
					if(vars[index].constructor==Array){
						for(index1 in vars[index]){
							varsStr+=index+'[]='+escape(vars[index][index1])+"&";
						}
					}else{
					varsStr+=index+'='+escape(vars[index])+"&";
					}
				}
			vars=varsStr.substring(0,varsStr.length-1);
		}
	if(!objxml)
		var xml=objXml();
	else{        
		var xml=objxml;
    }
	var variables_aEnviar=vars;
	var evitaCache=Math.floor(Math.random() * (100000000000000));		
	_URL_=url+((url.indexOf('?')==-1)?"?":"&")+evitaCache;	
	xml.open("POST",_URL_,true);	
	xml.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); //cabeceras del post
	xml.send(variables_aEnviar); //enviar variables
	xml.onreadystatechange=function() {
		if (xml.readyState==4){
			if(xml.status==200){
				if(parseAutomatico||parseAutomatico==undefined)
					Fstate200(string2vars(xml.responseText),otrosParametros,xml);
				else
					Fstate200(otrosParametros,xml);
			}else{
				alert("Error: Status "+xml.status);
			}
		}
	}
	return;
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ emailOk, evalua si el value del un obj es un email
+ retorna flase si no lo es true si lo es
+
+ Parametros
+  idObj: String con el id del objto 
+  mensaje:  String con el mensaje de error si el value no es un email
+ 
+ dependencia:
+   [Object] funciton obj(idObj)
+********************************************************************/
function emailOk(idObj,mensaje){
	var s = obj(idObj).value;
	var filter=/^[A-Za-z][A-Za-z0-9_]*@[A-Za-z0-9_]+\.[A-Za-z0-9_.]+[A-za-z]$/;
	if (filter.test(s)){
		return true;
	}else{
		alert(mensaje);
		obj(idObj).focus();
		return false;
	}
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ validarInputV, evalua la propiedad value de un objeto cntra ""
+ retorna flase si algun campo es = a ""
+
+ recibe un JSON
+ obj={
+     id_campo1 : 'Mensaje de Alerta 1',
+	  id_campo2 : 'Mensaje de Alerta 2',
+	  id_campo3 : 'Mensaje de Alerta 3',
+ 	  id_campo4 : 'Mensaje de Alerta 4'
+	}
+ los campos seran buscados por el id del objeto y si su value es vacio
+ mostrara en un alert el 'Mensaje de Alerta n' y returnara false
+ si ningun campo es = "" retornara true
+********************************************************************/
function validarInputV(objInputs,debuMode){
		for(var i in objInputs){
			if(debuMode)alert(i);
			if(obj(i).value.replace(/^\s+|\s+$/g,'')==""){
				alert(objInputs[i]);
				return false;
			}
		}
		return true;
	}
	
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+  string2vars(string cad) V.1.2
+
+ declara y coloca en el array variables[] las variables recibidas
+ en la cadena
+ la cadena tiene el formato "variable1=1&variable2=2&variable3=3
+ la funcion divide a cad por los "&" y posteriormete el resultado de 
+ esta divicion el prmer valor sera la llave del variables[prmierValor]
+ y el valor de variables[primerValor] sera "segundoValor"
+ en el ejemplo anterior el array variables[] despues de llamar a string2vars()
+ sera:
+ variables[variable1]=1
+ variables[variable2]=2
+ variables[variable3]=3
+ string2vars tabien admimite formar arreglos desde la cad pra esto cada variable
+ que valla a ser un array hay que colocar el sufijo "[]" para ser tomado como un 
+ arreglo o elmento del arrelgo, los idices iran de 0 al numero de variables[] encotradas
+ ejmplo
+ cad= "variable1=1&variableArr[]=1&variableArr[]=2";
+ string2vars(cad)
+ tras estas lineas el arreglo variables tendra los valores
+ variables['variable1']=1
+ variables['variableArr'][0]=1
+ variables['variableArr'][1]=2
+
+ NOTA: si despues de variableArr declara otro variableArr y le asigna un valor el 
+ array variableArr se destruira!
+
+ [[[Por: José Francisco Díaz Ar ]]
+ [[ jfcodiaz@gmail.com ]]]]]
+ 22/May/2006
+ Modificacion 27 de Oct. 2007
+  Sé reparó el incoveniente de que la cadena de variables deve de iniciar con un "&", ahora podra inciar con el nombre 
+  de la primera variable sin antemponer el "&", al igual forma queda funcional si se agrega este, pero ya no será requerido
+ JFDA.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
function string2vars(cad)
{
	var vars= new Array();//declaro vars como arreglo
	if(cad.charAt(0)!="&")cad="&"+cad;
	vars=cad.split('&');//divido cad por los "&" enctrodo y el resultado se lo asigno a vars
	var variables=new Array();//declaro el arreglo variables como un nuevo arreglo
	for(i=0;i<vars.length;i++)//esto se repitira para todos los elementos de vars
	{
		variablesEnVars=vars[i].split('=');//divido el varlo de vars[i] por el '=' para optner indice/valor
		if(variablesEnVars[0].substring(variablesEnVars[0].length-2)=='[]')//verifico si el indice termina en "[]" esto me indica que seria o no un arreglo
		{
			arreglo=variablesEnVars[0].substring(0,variablesEnVars[0].length-2);//optengo el nombre del indice que sera el arrelgo quitando las "[]"
			if(variables[arreglo]==undefined)//veo si variables[arrelgo] esta definido si no lo esta esta intruccion dara verdadero
			{
				variables[arreglo]=new Array();//declaro variables arreglo 
				numero=0;				
			}
			else
				numero=variables[arreglo].length;				
			variables[arreglo][numero]=variablesEnVars[1];
		}
		else		
			variables[variablesEnVars[0]]=variablesEnVars[1];
	}
	return variables;
}	
//cad="uno[]=1&uno[]=2&dos=2&tres=3&cuatro[]=cuatro&cuatro[]=4";
//string2vars(cad);
//alert(variables['cuatro'][0]);




var objxml=objXml();



