//===========================================================================
// Objetos e funções para validação de campos através de expressões regulares
//===========================================================================

function PatternDictEntry(pattern, message, complementFunction) {
	this.pattern= pattern;
	this.message= message;
	this.complementFunction= complementFunction;
}

var PatternsDict = new Object();

// Guia de ref. para RegExp em Javascript: http://developer.netscape.com/docs/manuals/js/client/jsguide/index.htm
// **************************************************************************************************************

PatternsDict.CEP = new PatternDictEntry("^\\d{5}-?\\d{3}$", "deve ser um CEP válido.\n\nExemplo: 99999-999 ou 99999999", null);

PatternsDict.MONETARIO = new PatternDictEntry("^[-+]?[0-9]{1,3}(\\.[0-9]{3})*(,[0-9]{2})$", "deve ser um valor monetário.\n\nExemplo: 99.999,99", null);

PatternsDict.HORA= new PatternDictEntry("^([01][0-9]|2[0-3]):[0-5][0-9]$", "deve ser uma hora válida.\n\nExemplo: 12:34 OU 23:59", null);

PatternsDict.NOME= new PatternDictEntry("^([A-ZÀ-Ú][a-zà-ú]+)(\\s[A-ZÀ-Úa-zà-ú]*)*$", "deve iniciar por letra maiúscula e ter mais de um caractere.\n\nExemplo: Américo Vespúcio", null);

PatternsDict.TERMO= new PatternDictEntry("^[A-Za-zÀ-Úà-ú]+$", "deve ser alfabético.\n\n Exemplo: América do Sul", null);

PatternsDict.NUMERO= new PatternDictEntry("^[-+]?[0-9]{1,}(,[0-9]{1,})?$", "deve ser numérico dentro do intervalo especificado.\n\n Exemplo: 5.467.324,56 OU -8.907", checkRange);

PatternsDict.INTEIRO= new PatternDictEntry("^[0-9]+$", "deve ser inteiro dentro do intervalo especificado.\n\n Exemplo: 1 OU 9999", checkRange);

PatternsDict.DATA= new PatternDictEntry("^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/[12][0-9]{3}$", "deve ser uma data válida.\n\n Exemplo: 03/03/1996 OU 29/02/2092", validaCxDt);

PatternsDict.MESANO= new PatternDictEntry("^(0?[1-9]|1[012])/[12][0-9]{3}$", "deve ser uma data válida.\n\n Exemplo: 03/1996 OU 02/2092", null);

PatternsDict.EMAIL= new PatternDictEntry("^[A-Za-z0-9_.-]+@([A-Za-z0-9_-]+\\.)+[A-Za-z]{2,4}$", "deve ser um endereço de e-mail válido.\n\n Exemplo: fulano.da.silva@onde.trabalha.org", null);

PatternsDict.WEB= new PatternDictEntry("^(http://|HTTP://)?([A-Za-z0-9_-]+\\.)+[A-Za-z]{2,4}(/[.A-Za-z0-9_-]+)*/?$", "deve ser um endereço Web válido.\n\n Exemplo: primapag.seilaonde.org OU http://www.empresa.com.br/especial/segunda/index.html", null);

PatternsDict.FONE= new PatternDictEntry("^(\\(0xx[0-9]{2}\\) ?)?[0-9]{1,4}-?[0-9]{4}$", "deve ser um número de telefone válido.\n\n Exemplo: (0xx51) 4321-9876 OU 99881234", null);

PatternsDict.CPF= new PatternDictEntry("^\\d{3}\\.?\\d{3}\\.?\\d{3}-?\\d{2}$", "deve ser um CPF válido.\n\nExemplo: 231.261.750-15 OU 72345616091", validaCPF);

PatternsDict.CNPJ= new PatternDictEntry("^\\d{2}\\.?\\d{3}\\.?\\d{3}/?\\d{4}-?\\d{2}$", "deve ser um CNPJ válido.\n\nExemplo: 92.242.080/0001-00 OU 96734769000102", isCNPJ);

PatternsDict.HIDDEN= new PatternDictEntry(".*", "Pressione o botão 'BUSCAR' e selecione um ", isOid);

PatternsDict.ALFANUM= new PatternDictEntry(".*", "deve ser preenchido.", null);


function validateForm(theForm) {  // return true if all is well
	var elArr = theForm.elements; // get all elements of the form into array

	for(var i = 0; i < elArr.length; i++) 
	with(elArr[i]) { // for each element of the form...
		value= value.trim();
		var v = elArr[i].validator; // get validator, if any
		if(!v) continue; // no validator property, skip

		if(type == "hidden") {
			if(elArr[i].notNull != null) {		// OBRIGATÓRIO
				if(value != '') continue;
				if(eval(elArr[i].bind).value == '')
					return erro(elArr[i], "Campo '" + elArr[i].id + "' deve ser preenchido.");
				else
					return erro(elArr[i], "Pressione o botão 'BUSCAR' e selecione um(a) " + elArr[i].id);
				return false;
			} else if((eval(elArr[i].bind).value != '') && (value == '')) {
				return erro(elArr[i], "Pressione o botão 'BUSCAR' e selecione um(a) " + elArr[i].id);
				return false;
			}
		} else {
			if(value == '') {
				if(elArr[i].notNull != null)
					return erro(elArr[i], 'deve ser preenchido.');
				else continue;
			}

			var thePat = new RegExp(PatternsDict[v].pattern); // select the validating regular expr
			var gotIt = thePat.test(value); // run it on value of elArr[i]
			if(!gotIt)
				return erro(elArr[i], PatternsDict[v].message);
			if(PatternsDict[v].complementFunction != null) {
				if(!PatternsDict[v].complementFunction(elArr[i]))
					if(v == 'NUMERO')
						return rangeError(elArr[i], elArr[i].minVal, elArr[i].maxVal);
					else
						return erro(elArr[i], PatternsDict[v].message);
			}
		}	
	};
	return true;
}

function desabilitaForm(theForm) {  // return true if all is well
	var elArr = theForm.elements; // get all elements of the form into array
	for(var i = 0; i < elArr.length; i++)

	with(elArr[i]) { // for each element of the form...
		if(type == "button") {
			eval('document.'+theForm.name+'.'+eval(elArr[i]).name+'.disabled=true');
		}
	};
}		



function erro(campo, msg) {
	if(campo.type == "hidden") {
		alert(msg);
		if(campo.button != null) eval(campo.button).focus();
	} else {
		alert("Campo '" + campo.id + "' " + msg);
	    campo.focus();
	    campo.select();
	}
    return false;
}

function rangeError(campo, min, max) {
	alert("Valor deve estar entre " + min + " e " + max);
	campo.focus();
	campo.select();
}

function isOid(fieldOid) {
	if(isNaN(parseInt(fieldOid.value, 10))) return false;
	return true;
}

function checkRange(field) {
	if(field.minVal == null || field.maxVal == null) return true;
	var min= parseFloat(field.minVal);
	if(isNaN(min)) return true;
	var max= parseFloat(field.maxVal);
	if(isNaN(max)) return true;
	var val= field.value;
	val= val.replace(/[,]/g , ".");
	val= parseFloat(val);
	if(isNaN(val)) return false;
	if(val < min || val > max) return false;
	return true;
}
