/*

Framework para Validacao de Formulários

Desenvolvido por Jonas Rosado @ AI Systems (Cubo Multimidia)

Entre Dezembro/2007 até Abril/2008

Script em constante Aperfeiçoação!

*/

//alert('Inicio do Arquivo: validacao.js');



//Define a classe que sera utilizada para indicar o campo que esta preenchido incorretamento
var campoClassNameErro 	= "campo_erro";
//Define a classe que sera utilizada para indicar o campo que esta preenchido corretamento
var campoClassNameOk 	= "campo_ok";


function validacao(formId, addObs, load){

	//declara variaveis
	var campo, evento;
	var retorna = true;
	var addObs = (addObs==undefined)?0:addObs;
	var load = (load==undefined)?0:load;

	debug("- - - - - - - - - - - - - - - - - - - - -");
	debug("Validacao("+formId+", "+addObs+", "+load+")");
	debug("- - - - - - - - - - - - - - - - - - - - -");

	//pega todos elementos input do ID passado via parametro e faz um loop
	$$('#'+formId+' input, #'+formId+' select, #'+formId+' textarea').each(function(campo){

		debug("- - - - - - - - - - - - - - - - - - - - -");

		/*
		SÓ NUMEROS
		*/
		if(addObs==1 || load==1){
			try{
			    if(campo.getAttribute('valida')){
    				if(campo.getAttribute('valida').match("alfanum")==null && campo.getAttribute('valida').match("num")!=null){
    					Event.observe(campo, "focus", function(){ soNum(campo); }, false);
    					Event.observe(campo, "keyup", function(){ soNum(campo); }, false);
    					Event.observe(campo, "blur", function(){ soNum(campo); }, false);
    					debug("Add Obs: soNum()\nCampo: "+campo.id);
    				}
			    }
			}catch(erro){}
		}


		/*
		EXCEÇÕES
		*/

		//Doc Numero: alterar tipo de DOC
		if((addObs==1 || load==1) && campo.id=="docTipo"){
			Event.observe(campo, "change", function(){
				if($F('docNumero').length>0){
					verifica($('docNumero'));
				}
			}, false);
			debug("Add Obs: verifica ($('docNumero'))\nCampo: "+campo.id);
		}



		// Campos de Sacado: qdo o usuario seleciona que será ele msm o resp. pelo pgto, então não nem verifica, já retorna TRUE
		if(campo.hasClassName('sacado')==true && $('pgtoTerceiros_0').checked==true){
			retorna = (retorna==true) ? true : false;
		}

		// Botão Add Acompanhante:
		else if(campo.id=="acompanhanteAdd"){

			if($('acompanhantes_0').checked==true){
				//OK
				var retorna_acom = true;
			}else if($('acompanhantes_1').checked==true){
				//ERRO
				if($$(".acompanhante").length==0 || $('acompanhanteAdd').value>0){
					//seta atributo
					campo.setAttribute("valida","campo");
					//valida
					verifica(campo, addObs);
					//remove atributo
					campo.setAttribute("valida","");
					//alert
					//alert(strings['acom_alert']);
					//erro
					erroClass($('acompanhanteAdd'));
					//focus
					$('acompanhanteAdd').activate();
					//retorna
					retorna_acom = false;
				}
				else{
					//retorna
					retorna_acom = true;
				}

			}
			//retorna
			retorna = (retorna==true) ? retorna_acom : false;
		}

		// Newsletter - data agendada
		else if(campo.id=="data_agora" || campo.id=="data_agendadaR" ){

			if(load==1){
				Event.observe(campo, 'click', function(event){ newsletterValidaData(campo); }, false);
				if(campo.id=="data_agendadaR"){
					Event.observe($('campo_data'), 'blur', function(event){ (($('data_agendadaR').checked==true)? newsletterValidaData(campo) : null) }, false);
				}
			}else{
				retornaNlValidaData = newsletterValidaData(campo);
				retorna = (retorna==true) ? retornaNlValidaData : false;
			}

		}

		else{
			//Verifica no Load
			if(load==1){
				verifica(campo, 0, 1);
			}
			//Verifica no submit
			else{
				if(campo.id=="docTipo"){
					debug("Campo: docTipo\nValida (antes): "+retorna);
				}

				retorna =  (verifica(campo, ((addObs==1 && (campo.id=='docNumero' || campo.id=='email'))?0:addObs), load)==false) ? false : retorna;

				if(campo.id=="docTipo"){
					debug("Campo: docTipo\nValida (dps): "+retorna);
				}

			}//else verifica
		}

	});//each

	//Retorna
	return retorna;

}//function validacao



function verifica(campo, addObs, load){

	// adiciona observers?
	var addObs = (addObs==undefined)?0:addObs;

	//Load
	var load = (load==undefined)?0:load;

	//declara variaveis
	var validacao, tipo, par1, par2, par3;

	//Está Visivel?
	try{
		var visivel = campo.visible();
	}catch(erro){
		debug("Campo: "+campo.id+" - Sem Atributo VISIBLE");
	}

	//pega o valida do elemento
	try{
		var valida = campo.getAttribute('valida');
	}catch(erro){
		debug("Campo: "+campo.id+" - Sem Atributo VALIDA");
	}

    if(valida!=null){
    	if(valida.length>0){
    
    		var valido = true;
    		var campos_aux = new Array();
    		var atributoAdd;
    		var i = 0;
    
    		//divide o valida e da loop do array do valida e loop
    		$A(valida.split(" ")).each(function(validacao){
    
    			//formata o valida e os parametros
    			dados = validacao.split(":");
    
    			tipo = dados[0];
    			par1 = dados[1];
    			par2 = dados[2];
    			par3 = dados[3];
    
    			//swtich com os tipos de validacao
    			switch(tipo){
    
    				//Campo
    				case 'campo':
    					valido = (valido)? validaCampo(campo) : false;
    				break;
    
    				//Editor
    				case 'editor':
    					valido = (valido)? validaEditor( String(tinyMCE.getContent()) ) : false;
    				break;
    
    				//Email
    				case 'email':
    					valido = (valido)? validaEmail(campo) : false;
    				break;
    
    				//Url
    				case 'url':
    					valido = (valido)? validaUrl(campo) : false;
    				break;
    
    				//Select
    				case 'select':
    					par1 = (!par1)?1:par1;
    					par2 = (!par2)?par1:par2;
    					valido = (valido)? validaSelect(campo, par1, par2) : false;
    				break;
    
    				//Checkbox
    				case 'check':
    					//Campos Aux
    					$$('input.'+par1).each(function(campos){
    						campos_aux[i] = campos;
    						i++;
    					})//each
    
    					//add Atributo
    					atributoAdd = tipo+":"+par1+":"+par2+":"+par3;
    
    					//valida
    					valido = (valido)? validaCheckbox(par1, par2, par3) : false;
    				break;
    
    				//Radio
    				case 'radio':
    					//Campos Aux
    					$A(document.getElementsByName(par1)).each(function(campos){
    						campos_aux[i] = campos;
    						i++;
    					})//each
    
    					//add Atributo
    					atributoAdd = tipo+":"+par1;
    
    					//valida
    					valido = (valido)? validaRadio(par1) : false;
    				break;
    
    				//Comparacao
    				case 'comparacao':
    					//valida
    					valido = (valido)? validaComparacao(campo, $(par1)) : false;
    				break;
    
    				//Tamanho
    				case 'tamanho':
    					par2 = (!par2)?par1:par2;
    					valido = (valido)? validaTamanho(campo, par1, par2) : false;
    				break;
    
    				//AlfaNumerico
    				case 'alfanum':
    					valido = (valido)? validaAlfaNum(campo) : false;
    				break;
    
    				//Alfa
    				case 'alfa':
    					valido = (valido)? validaAlfa(campo) : false;
    				break;
    
    				//Numerico
    				case 'num':
    					valido = (valido)? validaNum(campo) : false;
    				break;
    
    				//Numerico não Obrigatório
    				case 'numNO':
    					valido = (valido)? validaNumNO(campo) : false;
    				break;

    				//Data
    				case 'data':
    					valido = (valido)? validaData(campo) : false;
    				break;
    
    				//Documento (cpf, cnpj)
    				case 'doc':
    					valido = (valido)? validaDoc(campo, par1) : false;
    				break;
    
    				//Grupo
    				case 'grupo':
    					//par1 deve conter os IDs dos campos do grupo, se houver mais de um campo a separacao deverá ser feita atraves de virgula
    					valido = (valido)? validaGrupo(campo, par1) : false;
    				break;
    
    
    				// Edita (só valida as outras validacoes caso o campo esteja preenchido)
    				//** SEMPRE SER O ULTIMO TIPO DE VALIDAÇÂO **
    				case 'edita':
    					if(campo.value.length>0){
    						valido = (valido)? true : false;
    					}else{
    						valido = true;
    					}
    				break;
    
    
    
    			}//switch
    
    			//count
    			i++;
    
    		});//loop validacoes
    
    
    		//Msgs
    		var msgs		= getMsgField(campo);
    		var msgInfo 	= msgs['info'];
    		var msgOk 		= msgs['ok'];
    		var msgErro 	= msgs['erro'];
    		var msgErroDup 	= (msgs['erroDup']==undefined)? msgs['erro'] : msgs['erroDup'] ;
    
    		if(load==0){
    			//Esconde tudo
    			[msgInfo, msgOk, msgErro, msgErroDup].each(Element.hide);
    
    			//valido
    			if(valido==true){
    				okClass(campo);
    				(msgOk) ? Element.show(msgOk) : null;
    			}else{
    				erroClass(campo);
    				(msgErro) ? Element.show(msgErro) : null;
    			}
    		}//load
    
    
    		//Campo auxiliar
    		var j = 0;
    		campos_aux.each(function(campo_aux){
    
    			var addAtributo, atributoAux;
    
    			//pega o atributo valida
    			try{
    				atributoAux = campo_aux.getAttribute('valida');
    				atributoAux = (atributoAux)?atributoAux:'';
    			}catch(erro){
    				atributoAux = '';
    			}
    
    			//valido
    			if(load==0){
    				(valido==true)? okClass(campo_aux) : erroClass(campo_aux);
    			}
    
    			//add Atributo
    			if(atributoAdd!=""){
    				atributoAdd = atributoAdd.toString().split(" ");
    				atributoAux = atributoAux.split(" ");
    				addAtributo = (atributoAux!='')? atributoAdd.concat(atributoAux) : atributoAdd;
    				addAtributo = addAtributo.uniq();
    				addAtributo = addAtributo.toString().replace(/,/g," ");
    				campo_aux.setAttribute("valida", addAtributo);
    			}
    
    			// adiciona observers
    			(addObs==1)? Event.observe(campo_aux, event2field(campo_aux), function(){ verifica(campo_aux) }, false): null;
    			(addObs==1)? debug("Add Obs: verifica\nCampo: "+campo_aux.id): null;
    
    		});//for
    
    		//Load ou addObs
    		if(load==1 || addObs==1){
    			//Esconde OK e ERRO
    			Event.observe(campo, 'focus', function(){ [msgOk, msgErro].each(Element.hide); }, false);
    			debug("Add Obs: hide msgOk e msgErro\nCampo: "+campo.id);
    
    			Event.observe(campo, event2field(campo), function(){ verifica(campo) }, false);
    			debug("Add Obs: verifica\nCampo: "+campo.id);
    		}
    
    		//retorna
    		return valido;
    
    	}//if
    	else{
    		//retorna
    		return true;
    	}
    }else{
		//retorna
		return true;
    }

}//function verifica




/* Obtem o objeto da msg do campo determinado*/
function getMsgField(campo){

	//Vars
	var msgInfo, msgOk, msgErro, msgErroDup;
	var retorna = new Array();

	//Sobe um nivel
	var campo_aux = campo.up();

	//Checa se o elemento tem algum filho com a classe INFO
	while(campo_aux.select(".info").length<=0){
		//sobe mais um nivel
		campo_aux = campo_aux.up();
	}

	try{
		//INFO
		retorna['info'] = campo_aux.getElementsByClassName('info')[0];

		//OK
		retorna['ok'] = campo_aux.getElementsByClassName('ok')[0];

		//ERRO
		retorna['erro'] = campo_aux.getElementsByClassName('erro')[0];

		try{
		//ERRO Duplicado
		retorna['erroDup'] = campo_aux.getElementsByClassName('erroDup')[0];
		}catch(e){}


	}catch(erro){
		alert("ERRO\nCampo sem as msg de OK ou INFO ou ERRO!\n\nCampo: "+campo.id)

		retorna['info'] = false;
		retorna['ok'] = false;
		retorna['erro'] = false;
		try{
			retorna['erroDup'] = false;
		}catch(e){}
	}

	//Retorna
	return retorna;

}//function


function event2field(campo){

	var evento;

	if (campo.type == 'text' || campo.type == 'password' || campo.type == 'textarea'){
		evento = "keyup"; //esta bugando qdo utiliza o TAB
		//evento = "keypress";
	}
	else if (campo.nodeName.toLowerCase() == "select"){
		evento = "change";
	}
	else if (campo.type == 'radio' || campo.type == 'checkbox'){
		evento = "click";
	}
	else{
		evento = "blur";
	}

	return evento;
}


/* Se conter a classe de campo OK remove-a e adiciona a classe de campo ERRO, se ja nao conter*/
function erroClass(campo){
	//remove classe OK
	campo.removeClassName(campoClassNameOk);

	//add classe Erro, se ja nao tiver
	var add = true;
	campo.classNames().each(function(classe){
		if(classe==campoClassNameErro){
			add = false;
		}
	});
	if(add==true){
		campo.addClassName(campoClassNameErro);
	}

}

/* Se conter a classe de campo ERRO remove-a e adiciona a classe de campo OK, se ja nao conter*/
function okClass(campo){
	//remove classe Erro
	campo.removeClassName(campoClassNameErro);

	//add classe Ok, se ja nao tiver
	var add = true;
	campo.classNames().each(function(classe){
		if(classe==campoClassNameOk){
			add = false;
		}
	});
	if(add==true){
		campo.addClassName(campoClassNameOk);
	}

}



/* Remove os espacos em branco para realizar algumas validacoes */
function removeEspaco(str){
	var retorna = str;
	var re = /\s/g;
	if(str.search(re) != -1){
		retorna = str.replace(re, '');
	}
	return retorna;
}


/* Valida Campo se esta preenchido */
function validaCampo(campo){
	var value = removeEspaco(campo.value);
	if (value==null || value=="" || value.length==0){
		return false;
	}else{
		return true;
	}
}
/* Valida Editor se esta preenchido */
function validaEditor(editor){
	var value = removeEspaco(editor);
	if (value==null || value=="" || value.length==0){
		return false;
	}else{
		return true;
	}
}

function validaSelect(campo, min, max){
	var selecionado = 0;
	$$('#'+campo.id+' option').each(function(opcao){
			if(opcao.value!='' && opcao.selected==true){
				selecionado++;
			}
		}//function
	)//each
	if(selecionado>=min && selecionado<=max){
		return true;
	}else{
		return false;
	}
}

/* Verifica se algum dos campos esta checado (checked) via name do campo */
function validaRadio(name){
	var checado = false;
	$A(document.getElementsByName(name)).each(function(campo){
			if(checado==false && campo.checked==true){
				checado = true;
			}
		}//function
	)//each
	//retorna
	return checado;
}

/* Verifica se os checkboxes estao selecionados conforme os parametros min e max */
function validaCheckbox(classe, min, max){
	var checado = 0;
	$$('input.'+classe).each(function(campo){
			if(campo.type=='checkbox' && campo.checked == true){
				checado++;
			}
		}//function
	)//each

	//alert("validaCheckbox()\nclass: "+classe+"\nqde: "+checado);

	if(checado>=min && checado<=max){
		return true;
	}else{
		return false;
	}
}


/* Valida endereco de Email */
function validaEmail(campo){
	if(validaCampo(campo)==false){
		return false;
	}else{
		var value = campo.value;
		var re = /^[\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}\])$/;
		return re.test(value);
	}
}


/* Valida uma URL */
function validaUrl(campo){
	var value = campo.value;
	var re = /^(https?|ftp):\/\//;
	return re.test(value);
}


/* Compara o valor de 2 campos */
function validaComparacao(campoA, campoB){
	if(campoA.value == campoB.value){
		return true
	}else{
		return false;
	}
}


/* Verifica se o numero de caracteres do campo esta entre os definidos pelos parametros min e max*/
function validaTamanho(campo, min, max){
	var retorna = true;
	var value = campo.value;
	var tamanho = value.length;
	if(tamanho>=min && tamanho<=max){
		return true;
	}else{
		return false;
	}
}


/* Valida se o campo somente contem caracteres AlfaNumericos*/
function validaAlfaNum(campo){
	var value = campo.value;

	var re = /\W+|_+/;
	return !re.test(value);

	/*var reUndeline = /_+/;
	if(reUndeline.test(value)==true){
		return false;
	}else{
		var re = /^\w+$/;
		return re.test(value);
	}*/
}

/* Valida se o campo somente contem caracteres do Alfabeto*/
function validaAlfa(campo){
	var value = campo.value;
	var re = /^[a-zA-Z]+$/;
	return re.test(value);
}


/* Valida se o campo somente contem caracteres Numericos*/
function validaNum(campo){
	var value = campo.value;
	var re = /^\d+$/;
	return re.test(value);
}

/* Valida se o campo somente contem caracteres Numericos*/
function validaNumNO(campo){
	var value = campo.value;
	var re = /^\d*$/;
	return re.test(value);
}

/* Valida o campo no fomato de data BR: dd/mm/yyyy*/
function validaData(campo){
	var value = campo.value;
	var re = /^((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{4}$/;
	return re.test(value);
}


/* Valida o numero do documento*/
function validaDoc(campo, campo_tipo_doc){

    // filta alfanumericos
    var value='';
    var RG = new RegExp('[a-zA-Z0-9]');
    campo.value.toArray().each(function(car){
        if(RG.test(car)==true){
            value += car;
        }
    });
	
	// atualiza valor
	if(value!=campo.value){
	    $(campo).value = value;
	}
	
	var retorna;

	if(campo_tipo_doc==null){
		retorna = isCpfCnpj(value);
	}else{
		switch($(campo_tipo_doc).value){
			case '':
				retorna = false;
			break;
			case 'CPF':
				retorna = isCpf(value);
			break;
			case 'CNPJ':
				retorna = isCnpj(value);
			break;
			case 'Passport':
				retorna = true;
			break;
		}

	}

	//Retorna
	return retorna;
}


function validaGrupo(campo, campos){

	var total, preenchido;

	// conta qtos campos tem no total e qtos tem preenchidos
	//campo
	total++;
	preenchido += (campo.value.length>0)?1:0;

	//campos aux
	$A(campos.split(",")).each(function(campos){
		total++;
		preenchido += (campos.value.length>0)?1:0;
	});

	return (preenchido==0 || total==preenchido)? true : false;
}


function validaDuplicidade(campo, tipo, campo_doc_tipo){

	//Variaveis
	var dado1, dado2, valido, ok;

	//DOC
	if(tipo=="doc"){
		dado1	= $F(campo_doc_tipo);
		dado2	= campo.value;
		ok 		= (dado1.length>0 && dado2.length>0 && validaDoc(campo, campo_doc_tipo)==true)?1:0;
	}
	// Email
	else if(tipo=="email"){
		dado1	= campo.value;
		dado2	= null;
		ok 		= (dado1.length>0)?1:0;
	}
	else{
		alert("validaDuplicidade()\nTipo de validação invalido!\nTipo: "+tipo);
	}

	//Se tiver dados
	if(ok==1){

    //verifica se está editando a inscrição
    if ($('editIns') != null){
        pars = 'edit=1';
    }else{
        pars = 'edit=0';
    }

		//AJAX
		var url = './rpc/inscricao_duplicidade.php';
		var pars = pars + '&tipo='+tipo+'&dado1='+dado1+'&dado2='+dado2;
		var myAjax = new Ajax.Request( url, {
			asynchronous: false,
			method: 'post',
			parameters: pars,
			onComplete: function(originalRequest) {

				//Resposta
				var resp = originalRequest.responseText;

				//OK
				if(resp==0 || resp==1){
					retorna = (resp==1)? false : true;
				}
				//Erro nos parametros enviados
				else{
					retorna = resp;
				}

			}
		});

	}else{
		var retorna = -3;
	}

	//Retorna
	return retorna;

}// validaDuplicidade()



//function validaEmailDuplicado(campo_obj, msgErroDup){
function validaEmailDuplicado(campo_obj){

	var retorna = null;

	//valida
	var valido = validaDuplicidade(campo_obj, "email");

	// se entra no IF caso o campo esteja preenchido, pois o valor -3 pode ser referente a esse erro
	if(valido != -3){

		//Msgs
		msgs = getMsgField(campo_obj);
		var msgInfo 	= msgs['info'];
		var msgOk 		= msgs['ok'];
		var msgErro 	= msgs['erro'];
		var msgErroDup 	= (msgs['erroDup']==undefined)? msgs['erro'] : msgs['erroDup'];

		//Esconde Msgs
		[msgInfo, msgOk, msgErro, msgErroDup].each(Element.hide);


		//acao pos validacao
		switch(valido){

			// (1) OK
			case true:
				// Re-Valida endereço
				retorna = verifica(campo_obj);
			break;

			// (0) duplicado
			case false:
				//add class
				erroClass(campo_obj);
				//show msg
				(msgErroDup) ? Element.show(msgErroDup) : null;
				//retorna
				retorna = false;
				// esconde msg erro padrao
				(msgErro.visible()==true)? Element.hide(msgErro) : null;
			break;

			// (-1) falta de envio de dados
			case -1:
			// (-2) tipo validacao diferente de email e doc
			case -2:
				alert(strings['emailDup_erro']);
			break;
		}

	}

	//retorna
	return retorna;

}



function validaDocDuplicado(campoNum_obj, campoTipo_obj){

	var retorna = null;

	//valida
	var valido = validaDuplicidade(campoNum_obj, "doc", campoTipo_obj);

	// se entra no IF caso o campo esteja preenchido, pois o valor -3 pode ser referente a esse erro
	if(valido != -3){

		//Msgs
		msgs = getMsgField(campoNum_obj);
		var msgInfo 	= msgs['info'];
		var msgOk 		= msgs['ok'];
		var msgErro 	= msgs['erro'];
		var msgErroDup 	= (msgs['erroDup']==undefined)? msgs['erro'] : msgs['erroDup'];

		//Esconde Msgs
		[msgInfo, msgOk, msgErro, msgErroDup].each(Element.hide);

		//acao pos validacao
		switch(valido){

			// (1) OK
			case true:
				//add class
				okClass(campoNum_obj);
				//show msg
				(msgOk) ? Element.show(msgOk) : null;
				//retorna
				retorna = true;
			break;

			// (0) duplicado
			case false:
				//add class
				erroClass(campoNum_obj);
				//show msg
				(msgErroDup) ? Element.show(msgErroDup) : null;
				//retorna
				retorna = false;
				// esconde msg erro padrao
				(msgErro.visible()==true)? Element.hide(msgErro) : null;
			break;

			// (-1) falta de envio de dados
			case -1:
			// (-2) tipo validacao diferente de email e doc
			case -2:
				alert(strings['emailDup_erro']);
			break;
		}

	}

	//retorna
	return retorna;
}


//alert('Fim do Arquivo: validacao.js');