var vFocaCampo = ""; // Foca 1o. campo errado
var vColorError = "#FFFFEC" // Seta cor de fundo do campo com erro
var vColorOK	= "#FFFFFF"

// Expressões regulares
// inteiro não-negativo sem sinal
var reDigits = /^\d+$/;
//número real decimal (Portugues ou Ingles.
var reDecimalPt = /^[+-]?((\d+|\d{1,3}(\.\d{3})+)(\,\d*)?|\,\d+)$/;
var reDecimalEn = /^[+-]?((\d+|\d{1,3}(\,\d{3})+)(\.\d*)?|\.\d+)$/;
// Valor financeiro
//O valor financeiro é uma simplificação do número decimal visto anteriormente, não permitindo sinal e exigindo sempre 2 casas decimais e separador de milhar obrigatório. Separadores de decimal e milhar estão no formato em português: vírgula e ponto, respectivamente.
//var reMoeda = /^\d{1,3}(\.\d{3})*\,\d{2}$/;
var reMoeda = /^\d+\,\d{2}$/;
// Data
var reDate1 = /^\d{1,2}\/\d{1,2}\/\d{1,4}$/; // Simples
var reDate2 = /^[0-3]?\d\/[01]?\d\/(\d{2}|\d{4})$/; //Média
var reDate3 = /^(0?[1-9]|[12]\d|3[01])\/(0?[1-9]|1[0-2])\/(19|20)?\d{2}$/; // Avançada
var reDate4 = /^((0?[1-9]|[12]\d)\/(0?[1-9]|1[0-2])|30\/(0?[13-9]|1[0-2]) |31\/(0?[13578]|1[02]))\/(19|20)?\d{2}$/; //Completa
var reDate5 = /^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[0-2])|31\/(0[13578]|1[02]))\/\d{4}$/; // dd/mm/aaaa

//Tempo
var reTime1 = /^\d{2}:\d{2}$/; // Horário HH:MM Simples
var reTime2 = /^([0-1]\d|2[0-3]):[0-5]\d$/; // Horário HH:MM 24Hs
var reTime3 = /^(0[1-9]|1[0-2]):[0-5]\d$/; // Horário HH:MM 12Hs
var reTime4 = /^\d+:[0-5]\d:[0-5]\d$/; // Tempo horas:MM:SS
var reTime5 = /^\d+:[0-5]\d:[0-5]\.\d{3}\d$/; // Tempo horas:MM:SS.milisegundos

//E-mail
//Livre
var reEmail1 = /^[\w!#$%&'*+\/=?^`{|}~-]+(\.[\w!#$%&'*+\/=?^`{|}~-]+)* @(([\w-]+\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/;
//Compacto
var reEmail2 = /^[\w-]+(\.[\w-]+)*@(([\w-]{2,63}\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/;
//Restrito
var reEmail3 = /^[\w-]+(\.[\w-]+)*@(([A-Za-z\d][A-Za-z\d-]{0,61}[A-Za-z\d]\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/;

/*
Como usar as expressões regulares
function isTipo(pVal)
{
	var reTipo = /^...$/; // Onde ... é a expressão regular apropriada
	return reTipo.test(pVal);
}

*/

function ChecaForm(FRM) {

	// prms="Requerido=1/0,Tamanho Minimo=X,Tipo de entidades de Dados=C/N/A/R/E/D,Compara com outro campo=Nome outro campo,Menssagem"
	var oForm = FRM; // Objeto Form
	var vNrCampos = FRM.elements.length; // Nr. de Campos no Form
	var oCampo; // Objeto campo no Form
	var oCampo2; // Objeto campo no Form (Auxiliar)
	var aParams; // Parametros passados pelo campo
	var aParams2; // Parametros passados pelo campo	(Auxiliar)
	var i; // Variavel de controle
	var x; // Variavel de controle
	var vCheched = false; // Variavel de controle
	var vSelected = false; // Variavel de controle
	var vMenssagem = "Ocorreram erros:\n"; // Menssagem de erro(s) para usuario
	var aDataParams = ""; // Tipos de verificação de datas
	var vConfirme = ""; // Variavel auxiliar
	
	var aField = new Array();
	var nome="";
	var y = 0;

	for (i=0;i<vNrCampos;i++) {
		oCampo = oForm.elements[i];
		//alert("oCampo.type = " + oCampo.type);
		if ((oCampo.type!="button") && (oCampo.type!="submit") && (oCampo.type!="reset") && (oCampo.type!="hidden") && (!oCampo.disabled) && (!oCampo.readonly)) {		
			vExiste = false;
			if (aField.length=="") {
				aField[y++] = oForm.elements[i].name;
			} else {
				for (x=0;x<aField.length;x++) {
					if (aField[x]==oForm.elements[i].name) {
						vExiste=true;
						break;
					}
				}
				if (!vExiste) {					
					aField[y++] = oForm.elements[i].name
				}
			}
		}
	}


/*
	for (j=0;j<aField.length;j++){
		alert("aField["+j+"]="+aField[j]);	
	}
*/


//	for (i=0;i<vNrCampos;i++) {
		
	for (i=0;i<aField.length;i++) {
		oCampo = oForm[aField[i]]; 
		
		if ((oCampo.type!="button") && (oCampo.type!="submit") && (oCampo.type!="reset") && (oCampo.type!="hidden") && (!oCampo.disabled) && (!oCampo.readonly)) {
		
			setColor(oCampo,vColorOK);
			
			// Verifica se campo é um Array
			if (oCampo.length) {
				vTipo = (oCampo.type) ? oCampo.type : oCampo[0].type

				if (vTipo=="select-one" || vTipo=="select-multiple") {					
					aTemp = oCampo.id.split(":");
					aParams = aTemp[0].split(",");
				} else {
					aTemp = oCampo[0].id.split(":");
					aParams = aTemp[0].split(",");	
				}
				
				/*
				for (j=0;j<aParams.length;j++){
					alert("aParams["+j+"]="+aParams[j]);	
				}
				*/
				
			} else {
				vTipo = oCampo.type;
				aTemp = oCampo.id.split(":");
				aParams = aTemp[0].split(",");
				//alert("vTipo = " + vTipo);
			}

			//aTemp = oCampo.id.split(":");
			//aParams = aTemp[0].split(",");
			
			
			if ((vTipo=="text") || (vTipo=="textarea") || (vTipo=="password") || (vTipo=="file")) { // Se campo é do tipo texto, senha ou arquivo
				//alert("oCampo.name = " + oCampo.name);
				// Verifica se campo é obrigatorio e/ou é requerido um nr. No minimo posicoes
				if ((aParams[0]==1) && ((oCampo.value=="") || (oCampo.value.length < aParams[1]))) {
					SetaFoco(oCampo);
					vMenssagem+="=> "+aParams[6]+" (No minimo " + aParams[1] + " posicao(oes))\n"
				} else {

					if ((aParams[2]!="") && (oCampo.value.length>aParams[2])) {
						SetaFoco(oCampo);
						vMenssagem+="=> "+aParams[6]+" (Permitido apenas " + aParams[2] + " posicao(oes) no campo)\n"					
					}
					
					if (aParams[5]!="") {
						oCampo2 = oForm[aParams[5]];
						aTemp2 = oCampo2.id.split(":");
						aParams2 = aTemp2[0].split(",");
						if ((aParams[5]!="") && (oCampo.value!=oCampo2.value)) {
							vMenssagem+="=> "+aParams2[6]+" (Direfente de "+aParams[6]+")\n";							
							SetaFoco(oCampo);
							//break;
						}						
						oCampo2 = "";
						aParams2 = "";						
					}
					
					switch (aParams[3].substring(0,1)) { // Tipos de entidades de dados

						case "": // Nulo
							vMenssagem+="=> "+aParams[6]+": Tipo de dados nao especificado\n(Contate o desenvolvedor do site!)\n";						
							SetaFoco(oCampo);
							break;
						case "G": // Generico
							break;
						case "I": // Numero Inteiro

							if (!reDigits.test(oCampo.value)) {
								vMenssagem+="=> "+aParams[6]+" (Invalido)\n"
								SetaFoco(oCampo);
								
							}
							break;						
						case "R": // Numero Real
							if (!reDecimalPt.test(oCampo.value)) {
								vMenssagem+="=> "+aParams[6]+" (Invalido)\n"
								SetaFoco(oCampo);								
							}						
							break;
						case "M": // Valor monetário (R$)
							if (!reMoeda.test(oCampo.value)) {
								vMenssagem+="=> "+aParams[6]+" (Invalido)\n"
								SetaFoco(oCampo);								
							}
							break;
						case "E": // E-mail
							if (((aParams[0]==0) && (oCampo.value!="")) || (aParams[0]==1)) {
								/*if (!reEmail1.test(oCampo.value)) {
									vMenssagem+="=> "+aParams[6]+" (Invalido)\n"								
									SetaFoco(oCampo);						
								}
								*/
								
								if (!ChecaEmail(oCampo.value)) {
									vMenssagem+="=> "+aParams[6]+" (Invalido)\n"								
									SetaFoco(oCampo);						
								}
								
							}
							break;
						case "D": // Data	
							if (((aParams[0]==0) && (oCampo.value!="")) || (aParams[0]==1)) {
								
								if (!ChecaData(oCampo)) {
									vMenssagem+="=> "+aParams[6]+" (Invalido)\n"																	
									SetaFoco(oCampo);						
									//break;
								} else {
									
									aDataParams = aParams[3].split("|");
									//alert("aDataParams[0]="+aDataParams[0] + " - " + aDataParams[1] + " - " + aDataParams[2]);
									if (aDataParams[1]=="") {
											vMenssagem+="=> "+aParams[6]+": Permissão de data nao especificada\n(Contate o desenvolvedor do site!)\n";
											SetaFoco(oCampo);								
									} else if (aDataParams[1]==0) { // Não faz comparações
									} else if (aDataParams[1]==1) { // Não permite que data seja menor que data do sistema
									} else if (aDataParams[1]==2) { // Permite que data seja menor que data do sistema
									} else if (aDataParams[1]==3) { // Pede confirmação para permitir data menor que data do sitema
									} else if (aDataParams[1]==4) { // Não permite que data seja MAIOR que data do sistema					
									} else if (aDataParams[1]==5) { // Permite que data seja MAIOR que data do sistema
									} else if (aDataParams[1]==6) { // Pede confirmação para que data seja MAIOR que data do sistema
									}
									
									if (!DiaUtil(oCampo)) {																		
										if (aDataParams[2]=="") {
												vMenssagem+="=> "+aParams[6]+": Permissão de data 2 nao especificada\n(Contate o desenvolvedor do site!)\n";										
												SetaFoco(oCampo);																
										} else if (aDataParams[2]==0) { // Não faz comparações
										} else if (aDataParams[2]==1) { // NÃO PERMITE data em dia não útil
												vMenssagem+="=> "+aParams[6]+": (Dia nao util)\n";
												SetaFoco(oCampo);										
										} else if (aDataParams[2]==2) { // PERMITE data em dia não útil
										} else if (aDataParams[2]==3) { // PEDE CONFIRMÇÃO para permitir data em dia não útil
												vConfirme = confirm("Data informada no campo " + aParams[6] + " cai em dia nao util!\nDeseja continuar mesmo assim?");
												if (!vConfirme) {
													vMenssagem+="=> "+aParams[6]+": (Dia nao util)\n";
													SetaFoco(oCampo);										
												}
										}
									}
									
								}
							}
							break;
						case "C": // CNPJ/CPF
							if (aParams[0]<3) {	// 3 = Qualquer coisa
								if (!ChecaCNPJCPF(oCampo)) {
									vMenssagem+="=> "+aParams[6]+" (Invalido)\n"								
									SetaFoco(oCampo);						
								}
							}
							break;
						case "B": // Código de barras						
							if (aParams[0]<3) {	// 3 = Qualquer coisa
								if (oCampo.value!="" || oCampo.value.length>0) {
									
									vTamCodigo = oCampo.value.length;
									if (vTamCodigo==12) {
										if (!ccc12(oCampo.value)) {
											vMenssagem+="=> "+aParams[6]+" (Invalido)\n"								
											SetaFoco(oCampo);												
										}
									} else if (vTamCodigo==13) {
										if (!ccc13(oCampo.value)) {
											vMenssagem+="=> "+aParams[6]+" (Invalido)\n"								
											SetaFoco(oCampo);												
										}
									} else if (vTamCodigo==14) {
										if (!ccc14(oCampo.value)) {
											vMenssagem+="=> "+aParams[6]+" (Invalido)\n"								
											SetaFoco(oCampo);																							
										}
									} else if (vTamCodigo==18) {
										if (!ccc18(oCampo.value)) {
											vMenssagem+="=> "+aParams[6]+" (Invalido)\n"								
											SetaFoco(oCampo);																							
										}
									} else if (vTamCodigo==17) {
										if (!ccc17(oCampo.value)) {
											vMenssagem+="=> "+aParams[6]+" (Invalido)\n"								
											SetaFoco(oCampo);																							
										}
									} else if (vTamCodigo==8) {
										if (!ccc8(oCampo.value)) {
											vMenssagem+="=> "+aParams[6]+" (Invalido)\n"								
											SetaFoco(oCampo);																							
										}
									} else {
										vMenssagem+="=> "+aParams[6]+" (Invalido)\n"								
										SetaFoco(oCampo);						
									}
								} else {
									vMenssagem+="=> "+aParams[6]+" (Invalido)\n"								
									SetaFoco(oCampo);						
								}
								
							} else {
//								aBarrasParams = aParams[3].split(":");								
//								alert("aBarrasParams[0] = " + aBarrasParams[0] + " aBarrasParams[1] = " + aBarrasParams[1]);
							}							
							break;
					} // switch end
				}
					
			} else {

				if (aParams[0]==1) { // Verifica se campo é obrigatório
					
					switch (vTipo) {
						case 'select-one':
				
							if ((oCampo.options[oCampo.options.selectedIndex].value==-1) || (oCampo.options[oCampo.options.selectedIndex].value=="")) {
								vMenssagem+="=> "+aParams[6]+" (Requerido)\n"
								SetaFoco(oCampo);
							}							
							break;							
						case 'select-multiple':
							vSelected=false;
							for (x = 0; x < oCampo.length; x++) {						
								if (oCampo.options[x].selected) {
									vSelected = true;
									break;
								}					
							}	
							if (!vSelected) {						
								vMenssagem+="=> "+aParams[6]+" (Requerido)\n"
								SetaFoco(oCampo);
							}
							vSelected=false;							
							break;							
						case 'checkbox':
							vChecked = false;
							if (oCampo.length) {
								for (x = 0; x < oCampo.length; x++) {
									if (oCampo[x].checked) {
										vChecked = true;
									}					
								}						
							} else {
								if (oCampo.checked) {
									vChecked = true;
								}													
							}
							if (!vChecked) {						
								vMenssagem+="=> "+aParams[6]+" (Requerido)\n"
								SetaFoco(oCampo);
							}
							vCheched=false;																									
							break;
						case 'radio':
							vChecked = false;
							if (oCampo.length) {
								for (x = 0; x < oCampo.length; x++) {
									if (oCampo[x].checked) {
										vChecked = true;
										break;
									}					
								}						
							} else {
								if (oCampo.checked) {
									vChecked = true;
								}													
							}
							if (!vChecked) {						
								vMenssagem+="=> "+aParams[6]+" (Requerido)\n"
								SetaFoco(oCampo);
							}
							vCheched=false;																				
							break;
					}
				} // if (aParams[0]==1)	
					
			}

		}
	}

	if (vMenssagem!="Ocorreram erros:\n") {
		alert(vMenssagem);
		if (vFocaCampo.length && (vFocaCampo.type!="select-one" && vFocaCampo.type!="select-multiple")) {
			vFocaCampo[0].focus();
		} else {
			vFocaCampo.focus();
		}
		vFocaCampo = "";
		vMenssagem = "";
		return false;
	} else {		
		if (oForm.CamposOU) {
			return SubmitForm(oForm);	
		} else {
			return true;	
		}
		
	}
}
function SetaFoco(objCampo) {
	
	if (vFocaCampo=="") {
		vFocaCampo=objCampo;
		if (objCampo.length && objCampo.type!="select-one" && objCampo.type!="checkbox") {			
			for (i=0;i<objCampo.length;i++) {
				setColor(objCampo[i],vColorError);
			}
		}
	}
	if (!objCampo.length || objCampo.type=="select-one" || objCampo.type=="checkbox") {	
		setColor(objCampo,vColorError);
	}
//	setColor(objCampo,vColorError);	
}
function setColor(el,cor) {
  if (el.style) el.style.backgroundColor = cor;
}


