/**
*
* @package Rotinas de validação
*/

/**
* Retira as aspas e os apostrofos encontrados em uma string
* @param sValor string Cadeia e ser retirado dos espaços laterais
* @return string
*/

function tiraAspas(sValor)
{

  sValor = sValor.replace(/(\'|\")/gi,"");

  return trim(sValor);

}

/**
* Retira os espaços laterais contidos em uma string
* @param sValor string
* @return string
*/

function trim(sValor)
{

  sValor = sValor.replace(/^\s+/gi,"");
  sValor = sValor.replace(/\s+$/gi,"");

  return sValor;

}

/**
* Verifica se o objeto é um array
* @param obj object objeto javascript em que será testada a condição
* @return boolean
*/

function isArray(obj)
{
   return( typeof(obj.length) == "undefined" )? false : true;
}

/**
* Verifica se algum campo da caixa de seleção foi selecionado
* @param Lista objectSelect Objeto caixa de selecao
* @param valorPadrao string Valor inicial da caixa de seleção
* @param nomecampo string Nome do campo, no caso de uma mensagem de aviso
* @return void
*/

function validarSelecao(Lista,valorPadrao,nomecampo)
{
   resultado = true;

   if (
     ( Lista.selectedIndex == -1 )
     || ( Lista.options[Lista.selectedIndex].value == valorPadrao )
	  )
   {
      if ( validarSelecao.arguments.length == 2 )
      {
         nomeCampo = Lista.name;
      }
      Lista.focus();
      resultado = false;
      alert("O campo '" + String(nomecampo) + "' é de seleção obrigatória!");
   }

   return resultado;

}

/**
* Verifica se os campos do formulario do tipo TEXT,PASSWORD,TEXTAREA,RADIO e SELECT
*   foram devidamente preenchidos.
* Campos cujo o nome comece pelo caractere '_' são omitidos da verificação.
* Caso a propriedade title esteja definida, ela será usada nas mensagens de alerta
*   senão será usado o nome do campo no formulario.
* A função retorna true em caso afirmativo, senão false.
* @param formulario objectForm Objeto formulario
* @return boolean
*/

function validarFormulario(formulario)
{

  var resultado,i,j,caixaSelecao;

  ehCaixaSelecao = /^select(\-|\w)*$/i

  function existeRadioButtonMarcado(sNome)
  {

    var grupoRadioButtons = Array();

    if ( sNome != "" )
    {
      var grupoRadioButtons = formulario[sNome];
    }

    bMarcado = false;

    if ( isArray(grupoRadioButtons) )
    {
       for (j = 0;j < grupoRadioButtons.length;j++)
       {
          if ( grupoRadioButtons[j].checked )
          {
             bMarcado = true;
             break;
          }
       }
    }
    else
    {
       bMarcado = grupoRadioButtons.checked;
    }

    return bMarcado;
  }

  j = 0;
  for(i=0;i < formulario.length;i++)
  {
    if (
      ( formulario.elements[i].type == "text" ) ||
      ( formulario.elements[i].type == "password" ) ||
      ( formulario.elements[i].type == "textarea" ) ||
      ( formulario.elements[i].type == "radio" ) ||
      ( ehCaixaSelecao.test(formulario.elements[i].type) )
    )
    {
       if ( !ehCaixaSelecao.test(formulario.elements[i].type ) )
       {
         //formulario.elements[i].value = tiraAspas(formulario.elements[i].value);
         formulario.elements[i].value = trim(formulario.elements[i].value);
       }

       if ( formulario.elements[i].name.charAt(0) != "_" )
       {

         resultado = false;
         if ( formulario.elements[i].type == "radio" )
         {
            resultado = !existeRadioButtonMarcado(formulario.elements[i].name);
         }
         else if ( !ehCaixaSelecao.test(formulario.elements[i].type) )
         {
           resultado = ( formulario.elements[i].value.length == 0 );
         }
         else
         {
           caixaSelecao = formulario.elements[i];
           resultado = (
                         ( caixaSelecao.selectedIndex == -1 ) ||
                         (
                           ( caixaSelecao.selectedIndex != -1 ) &&
                           ( caixaSelecao.options[caixaSelecao.selectedIndex].value.length == 0 )
                         )
                       );
         }

         if ( resultado )
         {

            if ( formulario.elements[i].title != "" )
            {
	              nomeCampo = formulario.elements[i].title;
	           }
	           else
            {
               nomeCampo = formulario.elements[i].name;
            }

				        if ( ehCaixaSelecao.test(formulario.elements[i].type) )
				        {
						         sMsg = "O campo '" + nomeCampo + "' é de seleção obrigatória!";
				        }
				        else
				        {
						         sMsg = "O campo '" + nomeCampo + "' é de preenchimento obrigatório!";
				        }

            alert(sMsg);
            formulario.elements[i].focus();
            return false;

         }

         j++;
       }
    }
  }

  return true;

}

/**
* Verifica se pelo menos um checkbox foi selecionado no formulario.
* Retorna true em caso afirmativo, senão retorna false.
* @param formulario objectForm Objeto formulario, contido na página
* @return boolean
*/

function existeCheckboxMarcado(formulario)
{

  for(i=0;i < formulario.length;i++)
  {
    if ( ( formulario.elements[i].type == "checkbox" ) && 
         ( formulario.elements[i].name.charAt(0) != "_" ) )
    {
      if ( formulario.elements[i].checked )
      {
        return true;
      }
    }
  }

	return false;
}

/**
* Verifica se pelo menos um botao de radio foi selecionado no formulario.
* Retorna true em caso afirmativo, senão retorna false.
* @param formulario objectForm Objeto formulario
* @return boolean
*/

function existeRadioButtonMarcado(formulario)
{

  for(i=0;i < formulario.length;i++)
  {

    if ( formulario.elements[i].type == "radio" )
    {
      if ( formulario.elements[i].checked )
      {
        return true;
      }
    }

  }

  return false;

}

/**
* Verifica se pelo menos um item de uma caixa de listagem foi selecionado.
* Retorna true em caso afirmativo, senão retorna false.
* @param Lista objectSelect Objeto select de um formulario
* @return boolean
*/

function existeItemSelecionado(Lista)
{

   for(i = 0;i < Lista.options.length;i++)
   {
      if ( Lista.options[i].selected )
      {
         return true;
      }
   }

   return false;

}

/**
* Verifica se todos os grupos de radiobuttons tem uma opção selecionada.
* Retorna true em caso afirmativo, senão retorna false.
* @param formulario objectForm formulario da página
* @return boolean
*/

function todosRadioButtonMarcados(formulario)
{

  for(i=0;i < formulario.length;i++)
  {

    if ( formulario.elements[i].type == "radio" )
    {

      sNome = formulario.elements[i].name;
      var grupoRadioButtons = formulario[sNome];
      bMarcado = false;

      if ( isArray(grupoRadioButtons) )
      {
         for (j = 0;j < grupoRadioButtons.length;j++)
         {
            if ( grupoRadioButtons[j].checked )
            {
               bMarcado = true;
               break;
            }
         }
      }
      else
      {
         bMarcado = grupoRadioButtons.checked;
      }

      if ( !bMarcado ) return false;

    }

  }

  return true;

}

/**
* Verifica se valor do campo text é um e-mail válido
* Para funcionar deve ser associado a um evento onkeyup ou onkeydown do objeto.
* @param Email objectTextField Campo tipo text do formulario
* @param nomecampo string Nome do campo, que aparecerá nas mensagens de alerta
* @param required boolean Diz se o campo é requerido ou não
* @return boolean
*/

function IsValidEmail(Email,nomecampo,requerido){
   //Fonte: http://www.regular-expressions.info/email.html
   //Fonte: http://tools.ietf.org/html/rfc2822#section-3.4.1 
   //var padraoEmail = /^\w+@\w+(\.\w+)*$/i;
   var padraoEmail = new RegExp("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+(?:[A-Z]{2}|com|org|net|gov|biz|info|name|aero|biz|info|jobs|museum)\\b$","gi");
   sEmail = Email.value;

   if ( ( sEmail == "" ) && ( requerido ) )
   {
     alert("O campo '" + nomecampo + "' é de preenchimento obrigatório!");
     return false;
   }
   else if ( ( sEmail != "" ) && ( !padraoEmail.test(sEmail) ) )
   {
     Email.focus();
     alert("O valor do campo "+nomecampo+" não é um email válido.");
     return false;
   }

   return true;

}

/**
* Verifica se valor do campo text é um CEP válido, no formato 00000-000
* Para funcionar deve ser associado a um evento onkeyup ou onkeydown do objeto.
* @param CEP objectTextField Campo tipo text do formulario
* @param nomecampo string Nome do campo, que aparecerá nas mensagens de alerta
* @param required boolean Diz se o campo é requerido ou não
* @return boolean
*/

function IsValidCEP(CEP,nomecampo,requerido){

   var padraoCEP = /^4\d\.\d{3}\-\d{3}$/; // Somente Bahia
   if ( ( CEP.value == "" ) && ( requerido ) ){
     alert("O campo '" + nomecampo + "' é de preenchimento obrigatório!");
     CEP.focus();
     return false;
   }else if(CEP.value != "" ){
     if ( !padraoCEP.test(CEP.value) ){
       alert(nomecampo + " inválido!");
       CEP.focus();
       return false;
     }
   }

   return true;

}

/**
* Verifica se valor do campo text é um número real no formato moeda,
* ou seja, contendo separadores de decimal e milhar. Para funcionar
* deve ser associado a um evento onkeyup ou onkeydown.
* @param Valor objectTextField Campo tipo text do formulario
* @param nomecampo string Nome do campo, que aparecerá nas mensagens de alerta
* @param required boolean Diz se o campo é requerido ou não
* @return boolean
*/

function IsValidMoney(Valor,nomecampo,required) {

   //var moneyPat = /^\d+(,\d{2})?$/;
   var moneyPat = /^\d{1,3}(\.\d{3})*(,\d{2})?$/;


   if ( ( Valor.value == "") && ( required ) ){

     alert("O campo '" + nomecampo + "' é de preenchimento obrigatório!");
     Valor.focus();
     return false;

   }else if ( ( Valor.value != "") && ( !moneyPat.test(Valor.value) ) ){

     alert("O valor do campo "+nomecampo+" não esta em um formato válido.\nExemplos de valores válidos: 9,78  5.965,35  0,98.");
     Valor.focus();
     return false;

   }

   return true;

}

/**
* Verifica se valor do campo text é um número inteiro
* @param Numero objectTextField Campo tipo text do formulario
* @param nomecampo string Nome do campo, que aparecerá nas mensagens de alerta
* @param required boolean Diz se o campo é requerido ou não
* @return boolean
*/

function IsValidNumber(Numero,nomecampo,required) {

   var numberPat = /^\d+$/;

   if ( ( Numero.value == "") && ( required ) ){

     alert("O campo '" + nomecampo + "' é de preenchimento obrigatório!");
     Numero.focus();
     return false;

   }else if ( ( Numero.value != "") && ( !numberPat.test(Numero.value) ) ){

     alert("O valor do campo "+nomecampo+" não esta em um formato numérico.");
     Numero.focus();
     return false;

   }

   return true;

}

/**
* Verifica se valor do campo text está no formato correto MM/YYYY
* @param MesAno objectTextField Campo tipo text do formulario
* @param nomecampo string Nome do campo, que aparecerá nas mensagens de alerta
* @param required boolean Diz se o campo é requerido ou não
* @return boolean
*/

function IsValidMonthYear(MesAno,nomecampo,required)
{

  var datePat = /^((0[1-9])|(1[0-2]))\/((19\d{2})|(2\d{3}))$/;

  if ( ( MesAno.value == "") && ( required ) )
  {
    alert("O campo '" + nomecampo + "' é de preenchimento obrigatório!");
    MesAno.focus();
    return false;

  }
  else if ( ( MesAno.value != "" ) && ( !datePat.test(MesAno.value) ) )
  {
     alert("O valor do campo '" + nomecampo + "' é inválido!");
     MesAno.focus();
     return false;
  }

  return true;
}

/**
* Verifica se valor do campo Ano obedece a faixa correta que vai de 1900 a 2999
* @param Ano objectTextField Campo tipo text do formulario onde será colocado o ano
* @param nomecampo string Nome do campo, que aparecerá nas mensagens de alerta
* @param required boolean Diz se o campo é requerido ou não
* @return boolean
*/

function IsValidYear(Ano,nomecampo,required)
{

  var datePat = /^((19\d{2})|(2\d{3}))$/;
  if ( ( Ano.value == "") && ( required ) )
  {
    alert("O campo '" + nomecampo + "' é de preenchimento obrigatório!");
    Ano.focus();
    return false;

  } //&& (!required)
  else if ((!datePat.test(Ano.value)) && ((Ano.value != "" ) ))
  {

     alert("O valor do campo '" + nomecampo + "' é inválido!");
     Ano.focus();
     return false;

  }

  return true;

}

/**
* Verifica se valor do campo Data está no formato DD/MM/YYYY
* @param Data objectTextField Campo que contem o valor da data, no formato DD/MM/YYY
* @param nomecampo string Nome do campo, que aparecerá nas mensagens de alerta
* @param required boolean Diz se o campo é requerido ou não
* @return boolean
*/

function IsValidDate(Data,nomecampo,required)
{

   var datePat = /^((0[1-9])|([1-2][0-9])|(3[0-1]))\/((0[1-9])|(1[0-2]))\/((19[0-9]{2})|(2[0-9]{3}))$/

   if ( ( Data.value == "") && ( required ) )
   {

     alert("O campo '" + nomecampo + "' é de preenchimento obrigatório!");
     Data.focus();
     return false;

   }
			else if (( Data.value != ""))
			{
					if ( !datePat.test(Data.value) )
					{

							alert("O valor do campo '"+nomecampo+"' não é uma data válida!");
							Data.focus();
							return false;

					}
					else
					{

								var arDia = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

								nDia = Number(Data.value.substr(0,2));
								nMes = Number(Data.value.substr(3,2)) - 1;
								nAno = Number(Data.value.substr(6,4));

								//Checa se o ano é bissexto.
								if ( ( (nAno % 4 == 0) && (nAno % 100 !=0) ) || (nAno % 400 == 0) )
											arDia[1] = 29;

								//Valida a quantidade de dias de um mês.
								if ( ( nDia <= arDia[nMes] ) && ( nDia > 0 ) )
								{
										return true;
								}
								else
								{
										alert("O valor do campo '"+nomecampo+"' não é uma data válida.");
										return false;
								}

					}
   }
   return true;

}

/**
* Verifica se valor do campo CPF está no formato 999.999.999-99
* @param cpf objectTextField Campo que contem o valor do CPF
* @param nomecampo string Nome do campo, que aparecerá nas mensagens de alerta
* @param required boolean Diz se o campo é requerido ou não
* @return boolean
*/

function IsValidCPF(cpf,nomecampo,required){

  var resultado;
  var soma,i,dv,resto;

  sCPF = cpf.value;
  resultado = true;

  if ( ( sCPF == "" ) && ( required ) )
  {
    resultado = false;
    cpf.focus();
    alert("O campo '" + nomecampo + "' é de preenchimento obrigatório!");
    return false;
  }
  else if (sCPF != "" )
  {
    re = /\D/gi
    sCPF = sCPF.replace(re,"");
    
    sCPF = '00000000000' + sCPF;
    sCPF = sCPF.slice(-11);

    /*
      Para detectar CPFs completos usando apenas um único algarismo,
      como por exemplo 999.999.999-99
    */
    var reCPFInvalido = /1{11}|2{11}|3{11}|4{11}|5{11}|6{11}|7{11}|8{11}|9{11}|0{11}/gi

    soma = 0;

    if ( sCPF.length != 11 )
    {
       resultado = false;
    }
    else if ( reCPFInvalido.test(sCPF) )
    {
       resultado = false;
    }
    else
    {

      for(i = 0;i < 9;i++)
        soma = soma + parseInt(sCPF.charAt(i))*(10 - i);

      resto = soma % 11;

      if ( resto < 2 )
        dv = 0
      else
        dv = 11 - resto;

      if ( parseInt(sCPF.charAt(9)) != dv )
      {
        resultado = false;
      }
      else
      {
        soma = 0;
        for (i = 0;i < 10;i++)
          soma = soma + ( parseInt(sCPF.charAt(i)) )*(11 - i);

        resto = soma % 11;
        if ( resto < 2 )
          dv = 0
        else
          dv = 11 - resto;

        if ( parseInt(sCPF.charAt(10)) != dv )
          resultado = false;
      }

    }

  }

  if ( !resultado )
  {
    cpf.focus();
    alert("CPF inválido.");
  }

  return resultado;

}

/**
* Verifica se valor do campo CNPJ é válido
* @param cnpj objectTextField campo que contem o valor do CNPJ
* @param nomecampo string Nome do campo, que aparecerá nas mensagens de alerta
* @param required boolean Diz se o campo é requerido ou não
* @return boolean
*/

function IsValidCNPJ(cnpj,nomecampo,required){

  var resultado;
  var i,j,soma,dv;

  sCNPJ = cnpj.value;

  if ( ( sCNPJ == "" ) && ( required ) )
  {
     cnpj.focus();
     alert("O campo '" + nomecampo + "' é de preenchimento obrigatório!");
     return false;
  }

  resultado = true;

  re = /\D/gi
  sCNPJ = sCNPJ.replace(re,"") /* Eliminando caracteres não numéricos */
  if ( sCNPJ.length != 14 )
  {
    resultado = false;
  }
  else
  {

    soma = 0;
    j = 5;
    for(i = 0;i < 12;i++)
    {
      soma = soma + parseInt(sCNPJ.charAt(i))*j;
      if ( j > 2 )
      {
	        j--;
      }
      else
      {
	        j = 9;
      }
    }

    resto = soma % 11;
    if ( resto < 2 )
    {
      dv = 0
    }
    else
    {
      dv = 11 - resto;
    }

    if ( parseInt(sCNPJ.charAt(12)) != dv )
    {
      resultado = false;
    }
    else
    {

      soma = 0;
      j = 6;
      for(i = 0;i < 13;i++)
      {
        soma = soma + parseInt(sCNPJ.charAt(i))*j;
        if ( j > 2 )
        {
          j--;
        }
        else
        {
          j = 9;
        }
      }

      resto = soma % 11;
      if ( resto < 2 )
      {
        dv = 0;
      }
      else
      {
        dv = 11 - resto;
      }

      if ( parseInt(sCNPJ.charAt(13)) != dv )
      {
        resultado = false;
      }

    }

  }

  if ( !resultado )
  {
     cnpj.focus();
     alert("CNPJ inválido.");
  }

  return resultado;

}

/**
* Verifica se valor de  um campo hora é válido.
* @param Hora objectTextField campo que contem o valor da hora
* @param nomecampo string Nome do campo, que aparecerá nas mensagens de alerta
* @param required boolean Diz se o campo é requerido ou não
* @return boolean
*/

function IsValidTime(Hora,nomecampo,required)
{

   // Checks if time is in HH:MM format.

   var timePat = /^(([0-1][0-9])|(2[0-3])):([0-5][0-9])$/;

   if ( ( Hora.value == "" ) && ( required  ) ){
     alert("O campo '" + nomecampo + "' é de preenchimento obrigatório!");
     Hora.focus();
     return false;
   }else if ( ( Hora.value != "" ) && ( !timePat.test(Hora.value) ) ){
     alert("O valor do campo "+nomecampo+" não esta em um formato válido: (HH:MM).");
     Hora.focus();
     return false;
   }

   return true;
}

/**
* Verifica se valor de um campo com um valor PIS é valido
* @param pis objectTextField campo que contem o valor da hora
* @param nomecampo string Nome do campo, que aparecerá nas mensagens de alerta
* @param required boolean Diz se o campo é requerido ou não
* @return boolean
*/

function IsValidPIS(pis,nomecampo,required)
{
  var resultado;
  var i,j,soma,dv;

  sPIS = pis.value;
  bResultado = true;

  if ( ( sPIS == "" ) && ( required ) )
  {
     pis.focus();
     alert("O campo '" + nomecampo + "' é de preenchimento obrigatório!");
     bResultado = false;
  }
  else if ( sPIS != "" )
  {
     re = /\D/gi
     sPIS = sPIS.replace(re,"") /* Eliminando caracteres não numéricos */

     if ( sPIS.length != 11 )
     {
        for(i = 0;i < (11 - sPIS.length);i++) sPIS = '0' + sPIS;
     }
  
     dv = sPIS.substr(10,1);
     nSoma = 0;
  
     fator = 3;
     for (i = 0;i < 10;i++)
     {
        nSoma+= fator*parseInt(sPIS.charAt(i));
        fator--;
        if ( fator < 2 ) fator = 9;
     }
     
     DV = 11 - ( nSoma % 11 );
     if ( DV > 9 ) DV = 0;

     if ( dv != DV )
     {
        pis.focus();
        alert('PIS/PASEP inválido!');
        bResultado = false;
     }
  }
  return bResultado;
}