/* ValidaForm - 11/2006 - ver 0.2

11/06 -> Focus no campo com erro.
*/

//-------------------------------------------------------------------------------
if( !(typeof(motorjs) == 'object') ){
	var motorjs = new MotorJS();
}
//-------------------------------------------------------------------------------

function ValidaForm(){
	
	this.aVerificados	  = new Array();
	
	this.aErrorMsg 		  = new Array();
	this.aErrorObjetos	  = new Array();
	
	this.sEstiloCorreto	  = new String();
	this.sEstiloIncorreto = new String();
	
	this.bSinalizacao 	  = false;
	
	//---------------------------------------------------------------------------
    	
	this.sinalizacaoOn = function(){
		this.bSinalizacao = true;
	}
	
	this.setEstilos = function(sCorreto, sIncorreto){
		this.sEstiloCorreto   = sCorreto;
		this.sEstiloIncorreto = sIncorreto;
	}
	
	this.addVerificados = function(sNome){
		if(this.bSinalizacao) this.aVerificados.push(sNome);
	}
	
	this.addErrorMsg = function(sErro){
		this.aErrorMsg.push(sErro);
	}
	
	this.addErrorObjetos = function(sNome){
		this.aErrorObjetos.push(sNome);
	}
	
	this.alertErrorMsg = function(sForm){
		if(this.aErrorMsg.length > 0){
			var sErrosDisplay = this.aErrorMsg.toString();
			sErrosDisplay = sErrosDisplay.replace(/,/g, '\n');
			sErrosDisplay = 'Os seguintes erros ocorreram:\n\n' + sErrosDisplay;
			
			alert(sErrosDisplay);
			if(this.bSinalizacao) this.sinalizaObjetos(sForm);
			
			for(var i=0;i<document.forms[sForm].length;i++){
				var oField = document.forms[sForm][this.aErrorObjetos[i]];
				if( typeof oField != 'undefined' && motorjs.in_array(oField.type, ['text', 'textarea', 'password', 'select']) ){
					oField.focus();
					break;
				}
			}
			
			this.aErrorMsg 	   = new Array();
			this.aErrorObjetos = new Array();
			return false;
		}
		
		if(this.bSinalizacao) this.sinalizaObjetos(sForm);
		return true;
	}
	
	this.sinalizaObjetos = function(sForm){
		var sEstilo;
		var sNome;
		var sTiposPermitidos = new Array('text', 'textarea', 'password', 'select-one', 'select-multiple');
		
		with(document.forms[sForm]){
			for(var i=0;i<length;i++){
				if( (motorjs.in_array(elements[i].name, this.aVerificados)) && (motorjs.in_array(elements[i].type, sTiposPermitidos)) ){
					sObjeto = document.forms[sForm][elements[i].name];
					
					sEstilo = ( motorjs.in_array(elements[i].name, this.aErrorObjetos) ) ? this.sEstiloIncorreto : this.sEstiloCorreto;
					sObjeto.className = sEstilo;
				}
			}
		}
	}
	
	//---------------------------------------------------------------------------
	
	this.getLabels = function(sForm){
		var sRetorno = new String();
		
		with(document.forms[sForm]){
			for(var i=0;i<length;i++){
				if (elements[i].getAttribute('title') != ""){
					sRetorno = sRetorno + elements[i].getAttribute('title') + ';';
				}
			}
		}
		return sRetorno;
	}
	
	this.getTitle = function(oObjeto){
		return oObjeto.getAttribute('title');
	}
	
	//---------------------------------------------------------------------------
        
	this.validate = function(sForm){
		
		if(document.forms[sForm]){
			var sCatalogados = new Array();
		
			with(document.forms[sForm]){
				for(var i=0;i<length;i++){
					with(elements[i]){
						if( !(motorjs.in_array(name, sCatalogados)) ){
							sCatalogados.push(name);
							
							//Vazio
							if(getAttribute('vf:vazio') && getAttribute('vf:vazio') == 'S'){
								
								(!getAttribute('vf:error')) ? this.vazio(elements[i]) : this.vazio(elements[i], getAttribute('vf:error'));
								this.addVerificados(name);
							}
							
							//Check
							if(getAttribute('vf:check') && getAttribute('vf:check') > 0){
								(!getAttribute('vf:error')) ? this.check(document.forms[sForm][elements[i].name], getAttribute('vf:check')) : this.check(document.forms[sForm][elements[i].name], getAttribute('vf:check'), getAttribute('vf:error'));
								this.addVerificados(name);
							}
							
							//Mínimo
							if(getAttribute('vf:minimo') && getAttribute('vf:minimo') > 0){
								(!getAttribute('vf:error')) ? this.minimo(elements[i], getAttribute('vf:minimo')) : this.minimo(elements[i], getAttribute('vf:minimo'), getAttribute('vf:error'));
								this.addVerificados(name);
							}
							
							//E-mail
							if(getAttribute('vf:email') && getAttribute('vf:email') == 'S'){
								(!getAttribute('vf:error')) ? this.email(elements[i]) : this.email(elements[i], getAttribute('vf:error'));
								this.addVerificados(name);
							}
							
							//Comparar
							if(getAttribute('vf:comparar') && getAttribute('vf:comparar').length > 0){
								(!getAttribute('vf:error')) ? this.comparar(elements[i], getAttribute('vf:comparar')) : this.comparar(elements[i], getAttribute('vf:comparar'), getAttribute('vf:error'));
								this.addVerificados(name);
							}
							
							//Data
							if(getAttribute('vf:data') && getAttribute('vf:data') == 'S'){
								(!getAttribute('vf:error')) ? this.data(elements[i]) : this.data(elements[i], getAttribute('vf:error'));
								this.addVerificados(name);
							}
							
							//Hora
							if(getAttribute('vf:hora') && getAttribute('vf:hora') == 'S'){
								(!getAttribute('vf:error')) ? this.hora(elements[i]) : this.hora(elements[i], getAttribute('vf:error'));
								this.addVerificados(name);
							}
							
							//CPF
							if(getAttribute('vf:cpf') && getAttribute('vf:cpf') == 'S'){
								(!getAttribute('error')) ? this.cpf(elements[i]) : this.cpf(elements[i], getAttribute('vf:error'));
								this.addVerificados(name);
							}
							
							//CNPJ
							if(getAttribute('vf:cnpj') && getAttribute('vf:cnpj') == 'S'){
								(!getAttribute('vf:error')) ? this.cnpj(elements[i]) : this.cnpj(elements[i], getAttribute('vf:error'));
								this.addVerificados(name);
							}
							
						}
					}
				}
			}
			
			if( this.alertErrorMsg(sForm) ) return true; else return false;
		}else{
			alert('O formulário informado não existe!');
			return false;
		}
	}
	
	//---------------------------------------------------------------------------
    	
	this.vazio = function(sObjeto){
		var sValue = motorjs.trim(sObjeto.value);
		
		if(sObjeto.value == '' || sValue.length == 0){
			(arguments[1]) ? this.addErrorMsg(arguments[1]) : this.addErrorMsg("O campo '" + sObjeto.title + "' deve ser preenchido.");
			this.addErrorObjetos(sObjeto.name);
		}
	}
	
	this.check = function(sObjeto, iMinimo){
		var iMarcados = new Number();
		
		if( sObjeto.length > 0 ){
			for(var i=0;i<sObjeto.length;i++) if(sObjeto[i].checked==true) iMarcados++;
		}else{
			if(sObjeto.checked==true) iMarcados++;
		}
		
		if(iMarcados < iMinimo){
			var sTitle = ( sObjeto[0] ) ? sObjeto[0].title : sObjeto.title;
			var sName  = ( sObjeto[0] ) ? sObjeto[0].name : sObjeto.name;
			
			(arguments[2]) ? this.addErrorMsg(arguments[2]) : this.addErrorMsg("O campo '" + sTitle +  "' deve possuir no mínimo " + iMinimo + " opções selecionadas.");
			this.addErrorObjetos(sName);
		}
	}
	
	this.minimo = function(sObjeto, iMinimo){
		if(sObjeto.value.length < iMinimo){
			(arguments[2]) ? this.addErrorMsg(arguments[2]) : this.addErrorMsg("O campo '" + sObjeto.title + "' deve possuir no mínimo " + iMinimo + " caracteres.");
			this.addErrorObjetos(sObjeto.name);
		}
	}
	
	this.email = function(sObjeto){
		if( !this.checkEmail(sObjeto.value) ){
			(arguments[1]) ? this.addErrorMsg(arguments[1]) : this.addErrorMsg("O campo '" + sObjeto.title + "' possui um e-mail inválido.");
			this.addErrorObjetos(sObjeto.name);
		}
	}
	
	this.comparar = function(sObjeto, sAttr){
		var aAttr = new Array();
		var sOpLogico = new String();
		aAttr = sAttr.split(';');
		
		switch(aAttr[1]){
			case 'MAIOR': 		sOpLogico = '>';  break;
			case 'MAIOR_IGUAL': sOpLogico = '>='; break;
			case 'MENOR': 		sOpLogico = '<';  break;
			case 'MENOR_IGUAL': sOpLogico = '<='; break;
			case 'IGUAL': 		sOpLogico = '=='; break;
			case 'DIFERENTE': 	sOpLogico = '!='; break;
		}
		
		if( eval("'" + sObjeto.value + "'" + sOpLogico + "'" + aAttr[0] + "'") ){
			(arguments[2]) ? this.addErrorMsg(arguments[2]) : this.addErrorMsg("O campo '" + sObjeto.title + "' possui um valor incompatível.");
			this.addErrorObjetos(sObjeto.name);
		}
	}
	
	this.data = function(sObjeto){
		if(!this.checkData(sObjeto.value)){
			(arguments[1]) ? this.addErrorMsg(arguments[1]) : this.addErrorMsg("O campo '" + sObjeto.title + "' possui uma data inválida.");
			this.addErrorObjetos(sObjeto.name);
		}
	}
	
	this.hora = function(sObjeto){
		if(!this.checkHora(sObjeto.value)){
			(arguments[1]) ? this.addErrorMsg(arguments[1]) : this.addErrorMsg("O campo '" + sObjeto.title + "' possui uma hora inválida.");
			this.addErrorObjetos(sObjeto.name);
		}
	}
	
	this.cpf = function(sObjeto){
		if(!this.checkCPF(sObjeto.value)){
			(arguments[1]) ? this.addErrorMsg(arguments[1]) : this.addErrorMsg("O campo '" + sObjeto.title + "' possui um CPF inválido.");
			this.addErrorObjetos(sObjeto.name);
		}
	}
	
	this.cnpj = function(sObjeto){
		if(!this.checkCNPJ(sObjeto.value)){
			(arguments[1]) ? this.addErrorMsg(arguments[1]) : this.addErrorMsg("O campo '" + sObjeto.title + "' possui um CNPJ inválido.");
			this.addErrorObjetos(sObjeto.name);
		}
	}
	
	//===========================================================================
    
	this.checkDominio = function(sDominio){
		var sER; 
		sER = /^[a-z0-9][a-z0-9\-]+(\.?[a-z0-9\-]+){0,2}\.[a-z]{2,3}$/;
		return sER.test(sDominio);
	}

	this.checkEmail = function(sEmail){
		if(sEmail.length != '' && sEmail.length > 0){
			var aDados = sEmail.split("@");
			if(this.checkDominio(aDados[1])){
				var sER = /^[0-9a-z][0-9a-z\-\.\_]+$/;
				return sER.test(aDados[0]);
			}else{
				return false;
			}
		}
		
		return true;
	}
	
	//---------------------------------------------------------------------------
	
	this.checkData = function(sData){
		if(sData.length > 0){
			var sErro = new String;
			var aNovadata = new Array();
			
			if(sData.length < 10) sErro += " A data deve ser escrita no formato DD/MM/AAAA!";
			
			if(sData.charAt(2) != "/" || sData.charAt(5) != "/") if(sErro == "") sErro += " A data preenchida está incorreta. Preencha no formato DD/MM/AAAA!";
			
			aNovadata = sData.split("/");
			var dia = aNovadata[0];
			var mes = aNovadata[1];
			var ano = aNovadata[2];
			
			if(ano < 1000) sErro += " Preencha corretamente o ano!";
			if(mes < 1 || mes > 12)	sErro += " Preencha corretamente o mês!";
			
			switch(mes){
				case '02':
					if(dia < 1 || dia > 29)	sErro += " Preencha corretamente o dia!\nO mês especificado não possui este dia!";
					break;
				
				case '04':
				case '06':
				case '09':
				case '11':
					if(dia < 1 || dia > 30) sErro += " Preencha corretamente o dia!\nO mês especificado não possui este dia!";
					break;
				
				default:
					if(dia < 1 || dia > 31) sErro += " Preencha corretamente o dia!\nO mês especificado não possui este dia!";
					break;
			}
			
			if(sErro.length > 0) return false; else	return true;
		}
		
		return true;
	}
	
	this.checkHora = function(sHora){
		if(sHora.length > 0){
			var sErro		= new String;
			var aNovaHora	= new Array();
			var iIndiceHora = (arguments[1] && arguments[1]!='') ? arguments[1] : 23;
			
			if(sHora.charAt(2) != ":") if(sErro == "") sErro += " A hora preenchida está incorreta. Preencha no formato HH:MM!";
			
			aNovaHora = sHora.split(":");
			var hora 	= aNovaHora[0];
			var minuto 	= aNovaHora[1];
			
			if(hora > iIndiceHora) sErro += " Preencha as horas corretamente (até 59)!";
			if(minuto > 59)	sErro += " Preencha os minutos corretamente (até 59)!";
			
			if(sErro.length > 0) return false; else	return true;
		}
		
		return true;
	}
	
	//---------------------------------------------------------------------------
	
	this.checkCPF = function(sCPF){
		if(sCPF.length > 0){
			var sErro = new String;
			var x = new String;
			
			if(document.layers && parseInt(navigator.appVersion) == 4){
				x  = sCPF.substring(0, 3);
				x += sCPF.substring(4, 7);
				x += sCPF.substring(8, 11);
				x += sCPF.substring(12, 14);
				sCPF = x; 
			}else{
				sCPF = sCPF.replace(".", "");
				sCPF = sCPF.replace(".", "");
				sCPF = sCPF.replace("-", "");
			}
			
			if (sCPF.length < 11) sErro += "Sao necessarios 11 digitos para verificacao do CPF! "; 
			if (sCPF == "00000000000" || sCPF == "11111111111" || sCPF == "22222222222" || sCPF == "33333333333" || sCPF == "44444444444" || sCPF == "55555555555" || sCPF == "66666666666" || sCPF == "77777777777" || sCPF == "88888888888" || sCPF == "99999999999"){
				sErro += "Numero de CPF invalido!";
			}
			
			var a = [];
			var b = new Number;
			var c = 11;
			var i, y;
			
			for (i=0; i<11; i++){
				a[i] = sCPF.charAt(i);
				if (i < 9) b += (a[i] * --c);
			}
			
			if ((x = b % 11) < 2) { a[9] = 0 } else { a[9] = 11-x }
			b = 0;
			c = 11;
			
			for (y=0; y<10; y++) b += (a[y] * c--); 
			if ((x = b % 11) < 2) { a[10] = 0; } else { a[10] = 11-x; }
			if ((sCPF.charAt(9) != a[9]) || (sCPF.charAt(10) != a[10]))	sErro +="O CPF digitado possui um erro!";
			
			if(sErro.length > 0) return false; else	return true;
		}
		
		return true;
	}
	
	this.checkCNPJ = function(sCNPJ){
		if(sCNPJ.length > 0){
			var sErro = new String;
			var x = new String;
			
			if(document.layers && parseInt(navigator.appVersion) == 4){
				x = sCNPJ.substring(0, 2);
				x += sCNPJ.substring (3, 6);
				x += sCNPJ.substring (7, 10);
				x += sCNPJ.substring (11, 15);
				x += sCNPJ.substring (16, 18);
				sCNPJ = x; 
			} else {
				sCNPJ = sCNPJ.replace (".", "");
				sCNPJ = sCNPJ.replace (".", "");
				sCNPJ = sCNPJ.replace ("-", "");
				sCNPJ = sCNPJ.replace ("/", "");
			}
			
			var a = [];
			var b = new Number;
			var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];
			var i, j;
			
			for (i=0; i<12; i++){
				a[i] = sCNPJ.charAt(i);
				b += a[i] * c[i+1];
			}
			
			if ((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11-x }
			b = 0;
			
			for (y=0; y<13; y++) b += (a[y] * c[y]);
			if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
			if ((sCNPJ.charAt(12) != a[12]) || (sCNPJ.charAt(13) != a[13])) sErro +="O CNPJ digitado possui um erro!";
			
			if(sErro.length > 0) return false; else	return true;
		}
		
		return true;
	}
	
	//---------------------------------------------------------------------------
	
	this.criaComparacao = function(sObjeto, sValorComparado, sTipo){
		var sTipoPermitidos = new Array('MAIOR', 'MAIOR_IGUAL', 'MENOR', 'MENOR_IGUAL', 'IGUAL', 'DIFERENTE');
		
		if( motorjs.in_array(sTipo, sTipoPermitidos) ){
			sObjeto.setAttribute('vf:comparar', sValorComparado + ';' + sTipo);
			return true;
		}else{
			alert('O tipo solicitado não é permitido!');
			return false;
		}
	}
	
}

//-------------------------------------------------------------------------------
var validaform = new ValidaForm();
//-------------------------------------------------------------------------------
