//Descrição: Funções basicas de verificação
//Pacote: tw Framework
//Copyright: 1996 - 2005 (c) tw Latin America - www.tw.com.br
//Versão: 1.0.0.3

//Verifica se o numero de caracteres de um campo é menor que um número especifico.
//    Se for menor, retorna (false) e exibe um alerta com uma mensagem.
//    Se for maior ou igual, apenas retorna (true).
function twFctCampoCheckMin(ccmCampo, ccmQuantidadeMinima, ccmMensagem, ccmFoco){
	if (ccmCampo.value.length < ccmQuantidadeMinima){ alert(ccmMensagem); if(ccmFoco!=false){ ccmCampo.focus(); } return (false); }
	else { return (true); }
}

//Verifica se o numero de caracteres de um campo exede um número especifico.
//    Se for maior, retorna (false) e exibe um alerta com uma mensagem.
//    Se for menor ou igual, apenas retorna (true).
function twFctCampoCheckMax(ccmCampo, ccmQuantidadeMaxima, ccmMensagem){
	if (ccmCampo.value.length > ccmQuantidadeMaxima){ alert(ccmMensagem); ccmCampo.focus(); return (false); }
	else { return (true); }
}

//Verifica se o valor de um campo é numerico.
//    Se não for numérico, retorna (false) e exibe um alerta com uma mensagem.
//    Se for numérico, apenas retorna (true).
function twFctIsNumeric(inCampo, inMensagem){
	if (isNaN(inCampo.value)){ alert(inMensagem); inCampo.focus(); return (false); }
	else { return (true); }
}

//Verifica se o valor de um campo é igual um valor especifico.
//    Se for diferente, retorna (false) e exibe um alerta com uma mensagem.
//    Se for igual, apenas retorna (true).
function twFctCampoEqualNum(cenCampo, cenValor, cenMensagem){
	if (parseInt(cenCampo.value)==parseInt(cenValor)){ return (true); }
	else { alert(cenMensagem); cenCampo.focus(); return (false); }
}

//Verifica se o valor de um campo é maior que um valor especifico.
//    Se for menor ou igual, retorna (false) e exibe um alerta com uma mensagem.
//    Se for maior, apenas retorna (true).
function twFctCampoGreaterNum(cgnCampo, cgnValor, cgnMensagem){
	if (parseInt(cgnCampo.value)>parseInt(cgnValor)){ return (true); }
	else { alert(cgnMensagem); cgnCampo.focus(); return (false); }
}

//Verifica se o valor de um campo é maior ou igual que um valor especifico.
//    Se for menor, retorna (false) e exibe um alerta com uma mensagem.
//    Se for maior ou igual, apenas retorna (true).
function twFctCampoGreaterOrEqualNum(cgoenCampo, cgoenValor, cgoenMensagem){
	if (parseInt(cgoenCampo.value)>=parseInt(cgoenValor)){ return (true); }
	else { alert(cgoenMensagem); cgoenCampo.focus(); return (false); }
}

//Verifica se o valor de um campo é menor que um valor especifico.
//    Se for maior ou igual, retorna (false) e exibe um alerta com uma mensagem.
//    Se for menor, apenas retorna (true).
function twFctCampoLowerNum(clnCampo, clnValor, clnMensagem){
	if (parseInt(clnCampo.value)<parseInt(clnValor)){ return (true); }
	else { alert(clnMensagem); clnCampo.focus(); return (false); }
}

//Verifica se o valor de um campo é menor ou igual que um valor especifico.
//    Se for maior, retorna (false) e exibe um alerta com uma mensagem.
//    Se for menor ou igual, apenas retorna (true).
function twFctCampoLowerOrEqualNum(cloenCampo, cloenValor, cloenMensagem){
	if (parseInt(cloenCampo.value)<=parseInt(cloenValor)){ return (true); }
	else { alert(cloenMensagem); cloenCampo.focus(); return (false); }
}

//Valida se um texto é um CPF válido.
//Entradas: (string) no padrão (xxx.xxx.xxx-xx)
//Retorno: (string), retorna o texto formatado.
//Nota: Utilize a função twFctFormataCpf para formatar seu texto. (Arq. twSistemaUtilitarios.js)
function twFctIsCpf(icCpf){

	var icCpfNumero = "";
	var icRegExpCpf = /^\d{3}\.{1}\d{3}\.{1}\d{3}-{1}\d{2}$/;
	var icRegExpSohNumeros = /^\d$/;

	//Verfica se o CPF fornecido esta no padrão (xxx.xxx.xxx-xx)
	if(!icRegExpCpf.test(icCpf)){ return(false); }

	//Deixa apenas os números
	for(ic_x = 0; ic_x < icCpf.length; ic_x ++)
		if(icRegExpSohNumeros.test(icCpf.charAt(ic_x)))
			icCpfNumero += icCpf.charAt(ic_x).toString();

	var icCpfDigitos = icCpfNumero.substr(9,2);
	var icVerificadorD1 = 0;

	//Inicio: Calculo de verificação
	for (ic_x = 0; ic_x < 9; ic_x++) { icVerificadorD1 += parseInt(icCpfNumero.charAt(ic_x)) * (10 - ic_x); }
	if (icVerificadorD1 == 0){ return(false); }
	icVerificadorD1 = 11 - (icVerificadorD1 % 11);
	if (icVerificadorD1 > 9){ icVerificadorD1 = 0; }
	if (parseInt(icCpfDigitos.charAt(0)) != icVerificadorD1) { return(false); }
	icVerificadorD1 *= 2;
	for (ic_x = 0; ic_x < 9; ic_x++) { icVerificadorD1 += parseInt(icCpfNumero.charAt(ic_x)) * (11 - ic_x); }
	icVerificadorD1 = 11 - (icVerificadorD1 % 11);
	if (icVerificadorD1 > 9){ icVerificadorD1 = 0; }
	if (icCpfDigitos.charAt(1) != icVerificadorD1) { return(false); }
	//Fim: Calculo de verificação

	return(true);
}

//Valida se um texto é um CNPJ válido.
//Entradas: (string) no padrão (xxx.xxx.xxx/xxxx-xx)
//Retorno: (string), retorna o texto formatado.
//Nota: Utilize a função twFctFormataCnpj para formatar seu texto. (Arq. twSistemaUtilitarios.js)
function twFctIsCnpj(icCnpj){

	var icCnpjNumero = "";
	var icRegExpCnpj = /^([0-9]{2}|0[0-9]{2})\.[0-9]{3}\.[0-9]{3}\/[0-9]{4}\-[0-9]{2}$/;
	var icRegExpSohNumeros = /^\d$/;

	//Verfica se o CNPJ fornecido esta no padrão (xxx.xxx.xxx/xxxx-xx)
	if(!icRegExpCnpj.test(icCnpj)){ return(false); }

	//Deixa apenas os números
	for(ic_x = 0; ic_x < icCnpj.length; ic_x ++)
		if(icRegExpSohNumeros.test(icCnpj.charAt(ic_x)))
			icCnpjNumero += icCnpj.charAt(ic_x).toString();

	//Valida o CNPJ
	var icCnpjValido = true;
	for(ic_g = 13; ic_g <= 14; ic_g ++){
		var icCaracterValidador = 0;
		var icIndicador = 2;
		for(ic_f = ic_g; ic_f > 0; ic_f --){
			icCaracterValidador += parseInt(icCnpjNumero.charAt(ic_f - 1)) * icIndicador;
			if(icIndicador > 8){ icIndicador = 2; }
			else { icIndicador ++; }
		}
		icCaracterValidador %= 11;
		if((icCaracterValidador == 0) || (icCaracterValidador == 1)){ icCaracterValidador = 0; }
		else { icCaracterValidador = 11 - icCaracterValidador; }
		if(icCaracterValidador != parseInt(icCnpjNumero.charAt(ic_g))){
			icCnpjValido = false;
			break;
		}
	}
	return(icCnpjValido);
}

//Verifica se um valor é uma data.
//    Se não for uma data, retorna (false).
//    Se for uma data, apenas retorna (true).
function twFctIsDate(idValor) {
	if(typeof idValor == "undefined"){ return (false); }
	if(typeof idValor != "string"){ idValor = idValor.toString(); }
	if ((idValor.length > 10)||(idValor.length < 6)) { return (false); }

	var id_c = 0; 
	var idValorTemporario = idValor; 
	var idCaractereValido = false;
	var idDiaMesAno = new Array();
	var idCaracteresAceitos = new Array("0","1","2","3","4","5","6","7","8","9","/");

	idDiaMesAno[0] = "";
	idDiaMesAno[1] = "";
	idDiaMesAno[2] = "";

	for (id_x = 0; id_x < idValorTemporario.length; id_x ++){ 
		idCaractereValido = false; 
		for(id_y = 0; id_y < 11; id_y ++){ 
			if(idValorTemporario.charAt(id_x) == idCaracteresAceitos[id_y]){ 
				idCaractereValido = true; 
			} 
		} 
		if(idCaractereValido){ 
			if(idValorTemporario.charAt(id_x) == "/"){ id_c ++; } 
			else { idDiaMesAno[id_c] += idValorTemporario.charAt(id_x); } 
		} else { 
			return (false); 
		} 
	}

	if (id_c!=2){ return (false); }

	var idDia = parseFloat(idDiaMesAno[0]);
	var idMes = parseFloat(idDiaMesAno[1]);
	var idAno = parseFloat(idDiaMesAno[2]);
	if ((idDia<1) || (idDia>31)){ return (false); }
	if ((idMes<1) || (idMes>12)){ return (false); }
	if ((idAno.toString().length!=2)&&(idAno.toString().length!=4)){ return (false); }
	if (idAno.toString().length==2){ 
		if(parseFloat(idAno)>49){ idAno = 1900 + idAno; }
		else { idAno = 2000 + idAno; } 
	}

	if ((idMes==4) || (idMes==6) || (idMes==9) || (idMes==11)){ if (idDia==31){ return (false); } }

	if (idMes==2){ 
		if (idDia > 29){ return (false); } 
		if ((idDia == 29) && (!twFctIsYearBisexto(idAno))){ return (false); } 
	}

	return (true);
}

//Verifica se um ano é bisexto
function twFctIsYearBisexto(iybAno){
	var iybIsBisexto = false;
	var iybAnoNum = parseFloat(iybAno);
	if(((iybAnoNum % 4) == 0) && (((iybAnoNum % 100) != 0) || ((iybAnoNum % 400) == 0))){ iybIsBisexto = true; }
	return(iybIsBisexto);
}

//Verifica se um valor é uma data e mostra uma mensagem se não for.
//    Se não for uma data, retorna (false) e exibe um alerta com uma mensagem.
//    Se for uma data, apenas retorna (true).
function twFctIsDateMsg(idmValor, idmMensagem) {
	if(!twFctIsDate(idmValor)){ alert(idmMensagem); return(false); }
	else { return (true); }
}

//Verifica se um valor é um email.
//    Se não for um email, retorna (false).
//    Se for um email, retorna (true).
function twFctIsEmail(ieValor) {
	var ieRegExpEmail = /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]{2,}\.)+[a-zA-Z]{2,4}$/;
	return(ieRegExpEmail.test(ieValor));
}

//Verifica se um valor tem a extensão de imagem.
//    Se não tiver, retorna (false).
//    Se tiver, retorna (true).
function twFctIsImage(iiValor){
	var iiRegExpEmail = /^(.{3,})+\.(bmp|gif|jpg|jpeg|png)$/;
	return(iiRegExpEmail.test(iiValor));
}

//Valida todos os campos obrigatórios de um formulário especifico.
//    Se houver algum campo que não atenda todas as definições, retorna (false).
//    Se todas as definições forem atendidas, retorna (true);
function twFctValidaFomulario(vfFormulario){
	//Linha para atualização do conteudo do HTML Editor (Incluida na versão 1.0.0.3 em 15/01/05)
	if (vfFormulario.updateFCKEditor){ for (var i = 0 ; i < vfFormulario.updateFCKEditor.length ; i++) vfFormulario.updateFCKEditor[i](); }
	//
	for(vf_a = 0; vf_a < vfFormulario.elements.length; vf_a ++){
		var vfCampo = vfFormulario.elements(vf_a);
		var vfValorMinimo = 1;
		if(typeof(vfCampo.minimo)=="string")
			vfValorMinimo = parseFloat(vfCampo.minimo); 
		if((typeof(vfCampo.obrigatorio)=="string")||(typeof(vfCampo.opcional)=="string")){
			if(typeof(vfCampo.mensagem)=="string"){
				switch (vfCampo.type){
					case "text":
						if(((typeof(vfCampo.opcional)=="string")&&(vfCampo.value.length > 0))||(typeof(vfCampo.obrigatorio)=="string")){
							if(!twFctCampoCheckMin(vfCampo, vfValorMinimo, vfCampo.mensagem)){ return(false); }
							if((typeof(vfCampo.tipoCpf)=="string")&&(typeof(vfCampo.tipoCnpj)=="string")){
								if((!twFctIsCpf(vfCampo.value))&&(!twFctIsCnpj(vfCampo.value))){ alert(vfCampo.mensagem); vfCampo.focus(); return(false); }
							} else {
								if(typeof(vfCampo.tipoCpf)=="string")
									if(!twFctIsCpf(vfCampo.value)){ alert(vfCampo.mensagem); vfCampo.focus(); return(false); }
								if(typeof(vfCampo.tipoCnpj)=="string")
									if(!twFctIsCnpj(vfCampo.value)){ alert(vfCampo.mensagem); vfCampo.focus(); return(false); }
							}
							if(typeof(vfCampo.tipoData)=="string")
								if(!twFctIsDate(vfCampo.value)){ alert(vfCampo.mensagem); vfCampo.focus(); return(false); }
							if(typeof(vfCampo.tipoEmail)=="string")
								if(!twFctIsEmail(vfCampo.value)){ alert(vfCampo.mensagem); vfCampo.focus(); return(false); }
						}
						break;
					case "password":
						if(((typeof(vfCampo.opcional)=="string")&&(vfCampo.value.length > 0))||(typeof(vfCampo.obrigatorio)=="string")){
							if(!twFctCampoCheckMin(vfCampo, vfValorMinimo, vfCampo.mensagem)){ return(false); }
							if(typeof(vfCampo.compararCom)=="string"){
								for(vf_b = 0; vf_b < vfFormulario.elements.length; vf_b ++){
									var vfCampoComparar = vfFormulario.elements(vf_b);
									if(vfCampoComparar.name == vfCampo.compararCom){
										if(vfCampoComparar.value != vfCampo.value){
											alert(vfCampoComparar.mensagem);
											vfCampoComparar.value = "";
											vfCampoComparar.focus();
											return(false);
										} else {
											break;
										}
									}
								}
							}
						}
						break;
					case "file":
						if(((typeof(vfCampo.opcional)=="string")&&(vfCampo.value.length > 0))||(typeof(vfCampo.obrigatorio)=="string")){
							if(!twFctCampoCheckMin(vfCampo, vfValorMinimo, vfCampo.mensagem)){ return(false); }
							if(typeof(vfCampo.tipoImagem)=="string")
								if(!twFctIsImage(vfCampo.value)){ alert(vfCampo.mensagem); vfCampo.focus(); return(false); }
						}
						break;
					case "textarea":
						if(((typeof(vfCampo.opcional)=="string")&&(vfCampo.value.length > 0))||(typeof(vfCampo.obrigatorio)=="string")){
							if(!twFctCampoCheckMin(vfCampo, vfValorMinimo, vfCampo.mensagem)){ return(false); }
							if(typeof(vfCampo.maxlength)=="string")
								if(!twFctCampoCheckMax(vfCampo, parseFloat(vfCampo.maxlength), vfCampo.mensagem)){ return(false); }
						}
						break;
					case "checkbox":
						if(!vfCampo.checked){ alert(vfCampo.mensagem); return(false); }
						break;
					case "radio":
						var vfAlgumSelecionado = false;
						for(vf_b = 0; vf_b < vfFormulario.elements.length; vf_b ++){
							if(vfFormulario.elements(vf_b).name == vfCampo.name){
								if(vfFormulario.elements(vf_b).checked){ vfAlgumSelecionado = true; break; }
							}
						}
						if(!vfAlgumSelecionado){ alert(vfCampo.mensagem); vfCampo.focus(); return(false); }
						break;
					case "select-one":
						if(!twFctCampoCheckMin(vfCampo, vfValorMinimo, vfCampo.mensagem)){ return(false); }
						break;
					case "hidden":
						if(((typeof(vfCampo.opcional)=="string")&&(vfCampo.value.length > 0))||(typeof(vfCampo.obrigatorio)=="string")){
							if(!twFctCampoCheckMin(vfCampo, vfValorMinimo, vfCampo.mensagem, false)){ return(false); }
							if(typeof(vfCampo.tipoCpf)=="string")
								if(!twFctIsCpf(vfCampo.value)){ alert(vfCampo.mensagem); return(false); }
							if(typeof(vfCampo.tipoData)=="string")
								if(!twFctIsDate(vfCampo.value)){ alert(vfCampo.mensagem); return(false); }
							if(typeof(vfCampo.tipoEmail)=="string")
								if(!twFctIsEmail(vfCampo.value)){ alert(vfCampo.mensagem); return(false); }
							if(typeof(vfCampo.selecoesNumero)=="string")
								if(parseFloat(vfCampo.selecoesNumero)==0){ 
									alert(vfCampo.mensagem); 
									var vfCampoFoco = eval("vfFormulario."+vfCampo.name+"_0");
									vfCampoFoco.focus();
									return(false); 
								}
						}
						break;
				}
			}
		}
	}
	for(vf_a = 0; vf_a < document.all.length; vf_a ++){
		var vfObjeto = document.all.item(vf_a);
		if(typeof(vfObjeto.desabilitar) == "string"){ vfObjeto.disabled = true; }
	}
	return (true);
}