/**
 * Classe FormUtil
 * Contém métodos para manipulação de
 * formulários 
 * */
function FormUtil(){

	/**
	 * Pega todos os inputs da página e de acordo
	 * com o seu tipo define os filtros e mascaramento
	 * correspondente
	 **/
	this.carregarFiltros = function(){
	
		var campos = getCampos();
		
		for (var i = 0; i < campos.length; i++) {
			for (var j = 0; j < campos[i].length; j++) {
				definirFiltro(campos[i][j]);
				definirMascara(campos[i][j]);
			}
		}
		
	};
	
	/**
	 * Pega todos os formulários da página
	 * e adiciona o evento de validação no onsubmit
	 **/
	this.carregarValidacao = function(){
	
		var sTipo = "";
		var campos = null;
		var forms = document.getElementsByTagName('form');
		
		for (var i = 0; i < forms.length; i++) {
			forms[i].onsubmit = function( event ){
				var evento = window.event ? window.event : event;
				var bRetorno = false;
				if (evento.returnValue != false) {
					bRetorno = validarDados(this);
				}
				evento.returnValue = bRetorno;
				return bRetorno;
			}
			definirValidacao(forms[i].elements);
		}
	};
	
	/**
	 * Pega todos os campos do formulário e faz a devida validação
	 */
	validarDados = function(form){
	
		var sTipo = "";
		var campos = form.elements;
		
		setEstiloPadrao(campos);
		
		for (var i = 0; i < campos.length; i++) {
			if (!isValido(campos[i])) {
				showMensagem(campos[i]);
				campoInvalido(campos[i]);
				campos[i].focus();
				return false;
			}
		}
		return true;
	};
	
	this.validarForm = function( form ) {
		return validarDados( form );
	}	
	
	/**
	 * Define o filtro que será utilizado no campo
	 * conforme o seu tipo
	 **/
	definirFiltro = function(elemento){
	
		var objFiltro = new FormFiltro;
		
		switch (getTipo(elemento)) {
		
			case 'alfanumerico':
				elemento.onkeypress = function(event){
					return objFiltro.alfaNumerico(event);
				}
				adicionarEvento(elemento, "keyup", objFiltro.permitirAlfaNumerico);
				adicionarEvento(elemento, "blur", objFiltro.permitirAlfaNumerico);
				break;
				
			case 'cep':
				elemento.onkeypress = function(event){
					return objFiltro.numeros(event);
				}
				adicionarEvento(elemento, "keyup", objFiltro.permitirCEP);
				adicionarEvento(elemento, "blur", objFiltro.permitirCEP);
				break;
				
			case 'cnpj':
				elemento.onkeypress = function(event){
					return objFiltro.numeros(event);
				}
				adicionarEvento(elemento, "keyup", objFiltro.permitirCNPJ);
				adicionarEvento(elemento, "blur", objFiltro.permitirCNPJ);
				break;
				
			case 'cpf':
				elemento.onkeypress = function(event){
					return objFiltro.numeros(event);
				}
				adicionarEvento(elemento, "keyup", objFiltro.permitirCPF);
				adicionarEvento(elemento, "blur", objFiltro.permitirCPF);
				break;
				
			case 'data':
				elemento.onkeypress = function(event){
					return objFiltro.numeros(event);
				}
				adicionarEvento(elemento, "keyup", objFiltro.permitirData);
				adicionarEvento(elemento, "blur", objFiltro.permitirData);
				break;
				
			case 'decimal':
				elemento.onkeypress = function(event){
					return objFiltro.numeros(event);
				}
				adicionarEvento(elemento, "keyup", objFiltro.permitirDecimal);
				adicionarEvento(elemento, "blur", objFiltro.permitirDecimal);
				break;
				
			case 'email':
				elemento.onkeypress = function(event){
					return objFiltro.email(event);
				}
				adicionarEvento(elemento, "keyup", objFiltro.permitirEmail);
				adicionarEvento(elemento, "blur", objFiltro.permitirEmail);
				break;
				
			case 'numerico':
				elemento.onkeypress = function(event){
					return objFiltro.numeros(event);
				}
				adicionarEvento(elemento, "keyup", objFiltro.permitirNumeros);
				adicionarEvento(elemento, "blur", objFiltro.permitirNumeros);
				break;
				
			case 'site':
				elemento.onkeypress = function(event){
					return objFiltro.site(event);
				}
				adicionarEvento(elemento, "keyup", objFiltro.permitirSite);
				adicionarEvento(elemento, "blur", objFiltro.permitirSite);
				break;
				
			case 'telefone':
				elemento.onkeypress = function(event){
					return objFiltro.telefone(event);
				}
				adicionarEvento(elemento, "keyup", objFiltro.permitirTelefone);
				adicionarEvento(elemento, "blur", objFiltro.permitirTelefone);
				break;
				
			case 'texto':
				elemento.onkeypress = function(event){
					return objFiltro.tags(event);
				}
				adicionarEvento(elemento, "keyup", objFiltro.permitirTexto);
				adicionarEvento(elemento, "blur", objFiltro.permitirTexto);
				break;
				
		};
		
			};
	
	/**
	 * Define o mascaramento a ser usado no campo
	 * conforme o seu tipo
	 */
	definirMascara = function(elemento){
	
		var objMascara = new FormMascara;
		
		switch (getTipo(elemento)) {
		
			case 'cep':
				elemento.onkeyup = function(){
					objMascara.CEP(elemento);
				}
				break;
				
			case 'cnpj':
				elemento.onkeyup = function(){
					objMascara.CNPJ(elemento);
				}
				break;
				
			case 'cpf':
				elemento.onkeyup = function(){
					objMascara.CPF(elemento);
				}
				break;
				
			case 'data':
				elemento.onkeyup = function(){
					objMascara.data(elemento);
				}
				break;
				
			case 'decimal':
				elemento.onkeyup = function(){
					objMascara.decimal(elemento);
				}
				break;
				
		};
		
			};
	
	definirValidacao = function(elementos){
		for (var i = 0; i < elementos.length; i++) {
			adicionarEvento(elementos[i], "blur", validarCampo);
		}
	};
	
	validarCampo = function(){
	
		var elemento = this;
		/* IE */
		if (window.event) {
			elemento = window.event.srcElement;
		}
		
		if (!isValido(elemento)) {
			campoInvalido(elemento);
		}
		else {
			campoPadrao(elemento);
		}
		return true;
	};
	
	/**
	 * Formata e mostra uma mensagem de alerta sobre
	 * o preenchimento do campo
	 */
	showMensagem = function(elemento){
		if (getMensagem(elemento).length) {
			alert(getMensagem(elemento));
			return true;
		}
		else 
			if (getLabel(elemento).length) {
				alert("Favor preencher o campo " + getLabel(elemento) + " corretamente.");
				return true;
			}
		return false;
	}
	
	/**
	 * Verifica se o valor do campo especificado
	 * é válido em relação ao tipo do campo
	 */
	isValido = function(elemento){
	
		var objValidacao = new FormValidacao;
		
		elemento.value = elemento.value.trim();
		
		if (isRequerido(elemento)) {
			if (elemento.value.length == 0) {
				return false;
			}
			if (elemento.getAttribute("type") == 'select' && elemento.value == 0) {
				return false;
			}
			if (elemento.getAttribute("type") == 'checkbox') {
				return elemento.checked;
			}
		}
		
		if (elemento.value.length > 0) {
		
			switch (getTipo(elemento)) {
			
				case 'alfanumerico':
					return objValidacao.alfaNumerico(elemento.value);
					
				case 'cep':
					return objValidacao.CEP(elemento.value);
					
				case 'cnpj':
					return objValidacao.CNPJ(elemento.value);
					
				case 'cpf':
					return objValidacao.CPF(elemento.value);
					
				case 'data':
					return objValidacao.data(elemento.value);
					
				case 'email':
					return objValidacao.email(elemento.value);
					
				case 'decimal':
					return objValidacao.decimal(elemento.value);
					
				case 'numerico':
					return objValidacao.numeros(elemento.value);
					
				case 'site':
					return objValidacao.site(elemento.value);
					
				case 'telefone':
					return objValidacao.telefone(elemento.value);
					
			};
			
					}
		
		return true;
	};
	
	/**
	 * Retorna a mensagem a ser exibida em caso
	 * de erro na validação
	 */
	getMensagem = function(elemento){
		if (elemento.getAttribute('cst_mensagem')) {
			return elemento.getAttribute('cst_mensagem');
		}
		else {
			return "";
		}
	};
	
	/**
	 * Retorna o nome do campo
	 */
	getLabel = function(elemento){
		if (elemento.getAttribute('cst_label')) {
			return elemento.getAttribute('cst_label');
		}
		else {
			return "";
		}
	};
	
	/**
	 * Retorna o tipo do elemento definido pelo
	 * atributo 'cst_tipo'
	 **/
	getTipo = function(elemento){
		if (elemento.getAttribute('cst_tipo')) {
			return elemento.getAttribute('cst_tipo');
		}
		return "";
	};
	
	/**
	 * Retorna se o campo é obrigatório ou não
	 */
	isRequerido = function(elemento){
		if (elemento.getAttribute('cst_requerido') && elemento.getAttribute('cst_requerido') == 'true') {
			return true;
		}
		return false;
	};
	
	/**
	 * Altera o estilo do campo
	 * no formulário
	 */
	campoInvalido = function(elemento){
		elemento.className = "campo_erro";
		return true;
	};
	
	campoPadrao = function(elemento){
		elemento.className = "campo_ok";
	};
	
	setEstiloPadrao = function(elementos){
	
		for (var i = 0; i < elementos.length; i++) {
			campoPadrao(elementos[i]);
		}
		
		return true;
	};
	
	/**
	 * Retorna um array com os campos da página
	 */
	getCampos = function(){
		var campos = new Array();
		
		campos.push(document.getElementsByTagName('input'));
		campos.push(document.getElementsByTagName('textarea'));
		campos.push(document.getElementsByTagName('select'));
		
		return campos;
	}
}


/**
 * Cria a tag para chamado do arquivo especificado
 **/
function importarJS( sArquivo ) {
	var sExpressao = 'typeof b' + sArquivo + 'Loaded == "undefined"';
	
	if ( eval( sExpressao ) ) {
		document.write( "<script type='text/javascript' src='/js/ipLib/" + sArquivo + ".js'></script>" );
	}  
}

importarJS( 'Util' );
importarJS( 'FormFiltro' );
importarJS( 'FormMascara' );
importarJS( 'FormValidacao' );