// Parametros:
//   pField = Campo do formulário
//   pFieldName = Nome do campo para ser exibido na mensagem de erro
//   pCriteria =
//      'int' = inteiro
//      'dec[;n]' = decimal (opcionalmente com a precisao)
//      'null' = null (campo obrigatoriamente vazio)
//      'nnull' = not null (não pode ser vazio)
//      'nzero' = não pode ser 0 (no caso de decimal ou inteiro)
//      'date[;fmt]' = valida se é uma data válida
//   pShowMessage = Exibe mensagem de erro caso seja true.
// Obs: Quando a validação de números decimais é feita, a função altera
//      automáticamente no conteúdo do campo o separador decimal para
//      ponto (".") e caso tenha sido especificado o número de casas
//      decimais, trunca o número de casas decimais
//
// Exemplo:
//  // Valida o campo CampoValor do formulário MeuForm, verificando se este é
//  // numérico decimal com até 4 casas, não nulo e diferente de zero:
//  ValidateAnyField(document.MeuForm.CampoValor, "Valor", "dec;4;nnull;nzero",true)
//
function ValidateAnyField(pField, pFieldName, pCriteria, pShowMessage)
{
   vResult=true;
   pField.value=Trim(pField.value);

   vCriterios = pCriteria.split(';');
   for(vCrit=0; (vCrit<vCriterios.length) && vResult; vCrit++)
   {
      switch(vCriterios[vCrit])
      {
         case 'int':
            if (pField.value!="")
            {
               for (vCount=0;(vCount<pField.value.length) && vResult;vCount++)
                  if (!(vResult=("0123456789".indexOf(pField.value.substr(vCount,1))!=-1)))
				  		if (pShowMessage){
							alert("O campo "+pFieldName+" deve ser um valor numérico.");
							pField.select();
							pField.focus();
						}
            }
            else
               vResult = true;
            break;
         case 'nzero':
            if (pField.value!="")
            {
               vSoma = 0;
               for (vCount=0;(vCount<pField.value.length) && vResult;vCount++)
                  if ("123456789".indexOf(pField.value.substr(vCount,1))!=-1)
                     vSoma+=parseInt(pField.value.substr(vCount,1));
               if (!(vResult=(vSoma>0)))
                  	if (pShowMessage){
				  		alert("O campo "+pFieldName+" não pode ter valor zero.");
						pField.select();
						pField.focus();
					}
            }
            else
               vResult = true;
            break;
         case 'nnull':
            if (isEmpty(pField.value))
			{
				vResult=false;
               	if (pShowMessage){
					alert("O campo "+pFieldName+" não pode ser vazio.");
					pField.select();
					pField.focus();
				}
	       		break;
			}
			else
			{
				vResult=true;
				break;
			}
         case 'null':
            if (!(vResult=(pField.value=="")))
               	if (pShowMessage){
			   		alert("O campo "+pFieldName+" não deve ser preenchido.");
			   		pField.select();
					pField.focus();
				}
            break;
         case 'dec':
            if (pField.value!="")
            {
               var   intSeparadores = 0;
               for (vCount=0;(vCount<pField.value.length) && vResult;vCount++)
               {
                  if (!(vResult=("0123456789,.".indexOf(pField.value.substr(vCount,1))!=-1)))
                	  if (pShowMessage){
						alert("O campo "+pFieldName+" deve ser um valor decimal.");
					 	pField.select();
						pField.focus();
					  }
				
                  if (",.".indexOf(pField.value.substr(vCount,1))!=-1)
                     intSeparadores++;
               }
               if ((vResult) && !(vResult=(intSeparadores<2)))
               		if (pShowMessage){ 
				  		alert("O campo "+pFieldName+" não deve utilizar separadores de milhar. Use apenas um separador para a parte decimal.");
						pField.select();
						pField.focus();
					}
											
               if ((vResult) && ("0123456789".indexOf(vCriterios[vCrit+1])!=-1))
               {
                  vCrit++;
                  pField.value = pField.value.replace(/,/gi,".");
                  if (pField.value.indexOf(".")!=-1)
                     pField.value = pField.value.substring(0,pField.value.indexOf(".")+parseInt(vCriterios[vCrit])+1);
               }
            }
            else
               vResult = true;
            break;
         case 'date':
            if (pField.value!="")
            {		
            	if(!(vResult=isDateFmt(pField.value, vCriterios[vCrit+1]))){
					if (pShowMessage){ 
						alert("O campo "+pFieldName+" contêm uma data inválida.");
						pField.select();
						pField.focus();
					}
				}
				else
               		vResult = true;
            }
            else
               vResult = true;
			break;
		case 'email':
            if (pField.value!="")
            {		
            	if(!(vResult=isEmail(pField.value))){
					if (pShowMessage){ 
						alert("O campo "+pFieldName+" não contêm um endereço de e-mail válido.");
						pField.select();
						pField.focus();
					}
				}
				else
               		vResult = true;
            }
            else
               vResult = true;
			break;
		case 'selected':
			
            if (pField.selectedIndex != -1){
				if (pField[pField.selectedIndex] != ""){
					vResult = true;
				}else vResult = false; 	            				
			}else vResult = false;
			
			if (!vResult) {
				if (pShowMessage){
					alert("Selecione alguma opção do campo "+pFieldName+".");
					pField.focus();
				}
			}
      }
    }
    
    return vResult;
}

function isDateFmt( data, format ){
	var tdate, ad, rd, dm, tmpstr, pDay, pMonth, pYear;
	format = format.toUpperCase();
	pDay = format.indexOf('D');
	pMonth = format.indexOf('M');
	pYear = format.indexOf('Y');
	dm = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	data = data.toString().replace(/\-/gi, "/");
	ad = data.split('/');
	if (ad.length != format.length) return false;
	if((ad[pMonth]>=1 && ad[pMonth]<=12)==false) return false;
	if(Math.floor(ad[pYear]/4)*4==ad[pYear]) dm[1] = 29;
	if(!isNumber(ad[pYear])) return false;
	if(ad[pYear].toString().length != 4) return false;
	if((ad[pDay]>=1 && ad[pDay]<=dm[ad[pMonth]-1])==false) return false;
	for(i=0; i<ad.length; i++)
	{	
		if ((isEmpty(ad[i])) || (!isNumber(ad[i])) || (parseInt(ad[i])<0)) return false;
	}
	return true;
}

function isNumber(numero)
{
   var CaractereInvalido = false;

   for (i=0; i < numero.length; i++){
      var Caractere = numero.charAt(i);
      if(Caractere != "." && Caractere != "," && Caractere != "-"){
         if (isNaN(parseInt(Caractere))) CaractereInvalido = true;
      }
   }

   return !CaractereInvalido;
}

function isEmpty(text){
   var enter1 = "\n",
       enter2 = "\r",
       espaco = " ",
       tab = "\t";

   if (text =="") return true;

   //A verifica se o caracter selecionada possui valor vahlido
   for (var indice = 0; indice < text.length; indice++){
      if (text.charAt(indice) != espaco && 
         text.charAt(indice) != tab &&
         text.charAt(indice) != enter1 && 
         text.charAt(indice) != enter2 )
         return false;
   }
   return true;
}

function Trim(pValor){
   while ((pValor.length>0) && (pValor.substr(0,1)==' '))
      pValor = pValor.substr(1);
   while ((pValor.length>0) && (pValor[pValor.length-1]==' '))
      pValor = pValor.substr(0,pValor.length-1);
   return pValor;
}

function isEmail(text){
   var 	arroba = "@",
       	ponto = ".",
	   	posponto = 0,
	   	posarroba = 0;
	
	 if (text =="") return false;
	
	 for (var indice = 0; indice < text.length; indice++){
	 	if (text.charAt(indice) == arroba) {
	 		posarroba = indice;
	      	break;
		 }
	 }
	
	for (var indice = posarroba; indice < text.length; indice++){
		if (text.charAt(indice) == ponto) {
			posponto = indice;
	     	break;
		}
	}
   
	if (posponto == 0 || posarroba == 0) return false;

	if (posponto == (posarroba + 1)) return false;
	
	if ((posponto + 1) == text.length) return false;
		
	return true;
}