/***
*
*	Funções alc propaganda
*	Desenvolvido por alc propaganda
*
****/

/***
*	:: Log para Debug ::
*	:: alc propaganda ::
*	:: 2007 ::
*
*	l(<Mensagem>,<true ou false para IE>);
*
*	Exibe um log para Debug.
*	ex:
*		l("testando");
*		l("testando",true);
***/
function l(x,consoleIE){
    consoleIE = typeof (consoleIE) == "undefined" ? false : consoleIE;
	if (window.loadFirebugConsole) window.loadFirebugConsole();
	if(window.console){
	    console.info(x);
	} else if (window._firebug) {
	    _firebug.info(x);
	}else if(consoleIE){
		if(!$("#dmDebug").is("div")){
			$("body").append("<div id=\"dmDebug\" style=\"width:"+($(window).width()-50+"px")+"; border:1px solid #000; position:absolute; bottom:0; left:0; height:150px; overflow:auto; filter:alpha(opacity=80); font-size:12px; padding:5px; font-family:Tahoma, Arial, Helvetica, sans-serif; background:#fff; z-index:99999;\"></div>");
		}
		$("#dmDebug").append("<p style=\"margin:0; border-bottom:1px dashed #000; color: #000; font-weight: bold;\">"+x+"</p>");
	}
}

////////////////////////
// Validação Genérica //
////////////////////////
validar = {
	autor: "alc propaganda - 2008",
	versao: "2.25.7.2008",
	
	// Variáveis
	obj: null,
	nome: null,
	valor: null,
	valido: true,
	msg: null,
	campos: new Object(),
	timeout: null,
	
	// Inicialização
	init: function(){
		$(".validar").each(function(){
			
			var regras = $(this).attr("title");
			var obj = $(this);
			
			if(typeof(regras) != "undefined"){
				if(regras.indexOf("{") > 0){

					// Gera as regras
					var opcoes = new Object();
					regras = regras.substring(regras.indexOf("{"),regras.length).replace("{","").replace("}","").split(",");
					
					$.each(regras,function(i,val){
						var nome = val.split(":")[0];
						var valor = eval(val.split(":")[1].replace("(doispontos)",":"));
						opcoes[nome] = valor;
					});
					
					// Cria uma biblioteca com os campos e as regras
					validar.campos[$(this).attr("id")] = opcoes;

					// Eventos
					var validacaoBlur = function(){
						validar.obj = $(this);
						validar.valor = $(this).val();
						validar.valido = true;
						validar.verifica();
					}
					$(this).not(".calendario").unbind('blur',validacaoBlur).blur(validacaoBlur);
					
					// Máscaras
					if($(this).attr("title").indexOf("mascara") != -1){
						switch(opcoes.mascara){
							case "R$": $(this).maskMoney({symbol:"R$",decimal:",",thousands:"."}); break;
							default: $(this).mask(opcoes.mascara); break;
						}
					}
				}
			}
			
			var titulo = $(this).attr("title");
			$(this).attr("title",titulo.split("{")[0]);

		});
		
		if($(".validar").length > 0){
			$("form").unbind('submit',validar.form).submit(validar.form);
		}
	},
	
	form: function(form){
		var valido = true;
		obj = typeof(form) == "string" ? $(form) : this;
				
		$(".validar",obj).each(function(){
			if(valido){
				validar.obj = $(this);
				validar.valor = $(this).val();
				validar.valido = true;
				validar.verifica();
				valido = validar.valido;
				if(!validar.valido) $(validar.obj).focus();
			}
		});
		
		return valido;
	},
	
	// Função que faz as verificações
	verifica: function(){

		var id = $(validar.obj).attr("id");

		$.each(validar.campos[id],function(funcao,val){
			if(validar.valido && funcao != "mascara") validar[funcao](val);
		});

		if(!validar.valido){
			$(validar.obj).removeClass("form_ok").addClass("form_erro");
			validar.nome = $(validar.obj).attr("title");
			validar.exibeMsg();
		}else{
			$(validar.obj).removeClass("form_erro").addClass("form_ok");
		}

	},
	
	// Exibir mensagem
	exibeMsg: function(){

		var msg = "O campo <strong>\""+validar.nome+"\"</strong> "+validar.msg // Mensagem

		// Gera Box da mensagem
		var posicaoBox = function(){
			$(".boxMsg").css($(validar.obj).offset({scroll: false, border: true, padding: true}));
			$(".boxMsg").css({
				opacity: "0.9",
				top: parseInt($(".boxMsg").css("top")) - parseInt($(".boxMsg").height()) - 22,
				left: parseInt($(".boxMsg").css("left")) - 1
			});
			/*setTimeout(function(){
				if($(".boxMsg").is("div")) posicaoBox();
			},100);*/
		}
		$(".boxMsg").remove();
		$("body").prepend("<div class=\"boxMsg hide\">"+msg+"</div>");
		$(".boxMsg").css($(validar.obj).offset({scroll: false, border: true, padding: true}));
			$(".boxMsg")
				.stop()
				.css({
					opacity: "0.9",
					top: parseInt($(".boxMsg").css("top")) - parseInt($(".boxMsg").height()) - 22,
					left: parseInt($(".boxMsg").css("left")) - 1
				})
				.fadeIn("fast", function(){
					clearTimeout(validar.timeout);
					validar.timeout = setTimeout(function(){ validar.escondeMsg(); },5000);
					posicaoBox();
				})
				.click(validar.escondeMsg);
	},
	
	escondeMsg: function(){
		clearTimeout(validar.timeout);
		if($(".boxMsg").length > 0) $(".boxMsg").fadeOut("fast",function(){ $(".boxMsg").remove(); });
	},
	
	verificaCampos: function(objs){
		validar.valido = true;
		$(objs).filter(".validar").not("[disabled]").each(function(){
			if(validar.valido){
				validar.obj = $(this);
				validar.valor = $(this).val();
				validar.valido = true;
				validar.verifica();
				if(!validar.valido) $(validar.obj).focus();
			}
		});
		return validar.valido;
	},
	
	// Quantidade mínima de caracteres
	min: function(regra){
		if(validar.valor.length < regra){
			validar.valido = false;
			validar.msg = "deve ser preenchido com no mínimo <strong>"+regra+"</strong> caracteres.";
		}
	},
	
	// Quantidade máxima de caracteres
	max: function(regra){
		if(validar.valor.length > regra){
			validar.valido = false;
			validar.msg = "deve ser preenchido com no máximo <strong>"+regra+"</strong> caracteres.";
		}
	},
	
	// Igual a campo ou string
	igualA: function(regra){
		var valor = regra.indexOf("#") == -1 ? regra : $(regra).val();
		if(validar.valor != valor){
			validar.valido = false;
			validar.msg = "não foi preenchido corretamente.";
		}
	},
	
	// Diferente de campo ou string
	diferenteDe: function(regra){
		var valor = regra.indexOf("#") == -1 ? regra : $(regra).val();
		if(validar.valor == valor){
			validar.valido = false;
			validar.msg = "não foi preenchido corretamente.";
		}
	},
	
	// Definições de tipos
	tipo: function(regra){
		switch(regra){
			
			// Numérico inteiro
			case "inteiro": case "int":
				var expressao = /^\d+$/;
				if(!expressao.test(validar.valor)){
					validar.valido = false;
					validar.msg = "deve ser preenchido com um <strong>número inteiro</strong>!";
				}
			break;
			
			// E-mail
			case "email": case "e-mail":
				var expressao = /^[a-zA-Z0-9]{1}([\._a-zA-Z0-9-]+)(\.[_a-zA-Z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+){1,3}$/;
				if(!expressao.test(validar.valor)){
					validar.valido = false;
					validar.msg = "não é um <strong>e-mail válido</strong>!";
				}
			break;
			
			// Data tipo dd/mm/aaaa
			case "data":
				var expressao = /^((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{2}$/;
				if(!expressao.test(validar.valor)){
					validar.valido = false;
					validar.msg = "não é uma data válida, utilize o formato <strong>dd/mm/aaaa</strong>!";
				}
			break;
			
			// Obrigatorio
			case "obrigatório":
				if(validar.valor.length == 0){
					validar.valido = false;
					validar.msg = "é obrigatório o preenchimento!";
				}
			break;
		}
	}
}

/***
*	:: Exibe div de bloqueio ::
*	:: alc propaganda - alc propaganda ::
*	:: 2007 ::
*
*	Função que abre uma div cobrindo toda a tela bloqueando o site, com função de callback.
*	ex:
*		bloqueia({ speed: "slow", bgcolor: "#000" });
*		bloqueia({ speed: "slow", evento: "fim" });
*
*	OBS: Nescessário plugin Dimension.
***/
function bloqueia(options,callback){
	var defaults = {
		autor: "alc propaganda",
		versao: 2.1,
		id: "bloqueio",
		evento: "inicio",
		bgColor: "#000",
		opacity: "0.5",
		speed: "normal",
		zIndex: "100",
		cursor: "default",
		animate: true
	}
	options = $.fn.extend({}, defaults, options);

	if ((options.id == "" || options.id == "bloqueio") && !$("#bloqueio").is("div")) $("body").append("<div id=\"bloqueio\" style=\"display:none\"></div>");

	var altura = $(document).height() > $(window).height() ? $(document).height() : $(window).height();

	if (options.evento == "inicio") {
		if ($.browser.msie && $.browser.version == "6.0") $("select:visible").addClass("hiddenForDmBlock").css("visibility", "hidden");
		$("#" + options.id).css({
			background: options.bgColor,
			cursor: options.cursor,
			height: altura,
			left: "0",
			opacity: options.opacity,
			position: "absolute",
			top: "0",
			width: "100%",
			zIndex: options.zIndex
		});
		if (options.animate) {
			$("#" + options.id).fadeIn(options.speed, function() { if (typeof (callback) != "undefined") { callback(); } });
		} else {
			$("#" + options.id).css("display", "block");
			if (typeof (callback) != "undefined") { callback(); }
		}
		carregandoResize = function() {
			altura = $(document).height() > $(window).height() ? $(document).height() : $(window).height();
			$("#" + options.id).css({ height: altura });
		}
		$(window).bind('resize', carregandoResize);
	} else {
		$("select.hiddenForDmBlock").css("visibility", "visible");
		$(window).unbind('resize', carregandoResize);
		if (options.animate) {
			$("#" + options.id).fadeOut(options.speed, function() { if (typeof (callback) == "function") { callback(); } });
		} else {
			$("#" + options.id).css("display", "none");
			if (typeof (callback) == "function") { callback(); }
		}
	}
}

/***
*	:: Função de Ajax ::
*	:: alc propaganda ::
*	:: 2008 ::
*
*	Função que executa um ajax.
*	Opções:
*		arquivo:<string>
*			Qual arquivo será chamado com ou sem extenção, a extenção padrão é .php.
*		acao:<string>
*			Envia uma variável GET com nome padrão de "acao".
*		querystring:<string>
*			Envia dados obrigatoriamente via querystring, ex.: "id=1&produto=teste"
*		dados:<string ou objeto>
*			Envia dados via get ou post, dependendo do método de envio, ex.: "id=1&produto=teste" ou {id:1,produto:"teste"}.
*		carregando:<inteiro>
*			Tipo de carregando, padrão: 1.
*		aoIniciar:<função>
*			Executa função ao iniciar a requisição ajax.
*		aoConcluir:<função>
*			Executa função ao concluir a requisição ajax.
*		formulario:<seletor css>
*			Recupera os dados dos campos de um formulário e envia.
*		retornarEm:<seletor css>
*			Retorna dados para um determinado objeto.
*		metodo:<string>
*			Método de envio dos dados, get ou post, padrão: "GET".
*		caminho:<string>
*			Caminho que será chamado o arquivo, padrão: "inc/ajax/".
*
*	ex:
*		ajax({
*			arquivo: "produtos.php",
*			acao: "listarProdutos",
*			aoConcluir: function(retorno){
*				if(retorno != "erro"){
*					$("#tabela").html(retorno);
*				}
*			}
*		});
***/
function ajax(opcoes){
	
	// Valores padrão das opções e variáveis
	opcoes = $.extend({}, {
		arquivo: "",
		acao: "",
		querystring: "",
		dados: "",
		carregando: 1,
		aoIniciar: "",
		aoConcluir: "",
		aoFalhar: "",
		formulario: "",
		retornarEm: "",
		metodo: "get",
		tipoDados: "html",
		erro: false,
		caminho: "inc/ajax/",
		mostraErros: function(){ if(opcoes.erro != false) alert("Um erro ocorreu!\n\nPor favor, contate o administrador deste sistema e informe o seguinte erro:\n\n\"" + opcoes.erro + "\""); }
	}, opcoes);
	var er,dados;
	
	// Verificação de erros
	if(opcoes.arquivo == "") opcoes.erro = "Não foi informado o arquivo para ser carregado.";
	
	if(!opcoes.erro){
		// Caminho do arquivo
		er = /(\.php|\.asp|\.aspx|\.htm|\.html|\.js|\.jsp)/;
		opcoes.arquivo = !er.test(opcoes.arquivo) ? opcoes.arquivo += ".php" : opcoes.arquivo;
		
		// Ação
		opcoes.arquivo = opcoes.acao != "" ? opcoes.arquivo + "?acao=" + opcoes.acao : opcoes.arquivo;
		
		// Get
		opcoes.arquivo = opcoes.querystring != "" ? opcoes.arquivo.indexOf("?") != -1 ? opcoes.arquivo + "&" + opcoes.querystring : opcoes.arquivo + "?" + opcoes.querystring : opcoes.arquivo;
		
		// Dados
		dados = opcoes.formulario != "" ? $(opcoes.formulario).is("form") ? $(opcoes.formulario).serialize() : "" : "";
		dados = opcoes.dados != "" ? $.merge(opcoes.dados,dados) : dados;

		// Método get ou post
		opcoes.metodo = opcoes.formulario != "" ? $(opcoes.formulario).is("form") ? typeof($(opcoes.formulario).attr("method")) != "undefined" ? $(opcoes.formulario).attr("method") : opcoes.metodo : opcoes.metodo : opcoes.metodo;

		// Carregando
		var ajaxCarregando = function(acao){
			
			if(acao == "inicio"){
				// Carregando - Início
				switch(opcoes.carregando){
					case 1:
						bloqueia({
							bgColor:"url(imagens/carregando.gif) no-repeat center",
							cursor:"wait",
							animate:false
						});
					case 2:
					break;
				}
			}else{
				// Carregando - Fim
				switch(opcoes.carregando){
					case 1:
						bloqueia({
							evento:"fim",
							animate:false
						});
					case 2:
					break;
				}
			}
		}
		ajaxCarregando("inicio");
		
		// Executa o ajax
		var debugErros = true;
		$.ajax({
			url: opcoes.caminho + opcoes.arquivo,
			type: opcoes.metodo,
			data: dados,
			dataType: opcoes.tipoDados,
			beforeSend: function(){ if(typeof(opcoes.aoIniciar) == "function") opcoes.aoIniciar(); },
			success: function(retorno){
				if(typeof(retorno) != "undefined") if($.trim(String(retorno)) == "nao_logado") window.location = "default.php";
				if(opcoes.retornarEm != "") $(opcoes.retornarEm).html(retorno); // Retornar em
				ajaxCarregando("fim"); // Carregando
				if(typeof(opcoes.aoConcluir) == "function") opcoes.aoConcluir(retorno); // Ao concluir
			},
			error: function(XMLHttpRequest){
				if(opcoes.aoFalhar != "") opcoes.aoFalhar(XMLHttpRequest); // Ao falhar
				if(debugErros){
					try{
						var regExp	= new RegExp('(<body)(.|\n|\f|\r|\t|\v|\s| )*', 'gim');
						var texto	= XMLHttpRequest.responseText;
						texto		= texto.match(regExp)[0];
						regExp		= new RegExp('(.|\n|\f|\r|\t|\v|\s| )*(\/body>)', 'gim');
						texto		= texto.match(regExp)[0];
						texto		= texto.replace(/<(\/)?body(.)*>/g,"").replace(/(<(\/)?script[^>]*>)/g,"<!--$1-->");
						var div		= $('<div title="Clique para fechar">');
						bloqueia();
						$(div)
							.css({
								border:"1px solid #000",
								position:"absolute",
								top:"100px",
								left:"50%",
								height:"500px",
								width:"770px",
								margin:"0 0 0 -392px",
								padding:"10px",
								background:"#fff url(imagens/erro-ajax-bg.jpg) no-repeat center",
								cursor:"pointer",
								zIndex:"999999",
								display:"none"
							})
							.html(texto)
							.prepend('<a href="javascript:void(0);" title="Fechar" style="float:right;">X Fechar</a>')
							.click(function(){
								$(this).fadeOut('fast');
								bloqueia({evento:"fim"});
							});
						$("body").append(div);
						$("*",div).css("position","static");
						$(div).fadeIn('fast');
					}catch(e){
						opcoes.erro = "Erro ao acessar o arquivo remoto.";
						opcoes.mostraErros();
						ajaxCarregando("fim"); // Carregando
					}
				}else{
					opcoes.erro = "Erro ao acessar o arquivo remoto.";
					opcoes.mostraErros();
					ajaxCarregando("fim"); // Carregando
				}
			}
		});
	}

	// Exibe mensagem de erro caso ocorra
	opcoes.mostraErros();
}

///////////////////////////////////////////////////////////
// Ações												//
/////////////////////////////////////////////////////////
jQuery(function($) {
	validar.init();
});
