/***
*
*	Funções
*	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
*
****/

function inicializaBlank() {
    $(".blank").click(function() {
        window.open($(this).attr("href"));
        return false;
    });
}

/***
*	:: Log para Debug ::
*	:: Diego Marques ::
*	:: 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.log(x);
	} else if (window._firebug) {
	    _firebug.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 ::
*	:: 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",
	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);
	}
}

/***
*	:: Redimensionar por classe ::
*	:: Diego Marques ::
*	:: 2007 ::
*
*	Redimenciona um elemente setando uma classe para ele.
*	ex:
*		<div class="width150">teste</div>
*		<div class="height5050">teste</div>
***/
function redimencioarPorClasse() {
    $("*[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").removeClass("width" + dmTamanho);
    });
    $("*[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").removeClass("height" + dmTamanho);
    });
}

$(document).ready(function() {

    // Inicializações
    redimencioarPorClasse();

    /***
    *	:: Link Ativo ::
    *	:: Diego Marques ::
    *	:: 2007 ::
    *
    *	Adiciona a classe "ativo" para o link que tiver o destino (href) identico à pagina aberta
    ***/
    var dmPaginaAtivo = window.location + "";
    dmPaginaAtivo = dmPaginaAtivo.split("/").pop().split("?")[0];
    if (dmPaginaAtivo != "") $("a[href*='" + dmPaginaAtivo + "']:not(.naoAutoAtivo)").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">Diego Marques</a>
    ***/
    inicializaBlank();

    /***
    *	:: 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: "Diego Marques"
    *			});
    ***/
    $.extend({
        addFlash: {
            version: 1.2,
            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>'
                    $(this).html(flash);
                }
            });
        }
    });

    /***
    *	:: Reset de formulário ::
    *	:: Diego Marques ::
    *	:: 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 ::
    *	:: 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:not(.naoValidar)").unbind('submit', validar.form).submit(validar.form);
            }
        },

        form: function(form) {
            var valido = true;
            var obj = typeof (form) == "string" ? $(form) : this;
            //var obj = $(this);

            $(".validar:visible", obj).each(function() {
                if (!$(this).parents(":hidden").is(":hidden")) {
                    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");
                if (typeof (id) == "undefined" || id == "") {
                    $(validar.obj).attr("id", "id_verificando");
                    id = "id_verificando"
                }
                $.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")) + 20,
                    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")) + 20,
					    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;
        },

        verificaCampo: function(obj) {
            validar.obj = obj;
            validar.valor = $(obj).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":
                    validar.valor = $.trim(validar.valor);
                    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;

                // CNPJ        
                case "cnpj": case "CNPJ":
                    var cnpj = validar.valor.replace(/[^0-9]/g, "");
                    var erro = new String;

                    if (cnpj.length >= 14) {
                        var a = [];
                        var b = new Number;
                        var c = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
                        for (i = 0; i < 12; i++) {
                            a[i] = cnpj.charAt(i);
                            b += a[i] * c[i + 1];
                        }
                        if ((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11 - x }
                        b = 0;
                        for (y = 0; y < 13; y++) {
                            b += (a[y] * c[y]);
                        }
                        if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11 - x; }
                        //if ((cnpj.charAt(12) != a[12]) || (cnpj.charAt(13) != a[13]) || (cnpj == "00000000000000")) {
                        if ((cnpj.charAt(12) != a[12]) || (cnpj.charAt(13) != a[13])) {
                            erro += " é um número de CNPJ inválido!";
                        }
                        if (erro.length > 0) {
                            validar.msg = erro;
                            validar.valido = false;
                        } else {
                            validar.valido = true;
                        }
                    }

                    break;
            }
        }
    }
    validar.init();

    /***
    *	:: Exibe div de bloqueio ::
    *	:: Diego Marques ::
    *	:: 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",
            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 ::
    *	:: 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 ::
*	:: 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: "",
		aoFalhar: "",
		formulario: "",
		retornarEm: "",
		metodo: "get",
		tipoDados: "html",
		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).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:
						var now = new Date();
						$("#log span.tipo1")
							.html("[" + now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds() + "] " + "Carregando dados...")
							.css({
								background:"url(imagens/carregando5.gif) no-repeat 0 center",
								paddingLeft:"20px"
							})
						;
						bloqueia({
							bgColor:"url(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
		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 (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;
		                if (texto.indexOf("<body") != -1) {
		                    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",
							    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.\n\nCódigo do erro: (mn100).";
		                opcoes.mostraErros();
		                ajaxCarregando("fim"); // Carregando
		            }
		        } else {
		            opcoes.erro = "Erro ao acessar o arquivo remoto.\n\nCódigo do erro: (mn101).";
		            opcoes.mostraErros();
		            ajaxCarregando("fim"); // Carregando
		        }
		        opcoes.retornorequest = XMLHttpRequest.responseText;
		        delete opcoes.aoIniciar;
		        delete opcoes.aoConcluir;
		        delete opcoes.aoFalhar;
		        delete opcoes.formulario;
		        delete opcoes.retornarEm;
		        delete opcoes.mostraErros;
		        $.ajax({
		            url: "biblioteca/ajax/geral.asp?acao=debug",
		            type: "post",
		            data: opcoes
		        });
		    }
		});
	}

	// Exibe mensagem de erro caso ocorra
	opcoes.mostraErros();
}

/***
*	:: Ler Variável GET ::
*	:: Diego Marques ::
*	:: 2007 ::
*
*	Lê uma variável GET da barra de endereço
*	ex:
*		pagina = getQueryString("pagina");
***/
function getQueryString(variavel) {
    var retorno = null;
    var endereco = window.location.href;
    if (endereco.indexOf("?") != -1) {
        endereco = endereco.split("?")[1].split("&");
        for (i = 0; i < endereco.length; i++) {
            if (variavel == endereco[i].split("=")[0])
                retorno = endereco[i].split("=")[1];
        }
    }
    return retorno;
}
