/***
*
*	Funções Agência DMK
*	Versão: 11.8.2008
*	Desenvolvido por Diego Marques
*
*	Índice:
*
*	Log para Debug............................: 25
*	Manipulação de Datas......................: 49
*	Redimensionar por classe..................: 173
*	Link Ativo................................: 194
*	Blank.....................................: 205
*	Preload automático de imagens.............: 219
*	Classe Voltar.............................: 329
*	Tira bordas do Flash no IE................: 342
*	Reset de formulário.......................: 391
*	Validação Genérica........................: 408
*	Exibe div de bloqueio.....................: 687
*	Função de Ajax............................: 756
*
****/

/***
*	:: Log para Debug ::
*	:: Diego Marques - Agência DMK ::
*	:: 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.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>");
	}
}

/***
*	:: Manipulação de Datas ::
*	:: Diego Marques - Agência DMK ::
*	:: 2008 ::
*
*	Objeto para manipulação de datas.
*	Métodos:
*		dmDate.addDay(<data dd/mm/aaaa>,<dias positivo ou negativo>)
*			Soma dias a uma data.
*		dmDate.addMonth(<data dd/mm/aaaa>,<meses positivo ou negativo>)
*			Soma meses a uma data.
*		dmDate.addYear(<data dd/mm/aaaa>,<anos positivo ou negativo>)
*			Soma anos a uma data.
*		dmDate.separeDate(<data dd/mm/aaaa>)
*			Separa a data em 3 inteiros, dmDate.d para dia, dmDate.m para mês e dmDate.y para ano.
*		dmDate.daysInMonth(<mês>,<ano>)
*			Retorna a quantidade de dias de um determinado mês.
*		dmDate.dateDiff(<data 1 dd/mm/aaaa>,<data 2 dd/mm/aaaa>)
*			Retorna a diferênça de dias entre as datas.
***/
dmDate = {
	autor: "Diego Marques - Agência DMK",
	version: "1.6.28.7.9",
	d: 0, m: 0, y: 0,
	
	addDay: function(date,days){
		dmDate.separeDate(date);
		var daysCont = days > 0 ? days + dmDate.d : -days + (dmDate.daysInMonth(dmDate.m,dmDate.y) - dmDate.d);
		var daysRest = 0;
		dmDate.d = 1;
		if(days > 0){
			while(daysCont > 0){
				daysRest = daysCont;
				daysCont = daysCont - dmDate.daysInMonth(dmDate.m,dmDate.y);
				if(daysCont > 0){
					dmDate.m = dmDate.m + 1 == 13 ? 1 : dmDate.m + 1;
					dmDate.y = dmDate.m == 1 ? dmDate.y + 1 : dmDate.y;
				}else{
					dmDate.d = daysRest;
				}
			}
		}else{
			while(daysCont >= 0){
				daysRest = daysCont;
				daysCont = daysCont - dmDate.daysInMonth(dmDate.m,dmDate.y);
				if(daysCont >= 0){
					dmDate.m = dmDate.m - 1 == 0 ? 12 : dmDate.m - 1;
					dmDate.y = dmDate.m == 12 ? dmDate.y - 1 : dmDate.y;
				}else{
					dmDate.d = dmDate.daysInMonth(dmDate.m,dmDate.y) - daysRest;
				}
			}
		}
	
		return dmDate.d + "/" + dmDate.m + "/" + dmDate.y;
	},
	
	addMonth: function(date,months){
		dmDate.separeDate(date);

		dmDate.m = dmDate.m + months
		dmDate.y = dmDate.m > 12 ? parseInt(dmDate.m / 12) + dmDate.y : dmDate.y;
		
		dmDate.m = months > 0
			? dmDate.m > 12
				? dmDate.m - (parseInt((dmDate.m) / 12) * 12)
				: dmDate.m
			: dmDate.m < 0
				? dmDate.m + (parseInt((-dmDate.m) / 12) * 12)
				: dmDate.m
		;
		
		dmDate.m = dmDate.m == 0 ? 12 : dmDate.m < 0 ? dmDate.m + 12 : dmDate.m;
		
		return dmDate.d + "/" + dmDate.m + "/" + dmDate.y;
	},
	
	addYear: function(date,years){
		dmDate.separeDate(date);
		
		dmDate.y = dmDate.y + years;
		
		return dmDate.d + "/" + dmDate.m + "/" + dmDate.y;
	},
	
	separeDate: function(date){
		dmDate.d = date.split("/")[0].replace(/^[0]+/,"");
		dmDate.d = dmDate.d.length > 0 ? parseInt(dmDate.d) : 0;
		dmDate.m = date.split("/")[1].replace(/^[0]+/,"");
		dmDate.m = dmDate.m.length > 0 ? parseInt(dmDate.m) : 0;
		dmDate.y = date.split("/")[2].replace(/^[0]+/,"");
		dmDate.y = dmDate.y.length > 0 ? parseInt(dmDate.y) : 0;
	},
	
	daysInMonth: function(month,year){
		switch(month){
			case 1: case 3: case 5: case 7: case 8: case 10: case 12:
				return 31;
			break;
			case 4: case 6: case 9: case 11:
				return 30;
			break;
			case 2:
				return ((year % 4) == 0) && ((year % 100) != 0)
					? 29
					: year >= 2000
						? ((year % 400) == 0)
							? 29
							: 28
						: 28
			break;
		}
	},
	
	dateDiff: function(date1,date2){
		date1 = dmDate.separeDate(date1);
		date1 = dmDate.m + "/" + dmDate.d + "/" + dmDate.y;
		date2 = dmDate.separeDate(date2);
		date2 = dmDate.m + "/" + dmDate.d + "/" + dmDate.y;
		return (((Date.parse(date2))-(Date.parse(date1)))/(24*60*60*1000)).toFixed(0);
	}
}





$(document).ready( function(){
	/***
	*	:: Redimensionar por classe ::
	*	:: Diego Marques - Agência DMK ::
	*	:: 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 - Agência DMK ::
	*	:: 2007 ::
	*
	*	Adiciona a classe "ativo" para o link que tiver o destino (href) identico à pagina aberta
	***/
	paginaAtivo = window.location+"";
	paginaAtivo = paginaAtivo.split("/").pop();
	if(paginaAtivo != ""){
		$("a[href="+paginaAtivo+"]").addClass("ativo").siblings("ul, .subFim").removeClass("hide");
		$("a[href="+paginaAtivo+"]").addClass("ativo").parents("ul.hide").removeClass("hide").siblings('.subFim').removeClass("hide");
		$("a[href="+paginaAtivo+"]").parents("ul:eq(0)").siblings("a").addClass("ativo").siblings(".subFim").removeClass("hide");
	}
		
	
	
	/***
	*	:: Classe Voltar ::
	*	:: Diego Marques - Agência DMK ::
	*	:: 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 - Agência DMK ::
	*	:: 2008 ::
	*
	*	Retira as bordas pontilhadas do flash no Internet Explorer
	*	Ex.: 	$("#flash").addFlash({
	*				src: "swf/banner2.swf",
	*				width: 584,
	*				height: 201,
	*				title: "Agência DMK"
	*			});
	***/
	$.extend({
		addFlash: {
			version: 1.2,
			autor: "Diego Marques - Agência DMK",
			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>'
					$(this).html(flash);
				}
			});
		}
	});

	/***
	*	:: Reset de formulário ::
	*	:: Diego Marques - Agência DMK ::
	*	:: 2007 ::
	*
	*	Reseta um formulário
	*	Ex.: $("#contato").resetForm();
	***/
	/*$.fn.resetForm = function() {
		return this.each(function() {
			dmRfName = $(this).attr("name") + "";
			dmRfName = dmRfName == "undefined" || dmRfName == "" ? "dmRfName" : dmRfName;
			$(this).attr("name",dmRfName);
			eval("document."+dmRfName+".reset()");
		});
	}; */

	/***
	*	:: Validação Genérica ::
	*	:: Diego Marques - Agência DMK ::
	*	:: 2008 ::
	*
	*	Validação genérica para formulários. Para adicionar uma validação em um campo, atribuir a classe
	*	"validar" e no atributo "title", acrescentar as regras.
	*
	*	Regras:
	*	-------
	*		min:<inteiro>
	*			Quantidade mínima de caracteres.
	*			{min:1}
	*
	*		max:<inteiro>
	*			Quantidade máxima de caracteres
	*			{max:5}
	*
	*		igualA:<string>
	*			Igual a valor de um outro campo ou a string
	*			{igualA:'teste'} ou {igualA:'#texte'}
	*		
	*		diferenteDe:<string>
	*			Diferente do valor de um outro campo ou a string
	*			{diferenteDe:'teste'} ou {diferenteDe:'#texte'}
	*		
	*		tipo:<string>
	*			Define o tipo obrigatório
	*			"inteiro" / "int": Numérico inteiro
	*			"email" / "e-mail": E-mail
	*			"data": Data tipo dd/mm/aaaa
	*			"obrigatório": Preenchimento obrigatório
	*	
	*	Ex.:
	*	----
	*		<input id="teste" name="teste" type="text" class="validar" title="Teste{min:5,tipo:'email',max:50,diferenteDe:'exemplo@dominio.com.br'}" />
	*	
	*	Métodos:
	*	--------
	*		validar.init()
	*			Inicializa a validação aplicando os eventos.
	*		validar.form(<string opcional>)
	*			Executa a validação em um determinado formulário.
	*		validar.verificaCampos(<objetos>)
	*			Executa a validação em um conjunto de objetos específicos.
	***/
	validar = {
		autor: "Diego Marques - 2008",
		versao: "2.15.8.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) : typeof(form) == "object" ? form : this;
			obj = this;
			$(".validar:visible",obj).each(function(){
				if(!$(this).parents(":hidden:eq(0)").is(":hidden")){
					l(this);
					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(){
			if($(validar.obj).hasClass("validar")) {
				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\" style=\"display:none;\">"+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.";
			}
		},
		
		// Maior que inteiro ou data
		maiorQue: function(regra){
			if(validar.valor != ""){
				if(typeof(regra) == "number"){
					if(validar.valor < regra){
						validar.valido = false;
						validar.msg = "deve ser maior que <strong>"+regra+"</strong>.";
					}
				}else{
					if(regra == "hoje"){
						var hoje = new Date();
						hoje = hoje.getDate() + "/" + (hoje.getMonth() + 1) + "/" + hoje.getFullYear();
						if(dmDate.dateDiff(hoje,validar.valor) < 0){
							validar.valido = false;
							validar.msg = "deve ser maior que <strong>"+hoje+"</strong>.";
						}
					}
				}
			}
		},
		
		// 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":
					if(validar.valor != ""){
						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":
					if(validar.valor != ""){
						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":
					if(validar.valor != ""){
						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": case "obrigatorio":
					if(validar.valor.length == 0){
						validar.valido = false;
						validar.msg = "deve ser preenchido!";
					}
				break;
			}
		},
		
		// Validação de tipos
		validacao: function(regra){
			switch(regra){
				
				// CPF
				case "cpf": case "CPF":
					cpf = validar.valor.replace(/[^0-9]/g,"");
					erro = new String;
					if(cpf.length >= 11){
						if(cpf == "00000000000" || cpf == "11111111111" || cpf == "22222222222" || cpf == "33333333333" || cpf == "44444444444" || cpf == "55555555555" || cpf == "66666666666" || cpf == "77777777777" || cpf == "88888888888" || cpf == "99999999999"){
							erro += " é um número de CPF invalido!";
						}else{
							var a = [];
							var b = new Number;
							var c = 11;
							for(i=0; i<11; i++){
								a[i] = cpf.charAt(i);
								if(i < 9) b += (a[i] * --c);
							}
							if((x = b % 11) < 2){ a[9] = 0; }else{ a[9] = 11-x; }
							b = 0;
							c = 11;
							for(y=0; y<10; y++) b += (a[y] * c--);
							if((x = b % 11) < 2) { a[10] = 0; }else{ a[10] = 11-x; }
							if((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10])) erro += " é um número de CPF invalido!";
						}
						if (erro.length > 0){
							validar.msg = erro;
							validar.valido = false;
						}else{
							validar.valido = true;
						}
					}
				break;
			}
		}
	}
	validar.init();
	
	/***
	*	:: 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 = {
			autor:"Diego Marques - Agência DMK",
			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(); }
			}
		}
	}
	
	/***
	*	:: Absolute Center ::
	*	:: Diego Marques - Agência DMK ::
	*	:: 2008 ::
	*
	*	Função que centraliza um objeto na tela.
	*	ex:
	*		$("#teste").absoluteCenter({limit:[0,10,0,10]});
	*
	*	OBS: Nescessário plugin Dimension.
	***/
	$.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);
			});
		}
	});

});

/***
*	:: Função de Ajax ::
*	:: Diego Marques - Agência DMK ::
*	:: 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 é .asp.
*		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: "biblioteca/ajax/".
*
*	ex:
*		ajax({
*			arquivo: "produtos.asp",
*			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: "",
		formulario: "",
		retornarEm: "",
		metodo: "get",
		erro: false,
		caminho: "biblioteca/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 += ".asp" : 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).serializeArray() : {} : {};
		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:
						var now = new Date();
						$("#log span.tipo1")
							.html("[" + now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds() + "] " + "Carregando dados...")
							.css({
								background:"url(http://www.docebeleza.siteempresarial.com/imagens/carregando5.gif) no-repeat 0 center",
								paddingLeft:"20px"
							})
						;
						bloqueia({
							bgColor:"url(http://www.docebeleza.siteempresarial.com/imagens/blank.gif)",
							cursor:"wait",
							animate:false
						});
					break;
				}
			}else{
				// Carregando - Fim
				switch(opcoes.carregando){
					case 1:
						bloqueia({
							evento:"fim",
							animate:false
						});
						var now = new Date();
						$("#log span.tipo1")
							.html("[" + now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds() + "] " + "Concluído!")
							.css({
								background:"none",
								paddingLeft:"0"
							})
						;
					break;
				}
			}
		}
		ajaxCarregando("inicio");
		
		// Executa o ajax
		$.ajax({
			url: opcoes.caminho + opcoes.arquivo,
			type: opcoes.metodo,
			data: dados,
			dataType: "html",
			beforeSend: function(){ if(typeof(opcoes.aoIniciar) == "function") opcoes.aoIniciar(); },
			success: function(retorno){
				if(opcoes.retornarEm != "") $(opcoes.retornarEm).html(retorno); // Retornar em
				ajaxCarregando("fim"); // Carregando
				if(typeof(opcoes.aoConcluir) == "function") opcoes.aoConcluir(retorno); // Ao concluir
			},
			error: function(){
				opcoes.erro = "Erro ao acessar o arquivo remoto.";
				opcoes.mostraErros();
				ajaxCarregando("fim"); // Carregando
			}
		});
	}

	// Exibe mensagem de erro caso ocorra
	opcoes.mostraErros();
}



//////////////
// No Label //
//////////////
noLabel = {
	init: function(){
		$(".noLabel").each(function(){
			$(this).addClass("vazio");
			noLabel.buffer[$(this).attr("id")] = $(this).val();
			$(this).unbind('focus',noLabel.foco).unbind('blur',noLabel.desfoco).bind('focus',noLabel.foco).bind('blur',noLabel.desfoco);
		}).parents("form:eq(0)").unbind('submit',noLabel.formulario).bind('submit',noLabel.formulario);
	},
	
	buffer: {},
	
	foco: function(obj){
		obj = typeof($(obj).attr("id")) == "undefined" ? this : obj;
		if($(obj).hasClass("vazio")){
			if($(obj).is("textarea")){
				$(obj).html("");
			}else{
				$(obj).val("");
			}
			$(obj).removeClass("vazio");
		}
	},
	
	desfoco: function(){
		if($.trim($(this).val()) == ""){
			if($(this).is("textarea")){
				$(this).html(noLabel.buffer[$(this).attr("id")]);
			}else{
				$(this).val(noLabel.buffer[$(this).attr("id")]);
			}
			$(this).addClass("vazio");
		}
	},
	
	formulario: function(){
		$(".vazio",this).each(function(){
			noLabel.foco(this);
		});
		return true;
	}
}