function ValidaTexto(vTextoRecebido,vObrigatoriedade){
	if(!vTextoRecebido){													// Se nenhum texto foi recebido...
		if(vObrigatoriedade)												// ... e se o campo foi definido como obrigatório,...
			return false;													// ... retorna erro.
	}
	return true;
}

function ValidaEmail(vTextoRecebido,vObrigatoriedade){
	// Baseada na função disponível na URL "http://www.codetoad.com/javascript/is_valid_email.asp", em 18/03/2003.
	if(!ValidaTexto(vTextoRecebido,vObrigatoriedade)){						// Se nenhum texto foi recebido...
		return false;														// ... retorna erro.
	}
	if(vTextoRecebido!=""){
		return(vTextoRecebido.indexOf(".")>2) && (vTextoRecebido.indexOf("@")>0);
	}
	return true;
}

function ValidaNumero(vTextoRecebido,vObrigatoriedade){
	// Baseada na função disponível na URL "http://www.codetoad.com/javascript/isnumeric.asp", em 18/03/2003.
	var vCaracter;
	var vCaracteresValidos="0123456789.";									// Define os caracteres válidos.
	if(!ValidaTexto(vTextoRecebido,vObrigatoriedade)){						// Se nenhum texto foi recebido...
		return false;													// ... retorna erro.
	}else{
		for(n=0;n<vTextoRecebido.length;n++){
			vCaracter=vTextoRecebido.charAt(n);
			if(vCaracteresValidos.indexOf(vCaracter)==-1){
				return false;
				break;
			}
		}
	}
	return true;
}

function ValidaData(vTextoRecebido,vObrigatoriedade){
	// Baseada na função disponível na URL "http://javascript.internet.com/calculators/date-difference.html", em 18/03/2003.
	if(!ValidaTexto(vTextoRecebido,vObrigatoriedade)){						// Se nenhum texto foi recebido...
                return false;												// ... retorna erro.
	}else{
		var vCaracteresValidos = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;		// Define a quantidade de dígitos por parte da data (dd/mm/aaaa).
		var vPartesDaData=vTextoRecebido.match(vCaracteresValidos);			// Verifica se a data digitada segue o padrão acima estabelecido.
		if(vPartesDaData==null)												// Se nenhuma parte foi retornada...
			return false;													// ... retorna erro.
		vDia=vPartesDaData[1];												// Captura o dia.
		vMes=vPartesDaData[3];												// Captura o mês.
		vAno=vPartesDaData[4];												// Captura o ano.
		if((vDia<1||vDia>31)||												// Se o dia especificado for menor que 01 ou maior que 31 ou...
			(vMes<1||vMes>12)||												// ... se o mês especificado for menor que 01 ou maior que 12 ou...
			((vMes==4||vMes==6||vMes==9||vMes==11) && vDia==31))			// ... se foi informado o dia 31 em meses que têm somente 30 dias...
			return false;													// ... retorna o erro.
		if(vMes==2){														// Se for o mês de fevereiro...
			var vBissexto=(vAno%4==0 && (vAno%100!=0||vAno%400==0));		// ... testa se é bissexto.
			if(vDia>29||(vDia==29 && !vBissexto))							// Se foi informado o dia 29 e o ano não é bissexto...
				return false;												// ... retorna erro.
		}
	}
	return true;
}

function ValidaDataInicialFinal(vDataInicial,vDataFinal,vObrigatoriedade){
	// Se a data inicial ou final forem inválidas...
	if(!(ValidaData(vDataInicial,vObrigatoriedade) && ValidaData(vDataFinal,vObrigatoriedade))){
		return false;														// ... retorna erro.
	}else{
		if(vDataInicial>vDataFinal)											// Se a data inicial for maior que a final...
			return false;													// ... retorna erro.
	}
	return true;
}

function ValidaHora(vTextoRecebido,vObrigatoriedade){
	// Baseada na função disponível na URL "http://javascript.internet.com/calculators/date-difference.html", em 20/03/2003.
	// ------------------------------------------------
	// OBS.: Segundos e Turno são parâmetros opcionais.
	// ------------------------------------------------
	if(!ValidaTexto(vTextoRecebido,vObrigatoriedade)){									// Se nenhum texto foi recebido...
		return false;																	// ... retorna erro.
	}else{
		var vCaracteresValidos = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;	// Define a quantidade de dígitos por parte da hora (hh:mm:ss tt).
		var vPartesDaHora=vTextoRecebido.match(vCaracteresValidos);						// Verifica se a hora digitada segue o padrão acima estabelecido.
		if(vPartesDaHora==null)															// Se nenhuma parte foi retornada...
			return false;																// ... retorna erro.
		vHora=vPartesDaHora[1];															// Captura a hora.
		vMinuto=vPartesDaHora[2];														// Captura os minutos.
		vSegundo=vPartesDaHora[4];														// Captura os segundos.
		vTurno=vPartesDaHora[6];														// Captura o turno.
		if(!vSegundo){vSegundo=null;}													// Se nenhum segundo foi definido, "anula" o campo.
		if(!vTurno){vTurno=null;}														// Se nenhum turno foi definido, "anula" o campo.
		if((vHora<0||vHora>23)||														// Se a hora especificada for menor que 00 ou maior que 23 ou...
			(vMinuto<0||vMinuto>59)||													// ... se os minutos especificados forem menores que 00 ou maiores que 59 ou...
			(vSegundo!=null && (vSegundo<0||vSegundo>59)))								// ... se foram especificados segundos e estes forem menores que 00 e maiores que 59...
			return false;																// ... retorna erro.
	}
	return true;
}

function ValidaHoraInicialFinal(vHoraInicial,vHoraFinal,vObrigatoriedade){
	// Se a hora inicial ou final forem inválidas...
	if(!(ValidaHora(vHoraInicial,vObrigatoriedade) && ValidaHora(vHoraFinal,vObrigatoriedade))){
		return false;															// ... retorna erro.
	}else{
		if(vHoraInicial>vHoraFinal)												// Se a hora inicial for maior que a final...
			return false;														// ... retorna erro.
	}
	return true;
}

function ValidaSenha(vSenhaRecebida,vObrigatoriedade){
	if(!vSenhaRecebida){													// Se nenhuma senha foi recebida...
		if(vObrigatoriedade)												// ... e se o campo foi definido como obrigatório,...
			return false;													// ... retorna erro.
	}else{
		// Se foi digitada uma aspa normal, simples ou o símbolo de percentual...
		if(vSenhaRecebida.indexOf(String.fromCharCode(34))!=-1||
			vSenhaRecebida.indexOf(String.fromCharCode(39))!=-1||
			vSenhaRecebida.indexOf(String.fromCharCode(37))!=-1)
			return false;													// ... retorna erro.
	}
	return true;
}

function ValidaSenhaInicialFinal(vSenhaInicial,vSenhaFinal,vObrigatoriedade){
	// Se a senha inicial ou final forem inválidas...
	if(!(ValidaSenha(vSenhaInicial,vObrigatoriedade) && ValidaSenha(vSenhaFinal,vObrigatoriedade))){
		return false;															// ... retorna erro.
	}else{
		if(vSenhaInicial!=vSenhaFinal)											// Se a senha inicial ou final forem diferentes uma da outra...
			return false;														// ... retorna erro.
	}
	return true;
}

function ValidaCombo(vTextoRecebido,vObrigatoriedade){
	if(vTextoRecebido=="0"){													// Se nenhuma opção foi selecionada...
		if(vObrigatoriedade)													// ... e se o campo foi definido como obrigatório,...
			return false;														// ... retorna erro.
	}
	return true;
}

function ValidaLista(vTextoRecebido,vObrigatoriedade){
        if(!vTextoRecebido){													// Se nenhuma opção foi selecionada...
                if(vObrigatoriedade)											// ... e se o campo foi definido como obrigatório,...
                        return false;											// ... retorna erro.
        }
        return true;
}

function ValidaCPF(vTextoRecebido,vObrigatoriedade){
	// Baseada na função disponível na URL "http://phpbrasil.com/articles/article.php/id/275", em 20/03/2003.
	if(!ValidaTexto(vTextoRecebido,vObrigatoriedade)){							// Se nenhum texto foi recebido...
		return false;															// ... retorna erro.
	}else{
		var vParte1=vTextoRecebido.substring(0,3);								// Separa cada uma das partes do CPF.
		var vParte2=vTextoRecebido.substring(4,7);
		var vParte3=vTextoRecebido.substring(8,11);
		var vParte4=vTextoRecebido.substring(12,14);
		var vCPF=vParte1+vParte2+vParte3+vParte4;								// Concatena as partes lidas. Obtém-se o CPF sem os separadores.
		var vAteBarra=vCPF.substring(0,9);										// Obtém a sequência numérica antes da barra.
		var vAposBarra=vCPF.substring(9,11);									// Obtém a sequência numérica depois a barra.
		var vCaracter=0;
		var vPosicaoAux=1;
		for(i=0;i<9;i++){
			vCaracter+=vCPF.substring(i,vPosicaoAux)*(10-i);
			vPosicaoAux++;
		}
		if(vCaracter==0){return false;}
		vCaracter=11-(vCaracter % 11);
		if(vCaracter>9){vCaracter=0;}
		if(vAposBarra.substring(0,1)!=vCaracter){return false;}
		vCaracter*=2;
		vPosicaoAux=1;
		for(i=0;i<9;i++){
			vCaracter+=vCPF.substring(i,vPosicaoAux)*(11-i);
			vPosicaoAux++;
		}
		vCaracter=11-(vCaracter % 11);
		if(vCaracter>9){vCaracter=0;}
		if(vAposBarra.substring(1,2)!=vCaracter){return false;}
	}
	return true;
}

function ValidaCNPJ(vTextoRecebido,vObrigatoriedade){
	// Baseada na função disponível na URL "http://br.groups.yahoo.com/group/javascript-br/message/7938", em 23/04/2003.
	if(!ValidaTexto(vTextoRecebido,vObrigatoriedade)){	// Se nenhum texto foi recebido...
		return false;																// ... retorna erro.
	}else{
		if(vTextoRecebido.length>0){
			var vParte1=vTextoRecebido.substring(0,2);									// Separa cada uma das partes do CNPJ.
			var vParte2=vTextoRecebido.substring(3,6);
			var vParte3=vTextoRecebido.substring(7,10);
			var vParte4=vTextoRecebido.substring(11,15);
			var vParte5=vTextoRecebido.substring(16,18);
			var vCNPJ=vParte1+vParte2+vParte3+vParte4+vParte5;							// Concatena as partes lidas. Obtém-se o CNPJ sem os separadores.
			// Testa se o CNPJ montado realmente é um número.
			if(ValidaNumero(vCNPJ,vObrigatoriedade)){
				m2=2;
				soma1=0;
				soma2=0;
				for(i=11;i>=0;i--){
					val=eval(vCNPJ.charAt(i));
					m1=m2;
					if(m2<9){m2=m2+1;}else{m2=2;}
					soma1=soma1+(val*m1);
					soma2=soma2+(val*m2);
				}
				soma1=soma1%11;
				if(soma1<2){d1=0;}else{d1=11-soma1;}
				soma2=(soma2+(2*d1))%11;
				if(soma2<2){d2=0;}else{d2=11-soma2;}
				if(!((d1==vCNPJ.charAt(12))&&(d2==vCNPJ.charAt(13)))){
					return false;
				}
			}else{
				return false;															// Não sendo numérico, retorna erro.
			}
		}
	}
	return true;
}

function ValidaForm(vFormulario){
	var vTotalCamposErrados=0;															// Total de campos preenchidos incorretamente.
	var vMensagem;																		// Mensagem de erro.
	var vCampoErrado="";																// Id (ou "label") do campo preenchido incorretamente.
	var vPrimeiroCampoErrado;															// Nome do campo preenchido incorretamente.
	for(x=0;x<document.forms[vFormulario].length;x++){									// Obtém os campos do formulário e efetua sua validação.
		var vCampoObrigatorio=false;													// Define que o campo em leitura, no momento, não é obrigatório.
		var vNomeDoCampo=new String(document.forms[vFormulario].elements[x].name);		// Obtém o nome do campo.
		var vTipo=vNomeDoCampo.substring(0,3);											// Obtém o tipo do campo.
		if(vNomeDoCampo.substring(vNomeDoCampo.length-1,vNomeDoCampo.length)=="_")		// Testa a sua obrigatoriedade.
			vCampoObrigatorio=true;
		switch(vTipo){																	// Testa o tipo do campo.
		case "txt":
			if(!ValidaTexto(document.forms[vFormulario].elements[x].value,vCampoObrigatorio)){
				vTotalCamposErrados++;
				if(vTotalCamposErrados<=10)
					vCampoErrado+="> " + document.forms[vFormulario].elements[x].id + "\n";
				if(!vPrimeiroCampoErrado)
					vPrimeiroCampoErrado=vNomeDoCampo;
			}
			break;
		case "cmb":
			if(!ValidaCombo(document.forms[vFormulario].elements[x].value,vCampoObrigatorio)){
				vTotalCamposErrados++;
				if(vTotalCamposErrados<=10)
					vCampoErrado+="> " + document.forms[vFormulario].elements[x].id + "\n";
				if(!vPrimeiroCampoErrado)
					vPrimeiroCampoErrado=vNomeDoCampo;
			}
			break;
		case "nbr":
			if(!ValidaNumero(document.forms[vFormulario].elements[x].value,vCampoObrigatorio)){
				vTotalCamposErrados++;
				if(vTotalCamposErrados<=10)
					vCampoErrado+="> " + document.forms[vFormulario].elements[x].id + "\n";
				if(!vPrimeiroCampoErrado)
					vPrimeiroCampoErrado=vNomeDoCampo;
			}
			break;
		case "eml":
			if(!ValidaEmail(document.forms[vFormulario].elements[x].value,vCampoObrigatorio)){
				vTotalCamposErrados++;
				if(vTotalCamposErrados<=10)
					vCampoErrado+="> " + document.forms[vFormulario].elements[x].id + "\n";
				if(!vPrimeiroCampoErrado)
					vPrimeiroCampoErrado=vNomeDoCampo;
			}
			break;
		case "lst":
			if(!ValidaLista(document.forms[vFormulario].elements[x].value,vCampoObrigatorio)){
				vTotalCamposErrados++;
				if(vTotalCamposErrados<=10)
					vCampoErrado+="> " + document.forms[vFormulario].elements[x].id + "\n";
				if(!vPrimeiroCampoErrado)
					vPrimeiroCampoErrado=vNomeDoCampo;
			}
			break;
		case "dat":
			if(!ValidaData(document.forms[vFormulario].elements[x].value,vCampoObrigatorio)){
				vTotalCamposErrados++;
				if(vTotalCamposErrados<=10)
					vCampoErrado+="> " + document.forms[vFormulario].elements[x].id + "\n";
				if(!vPrimeiroCampoErrado)
					vPrimeiroCampoErrado=vNomeDoCampo;
			}
			break;
		case "dti":
			var vCampoDataInicial=vNomeDoCampo;                                                                                // Captura o nome do campo da data inicial.
			var vCampoDataFinal=vCampoDataInicial.replace('dti','dtf');                                // Captura o nome do campo da data final.
			if(!ValidaDataInicialFinal(document.forms[vFormulario].elements[vCampoDataInicial].value,document.forms[vFormulario].elements[vCampoDataFinal].value,vCampoObrigatorio)){
				vTotalCamposErrados++;
				if(vTotalCamposErrados<=10)
					vCampoErrado+="> " + document.forms[vFormulario].elements[vCampoDataInicial].id + "\n";
				if(!vPrimeiroCampoErrado)
					vPrimeiroCampoErrado=vNomeDoCampo;
			}
			break;
		case "hor":
			if(!ValidaHora(document.forms[vFormulario].elements[x].value,vCampoObrigatorio)){
				vTotalCamposErrados++;
				if(vTotalCamposErrados<=10)
					vCampoErrado+="> " + document.forms[vFormulario].elements[x].id + "\n";
				if(!vPrimeiroCampoErrado)
					vPrimeiroCampoErrado=vNomeDoCampo;
			}
			break;
		case "hri":
			var vCampoHoraInicial=vNomeDoCampo;                                                                                // Captura o nome do campo da hora inicial.
			var vCampoHoraFinal=vCampoHoraInicial.replace('hri','hrf');                                // Captura o nome do campo da hora final.
			if(!ValidaHoraInicialFinal(document.forms[vFormulario].elements[vCampoHoraInicial].value,document.forms[vFormulario].elements[vCampoHoraFinal].value,vCampoObrigatorio)){
				vTotalCamposErrados++;
				if(vTotalCamposErrados<=10)
					vCampoErrado+="> " + document.forms[vFormulario].elements[vCampoHoraInicial].id + "\n";
				if(!vPrimeiroCampoErrado)
					vPrimeiroCampoErrado=vNomeDoCampo;
			}
			break;
		case "pwd":
			if(!ValidaSenha(document.forms[vFormulario].elements[x].value,vCampoObrigatorio)){
				vTotalCamposErrados++;
				if(vTotalCamposErrados<=10)
					vCampoErrado+="> " + document.forms[vFormulario].elements[x].id + "\n";
				if(!vPrimeiroCampoErrado)
					vPrimeiroCampoErrado=vNomeDoCampo;
			}
			break;
		case "pwi":
			var vCampoSenhaInicial=vNomeDoCampo;														// Captura o nome do campo da senha inicial.
			var vCampoSenhaFinal=vCampoSenhaInicial.replace('pwi','pwf');                                // Captura o nome do campo da senha final.
			if(!ValidaSenhaInicialFinal(document.forms[vFormulario].elements[vCampoSenhaInicial].value,document.forms[vFormulario].elements[vCampoSenhaFinal].value,vCampoObrigatorio)){
				vTotalCamposErrados++;
				if(vTotalCamposErrados<=10)
					vCampoErrado+="> " + document.forms[vFormulario].elements[vCampoSenhaInicial].id + "\n";
				if(!vPrimeiroCampoErrado)
					vPrimeiroCampoErrado=vNomeDoCampo;
			}
			break;
		case "cpf":
			if(!ValidaCPF(document.forms[vFormulario].elements[x].value,vCampoObrigatorio)){
				vTotalCamposErrados++;
				if(vTotalCamposErrados<=10)
					vCampoErrado+="> " + document.forms[vFormulario].elements[x].id + "\n";
				if(!vPrimeiroCampoErrado)
					vPrimeiroCampoErrado=vNomeDoCampo;
			}
			break;
		case "cpj":
			if(!ValidaCNPJ(document.forms[vFormulario].elements[x].value,vCampoObrigatorio)){
				vTotalCamposErrados++;
				if(vTotalCamposErrados<=10)
					vCampoErrado+="> " + document.forms[vFormulario].elements[x].id + "\n";
				if(!vPrimeiroCampoErrado)
					vPrimeiroCampoErrado=vNomeDoCampo;
			}
			break;
		}
	}
	// Se algum campo incorretamente preenchido foi encontrado...
	if(vCampoErrado){
		if(vTotalCamposErrados>10)
			vCampoErrado+="> e outros campos...";
		vMensagem="Foram encontrados erros nos seguintes campos:\n\n" + vCampoErrado;
		alert(vMensagem);
		eval("document.forms[vFormulario]." + vPrimeiroCampoErrado + ".focus();");			// Posiciona o cursos no primeiro campo preenchido incorretamente.
		if(vTipo=="txt"||vTipo=="nbr"||vTipo=="eml"||vTipo=="dat"||vTipo=="dti"||vTipo=="hor"||vTipo=="hri"||vTipo=="pwd"||vTipo=="pwi"||vTipo=="cpf"||vTipo=="cpj")
			eval("document.forms[vFormulario]." + vPrimeiroCampoErrado + ".select();");			// Seleciona o conteúdo do primeiro campo preenchido incorretamente.
		return false;
	}
	return true;
}
