/**
 * Quando ler o documento testa a validaÃ§Ã£o dos campos obrigatÃ³rios.
 */
$(document).ready(function() {

	Validacao.testarValidacao();

});
/**
 * Script de validaÃ§Ã£o para o framework
 * 
 * @example - Validacao.checar(this); Validacao.checar(this, 'validarCep');
 */
var Validacao = {

	/**
	 * Efetua a validaÃ§Ã£o de um campo especÃ­fico.
	 * 
	 * @param object
	 *            obj - O objeto que serÃ¡ validado.
	 * @param string
	 *            tipoValidacao - Determina o tipo da validaÃ§Ã£o que serÃ¡
	 *            utilizada.
	 */
	checar : function(obj, tipoValidacao) {

		obj = Validacao.setJquery(obj);

		if (tipoValidacao == undefined) {

			if (obj.val() == "") {

				Validacao.criarHint(obj, "FAIL",
						"O campo não pode estar vazio.");

			} else {

				Validacao.criarHint(obj, "OK");

			}
			return;

		}

		if (obj.val() != "") {

			switch (tipoValidacao) {

				case "validarCepPreencher" :

					tipoValidacao = "validarCep";
					Dne.selecionaCep(obj.val());

				default :
					valor = obj.val();

					break;

			}
			$.post(URL_ROOT + 'validacao/efetuarValidacao/', {
				tipoValidacao : tipoValidacao,
				valorValidacao : encodeURIComponent(valor)
			}, function(response) {
				objJSON = eval('(' + response + ')');
				Validacao.criarHint(obj, objJSON.tipoMensagem,
						objJSON.mixedMensagem);
			});

		} else {

			Validacao.criarHint(obj, "FAIL", "O campo não pode estar vazio.");

		}

	}

	/**
	 * Pega o obj especÃ­fico e transforma num objeto jquery.
	 * 
	 * @param object
	 *            obj - Objeto que serÃ¡ setado no jquery.
	 */
	,
	setJquery : function(obj) {

		return $("#" + obj.id);

	}

	/**
	 * Verifica se o dado Ã© obrigatÃ³rio, caso esteja ok, pega e dÃ¡ o submit
	 * automÃ¡tico.
	 * 
	 * @param array
	 *            arrIgnorar - Matriz de dados que serÃ£o verificados para poder
	 *            ser efetuado o submit.
	 */
	,
	enviar : function(arrIgnorar) {

		validarGeral = Validacao.verificarObrigatorio(arrIgnorar);

		if (validarGeral != "") {

			alert(validarGeral);

		} else {

			$("form").submit();

		}

	}
	
	, enviarSubmit : function(arrIgnorar) {

		validarGeral = Validacao.verificarObrigatorio(arrIgnorar);

		if (validarGeral != "") {

			alert(validarGeral);
			
			return false;

		} else {

			return true;

		}

	}

	/**
	 * Cria o hint do aviso de erro utilizando o brTip ( plugin do jquery para
	 * criaÃ§Ã£o de tips ).
	 * 
	 * @param object
	 *            obj - Objeto que serÃ¡ usado para criar o hint ( sempre vai ser
	 *            uma imagem ).
	 * @param string
	 *            retorno - O retorno do JSON ( vindo do object Mensagem do
	 *            server ) determinando se teve ou nÃ£o sucesso na validaÃ§Ã£o.
	 * @param string
	 *            mensagem - A mensagem de retorno, caso esteja vazia, nÃ£o cria
	 *            o hint da imagem.
	 */
	,
	criarHint : function(obj, retorno, mensagem) {

		mensagem = mensagem || "";

		$('.errada-hint').hide();
		$("#validacao-" + obj.attr("id")).remove();

		if (retorno == "FAIL") {

			strImagem = "Errada";

		} else {

			strImagem = "Correta";

		}

		img = $("#validacao" + strImagem).clone();
		img.attr("rel", mensagem);

		if (obj.attr("tagName").toUpperCase() != "SELECT") {

			img.css("padding-top", "3");

		}

		if (mensagem != "") {

			img.brTip(strImagem.toLowerCase());

		}

		obj.removeClass("correta").removeClass("errada")
				.removeClass("obrigatorio").addClass(strImagem.toLowerCase());
		img.attr("id", "validacao-" + obj.attr("id")).insertAfter(obj).css(
				"display", "");

	}

	/**
	 * Remove todos os hints.
	 * 
	 * @param object
	 *            obj - O objeto que serÃ¡ passado para remover os hints
	 *            vÃ­nculados a ele.
	 */
	,
	removerHint : function(obj) {

		obj = obj || alert("Programador passe um objeto por parâmetro!!!");
		$("#validacao-" + obj.attr("id")).remove();
		return obj.removeClass("correta").removeClass("errada");

	}

	/**
	 * Testa a validaÃ§Ã£o de determinados campos ou de todos os campos
	 * obrigatÃ³rios.
	 * 
	 * @param array
	 *            arrVerificar - Matriz que passa quais campos serÃ£o
	 *            verificados.
	 */
	,
	testarValidacao : function(arrVerificar) {

		arrVerificar = arrVerificar || '*.obrigatorio, *.errada';

		if (typeof(arrVerificar) == "object") {

			for (i in arrVerificar) {

				arrVerificar[i] = "#" + arrVerificar[i];

			}

		}

		$(arrVerificar.toString()).each(function() {

			if ($(this).val() != "") {

				$(this).focus().blur();

			}

		})

	}

	/**
	 * Reseta a validaÃ§Ã£o para um determinado tipo de campo ou - caso o
	 * inverterSelecao esteja false - para os campos que nÃ£o forem ele.
	 * 
	 * @param array
	 *            arrCampos - Matriz com os campos que serÃ£o passados.
	 * @param boolean
	 *            inverterSelecao - LÃ³gico que quando setado 'TRUE' reseta a
	 *            validaÃ§Ã£o dos campos que estiverem em arrIgnorar caso
	 *            contrÃ¡rio faz o inverso.
	 */
	,
	resetarValidacao : function(arrCampos, inverterSelecao) {

		inverterSelecao = inverterSelecao || false;
		arrCampos = arrCampos || "";

		if (arrCampos != "") {

			if (inverterSelecao) {

				for (i in arrCampos) {

					arrCampos[i] = "#" + arrCampos[i];

				}

				$(arrCampos.toString()).each(function() {

					Validacao.removerHint($(this)).addClass("obrigatorio");

				})

			} else {

				$('*.obrigatorio, *.correta').each(function() {

					if (((arrCampos.toString().search($(this).attr("id")) == -1)
							? true
							: false)) {

						Validacao.removerHint($(this)).addClass("obrigatorio");

					}

				})

			}

		} else {

			$('*.obrigatorio, *.correta').each(function() {

				Validacao.removerHint($(this)).addClass("obrigatorio");

			})

		}

		Validacao.testarValidacao(arrCampos);

	}

	/**
	 * Remove a validaÃ§Ã£o definitivamente dos campos passados.
	 * 
	 * @param array
	 *            arrCampos - Matriz que determina os campos que a validaÃ§Ã£o
	 *            serÃ¡ removida.
	 */
	,
	removerValidacao : function(arrCampos) {

		arrCampos = arrCampos
				|| alert("Programador Ã© necessÃ¡rio passar os campos onde a formatação será removida!");

		for (i in arrCampos) {

			Validacao.removerHint($("#" + arrCampos[i]))
					.removeClass("obrigatorio").removeAttr("onblur");

		}

	}

	/**
	 * Verifica um determinado nÃºmero de campos que estÃ£o como obrigatÃ³rios ou
	 * todos os obrigatÃ³rios.
	 * 
	 * @param array
	 *            arrIgnorar - Matriz com os campos que serÃ£o verificados.
	 * @param boolean
	 *            inverterSelecao - LÃ³gico que verifica os campos passados no
	 *            arrIgnorar como obrigatÃ³rios se 'TRUE', caso contrÃ¡rio faz o
	 *            inverso.
	 */
	,
	verificarObrigatorio : function(arrCampos, inverterSelecao) {

		inverterSelecao = inverterSelecao || false;
		arrCampos = arrCampos || "";
		validarGeral = "";

		if (arrCampos != "") {

			if (inverterSelecao) {

				for (i in arrCampos) {

					arrCampos[i] = "#" + arrCampos[i] + ".obrigatorio, #"
							+ arrCampos[i] + ".errada";

				}

				$(arrCampos.toString()).each(function() {

					if ($(this).hasClass("errada")) {

						validarGeral = "Atenção existem campos com erros de preenchimento.";
						return;

					}

					validarGeral = "Atenção existem campos não preenchidos.";
					return;

				})

			} else {

				$('*.obrigatorio, *.errada').each(function() {

					if (((arrCampos.toString().search($(this).attr("id")) == -1)
							? true
							: false)) {

						if ($(this).hasClass("errada")) {

							validarGeral = "Atenção existem campos com erros de preenchimento.";
							return;

						}

						validarGeral = "Atenção existem campos não preenchidos.";
						return;

					}

				})

			}

			return validarGeral;

		} else {

			$('*.obrigatorio, *.errada').each(function() {

				if ($(this).hasClass("errada")) {

					validarGeral = "Atenção existem campos com erros de preenchimento.";
					return;

				}
				
				if(this.value==""){
				validarGeral = "Atenção existem campos não preenchidos.";
				return;
				} else {
					return;
				}

			})

			return validarGeral;

		}

	}

}