/*
  Este campo hidden serve para guardar parâmetros de config. de campos do formulário para serem utilizados em uma função
javascript que irá validar os campos conforme parâmetros de cada um. Cada parâmetro é semarado por ";" e cada campo/field 
do formulário é separado por pipes "|", o que pode ser observado na estrutura abaixo:

<input type="hidden" name="vsistema" value="nomecampo;nomedisplay;tipodado;tipoinput;vmin;vmax;aceitanulo;funcoes|nomecampo2;nomedisplay2" ...|...>

Segue a descrição de cada parâmetro:

- nomecampo    -> nome do campo no table-DB e no formulário
- nomedisplay  -> nome utilizado para visualizações em mensagems de erro.
- tipodado     -> tipo de dado do campo conforme table-BD. Este parâmetro será utilizado pela função para
                  saber qual tratamento de validação irá ser aplicado ao campo. **
- tipoinput    -> Tipo do form-input utilizado ex: text,hidden etc... . Este parâmetro será utilizado pela
                  função juntamente com o parâmetro tipodado para fazer tratamento de dados conforme input. ***
- vmin         -> valor minimo do campo ; 
- vmax         -> valor máximo do campo ;
- aceitanulo   -> true se o campo aceita valores em branco;
- funcoes      -> este parâmetro serve para indicar funções de validação adicionais :  CGC/CPF/CEP ect...
- formatacao   -> é colocado uma máscara para formatacao dos dados

** segue a lista de tipos de dado
0 - integer
1 - varchar
2 - date
3 - time
4 - date/time
5 - float/double
6 - boolean/bit

*** segue a lista com tipos de input
0 - hidden
1 - text
2 - checkbox
3 - radio
4 - image
5 - password
6 - file
7 - textarea
8 - select
0,1,5,6,7
*/
// *******  SEPARA OS CAMPOS (|)

/*Tipo de dado guarda os parâmetros de um campo.*/

var numparametros = 9; //Num. de parametros de um campo

function TCampo(nomecampo,nomedisplay,tipodado,tipoinput,vmin,vmax,aceitanulo,funcoes,mascara){
   this.nomecampo   = nomecampo;
   this.nomedisplay = nomedisplay;
   this.tipodado    = tipodado;
   this.tipoinput   = tipoinput;
   this.vmin        = vmin;
   this.vmax        = vmax;
   this.aceitanulo  = aceitanulo;
   this.funcoes     = funcoes;
   this.mascara     = mascara;
}

function BuildCampos(theForm){
	var arrayCampos= theForm.validacao.value.split("|");   //array de campos e parâmetros
	var arr = new Array();
	var arrayParametros;
	var nomecampo,nomedisplay,tipodado,tipoinput,vmin,vmax,aceitanulo,funcoes,mascara;
	var erroaux;
	
	for (var i=0; i < arrayCampos.length; i++) {
    	arrayParametros = arrayCampos[i].split(";") //array de parâmetros de um campo
      	if ( arrayParametros.length == numparametros ){
	    	erroaux = "";
	    	for (var j=0; j< arrayParametros.length; j++){
		    	if (arrayParametros[j]==""){
		    		if (j != numparametros){
			        	erroaux = erroaux + j + ",";
			      	}else{
			        	erroaux = erroaux + j;
			      	}
		      	}
		 	}
		 	if (erroaux != ""){
	        	alert("Erro ao validar form. Verificar parâmetros sem valor : Campo = "+i+" Parâmetros = "+erroaux);
	        	return null;
		 	}
	  	}else{
	    	alert("Erro ao validar form. Verificar o número de parâmetros.");
	    	return null;
	  	}
      	nomecampo   = arrayParametros[0];
	  	nomedisplay = arrayParametros[1];
	  	tipodado    = arrayParametros[2];
	  	tipoinput   = arrayParametros[3];
	  	vmin        = arrayParametros[4];
	  	vmax        = arrayParametros[5];
	  	aceitanulo  = arrayParametros[6];
	  	funcoes     = arrayParametros[7];
	  	mascara     = arrayParametros[8];
      	arr[i] = new TCampo(nomecampo,nomedisplay,tipodado,tipoinput,vmin,vmax,aceitanulo,funcoes,mascara);
  	}
  	return arr ;
}

function formvalidacao (theForm){
	var arCampos = BuildCampos(theForm);
	var browser  = "" 
	var campoform
  	if (arCampos == null){
    	return false;
  	}
  
  if ((navigator.userAgent) && (navigator.userAgent.indexOf("MSIE")>=0)){
    browser = "MSIE"
  }else{
    browser = "NAV"
  }
  
  for (var icampo = 0; icampo < arCampos.length; icampo++){
	  switch (browser){
	     case "MSIE" : {
            // Campos que tem os mesmos metodos de acesso de input-Text 
               campoform =  theForm.elements(arCampos[icampo].nomecampo); // campo do formulário
			
			   if (arCampos[icampo].tipoinput == "0" || arCampos[icampo].tipoinput == "1" || arCampos[icampo].tipoinput == "5" || arCampos[icampo].tipoinput == "6" || arCampos[icampo].tipoinput == "7"){
                  //Verificação de nulos
			      if ((arCampos[icampo].aceitanulo == "false") && (campoform.value.length == 0) ) {
				      alert ("O campo "+arCampos[icampo].nomedisplay+" não pode ser nulo!")
			          campoform.focus();
				      return false;
			      }
               }
			
/*			   if (arCampos[icampo].tipoinput == "2"  || arCampos[icampo].tipoinput == "3" ){
                  //Verificação de nulos
				  alert(campoform.value);
			      if ((arCampos[icampo].aceitanulo == "false") && (campoform.value == "") ) {
			          alert ("É necessário selecionar uma opção para o campo "+arCampos[icampo].nomedisplay);
				      return false;
			      }
			   }
*/

			   if (arCampos[icampo].tipoinput == "3" ){
                  //Verificação de nulos
			      alerta = "sim";
					if ((arCampos[icampo].aceitanulo == "false")){
						for(i = 0; i < campoform.length; i++){
					  		if(campoform[i].checked){
								alerta = "nao";
								i = campoform.length;
							}
						}
						if(alerta == "sim"){
							alert ("É necessário selecionar uma opção para o campo "+arCampos[icampo].nomedisplay);
				      		campoform[0].focus();
							return false;
			      		}
				  }
			   }

			   if (arCampos[icampo].tipoinput == "8" ){
                  //Verificação de nulos
			      if ((arCampos[icampo].aceitanulo == "false") && (campoform.selectedIndex <= 0) ) {
				      if (campoform.multiple){
				         alert ("É necessário selecionar um ou mais valoroes para o campo "+arCampos[icampo].nomedisplay);
				      }else{
				         alert ("É necessário selecionar um valor para o campo "+arCampos[icampo].nomedisplay);
			          }
				      campoform.focus();
				      return false;
			      }
			   }

			   //verificação de tipos de dados
			   switch (arCampos[icampo].tipodado){
                  case "0" :{ //integer
			        if (arCampos[icampo].tipoinput == "0" || arCampos[icampo].tipoinput == "1" || arCampos[icampo].tipoinput == "5" || arCampos[icampo].tipoinput == "6" || arCampos[icampo].tipoinput == "7"){
				       if (!parseInt(campoform.value)){
			              alert("O campo "+arCampos[icampo].nomedisplay+" não é um número válido.")
					      campoform.focus();
	                      campoform.select();
					      return false;
					   }
					}
                  }break;			   

                  case "1" :{ //varchar
			        if (arCampos[icampo].tipoinput == "0" || arCampos[icampo].tipoinput == "1" || arCampos[icampo].tipoinput == "5" || arCampos[icampo].tipoinput == "6" || arCampos[icampo].tipoinput == "7"){
				       if (arCampos[icampo].vmin > 0){
					      if (campoform.value.length < arCampos[icampo].vmin){
				             alert("Campo " + arCampos[icampo].nomedisplay + " deve ter pelo menos "+arCampos[icampo].vmin+" caracteres");
			                 campoform.focus();
			                 campoform.select();
						     return false;
						  } 
					   }
				    }
				  }break;			   

                  case "2" :{ //date
			        if (arCampos[icampo].tipoinput == "0" || arCampos[icampo].tipoinput == "1" || arCampos[icampo].tipoinput == "5" || arCampos[icampo].tipoinput == "6" || arCampos[icampo].tipoinput == "7"){
				       if (!isValidDate(campoform.value,true)){
			              campoform.focus();
			              campoform.select();
					      return false;
					   }else{
					 
					   }
					}   
				  }break;			   

                  case "3" :{ //time
			        if (arCampos[icampo].tipoinput == "0" || arCampos[icampo].tipoinput == "1" || arCampos[icampo].tipoinput == "5" || arCampos[icampo].tipoinput == "6" || arCampos[icampo].tipoinput == "7"){
				       if (!isValidTime(campoform.value)){
			              campoform.focus();
			              campoform.select();
					      return false;
					   }else{
					 
					   }
					}   
				  }break;

                  case "4" :{ //date/time
			        if (arCampos[icampo].tipoinput == "0" || arCampos[icampo].tipoinput == "1" || arCampos[icampo].tipoinput == "5" || arCampos[icampo].tipoinput == "6" || arCampos[icampo].tipoinput == "7"){

                    }				  
				  }break;			   

                  case "5" :{ //float/double
			        if (arCampos[icampo].tipoinput == "0" || arCampos[icampo].tipoinput == "1" || arCampos[icampo].tipoinput == "5" || arCampos[icampo].tipoinput == "6" || arCampos[icampo].tipoinput == "7"){
				       if (!parseFloat(campoform.value)){
			              alert("O campo "+arCampos[icampo].nomedisplay+" não é um número válido.")
					      campoform.focus();
	                      campoform.select();
					      return false;
				  	   }
					}   
				  }break;			   

                  case "6" :{ //boolean/bit
			        if (arCampos[icampo].tipoinput == "0" || arCampos[icampo].tipoinput == "1" || arCampos[icampo].tipoinput == "5" || arCampos[icampo].tipoinput == "6" || arCampos[icampo].tipoinput == "7"){
					
                    }				    
				  }break;			   

			   }

		 }break;
		
	     case "NAV" : {
               alert(arCampos[icampo].tipodado+" Nav");
		 }break;

	  }
  }
 
  return true;
}

function isValidDate(dateStr,msg) {
  /* Checks for the following valid date formats:
   DD/MM/YY   DD/MM/YYYY   DD-MM-YY   DD-MM-YYYY
  */
  var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/; // requires 4 digit year
  var matchArray = dateStr.match(datePat); // is the format ok?
  if (dateStr == ""){
    return true;
  }
  if (matchArray == null) {
    if (msg){
       alert(dateStr + " Formato inválido.");
    }
    return false;
  }
  
  day = matchArray[1]; // parse date into variables
  month = matchArray[3];
  year = matchArray[4];

  if (month < 1 || month > 12) { // check month range
    if (msg){
      alert("Mes deve estar entre 1 e 12.");
    }
    return false;
  }
  if (day < 1 || day > 31) {
    if (msg){
       alert("Dia deve estar entre 1 e 31.");
    }
    return false;
  }
  if ((month==4 || month==6 || month==9 || month==11) && day==31) {
    if (msg){
      alert("Mes "+month+" Não tem 31 dias");
    }
    return false;
  }
  if (month == 2) { // check for february 29th
    var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
    if (day>29 || (day==29 && !isleap)) {
      if (msg){
        alert("Fevereiro do ano " + year + " não possui " + day + " dias!");
      }
      return false;
    }
  }

 return true;
}


function isValidTime(timeStr) {
// Checks if time is in HH:MM:SS AM/PM format.
// The seconds and AM/PM are optional.

var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;

var matchArray = timeStr.match(timePat);
if (matchArray == null) {
alert("Time is not in a valid format.");
return false;
}
hour = matchArray[1];
minute = matchArray[2];
second = matchArray[4];

if (second=="") { second = null; }

if (hour < 0  || hour > 23) {
return false;
}

if (minute < 0 || minute > 59) {
  //alert ("Minute must be between 0 and 59.");
return false;
}

if ((second != null) && (second < 0 || second > 59)) {
  //alert ("Second must be between 0 and 59.");
return false;
}

return true;
}


function limpa_string(S){
	// Deixa so' os digitos no numero
	var Digitos = "0123456789";
	var temp = "";
	var digito = "";
   	for (var i=0; i<S.length; i++){
      digito = S.charAt(i);
      if (Digitos.indexOf(digito)>=0){temp=temp+digito}
   	}
   return temp
}

function valida_CPF(s)
{
	var i;
	s = limpa_string(s);
	var c = s.substr(0,9);
	var dv = s.substr(9,2);
	var d1 = 0;
	for (i = 0; i < 9; i++)
	{
		d1 += c.charAt(i)*(10-i);
	}
        if (d1 == 0) return false;
	d1 = 11 - (d1 % 11);
	if (d1 > 9) d1 = 0;
	if (dv.charAt(0) != d1)
	{
		return false;
	}

	d1 *= 2;
	for (i = 0; i < 9; i++)
	{
		d1 += c.charAt(i)*(11-i);
	}
	d1 = 11 - (d1 % 11);
	if (d1 > 9) d1 = 0;
	if (dv.charAt(1) != d1)
	{
		return false;
	}
   
   return true;
}

function valida_CGC(s)
{
	var i;
	s = limpa_string(s);
	var c = s.substr(0,12);
	var dv = s.substr(12,2);
	var d1 = 0;
	for (i = 0; i < 12; i++)
	{
		d1 += c.charAt(11-i)*(2+(i % 8));
	}
        if (d1 == 0) return false;
        d1 = 11 - (d1 % 11);
	if (d1 > 9) d1 = 0;
	if (dv.charAt(0) != d1)
	{
		return false;
	}

	d1 *= 2;
	for (i = 0; i < 12; i++)
	{
		d1 += c.charAt(11-i)*(2+((i+1) % 8));
	}
	d1 = 11 - (d1 % 11);
	if (d1 > 9) d1 = 0;
	if (dv.charAt(1) != d1)
	{
		return false;
	}
        return true;
}

//-------------------------------------
//		função mais completa
//-------------------------------------
function testaEmail(txtInput) {
	var email = txtInput.value;
	var proibido
	var checkMail
	
	//define os proíbidões
	proibido = " +),(*&%$#!+;='\/`~?<>áéíóúýàèìòùäëïöüÿçãõâêîôû£¢¬§³²¹´"
	
	//testa se é vazio
	if (email == "") {
		alert("Informe um e-mail.");
		txtInput.focus();
		return false;
	} else {
  		if ((email.indexOf('@') == email.lastIndexOf('@')) &&	// só tem um @
  			(email.indexOf('@') > 0) &&			// existe @ e não é prim
  			(email.charAt(email.length-1) != '@') &&		// @ não é o último
  			(email.lastIndexOf('.') > email.indexOf('@')) &&	// existe . após @
  			(email.charAt(email.indexOf('@') + 1) != '.') &&	// sem . logo após @
  			(email.charAt(email.indexOf('@') - 1) != '.') &&	// sem . logo antes @
  			(email.indexOf('.') > 0) &&			// existe . e não é prim
			(email.charAt(email.length-1) != '.')) {		// . não é o último
				
			// verifica se não há pontos seguidos
			sub = email.substring(email.indexOf('.')+1, email.length);
			while (sub.indexOf('.') != -1) {
				if (sub.charAt(0) == '.') {
					alert("Formato de e-mail incorreto!");
					txtInput.focus();
					return false;
				} else {
					sub = sub.substring(sub.indexOf('.')+1, sub.length);
				}
			}
			//return true;

			for(c=0;c<email.length;c++){
				for (j=0; j<proibido.length;j++){
					if (proibido.charAt(j)==email.charAt(c)){
						alert ("Caracteres invalidos no e-mail");
						checkMail = false;
						txtInput.focus()
						return false;
					}
				}
			}
			if (checkMail==false) {
				return false
			} else {
				return true
			}

		} else {
			alert("Formato de e-mail incorreto!");
			txtInput.focus();
			return false;
		}
	}
}




function VerificaEmail( mail) {
    //declaracao das variaveis
	var user="";
	var dominio="";
	var i=0;
	var testa="+)(*&%$#!+;='\/`~?<>"; 
	var c=0;
	var checkmail=true;
	var ponto=0;
	var j=0;
	var arroba=0;
	

	//***********testa caracteres invalidos na variavel mail**********
	for(c;c<mail.length;c++){
		for (j=0; j<testa.length;j++){
			if (testa.charAt(j)==mail.charAt(c)){
				checkmail=false;
				alert ("Caracteres invalidos no e-mail");
				return (false);
				}
			}
		}		
	//************ cria variavel user******************************* 
	if (checkmail!=false){
			for (i=0;i< mail.length;i++){
				if (mail.charAt(i)=="@"){
					break;}
				else{	
					user=user+mail.charAt(i);
					}
				}
	
			//************cria variavel dominio**************************
			for (i;i<mail.length;i++){
				if (mail.charAt(i)==""){
					break;}
				else{	
					dominio=dominio+mail.charAt(i);
					}
				}
					
				//***********testa validade da variavel dominio********************		
				for(c=0;c<dominio.length;c++){
					if (dominio.charAt(c)=="@"){
						arroba++;}
					if (dominio.charAt(c)=="."){
						ponto++;}}
					if ((ponto<1)||(ponto>4)){
						alert("E-mail inválido");
						return (false);
						}
					if (arroba != 1.0){
						alert("E-mail inválido");
						return (false);
						};
				}			

	return (true);		
}

function getFileName(c){
    var f = c.value.substring(c.value.lastIndexOf("\\")+1);
//	alert(f);
    return f;
}



/******************************************************************************************************
						FORMATAÇÃO DE VALOR PARA INCLUSÃO NO BANCO DE DADOS
								(APENAS CAMPO DE ENTRADA DE DADOS)
*******************************************************************************************************/
//impede entrada de char
function okMoeda(){
	var Tecla = window.event.keyCode;
	event.cancelBubble = true;
	if(Tecla==46 || Tecla==44){
        var texto = window.event.srcElement.value
        if(texto.indexOf(",")>-1){
            event.returnValue = false;
        }else{
            window.event.keyCode=44;
            event.returnValue = true;        
        }
    }else{
        if((Tecla > 47 && Tecla < 58))
		    event.returnValue = true;
    	else
		    event.returnValue = false;
   }
}
//Formata o valor apos sair do campo
function ocMoeda(valor){
	if (valor.value.length != 0) {
		if((valor.value.indexOf(".") == -1) && (valor.value.indexOf(",") == -1)) valor.value = valor.value+",00";
		if (valor.value.indexOf(",") > -1){
			if (valor.value.indexOf(",") == (valor.value.length-1)) valor.value =  valor.value+"00";
			if (valor.value.indexOf(",") == (valor.value.length-2)) valor.value = valor.value+"0";
		}
		//Função que arredonda - Zeca - 
		if (valor.value.length > valor.value.indexOf(',')+3){
			valor.value = valor.value.substring(0,valor.value.indexOf(',')+1) + Math.round(valor.value.substring(valor.value.indexOf(",")+1, valor.value.indexOf(",")+3)+'.'+valor.value.substring(valor.value.indexOf(",")+4,valor.value.length ));
		}
	}
}
/******************************************************************************************************
												FIM
								(apenas campo de entrada de dados)
*******************************************************************************************************/