(function ($) {

    var _IE6_ = $.browser.msie && $.browser.version <= 6;


    /** ************************************************************************
    proxy para chamar callbacks com métodos do jquery
    @author Ricardo Tomasi
    @param fn Função a ser chamada
    */
    function _(fn) {
        return function () {
            $(this)[fn]();
        };
    }


    /** ************************************************************************
    Plugin para abas
    com suporte a location.hash (link direto para aba/reload aba atual)
    @author Ricardo Tomasi
 
    @param object {
    links: (string) seletor para os links/botões,
    content: (string) seletor para o container do conteúdo,
    activeParent: (boolean) adicionar classe 'ativo' ao elemento pai (false adiciona ao proprio)
    }
	
    Evento: emite o evento 'tabchange' ao trocar de aba.
 
    Uso
    -------
    o atributo href de cada link/botao deve apontar
    para a ID do conteúdo respectivo, ex:

    div#exemplo
    ul.lugares
    li a[href="#ctn-caverna"]
    li a[href="#ctn-savana"]
 	
    div.textos
    div#ctn-caverna
    div#ctn-savana
 	
    $('#exemplo').tabs({ links: '.lugares a', content: '.textos'});
    */
    $.fn.tabs = function (opts) {
        opts = $.extend({
            links: '.links a',
            content: '.conteudo',
            activeParent: false,
            linkable: true,
            onchange: null
        }, opts);

        var root = $(this);

        return this.each(function () {

            var 
			links = $(this).find(opts.links),
			content = $(this).find(opts.content).children(),
			active = false,
			hashchanging = false;

            links.each(function () {
                var self = $(this), tgt = self.attr('href'), mark = tgt.replace('#', '#/');

                self.click(function () {
                    (opts.activeParent ? links.parent() : links).removeClass('ativo');
                    (opts.activeParent ? self.parent() : self).addClass('ativo');

                    content.filter(tgt).show().siblings().hide();
                    if (opts.linkable) {
                        location.hash = mark;
                        hashchanging = true;
                    }

                    var secao = self.attr("href");
                    var elem = $(secao).find("a:first").attr("href");
                    var lnks = $(secao).find("a");
                    switch (secao) {
                        case "#lst-videosDicas":
                            var container = $('#destaque_videos');

                            if (!container.length) {
                                container = $('<div id="destaque_videos" />').hide().appendTo('#destaque').fadeIn(200);
                                $('#destaque img').remove();
                            }

                            var params = { wmode: 'transparent', quality: 'high' };
                            swfobject.embedSWF(elem, "destaque_videos", "708", "300", "8", null, null, params, null);

                            break;

                        case "#lst-videos":
                            var container = $('#destaque_videos');

                            if (!container.length) {
                                container = $('<div id="destaque_videos" />').hide().appendTo('#destaque').fadeIn(200);
                                $('#destaque img').remove();
                            }

                            var flashVars = { videoURL: elem };
                            var params = { wmode: 'transparent', quality: 'high' };
                            swfobject.embedSWF("../_swf/player.swf", "destaque_videos", "708", "300", "8", null, flashVars, params, null);

                            break;

                        case "#lst-fotos":
                            $("#destaque_videos, #destaque img").remove();

                            var img = new Image();
                            img.className = "foto";
                            img.style.display = "none";
                            img.onload = function () {
                                var self = $(img).hide().appendTo("#destaque");
                                self.css({
                                    marginLeft: -self.width() / 2,
                                    marginTop: -self.height() / 2
                                }).fadeIn(300);
                            }

                            img.src = elem;

                            break;
                    }

                    root.trigger('tabchange', [tgt]);

                    return false;
                });

                if (opts.linkable && location.hash == mark) {
                    active = true;
                    self.click();
                }
            });

            if (opts.linkable) {
                $(window).bind('hashchange', function () {
                    if (!hashchanging)
                        links.filter('[href=' + location.hash.replace('#/', '#') + ']').click();
                    else
                        hashchanging = false;
                });
            };

            if (!active) {
                content.not(':first').hide();
                //links.eq(0).addClass('ativo');
            }
        });

    };


    /** ************************************************************************
    Carrossel
    @author Ricardo Tomasi
    @params: object {
    auto: (boolean) - avanço automático
    interval: (number) - intervalo do avanço
    }
    */
    $.fn.carrossel = function (opts) {

        /** parâmetros default */
        opts = $.extend({
            auto: true,
            interval: 6
        }, opts);

        return this.each(function () {
            var 
			self = $(this),
			imgs = self.find('img'),
			desc = self.find('.desc li'),
			nav = self.find('.nav'),
			ln = imgs.length,
			pos = 0,
			timer;

            imgs.hide();
            desc.hide().css('text-indent', -710);
            imgs.eq(0).fadeIn(800);
            desc.eq(0).fadeIn(600).animate({ textIndent: 0 }, 500);

            nav.find('a').click(function () {

                if (opts.auto) {
                    // recomeçar automático depois de 3+6s
                    clearTimeout(timer);
                    timer = setTimeout(startTimer, opts.interval * 500);
                }

                // avançar/voltar
                navigate.call(this);
            });

            function navigate(auto) {

                // direção da navegação
                if ($(this).is('.btnProximo') || auto)
                    pos++;
                else
                    pos--;

                // loop pontas
                if (pos >= ln)
                    pos = 0;
                else if (pos <= 0)
                    pos = ln - 1;

                imgs.fadeOut(700).eq(pos).fadeIn(700);
                desc.hide().eq(pos).show().animate({ textIndent: 0 }, 500);
            }

            function startTimer() {
                timer = setInterval(function () {
                    navigate(true);
                }, opts.interval * 1000);
            };

            if (opts.auto) {
                startTimer();
            }

        });
    };


    /** ************************************************************************
    Construtor de Modal
    @author Ricardo Tomasi
    @param content (string|HTMLElement|jquery) - conteúdo do modal
    @param remove (boolean) - remover elemento content do DOM (caso false será clonado)
	
    @returns objeto {
    abrir : Método para abrir modal
    fechar : Método para fechar modal
    setContent : substituir conteúdo (jquery || string, [remove])
    changeContent : Função para alterar conteúdo
    loadImage : carrega imagem no modal, espera pelo evento onload
    }
    */
    $.modal = function (content, opts) {

        if (!(this instanceof $.modal))
            return new $.modal(content);

        var self = this;
        var isImage;

        opts = $.extend({
            remove: false,
            closeButton: null,
            block: false,
            open: null, // função executada ao abrir modal
            close: null, // função executada ao fechar modal
            w: null, // largura
            h: null, // altura (úteis ao carregar flash no modal)
            container: null,
            speed: 300
        }, opts);

        // evitar modal duplicado
        $('#bg-modal').remove();

        var body = opts.container || document.body;

        var bg = $('<div/>', {
            id: 'bg-modal',
            css: { opacity: 0 },
            click: opts.block ? null : fecharModal
        }).appendTo(body);

        var ctn = $('<div/>', {
            id: 'ctn-modal',
            css: {
                display: 'none',
                width: opts.w || 'auto',
                height: opts.h || 'auto'
            }
        }).appendTo(body);
        self.ctn = ctn;

        var fechar = $('<a/>', {
            text: 'Fechar',
            className: 'fechar',
            click: fecharModal
        });

        var iframebg = _IE6_
		? $('<iframe frameborder="0" />').addClass('ie6fix')
		: null;

        $(document).unbind('keyup.modal').bind('keyup.modal', function (e) {
            if (e.keyCode == "27")
                fecharModal();
        });

        function fecharModal() {
            _IE6_ && iframebg.hide();
            self.ctn.stop(true, true).fadeOut(opts.speed, function () {
                $(this).hide();
                $.isFunction(opts.close) && opts.close.call(this);
            });
            bg.stop(true, true).fadeTo(opts.speed * 1.25, 0, _('hide'));
            self.ctn.find('.fecharModal').unbind("click");
            return false;
        };

        function abrirModal(fn) {

            $('#ctn-modal').detach();
            ctn.hide().appendTo(body);

            var h = self.ctn.innerHeight();
            var w = self.ctn.innerWidth();

            _IE6_ && iframebg.attr({
                width: w,
                height: h
            }).show();

            reposition();

            $.isFunction(opts.open) && opts.open.call(self.ctn);
            $.isFunction(fn) && fn.call(self.ctn);

            self.ctn.hide().fadeIn(opts.speed);
            self.ctn.find('.fecharModal').bind("click", function () {
                fecharModal();
            });

            bg.hide().appendTo(body).height($(body).height()).fadeTo(opts.speed * 1.25, 0.6);
        };

        function reposition() {
            var h = self.ctn.innerHeight();
            var w = self.ctn.innerWidth();

            self.ctn.css({
                marginTop: -h / 2,
                marginLeft: -w / 2
            })
        };

        function set_content(c, remove) {
            var c = c || '';
            if (typeof c !== "string")
                c = $(c)[remove ? 'detach' : 'clone'](!remove).css('display', 'block');

            self.ctn.empty();

            self.ctn.append(c);
            !opts.block && self.ctn.append(fechar);
            _IE6_ && self.ctn.append(iframebg);

            if (opts.closeButton)
                self.ctn.find(opts.closeButton).click(fecharModal);
        };

        function load_image(src) {
            var img = $('<img/>', {
                load: function () {
                    abrirModal();
                }
            });
            self.ctn.empty().append(fechar, img, iframebg);
            self.ctn.find('img').attr('src', src);
        };

        function change_content(fn) {
            fn.call(self.ctn);
        };

        if (content) {
            set_content(content, opts.remove);
        };

        this.fechar = fecharModal;
        this.abrir = abrirModal;
        this.reposition = reposition;
        this.changeContent = change_content;
        this.setContent = set_content;
        this.loadImage = load_image;

    };


    /** ************************************************************************
    abrir conteúdo do elemento como modal
    utiliza construtor $.modal
    @author Ricardo Tomasi
	
    Uso
    ------
    $('#destaque').abrirModal(options) // ver construtor $.modal para opções
    */
    $.fn.abrirModal = function (opts) {
        new $.modal(this.eq(0), opts).abrir();
        return this;
    };


    /** ************************************************************************
    ativar modal no clique
    utiliza construtor $.modal
    @author Ricardo Tomasi
    Uso
    ------
    $('a').modal($('#destaque'), options) // ver construtor $.modal para opções
    abre o conteúdo de #destaque no modal ao clicar em 'a'
    */
    $.fn.modal = function (tgt, opts) {
        this.click(tgt
		? function () { new $.modal(tgt, opts).abrir(); return false }
		: function () { $(this).abrirModal(opts); return false }
	);
        return false;
    };


    /** ************************************************************************
    Avançar para o próximo campo ao completar
    */
    $.fn.autoNextField = function () {
        return this.keyup(function () {
            if ($(this).val().length == $(this).attr("maxlength")) {
                $(this).next().focus();
            }
        });
    };


    /** ************************************************************************
    NÃO-FINALIZADO Construtor de paginação NÃO-FINALIZADO
    @param n Itens por página
    */
    var tpl_paginacao = '<ul class="paginacao"><li><a class="frst">Primeiro</a></li> <li><a class="prev">Anterior</a></li> <li><a class="pag">1</a</li> <li><a class="next">Próximo</a></li> <li><a class="last">Último</a></li> </ul>';

    $.fn.paginar = function (n) {
        return this.each(function () {
            var 
			self = $(this),
			itens = self.children(),
			ln = itens.length,
			size = n,
			pages = Math.ceil(ln / size),
			tpl_pag = $(tpl_paginacao).insertAfter(self),
			tpl_it = tpl_pag.find('.pag'),
			prox = tpl_pag.find('.prox');

            itens.slice(3).hide();
            var pn = 0;
            while (++pn <= pages) {
                tpl_it.insertBefore(prox).text(pn);
            }

        });
    };

    /** ************************************************************************
    Adiciona classe durante hover
    substituto para :hover no IE6
    */
    $.fn.hoverClass = function (classname) {
        return this.hover(function () {
            $(this).addClass(classname);
        }, function () {
            $(this).removeClass(classname);
        });
    };


    /** ************************************************************************
    recupera metadados da classe do elemento
    @author Ricardo Tomasi
    @param nome identificador do objeto - formato "identificador{dados}"
    ex: <div class="classe1 biscoito{chocolate:true,id:1234} outraclasse">
    @returns object Objeto contendo os dados extraídos
	
    */
    $.fn.getMetaData = function (name) {
        if (this.length === 0)
            return null;

        var 
		self = this[0],
		class_str = self.className,
		reg = new RegExp(name + '\({[^{}]+\})', 'i'),
		matches = class_str.match(reg);

        return Function('return (' + matches[1] + ');')() || null;
    };


    /** ************************************************************************
    define valor padrão para input (exemplo/instrução)
    valor some no focus, retorna se o elemento não for preenchido
    @author Ricardo Tomasi
    @param nome do atributo para o valor padrão
    */
    $.fn.defaultValue = function (attr_name) {
        return this.each(function () {
            var self = $(this);
            var padrao = self.attr(attr_name);

            self.unbind('focus').unbind('blur');

            self.focus(function () {
                if (self.val() == padrao)
                    self.val('');
            });
            self.blur(function () {
                if (/^\s*$/.test(self.val())) //vazio
                    self.val(padrao);
            });
            self.blur();
        });
    };



    /** Helper para rastrear links Omniture */
    $.fn.marcaLink = function (txt) {
        return this.click(function () { marcaLink(txt) });
    };

    var _GLOBAL_linkYoutube = null;


    /*************/
    /* DOM Ready */
    /*************/
    $(document).ready(function () {

        $('input.numerico').live('keyup', function (e) {
            if (e.which != 9 /* tab */ && e.which != 16 /* shift */ && e.which != 37 /* seta direcional */ && e.which != 38 /* seta direcional */ && e.which != 39 /* seta direcional */ && e.which != 40 /* seta direcional */) {
                $(this).val($(this).val().replace(/\D/g, ""));
            }
        });

        // Envie Amigo
        $('#bt_enviar_amigo').live('click', function () {
            var dados = $('#form_envia_amigo').serializeArray();

            dados[5] = { name: 'url' }

            if (/#modalEnvieAmigo$/.test(_GLOBAL_linkYoutube)) {
                dados[5]['value'] = location.toString();
            } else {
                dados[5]['value'] = _GLOBAL_linkYoutube;
            }

            if (Jazz.WebService.Call("../Default.aspx/Indicar", dados)) {
                alert('Mensagem enviada');
                document.getElementById('form_envia_amigo').reset();
            } else {
                alert('Sua mensagem não foi enviada');
            }
        });

        $('a[href=#]').click(function () { return false });

        /* reset todos os campos da pagina */
        //$('#aspnetForm')[0].reset();

        //$('.paginacao a').live('click', function(e) { e.preventDefault() });

        /* SUBMENUS */
        $('#menuNovoServico .menuAba > li').hoverClass('hover');

        $(".btnEmail").live('click', function (e) {
            _GLOBAL_linkYoutube = e.target.getAttribute('HREF');

            var form = $('<form id="form_envia_amigo">' +
                            '<div id="modalEnvieAmigo">' +
                            '<div class="contentModal">' +
                            '<h1 style="background-position: -2px -328px !important">Envie para um amig</h1>' +
                            '<div class="colEsq">' +
                            '    <label for="nome">Seu Nome</label><br />' +
                            '    <input type="text" name="nome" id="seuNome" />' +
                            '</div>' +
                            '<div class="colDir">' +
                            '   <label for="email">Seu E-mail</label><br />' +
                            '    <input type="text" name="email" id="seuEmail" />' +
                            '</div>' +
                            '<div class="clr"><!-- --></div>' +
                            '<div class="colEsq">' +
                            '    <label for="nome">Nome do Amigo</label><br />' +
                            '    <input type="text" name="nomeAmigo" id="nomeAmigo" />' +
                            '</div>' +
                            '<div class="colDir">' +
                            '    <label for="emailAmigo">E-mail do Amigo</label><br />' +
                            '    <input type="text" name="emailAmigo" id="emailAmigo" />' +
                            '</div>' +
                            '<div class="clr"><!-- --></div>' +
                            '<div class="comentario">' +
                            '    <label for="comentario">Envie um Comentário</label> (Opcional)<br />' +
                            '    <textarea id="comentario" name="comentario"></textarea>' +
                            '</div>' +
                            '<input id="bt_enviar_amigo" type="button" class="btn btnEnviar" />' +
                        '</div>' +
                    '</div>' +
                    '</form>');
            var modal = new $.modal(form, { remove: true });
            modal.abrir();
            return false;
        });


        /* LOGIN */
        $('.lnkEsqueciSenha').click(function () {

            var tgt = $(this).attr('href');

            var form = $('<div id="form-esqueci-senha"><p>Para receber sua senha, digite o seu e-mail no campo abaixo:</p><input type="email" value="" id="inp-esqueci-senha" /><input type="button" value="enviar" id="inp-esqueci-senha-enviar" class="btn btnEnviar" /></div>');
            var modal = new $.modal(form, { remove: true });

            form.find('.btnEnviar').click(function () {

                var inp = $('#inp-esqueci-senha');
                var email = inp.val();
                var patt = /^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$/;

                if (!patt.test(email)) {
                    alert('Email inválido');
                    inp.val('').focus();
                    return;
                }
                else {
                    $.get(tgt, { email: email }, function (resp) {
                        if (/sucesso/i.test(resp)) {
                            form.html('<p class="subttl">Senha enviada para o seu e-mail.</p>');
                            if (tgt.indexOf('?t=ao') != -1) // SE FOR DE AGENDAMENTO ONLINE
                                trackOmni("NovoServico:Servico:AgendamentoOnline:EsqueciSenhaEnviado", "", null, null)
                        } else {
                            form.html('<p class="subttl">Email n&atilde;o encontrado</p>');
                            inp.val('').focus();
                        }
                    });
                };

                return false;
            });

            modal.abrir();
            return false;
        });

        /* REENVIO CONFIRMACAO */
        $('.lnkConfirmacao').click(function () {

            var tgt = $(this).attr('href');
            var form = $('<div id="form-esqueci-senha"><p>Para receber sua confirma&ccedil;&atilde;o , digite o seu e-mail no campo abaixo:</p><input type="email" value="" id="inp-esqueci-senha" /><input type="button" value="enviar" id="inp-esqueci-senha-enviar" class="btn btnEnviar" /></div>');
            var modal = new $.modal(form, { remove: true });

            form.find('.btnEnviar').click(function () {

                var inp = $('#inp-esqueci-senha');
                var email = inp.val();
                var patt = /^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$/;

                if (!patt.test(email)) {
                    alert('Email inválido');
                    inp.val('').focus();
                    return;
                }
                else {
                    $.get(tgt, { email: email }, function (resp) {
                        if (/sucesso/i.test(resp)) {
                            form.html('<p class="subttl">Confirma&ccedil;&atilde;o enviada para o seu e-mail.</p>');
                            if (tgt.indexOf('?t=ao') != -1) // SE FOR DE AGENDAMENTO ONLINE
                                trackOmni("NovoServico:Servico:AgendamentoOnline:ReenvioConfCadastroEnviado", "", null, null)
                        }
                        else if (/existe/i.test(resp)) {
                            form.html('<p class="subttl">Cadastro j&aacute; confirmado.</p>');
                        }
                        else {
                            form.html('<p class="subttl">Email n&atilde;o encontrado</p>');
                            inp.val('').focus();
                        }
                    });
                };

                return false;
            });

            modal.abrir();
            return false;
        });
        /* /LOGIN */

        /* LOCALIZADOR */
        $('.inpCEP1').autoNextField().defaultValue('alt');

        $('#lstResultadoBusca .fechar').click(function () {
            $('#lstResultadoBusca').hide();
            $('#boxLocalizador input').show();
            $('#boxLogin,#boxLocalizador .campos').show();
            $('.login_localizador').removeClass('loading');
            //$("#lstResultadoBusca li").removeClass("atv");
        });

        /* /LOCALIZADOR */
        $('.inpEmail').defaultValue('alt');

        var senha = $('.inpSenha');
        var senha_rep = $('<input type="text" class="inpSenha" />').val('Senha').hide().insertAfter(senha);

        senha.blur(function () {
            if (/^\s*$/.test(senha.val())) {
                senha.hide();
                senha_rep.show();
            }
        });
        senha_rep.focus(function () {
            senha_rep.hide();
            senha.show().focus();
        });

        senha.blur();

        // ajustar tamanho da gambiarra das abas troca de oleo
        $('.conteudoAbas .clearfoot').height($('#boxBanners').height());

    });

})(jQuery);
