//**************************************************************************************************************************
//  RUTINAS DE VALIDACION
//**************************************************************************************************************************
//
//  CheckNull			(Verifica si el contenido del campo es vacio.)
//  ValidChars			(Verifica si el contenido del campo posee carat&eacute;res v&aacute;lidos, seg&uacute;n el juego de caract&eacute;res)
//  MinMaxChars		  	(Verifica la cantidad de caract&eacute;res que puede poseer el campo, dentro de un rango deseado)
//  MinMaxVals			(Verifica el valor que puede tomar el campo, dentro de un rango deseado)
//  MinMaxWords		  	(Verifica la cantidad de palabras que puede poseer el campo, dentro de un rango deseado)
//  MinMaxChecked	  	(Verifica que se encuentren una cierta cantidad de opciones marcadas)
//  CheckIP				(Valida el formato de un n&uacute;mero IP ingresado)
//  CheckURL			(Valida el formato de una direcci&oacute;n URL ingresada)
//  CheckMail				  (Valida el formato de una direcci&oacute;n de mail ingresada)
//  CheckDate		  	  (Verifica que el formato de la fecha ingresada sea correcto/v&aacute;lido)    (en otro archivo)
//  ValidDateRange	  (Verifica que el rango entre dos fechas sea correcto) (la 1er fecha debe ser menor a la 2da)
//  ValidateDate			  (Verifica que la fecha ingresada sea correcta)
//
//**************************************************************************************************************************

var sMsg
var sAlpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ";
var sAlphaExt  = "ÁÉÍÓÚÑÄËÏÖÜÂÊÎÔÛ &aacute;&eacute;&iacute;&oacute;&uacute;&ntilde;äëïöüâêîôû .' ";
var sNumeric = "1234567890";
var sUsuario = sAlpha + sNumeric + "-_";
var sMail = sUsuario + ".@;";
var sTel = sNumeric + "-() ";
var sTextoLibre = sAlpha + sAlphaExt + sNumeric + "?¿/()=\-_[]{}:.·~&%#@.&ntilde;Ñ,¡!";
var sHora =  sNumeric + ":";
var sFecha = sNumeric + "/-";
var sClima = sNumeric + ".-ºCc% ";
var sMoneda = sNumeric + ".$€uUsS";
var sURL = sAlpha + sNumeric + ":/~#-_?&.=%+";
var sNombre = sAlpha + sAlphaExt;
var sIP = sNumeric + ".";
var sTLD1 = "AC,AE,AF,AG,AI,AL,AM,AN,AO,AQ,AR,AM,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,CF,CG,CH,CI,CK,CL,CM,CN,CO,CR,CS,CU,CV,CX,CY,CZ,DE,DJ,DK,DM,DO,DZ,EC,EE,EG,EH,ER,ES,ET,FI,FJ,FK,FM,FO,FR,FX,GA,GB,GD,GE,GF,GH,GI,GL,GM,GN,GP,GQ,GR,GS,GT,GU,GW,GY,HK,HM,HN,HR,HT,HU,ID,IE,IL,IN,IO,IQ,IR,IS,IT,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,MI,MZ,NA,NC,NE,NF,NG,NI,NL,NO,NP,NR,NT,NU,NZ,OM,PA,PE,PF,PG,PH,PK,PL,PM,PN,PR,PT,PW,PY,QA,RE,RO,RU,RW,SA,SB,SC,SD,SE,SG,SH,SI,SJ,SK,SL,SM,SN,SO,SR,ST,SU,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 sTLD2 = "COM,EDU,GOV,INT,MIL,NET,ORG,AERO,BIZ,COOP,INFO,INT,MUSEUM,NAME,PRO, TELECOM"

function LTrim(str){
	for(var i=0;str.charAt(i)==" ";i++);
	return str.substring(i,str.length);
}

function RTrim(str){
	for(var i=str.length-1;str.charAt(i)==" ";i--);
	return str.substring(0,i+1);
}

function Trim(s){
	return LTrim(RTrim(s));
}



//****************************************************************************************************************
// CheckNull (Verifica si el contenido del campo es vacio.)
//****************************************************************************************************************
function CheckNull(campo, nombre)	{

var valor = Trim(campo.value)

if (valor.length == 0)  {	
   sMsg = "Debe completarse el campo: '" + nombre + "'.";
   campo.focus();
   return(true);   }
else  {
   return(false);  }
}









//****************************************************************************************************************
// ValidChars (Verifica si el contenido del campo posee carat&eacute;res v&aacute;lidos, seg&uacute;n el juego de caract&eacute;res)
//****************************************************************************************************************
function ValidChars(param, juego, nombre) {

checkStr = param.value;
for (i = 0;  i < checkStr.length;  i++)
   if ( juego.indexOf(checkStr.charAt(i)) < 0) {
     sMsg = "El campo '" + nombre + "' contiene caracteres no v&aacute;lidos.";
	 param.focus();
	 return(false);
	}

return(true);
}









//***********************************************************************************************************************
// MinMaxChars (Verifica la cantidad de caract&eacute;res que puede poseer el campo, dentro de un rango deseado)
//***********************************************************************************************************************
function MinMaxChars(param, valMin, valMax, nombre) {

checkStr = param.value;
if ((checkStr.length < valMin) && (valMin != null)) {
   sMsg = "El campo '" + nombre + "' debe poseer un m&iacute;nimo de " + valMin + " caracteres.";
   param.focus();
   return(false);  }
if ((checkStr.length > valMax) && (valMax != null)) {
   sMsg = "El campo '" + nombre + "' debe poseer " + valMax + " caracteres como m&aacute;ximo.";
   param.focus();
   return(false);  }

return(true);
}









//***********************************************************************************************************************
// MinMaxWords (Verifica la cantidad de palabras que puede poseer el campo, dentro de un rango deseado)
//***********************************************************************************************************************
function MinMaxWords(param, valMin, valMax, nombre) {

	checkStr = param.value;

	var i=0;
	var WordsNumber=1;

	while(i<=checkStr.length) {
		if (checkStr.substring(i,i+1) == " ") {
			WordsNumber++;
			i++; 		}
		if (checkStr.substring(i,i+1) == "\n") {
			WordsNumber++;
			i++;		}
		i++;
	}

if ((WordsNumber < valMin) && (valMin != null)) {
   sMsg = "El campo '" + nombre + "' debe poseer un m&iacute;nimo de " + valMin + " palabras.";
   param.focus();
   return(false);  }
if ((WordsNumber > valMax) && (valMax != null)) {
   sMsg = "El campo '" + nombre + "' debe poseer " + valMax + " palabras como m&aacute;ximo.";
   param.focus();
   return(false);  }

return(true);
}









//***********************************************************************************************************************
// MinMaxVals (Verifica el valor que puede tomar el campo, dentro de un rango deseado)
//***********************************************************************************************************************
function MinMaxVals(param, valMin, valMax, nombre) {

checkStr = param.value;
if ((checkStr < valMin) && (valMin != null)) {
   sMsg = "El campo '" + nombre + "' debe ser mayor a " + valMin + ".";
   param.focus();
   return(false);  }
if ((checkStr > valMax) && (valMax != null)) {
   sMsg = "El campo '" + nombre + "' debe ser menor a " + valMax + ".";
   param.focus();
   return(false);  }

return(true);
}









//***********************************************************************************************************************
//  CheckIP (Valida el formato de un n&uacute;mero IP ingresado)
//***********************************************************************************************************************
function CheckIP(param)  {

var checkStr = param.value;
var vectorIP = checkStr.split(".");

if (!ValidChars(param, sIP)) {
	param.focus();
	return(false);	 }
if (!MinMaxChars(param,7,15))  {
    param.focus();
	return(false);  }
if (	(vectorIP.length != 4) || (vectorIP[0] == 0) ||
		(vectorIP[0] == "") || (vectorIP[0] > 255) ||	(vectorIP[1] == "") || (vectorIP[1] > 255) ||
		(vectorIP[2] == "") || (vectorIP[2] > 255) ||	(vectorIP[3] == "") || (vectorIP[3] > 255) ||
		((vectorIP[0] == 0) && (vectorIP[1] == 0) && (vectorIP[2] == 0) && (vectorIP[3] == 0)) ||
		((vectorIP[0] == 255) && (vectorIP[1] == 255) && (vectorIP[2] == 255) && (vectorIP[3] == 255))   )  {
	sMsg = "La direcci&oacute;n IP no tiene un formato v&aacute;lido.";
    param.focus();
	return(false);  }

return(true);
}









//***********************************************************************************************************************
// CheckURL (Valida el formato de una direcci&oacute;n URL ingresada)
//***********************************************************************************************************************
function CheckURL(param) {

var checkStr = param.value;
checkStr = checkStr.toLowerCase();

if (!ValidChars(param, sURL)) {
	param.focus();
	return(false);	 }
if ((checkStr.indexOf("http://") < 0) && (checkStr.indexOf("https://") < 0)) {
   sMsg = "La direcci&oacute;n URL debe comenzar con \"http://\" o \"https://\"";
   param.focus();
   return(false);  }
if ((checkStr.indexOf("@") >= 0) || (checkStr.indexOf("./") >= 0) || (checkStr.indexOf("/.") >= 0) || (checkStr.indexOf(".") <= 0) ||
	(checkStr.indexOf("http://wwww") >= 0) || (checkStr.indexOf("_/") >= 0) || (checkStr.indexOf("/_") >= 0) ||
	(checkStr.indexOf("..") >= 0) || (checkStr.indexOf("///") >= 0) || (checkStr.indexOf("/-") >= 0) || (checkStr.indexOf("-/") >= 0) ||
	(checkStr.indexOf(".") == checkStr.length-1)  || (checkStr.toUpperCase() == "HTTP://")  || (checkStr.toUpperCase() == "HTTPS://"))  {
   sMsg = "La direcci&oacute;n URL no tiene un formato v&aacute;lido.";
   param.focus();
   return(false);  }

return(true);
}









//***********************************************************************************************************************
// CheckMail (Valida el formato de una direcci&oacute;n de mail ingresada)
//***********************************************************************************************************************
function CheckMail(param, nombre) {

var checkStr, i, server, largo
checkStr = param.value;

if (checkStr.indexOf(";") <= 0)  {

	largo = checkStr.length;
	vectorMail = checkStr.split("@");
	if (!ValidChars(param, sMail, nombre)) {
		return(false);	 }
	if (vectorMail.length != 2) {
	   sMsg = "La dirección de email debe contener un caracter @";
	   param.focus();
	   return(false);	}
	server = vectorMail[1];
	if ((checkStr.indexOf("@") == 0) || (checkStr.indexOf(".@") >= 0) || (checkStr.indexOf("-@") >= 0) ||
	   (checkStr[0] == ".") || (checkStr[checkStr.length-1] == ".") || (server == "") || (checkStr.indexOf("@-") >= 0) ||
	   (checkStr.indexOf("@.") >= 0) || (checkStr.length < 5) || (server.indexOf(".") < 0) || (checkStr.indexOf(".") == checkStr.length-1)) {
	   sMsg = "La dirección de email no tiene un formato válido.";
	   param.focus();
	   return(false);  }

	var vectorTLD = vectorMail[1].split(".");
	var parte1TLD = vectorTLD[1];


	if (
		(sTLD1.indexOf(parte1TLD.toUpperCase())<0) && (sTLD2.indexOf(parte1TLD.toUpperCase())<0)
		) {
	  sMsg = "La dirección de email no tiene un formato válido.";
	  param.focus();
	  return(false);  }

	if (vectorTLD.length>2)
	{
		var parte2TLD = vectorTLD[2];
		if (
			(sTLD1.indexOf(parte2TLD.toUpperCase())<0) && (sTLD2.indexOf(parte2TLD.toUpperCase())<0)
			) {
		 sMsg = "La dirección de email no tiene un formato válido.";
	     param.focus();
		 return(false);  }
	}
	return(true);
}
else
  {
	return(true);
  }
}


//***********************************************************************************************************************
//  CheckManyMails	  (Valida m&aacute;s de un mail, utilizando la funci&oacute;n de arriba)
//***********************************************************************************************************************
function CheckManyMails(param, nombre)  {
var valor = param.value
if (valor.indexOf(";") <= 0)
  {
	return(ChequeaMail(param,nombre));
  }
else
  {
	var vectorMails = valor.split(";");
	alert(vectorMails.length);
	if (vectorMails.length<2)
	  {
		sMsg = "La direcci&oacute;n de mail no tiene un formato v&aacute;lido.";
	    param.focus();
		return(false); 
	  }
	else
	  {
		for (i=0;vectorMails.length-1;i++)
		{
			var mail = ChequeaMail(vectorMails[i], nombre);
			if (!mail)	{
   	            param.focus();
				return(false);
			}
		}
	  }
  }
}



//***********************************************************************************************************************
//  isNumber (Determina si lo ingresado es un Numero)
//***********************************************************************************************************************
function isNumber(param)  {

var checkStr = param.value;

	if (ValidChars(param, sNumeric))  {
		return (true); }
	else {
   	    param.focus();
		return(false);
	}
}









//***********************************************************************************************************************
//  MinMaxChecked	  (Verifica que se encuentren una cierta cantidad de opciones marcadas)
//***********************************************************************************************************************
function MinMaxChecked(param, valMin, valMax, nombre)  {
var cantidad = 0;
if (typeof(param)!='undefined')
{
	if (typeof(param.length)=='undefined')
	{
	  if ((!param.checked) && (valMin==1))
	  {
		sMsg = "El campo '" + nombre + "' debe estar seleccionado.";
		return(false);
	  }
	  else
		return(true);
	}
	else
	{
		for (i=0; i<param.length; i++)
			  if (param[i].checked)	{ cantidad++; }
	
		if ((cantidad < valMin) && (valMin != null))
		{
		   if (valMin == 1)
			 {	sMsg = "El campo '" + nombre + "' debe tener como m&iacute;nimo " + valMin + " casillero seleccionado.";   }
		   else
			 {  sMsg = "El campo '" + nombre + "' debe tener como m&iacute;nimo " + valMin + " casilleros seleccionados.";  }
		   return(false);
		}
		if ((cantidad > valMax) && (valMax != null)) {
		   sMsg = "El campo '" + nombre + "' puede tener un m&aacute;ximo de " + valMax + " casilleros seleccionados.";
		   return(false);  }
	
		return(true);
	}
}
else

	return(false);
	

}







//***********************************************************************************************************************
//  CheckDate (Verifica que el formato de la fecha ingresada sea correcto/v&aacute;lido)
//***********************************************************************************************************************
function CheckDate(pdia, pmes, panio)  {

var maxval;
var mes = new Array(12);
var mesValido = false;
var m = pmes.value;
var anio = panio.value;

if ( (!ValidChars(pdia, sNumeric)) || (!ValidChars(pmes, sNumeric+sAlpha)) || (!ValidChars(panio, sNumeric)))	 {
	sMsg = "La fecha ingresada contiene caract&eacute;res no v&aacute;lidos.";
	return(false);	 }

mes[0] = "enero";
mes[1] = "febrero";
mes[2] = "marzo";
mes[3] = "abril";
mes[4] = "mayo";
mes[5] = "junio";
mes[6] = "julio";
mes[7] = "agosto";
mes[8] = "septiembre";
mes[9] = "octubre";
mes[10] = "noviembre";
mes[11] = "diciembre";

if (!isNumber(pmes))	{
  m = m.toLowerCase();
  for (i=0; i<12; i++)  {
	if (mes[i] == m)
		{
		mesValido = true;
		mes = i+1;
		break;
		}
  }
}
else
{
  if (MinMaxVals(pmes, 1, 12))
	 {
	 mesValido = true; 
	 mes = pmes.value;
	 switch (mes)	
		{
			case "1", "3", "5", "7", "8", "10", "12":
					maxval = 31;
					break;
			case "2":
					if (anio % 4 == 0)
						{ maxval = 29; }
					else
						{ maxval = 28; }
					break;
			default:
					maxval = 30;
					break;
		}
	 }
}


if (anio < 100) {
	if ((!mesValido) || (!MinMaxVals(pdia, 1, maxval)) || (!MinMaxVals(panio, 00, 99)))   {
		sMsg = "La fecha ingresada no es v&aacute;lida.";
		return(false);  }
	}
else  {
	if ((!mesValido) || (!MinMaxVals(pdia, 1, maxval)) || (!MinMaxVals(panio, 1904, 3000)))   {
	sMsg = "La fecha ingresada no es v&aacute;lida.";
	return(false);  }
   }

return(true);
}





//***********************************************************************************************************************
//  ValidDateRange (Verifica que el rango entre dos fechas sea correcto) (la 1er fecha debe ser menor a la 2da)
//***********************************************************************************************************************
function ValidDateRange (strDate1, strDate2)	{
	var fecha1 = strDate1.split("/");
	var fecha2 = strDate2.split("/");

	intDia1 = fecha1[0] ;
	intDia2 = fecha2[0] ;
	intMes1 = fecha1[1] ;
	intMes2 = fecha2[1] ;
	intAnio1 = fecha1[2] ;
	intAnio2 = fecha2[2] ;

	if (	(intAnio1>intAnio2) 	||
			( (intAnio1==intAnio2) && (intMes1>intMes2) ) ||
			( (intMes1==intMes2) && (intDia1>=intDia2) )		)
		{
		sMsg = "El rango de fechas ingresado no es v&aacute;lido.";
		return(false);	 }

	return (true);
}



//***********************************************************************************************************************
//  ValidateDate (Verifica que la fecha ingresada sea correcta)
//***********************************************************************************************************************
function ValidateDate(pdia, pmes, panio, nombre)
{

	var intAnio = panio.value;
	var intMes = pmes.value;
	var intDia = pdia.value;

	// Se fija si es una fecha v&aacute;lida
	// Anio es valido siempre que sea positivo
	sMsg = nombre + " debe poseer un a&ntilde;o v&aacute;lido";
    if (intAnio < 1904) return false; 
	
	sMsg = nombre + " debe poseer un mes v&aacute;lido";
	if (intMes < 1) return false;
	
	sMsg = nombre + " debe poseer un d&iacute;a v&aacute;lido";
    if (intDia < 1) return false;
	
       
    sMsg = nombre + " debe poseer un mes v&aacute;lido";
    if (intMes > 12) return false;
    
	sMsg = nombre + " debe poseer un d&iacute;a v&aacute;lido";
    
    if (intDia > 31) return false;
    
    if (intMes==2) {
       //Se fija si el anio es biciesto
          if ( !(intAnio % 4) && ( intAnio % 100 || ! (intAnio % 400)))
          { // Bisiesto
            if (intDia > 29) return false;
          } else {
            if (intDia > 28) return false;
          }           
    }
    
    if (intMes==4) {
       if (intDia > 30) return false;
    }           
    
    if (intMes==6) {
       if (intDia > 30) return false;
    }           

    if (intMes==9) {
       if (intDia > 30) return false;
    }           
		
    if (intMes==11) {
       if (intDia > 30) return false;
    }    
	return true;
}
