$(document).ready( function(){

	/***
	*
	*	Funções 
	*	Desenvolvido por Diego Marques
	*
	*	Índice:
	*
	*	Log para Debug............................: 21
	*	Redimencionar por classe..................: 43
	*	Link Ativo................................: 68
	*	Blank.....................................: 80
	*	Preload automático de imagens.............: 94
	*	Classe Voltar.............................: 204
	*	Tira bordas do Flash no IE................: 217
	*
	****/

	/***
	*	:: Log para Debug ::
	*	:: Diego Marques -  ::
	*	:: 2007 ::
	*	ex:
	*		l("testando");
	*
	*	OBS: Funciona apenas no Firefox com o plugin Firebug.
	***/
	//l = function(x){ if(window.console) console.log(x); }
	l = function(x){
		var consoleIE = false
		if(window.console){
			console.log(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>");
		}
	}
	
	/***
	*	:: Redimencionar por classe ::
	*	:: Diego Marques -  ::
	*	:: 2007 ::
	*
	*	Redimenciona um elemente setando uma classe para ele.
	*	ex:
	*		<div class="width150">teste</div>
	*		<div class="height5050">teste</div>
	***/
	$("*[@class*=width]").each(function(){
		var dmClasses = $(this).attr("class").split(" ");
		$.each(dmClasses, function(i,n){
			if(n.indexOf("width") != -1){ dmTamanho = dmClasses[i].replace("width",""); }
		});
		$(this).css("width",dmTamanho+"px");
	});
	$("*[@class*=height]").each(function(){
		var dmClasses = $(this).attr("class").split(" ");
		$.each(dmClasses, function(i,n){
			if(n.indexOf("height") != -1){ dmTamanho = dmClasses[i].replace("height",""); }
		});
		$(this).css("height",dmTamanho+"px");
	});

	/***
	*	:: Link Ativo ::
	*	:: Diego Marques -  ::
	*	:: 2007 ::
	*
	*	Adiciona a classe "ativo" para o link que tiver o destino (href) identico à pagina aberta
	***/
	dmPaginaAtivo = window.location+"";
	dmPaginaAtivo = dmPaginaAtivo.split("/").pop();
	if(dmPaginaAtivo != "")
		$("a[@href="+dmPaginaAtivo+"]").addClass("ativo");
		
	/***
	*	:: Blank ::
	*	:: Diego Marques -  ::
	*	:: 2007 ::
	*
	*	Abre um link em uma nova janela.
	*	ex:
	*		<a href="http://www.diegomarqu.es/" title="Diego Marques" class="blank"></a>
	***/
	$(".blank").click(function(){
		window.open($(this).attr("href"));
		return false;
	});
	
	/***
	*	:: Classe Voltar ::
	*	:: Diego Marques -  ::
	*	:: 2007 ::
	*
	*	Adiciona um evento em um objeto que volta no histórico no navegador
	*	Ex.: <a href="javascript:void(0);" title="voltar" class="voltar">voltar</a>
	***/
	$(".voltar").click(function(){
		window.history.go(-1);
		return false;
	});

	/***
	*	:: Tira bordas do Flash no IE ::
	*	:: Diego Marques -  ::
	*	:: 2008 ::
	*
	*	Retira as bordas pontilhadas do flash no Internet Explorer
	*	Ex.: 	$("#flash").addFlash({
	*				src: "swf/banner2.swf",
	*				width: 584,
	*				height: 201,
	*				title: ""
	*			});
	***/
	$.extend({
		addFlash: {
			version: 1.1,
			autor: "Diego Marques - ",
			defaults: {
				src: "",
				width: 100,
				height: 50,
				title: "",
				quality: "high",
				menu: "false",
				wmode: "transparent"
			}
		}
	});
	$.fn.extend({
		addFlash: function(options){
			options = $.extend({}, $.addFlash.defaults, options);
			return this.each(function(){
				if(options.src != ""){
					var flash = '<object type="application/x-shockwave-flash" data="'+options.src+'?clicktag=./" width="'+options.width+'" height="'+options.height+'" tabindex="0" title="'+options.title+'">'
					flash += '<param name="movie" value="'+options.src+'?clicktag=./" />'
					flash += '<param name="quality" value="'+options.quality+'" />'
					flash += '<param name="menu" value="'+options.allowFullScreen+'" />'
					flash += '<param name="wmode" value="'+options.wmode+'" />'
					flash += '<p>Para visualizar este conteúdo corretamente, é necessário ter o <a title="Clique para instalar o flash player" href="http://www.macromedia.com/shockwave/download/alternates/" rel="nofollow">Flash Player</a> instalado.</p>'
					flash += '</object>'
					var id = $(this).attr("id");
					var conteudo = document.getElementById(id)
					conteudo.innerHTML = flash
				}
			});
		}
	});
	
	/***
	*	:: Exibe div de bloqueio ::
	*	:: Diego Marques - Agência DMK ::
	*	:: 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.
	***/
	bloqueia = function(options,callback){
		var defaults = {
			id: "bloqueio",
			evento: "inicio",
			bgColor: "#000",
			opacity: "0.5",
			speed: "normal",
			zIndex: "100"
		}
		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"){
			$("#"+options.id).css({
				background:options.bgColor,
				height:altura,
				left:"0",
				opacity:options.opacity,
				position:"absolute",
				top:"0",
				width:"100%",
				zIndex:options.zIndex
			}).fadeIn(options.speed, function(){ if(typeof(callback) != "undefined"){ callback(); } });
			$(window).resize(function(){
				altura = $(document).height() > $(window).height() ? $(document).height() : $(window).height();
				$("#"+options.id).css({height:altura});
			});
		}else{
			$("#"+options.id).fadeOut(options.speed, function(){ if(typeof(callback) != "undefined"){ callback(); } });
		}
	}
	
	// Alinhamento da div
	$.fn.extend({
		absoluteCenter: function(options, speed, callback){
			var defaults = {
				autor: "Diego Marques",
				dellay: 100,
				limitTop: 0,
				limitRight: 0,
				limitBottom: 0,
				limitLeft: 0,
				limit: null,
				animation: true
			}
			options = $.extend({}, defaults, options);
			
			if(options.limit != null){
				if(typeof(options.limit) == "object"){
					options.limitTop = typeof(options.limit[0]) != "undefined" ? options.limit[0] : options.limitTop;
					options.limitRight = typeof(options.limit[1]) != "undefined" ? options.limit[1] : options.limitRight;
					options.limitBottom = typeof(options.limit[2]) != "undefined" ? options.limit[2] : options.limitBottom;
					options.limitLeft = typeof(options.limit[3]) != "undefined" ? options.limit[3] : options.limitLeft;
				}else{
					options.limitTop = options.limit;
					options.limitRight = options.limit;
					options.limitBottom = options.limit;
					options.limitLeft = options.limit;
				}
			}
			
			speed = typeof(speed) == "undefined" ? "fast" : speed;
			
			return this.each(function(){

				var obj = this;
				var timeOut = null;
				
				var ajustaScroll = function(){
					
					if($(obj).css("display") == "none") $(window).unbind("scroll",ajustaScroll).unbind("resize",ajustaScroll);
					
					var altura = parseInt($(obj).outerHeight());
					var largura = parseInt($(obj).outerWidth());
					
					var limiteC = parseInt($(obj).css("top"));
					var limiteB = limiteC + altura;
					var limiteE = parseInt($(obj).css("left"));
					var limiteD = limiteE + largura;
					
					var scrollTop = parseInt($(window).scrollTop());
					var scrollLeft = parseInt($(window).scrollLeft());
					var janelaAltura = parseInt($(window).height());
					var janelaLargura = parseInt($(window).width());
					
					var documentoAltura = parseInt($("body").outerHeight());
					var documentoLargura = parseInt($(document).width());
					
					var top = janelaAltura > altura
						? parseInt(scrollTop + (( janelaAltura / 2 ) - parseInt(altura / 2)))
						: scrollTop < (limiteC - options.limitTop)
							? scrollTop + options.limitTop
							: (scrollTop + janelaAltura) > (limiteB + options.limitBottom)
								? scrollTop - (altura - janelaAltura) - options.limitBottom
								: limiteC
					;
					top = (top + altura) > documentoAltura ? documentoAltura - altura : top;
					
					var left = janelaLargura > largura
						? parseInt(scrollLeft + (( janelaLargura / 2 ) - parseInt(largura / 2)))
						: scrollLeft < (limiteE - options.limitLeft)
							? scrollLeft + options.limitLeft
							: (scrollLeft + janelaLargura) > (limiteD + options.limitRight)
								? scrollLeft - (largura - janelaLargura) - options.limitRight
								: limiteE
					;
					left = (left + largura) > documentoLargura ? documentoLargura - largura : left;

					if(options.animation){
						clearTimeout(timeOut);
						timeOut = setTimeout(function(){
							$(obj).animate({top:top+"px",left:left+"px"},speed,function(){ if(typeof(callback) != "undefined") callback(); });
						},options.dellay);
					}else{
						$(obj).css({top:top+"px",left:left+"px"});
					}
				}
				ajustaScroll();
				
				if(options.animation) $(window).scroll(ajustaScroll).resize(ajustaScroll);
			});
		}
	});
	
// Tree List //
	$(".treeList").each(function(){
		$(".hide",this).prev("a").click(function(){
			$(this).next(".hide").slideToggle("slow");
		});
	});
	
////////////////////////
// Validação Genérica //
////////////////////////
	validar = {
		autor: "Diego Marques - 2008",
		versao: 2.0,
		
		// 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]);
							opcoes[nome] = valor;
						});
						
						// Cria uma biblioteca com os campos e as regras
						validar.campos[$(this).attr("id")] = opcoes;

						// Eventos
						$(this).blur(function(){
							validar.obj = $(this);
							validar.valor = $(this).val();
							validar.valido = true;
							validar.verifica();
						})

					}
				}
				
				var titulo = $(this).attr("title");
				$(this).attr("title",titulo.split("{")[0]);

			});
			
			if($(".validar").length > 0){
				$("form").submit(function(){
					
					var valido = true;
					
					$(".validar",this).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) 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
			l(msg); // Log

			// Gera Box da mensagem
			$(".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);
				});
		},
		
		escondeMsg: function(){
			clearTimeout(validar.timeout);
			if($(".boxMsg").length > 0) $(".boxMsg").fadeOut("fast",function(){ $(".boxMsg").remove(); });
		},
		
		// 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":
					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;
			}
		}
	}
	validar.init();
});