//****************************************************  validar requerido  ****************************************************//
function requerido(formu)
  {
    var e;
	var tt;
	var mas;
	var uno = 1;
	var recur;

    for (var i=0;i<formu.elements.length;i++)
	  {
		e = formu.elements[i];
		mas = 0;
	do{
   		tt = e.id.substr(0+mas,1);
		recur = false;
		//alert(tt+" "+e.name);
		 switch (tt) 
		{ 
		   case "1" :  // requerido
		     if ((e.value.length==0)||(e.value=='~any~'))
			  {
		         alert(e.id.substr(1,e.id.length-uno)+" no puede estar vacio");
		         e.focus();
		         return (false);			  
			  }
			 break;
		  case "D" : //fecha
		    // if (!validator_date(e,'dd/mm/aaaa',e.id.substr(1+mas,e.id.length-1))) return(false); //esto estaba antes q lo de abajo
		    var nombre_b = new String
			(e.id.indexOf("/")==-1)?nombre_b=e.id.substr(1+mas,e.id.length-1):nombre_b=valor.substring(1+mas,valor.indexOf("/")-2);
			if (!validator_date(e,'dd/mm/aaaa',nombre_b)) return(false);
			break;
		  case "E" :  //emails
		    if (!esEmail(e))
			  return(false);
			break;
		  case "N" :  //para los numericos
            if (!esNumero(e)) return(false);
            break;
		  case "H" :  //para la hora
            if (!esHora(e)) return(false);		    
		    break;
	      case "S" :  //para los alfanumericos
	        if(!esAlfanumerico(e)) return(false);
	        break;
		  case "X": // requerido y tipo xxxxxx
		     if ((e.value.length==0)||(e.value=='~any~'))
			  {
(e.id.substr(1,1)=="D")?alert (e.id.substring(2,e.id.indexOf("/")-2)+" no puede estar vacio"):alert(e.id.substr(2,e.id.length-uno)+" no puede estar vacio");
		         e.focus();
		         return (false);			  
			  }
			  mas++;
			  recur = true;
			 break;
		}//fin del switch
	}while(recur);
	  }
	return (true);
  }
 //*********************************************** validador alfanumerico ********************************************************//
 function esAlfanumerico(w)
{
if (!vacio(w))
{
    for (var i = 0; i < w.value.length; i++) 
  {  
    var ww = w.value.charAt(i);
    if (alfanumerico.indexOf(ww) == -1) return advertencia(w,'Este campo no admite los caracteres '+ww);
  }
}
  return true;
}

//**************************************************  validador numerico   ********************************************************//
var numeros = "0123456789"
function esNumero(w)
{
if (!vacio(w))
{
    for (var i = 0; i < w.value.length; i++) 
  {  
    var ww = w.value.charAt(i);
    if (numeros.indexOf(ww) == -1) return advertencia(w,'Escriba Solo Numeros');
  }
  }
  return true;
}
  
//*********************************************** validator_email  **************************************************************// 

function esEmail(w)
  {
    w44 = new String(w.value);
	if (w.value.lastIndexOf(";")==-1)
	{ 
	
    if (blanco(w.value)) return advertencia(w,msg_blanco)
    else
	 if (!email(w)) return advertencia(w,msg_arroba)
	else if (!dominio(w)) return advertencia(w,msg_dominio)
	return true;
	
	}
	else
	{
		w2 = w;
		splitString = w.value.split(";");
		var tipo_error="";
		for (var i=0;i<= w2.value.split(";").length;i++)
		 {
		    en = new String(splitString[i]);
			w.value = en;
		    if (blanco(en)) 
		      {
		        tipo_error="1";
		        break;
		       }
		    else
		      {
		        if (!email(w)) 
		          {
		            tipo_error="2";
		            break;
		          }
			    else if (!dominio(w))
			      {
			        tipo_error="3";
			        break;
			      }
			   }
		  }//end del for
		
	
		if (tipo_error!="")
		  {
		    switch (tipo_error)
		      {
		        case "1":
		          alert(msg_blanco);
		          w2.value=w44;
		          w2.focus();
		          break;
		        case "2":
		          alert(msg_arroba+' '+"'"+w2.value+"'");
		          w2.value=w44;
		          w2.focus();
		          break;
		        case "3":
		          alert(msg_dominio);
		          w2.value=w44;
		          w2.focus();
		          break;
		      }
		    
		    return false;
		  }//fin de tipo_error
		w.value = w44;
		return true;
	}
  }

//************************************************ validator_date ****************************************************************//
function validator_date(valor,formato,name)
  {

  var fecha_condicion="";
  var condicion="";
  
  var barra = name.indexOf("/");
  if (barra != -1)
    {
	  fecha_condicion=name.substr(name.indexOf("/")-2,10);
	  condicion=name.substr(name.lastIndexOf("/")+5);
	  name=name.substring(0,name.indexOf("/")-2)
	  //return false;
	}
	w = valor;
    rExp = /[0-9]/gi;
	
if (w.value.length == 0)
{
  return(true)
}

((formato=='dd/mm/aaaa')||(formato=='dd/mm/yyyy'))?tipe="lat":tipe="ame";

  if (w.value.length != 10)
  {
    alert("El formato para el campo "+name+" es "+formato);
    w.focus();
	w.select();	
	return(false);
  }
 
  fecha=w.value
  dia=fecha.substr(0,2)
  mes=fecha.substr(3,2)
  if (tipe=="ame")
    {
	  var aux = dia;
	      dia = mes;
		  mes = aux; 
	}
  ano=fecha.substr(6,4)
  s1=fecha.substr(2,1)
  s2=fecha.substr(5,1)

  rExp1= /[/]/gi
//************************************ dia  *****************************************//  
if (rExp.test(dia))
{
  myString = new String(dia)
  results = myString.match(rExp)
  www=results.length
}
else
{
  www=0
}
if (www!=2)
  {
    (tipe=="lat")?alert("Debe escribir numeros en día"):alert("Debe escribir numeros en mes");
	w.focus();
	w.select();	
	return(false);
  }
 else {
 }//fin del else
  
  
if (s1.search(rExp1)==-1)
{
    alert("falta / despues de '"+dia+"'");
	w.focus();	
	w.select();	
	return(false);
}  


//************************************ mes  *****************************************//
  //this.lista.Asunto_extracto.value=rExp.test(mes)
  llopa=rExp.test(mes)
if ((rExp.test(mes))||(mes<=12)||(mes>=1))  // la verdad que desconozco porque esto es asi con   !
{
  myString = new String(mes)
  results = myString.match(rExp)
  www=results.length
//  this.lista.txtpartes.value="bueno mes"+www
}
else
{
  www=0
//  this.lista.txtpartes.value="malo mes"+www
}
//  this.lista.txttitulo.value=mes
  
if (www!=2)
  {
    (tipe=="lat")?alert("Debe escribir numeros en mes"):alert("Debe escribir numeros en día");
	w.focus();	
	w.select();	
	return(false);
  }
if (s2.search(rExp1)==-1)
{
    alert("Falta / despues de '"+mes+"'");
	w.focus();	
	w.select();	
	return(false);
}    

//************************************ año  *****************************************//
if (rExp.test(ano))
{
  myString = new String(ano)
  results = myString.match(rExp)
  www=results.length
}
else
{
  www=0
}
if (www!=4)
  {
    alert("Escriba numeros en año ");
	w.focus();	
	w.select();	
	return(false);
  }  
  
 if ((mes>12)||(mes<1))
 {
    alert("Debe escribir un numero entre 01-12 para el mes");
	w.focus();
	w.select(4,2);	
	return(false); 
 }
 
 d=new Date()
 anno=d.getFullYear();//+1
 mees=d.getMonth();
 diia=d.getDate();
 ano_minimo = 2000;
 
  if ((ano>anno)||(ano<ano_minimo))
 {
    if (ano==anno+1)
	  {
	    var cuantos_meses_hacia_adelante = 3;
  		    cuantos_meses_hacia_adelante = cuantos_meses_hacia_adelante * 30;
        var tonto = new Number;
		var d1 = new Date()
		var d2 = new Date(ano, mes-1, dia);
		    diff = d2-d1;
            mtg = new String(diff/86400000)    //calculate days and convert to string
            point=mtg.indexOf(".")    //find the decimal point
            days=mtg.substring(0,point)    //get just the whole days
		if (days>=cuantos_meses_hacia_adelante)
		{
		    
		    var df = new Date(Number(d1)+(Number(cuantos_meses_hacia_adelante)*86400000));
			((Number(df.getMonth())+1)<10)?oiuoiu="0"+((Number(df.getMonth())+1)):oiuoiu=(Number(df.getMonth())+1);
		    alert("La fecha no puede ser mayor a "+df.getDate()+"/"+oiuoiu+"/"+df.getFullYear());
			w.focus();
			w.select();	
			return(false); 
	    }
	  }
	else
	  {
	    alert("Debe escribir un numero entre "+ano_minimo+"-"+anno+" para el año");
		w.focus();
		w.select();	
		return(false); 
	  }
 }


//aqui tambien va la function que saca el diamayor
 dia_mayor=ultimo_dia_mes(mes,ano)
 
 if ((dia>dia_mayor)||(dia<1))
 {
    alert("Debe escribir un numero entre 01-"+dia_mayor+" para el día");
	w.focus();
	w.select();
	return(false); 
 }  

 if (!comparar_fechas(w,w.value,condicion,fecha_condicion)) return (false);

return (true);  
  }

//*************************************************** pregunta *******************************************************************//
function pregunta() {
  return (confirm('Esta seguro?'));
}

//*************************************************** rutinas del validador *******************************************************//
var msg_blanco = "This field cant'n be empty.";
var msg_arroba = 'Omitio un @ en la dirección de e-Mail';
var msg_letras = 'Unicamente Caracteres.';
var msg_dominio = 'No es un dominio.';
var msg_mas_arroba = 'Unicamente un @';
var msg_arroba = 'Dirección e-Mail inválida';
var acentos ="áéíóúÁÉÍÓÚÀÈÌÒÙàèìòùäëïöüÄËÏÖÜ";
var espacio = " ";
var letras_g_n = "Ñ";
var letras_p_n = "ñ";
var caracteres = "#$%&^`´~@¬|°¨_.,;:"+"<=>{}[]()/*-+"+"!¡¿?"
var caracteres_email="@.-_"
var dominioswww = "/.com/.net/.org/.edu/.mil/.gov/.int/";
var paises = "/.ac/.ad/.ae/.af/.ag/.ai/.al/.am/.an/.ao/.aq/.ar/.as/.at/.au/.aw/.az/.ba/.bb/.bd/.be/.bf/.bg/.bh/.bi/.bj/.bm/.bn/.bo/.br/.bs/.bt/.bv/.bw/.by/.bz/.ca/.cc/.cd/.cf/.cg/.ch/.ci/.ck/.cl/.cm/.cn/.co/.cr/.cu/.cv/.cx/.cy/.cz/.de/.dj/.dk/.dm/.do/.dz/.ec/.ee/.eg/.eh/.er/.es/.et/.fi/.fj/.fk/.fm/.fo/.fr/.ga/.gd/.ge/.gf/.gg/.gh/.gi/.gl/.gm/.gn/.gp/.gq/.gr/.gs/.gt/.gu/.gw/.gy/";
	paises += "/.hk/.hm/.hn/.hr/.ht/.hu/.id/.ie/.il/.im/.in/.io/.iq/.ir/.is/.it/.je/.jm/.jo/.jp/.ke/.kg/.kh/.ki/.km/.kn/.kp/.kr/.kw/.ky/.kz/.la/.lb/.lc/.li/.lk/.lr/.ls/.lt/.lu/.lv/.ly/.ma/.mc/.md/.mg/.mh/.mk/.ml/.mm/.mn/.mo/.mp/.mq/.mr/.ms/.mt/.mu/.mv/.mw/.mx/.my/.mz/.na/.nc/.ne/.nf/.ng/.ni/.nl/.no/.np/.nr/.nu/.nz/.om/.pa/.pe/.pf/.pg/.ph/.pk/.pl/.pm/.pn/.pr/.ps/.pt/.pw/.py/";
	paises += "/.qa/.re/.ro/.ru/.rw/.sa/.sb/.sc/.sd/.se/.sg/.sh/.si/.sj/.sk/.sl/.sm/.sn/.so/.sr/.st/.sv/.sy/.sz/.tc/.td/.tf/.tg/.th/.tj/.tk/.tm/.tn/.to/.tp/.tr/.tt/.tv/.tw/.tz/.ua/.ug/.uk/.um/.us/.uy/.uz/.va/.vc/.ve/.vg/.vi/.vn/.vu/.wf/.ws/.ye/.yt/.yu/.za/.zm/.zr/.zw/";
var buen_www = dominioswww + paises;
var espacio = " ";

var numeros = "0123456789";
var letras_g = "QWERTYUIOPLKJHGFDSAZXCVBNM";
var letras_p = "qwertyuioplkjhgfdsazxcvbnm";
var caracteres_email="@.-_";
var letras = letras_g+letras_p+letras_g_n+letras_p_n+espacio;
var alfanumerico = letras+numeros+caracteres+acentos+espacio+caracteres;
var letras_email =letras_g+letras_p+caracteres_email+numeros;

function advertencia(w,texto)
{
  alert(texto);
  w.focus();
  w.select();
  return false;
}

function vacio(w)
  {
	return ((w == null) || (w.length == 0));
  }


function blanco(w)
{
     if (vacio(w))
	 { 
	   return false;
	 }
	 else
	 {
       for (var i = 0; i < w.length; i++) 
	     {  
           var ww = w.charAt(i);
           if (espacio.indexOf(ww) == -1) return false;
         }
      }
  return true;
}


function b_puntos(w)
{
  var arroba=w.value.indexOf("@");
  if (arroba == -1) return false;
   var sdom = w.value.substring(arroba+1, w.value.length);
   var result=sdom.match(/[.]/g);   
   var p_s=sdom.lastIndexOf(".");
   if (p_s==-1)return false;
   var hjy = sdom.substring(p_s,sdom.length);
   if (hjy.length==4) 
    {result.length=1;}
   if(result.length>0)
   {
   if (result.length==2)
     {
        despues=sdom.substring(p_s, sdom.length);
	    antes=sdom.substring(0,p_s);   
	    p_s=antes.lastIndexOf(".");
        var pre = antes.substring(0,p_s);	 
        if (vacio(pre)) return false;		
	    antes=antes.substring(p_s, antes.length);
     }
     else if (result.length==1)
       {
	     var pre = sdom.substring(0,p_s)		 
         if (vacio(pre)) return false;		 
         despues=sdom.substring(p_s, sdom.length);
       }
       else if (result.length>2)
         {
            despues=sdom.substring(p_s, sdom.length);
	        antes=sdom.substring(0,p_s);   
	        p_s=antes.lastIndexOf(".");
	        var pre = antes.substring(0,p_s);
            if (vacio(pre)) return false;		  		   			
	        antes=antes.substring(p_s, antes.length);
         }
	}
	else {return false};
			
	if (result.length==1)
	{
   	  if ((paises.indexOf("/" + despues + "/") == -1)&&(dominioswww.indexOf("/" + despues + "/") == -1)) return false;
/*
      asi estaba antes, pero ahora puede existir una direccion que termine en un pais. Ejm: xxxx@yahoo.es
	  if (dominioswww.indexOf("/" + despues + "/") == -1) return false;
*/	  
	}
	else if (result.length>=2)
	{
   	  if ((paises.indexOf("/" + despues + "/") == -1)&&(dominioswww.indexOf("/" + despues + "/") == -1)) return false;
	  
	/* asi estaba antes, ahora esta como arriba para que acepte direcciones como yguerrer@brn.reacciun.ve
   	  if (paises.indexOf("/" + despues + "/") == -1) return false;
 	  if (dominioswww.indexOf("/" + antes + "/") == -1) return false;
	  */
	}
	return true;
}



function ver_letras(w)
{
  for (var i = 0; i < w.value.length; i++) 
  {  
    var ww = w.value.charAt(i);
    if (letras_email.indexOf(ww) == -1) return false;
  }
  return true;
}

function dominio(w) {
	var domidx = w.value.lastIndexOf(".");
	var dom = w.value.substring(domidx);
	var dom_lc = dom.toLowerCase();
	if (buen_www.indexOf("/" + dom_lc + "/") == -1) return false;
	return true;
}

function email(w)  
{
if (w.value.length!=0)
{

  var arroba=w.value.indexOf("@");
  if (arroba == -1) return false;  

  var results=w.value.match(/@/g); 
  if (results.length!=1)return advertencia(w,msg_mas_arroba);

  var semail = w.value.substring(0, arroba);
  var sdominio = w.value.substring(arroba+1, w.value.length);
  if (blanco(semail)) return false;
  if (blanco(sdominio)) return false;
  if (!b_puntos(w)) return false;
  if (!ver_letras(w)) return false;
  }
	return true;
}

function esHora(w,reque)
{
  if (w.value.length == 0)
    {
       return(true)
    }
	
  if (w.value.length != 5)
    {
      alert("El campo hora debe tener el formato hh:mm");
      w.focus();
	  w.select();	
	  return(false);
    }
	
	  time=w.value
      hora=time.substr(0,2)
      minuto=time.substr(3,2)
      dos_puntos=time.substr(2,1)
	  
	  rExp = /[0-9]/gi
      rExp1= /[:]/gi
//************************************ HORA  *****************************************//  
      if (rExp.test(hora))
        {
          myString = new String(hora)
          results = myString.match(rExp)
          www=results.length
        }
      else
        {
          www=0
        }

    if (www!=2)
      {
         alert("Debe escribir numeros en 'hh'");
	     w.focus();
	     w.select();	
	     return(false);
      }
 else {
 }//fin del else
  
  
    if (dos_puntos.search(rExp1)==-1)
      {
	    alert("despues de hh viene ':'");
		w.focus();	
		w.select();	
		return(false);
      }  

	  if ((rExp.test(minuto))||(minuto<=59)||(minuto>=0))
		{
		  myString = new String(minuto)
		  results = myString.match(rExp)
		  www=results.length
		}
	 else
		{
		  www=0
		}

  
		if (www!=2)
		  {
		    alert("Debe escribir numeros en 'mi'");
			w.focus();	
			w.select();	
			return(false);
		  }

     if ((hora<=0)||(hora>12))
	   {
		    alert("Debe escribir en el rango 01-12 en 'hh'");
			w.focus();
			w.select(1,2);	
			return(false);    
	   }
	   
	 if (minuto>59)
	   {
		    alert("Debe escribir en el rango 00-59 en 'mi'");
			w.focus();
			w.select(1,2);	
			return(false);    
	   }
	   
	   return(true);
}//fin de function


//************************************************  function comparar fechas *****************************************************************//

function comparar_fechas(object,tamano,condicion,currency_date)
 {
// alert(tamano+" tamano");
// alert(condicion+" condicion");
// alert(currency_date+" currency");
 
 if (((tamano.length>0)||(condicion.length>0))&&(currency_date.length==10))
   {
      dia_tamano=tamano.substr(0,2)
	  mes_tamano=tamano.substr(3,2)
	  ano_tamano=tamano.substr(6,4)
	  
	  currency_date_dia=currency_date.substr(0,2)
	  currency_date_mes=currency_date.substr(3,2)
	  currency_date_ano=currency_date.substr(6,4)

	   f2=new Date(currency_date_ano, currency_date_mes-1, currency_date_dia); //la fecha por parametro
	   f1=new Date(ano_tamano, mes_tamano-1, dia_tamano) //la fecha escrita por la pagina

//	   alert(f1+"  fue f1     "+f2+"    f2");
   switch (condicion)  //f1 admite los valores (condicion) que f2
     {
	   case "m="://mayor igual
	     if (f1<f2)
		 {
		     alert("Este campo no pude ser menor a "+currency_date);
			 object.focus();
		     object.select();
		     return(false);
		 }
	   break;
	   case "<="://menor igual
	     if (f1>f2)
		 {
		     alert("Este campo no pude ser mayor a "+currency_date);
			 object.focus();
		     object.select();
		     return(false);
		 }
	   break;
	   case "m"://mayor
	     if (f1<=f2)
		 {
		     alert("Este campo no pude ser menor o igual a "+currency_date);
			 object.focus();
		     object.select();
		     return(false);
		 }
	   break;
	   case "<"://menor
	     if (f1>=f2)
		 {
		     alert("Este campo no pude ser mayor o igual a "+currency_date);
			 object.focus();
		     object.select();
		     return(false);
		 }
	   break;
	   case "="://igual
	     if (f1!=f2)
		 {
		     alert("Este campo no pude ser distinto a "+currency_date);
			 object.focus();
		     object.select();
		     return(false);
		 }
	   break;
	   case "d"://distinto
	     if (f1==f2)
		 {
		     alert("Este campo no pude ser igual a "+currency_date);
			 object.focus();
		     object.select();
		     return(false);
		 }
	   break;
     }

   } 
   return (true);
 }//fin de function
 
 
 /****************************************** function que saca el dia mayor dependiendo del mes y año ***********************************************/
 function ultimo_dia_mes(mese,anoe)
 {
   var aux;
 if ((mese=="01")||(mese=="03")||(mese=="05")||(mese=="07")||(mese=="08")||(mese=="10")||(mese=="12"))
 {   
   aux=31;
 }

 if ((mese=="04")||(mese=="06")||(mese=="09")||(mese=="11"))
 {
	  aux=30;
 }
	  
 if (mese=="02")
  {
    if (((anoe % 4==0)&&(anoe % 100!=0))||(anoe % 400==0))
	   {
	     aux=29;
	   }
	 else
	 {
         aux=28; 
	 }  
  }  
  return(aux);
 }//fin de la function

