/*
 * jQuery Dropmenu 2.0
 * Copyright (c) Dezembro 2011 
 * Estrutura atualizada para multiplas instâncias
 */
 
(function ($) {

    $.fn.dropmenu = function (o) {

        // suporte a múltiplos elementos, caso exista mais de um no DOM
        if (this.length > 1) {
            this.each(function () { $(this).dropmenu(o) });
            return this;
        }

        // variáveis privadas...
        var dropmenu = this;
        var arrow = dropmenu.find(".arrow:eq(0)").attr("id", 'dropmenu_' + parseInt(Math.random() * 1000));
        var bt = arrow.parent();
        var bts = dropmenu.find("li").not("ul.subnav li");
        var menu = dropmenu.find("ul.subnav:first");

        // opções Padrões 
        var defaultOptions = {

            mode: 1, //Tipo 1 - abre submenus ao lado, tipo 2 abre dentro...
            onSelected: function (e) { },
            unSelected: function (e) { },
            onClick: function (e) { },
            onStart: function (e) { },
            close: true, // Fechar ao clicar no link?
            closemore: false, // Fechar o clicar no link com submenu?
            closeover: false, // Fechar ao retirar o mouse sobre o menu...
            dropmore: true, // Abrir submenu com slide (true) ou hover (false) 
            marginLeft: 0,
            marginTop: 0,
            marginWidth: -2

        };

        // extendendo opções ao objeto... padrões e/ou estabelecidas...						
        var options = $.extend({}, defaultOptions, o);

        // FUNÇÕES privadas...  
        var init = function () {

            // suporte a MetaData plugin
            if ($.meta) {
                options = $.extend({}, options, this.data());
            }

            // Verifica se há apenas um botão ou mais...
            if (bts.length < 1)
                bts = bt;

            // Colocando setinhas...		   
            dropmenu.find("li ul.subnav").parent().addClass("more");

            // Ajustando active event para IE
            dropmenu.find("a")
                    .attr("hideFocus", "true").css("outline", "none")
                    .not(".arrow")
			        .bind("mousedown", function () { $(this).parent().addClass("selected"); })
			        .bind("mouseup", function () { $(this).parent().removeClass("selected"); });


            //Configurando Links 
            bt.hover(function () {
                bt.addClass("hover"); // Ao passar o mouse sobre o botao....
            }, function () {
                bt.removeClass("hover");  // Ao retirar o mouse o botao...
            }).click(function () {
                options.onClick();
                console.log("clicou");
                if (!options.closeover) {
                    if (bts.hasClass('active') || bts.hasClass('activelarge'))
                        dropmenu.close();
                    else
                        dropmenu.open();
                }
                else
                    dropmenu.open();
                bt.hover(function () { bt.removeClass("hover"); }, // Ao passar o mouse sobre botao/menu
                           function () {    // Ao retirar o mouse sobre botao/menu
                               console.log("saiu");
                               if (options.closeover)
                                   dropmenu.close();
                           });



            }); // Ao clicar ...


            // Ao clicar sobre links do menu... 
            if (options.close) {
                dropmenu.find("ul.subnav li a").click(function () {
                    dropmenu.find("a").removeClass("selected");
                    $(this).addClass("selected");
                    if ($(this).parent().attr("class") != "more" || ($(this).parent().attr("class") == "more" && options.closemore))
                        dropmenu.close();
                    return false;
                });
                if (dropmenu.find("ul.subnav li a").length < 1)
                    dropmenu.find("ul.subnav li.more").click(function () {
                        options.onClick();
                        if (options.closemore)
                            dropmenu.close();
                        return false;
                    });

            }

            // Adiciona dropmenu evento em submenus
            if (options.dropmore && options.close)
                dropmenu.find(".more").each(function () {

                    var a = $(this).find("a:first");
                    if (a.length < 1)
                        a = $(this);
                    a.click(function () {

                        var sub = $(this).parent().find("ul.subnav");
                        if (a.hasClass('more'))
                            sub = $(this).find("ul.subnav");

                        if (dropmenu.find("ul.subnav li.more ul").length > 1)
                            dropmenu.find("li.more ul.subnav").not(sub).slideUp('fast', function () {
                                sub.slideDown('fast').show();
                            });
                        else
                            sub.slideDown('fast').show();
                    });

                });

            return dropmenu;
        }

        var hide = function (e) {

            if ($(e.target).attr('id') != arrow.attr('id') || $(e.target).attr('id') == undefined) {
                dropmenu.close();
            } else return false;
        }

        this.open = function () {

            var position = dropmenu.position();
            var left = position.left + options.marginLeft;
            var top = position.top + dropmenu.height() + options.marginTop;
            var w = 0;
            var wfinal = w;
            bts.each(function () {
                w = w + $(this).width();
            });
            wfinal = w;
            if (wfinal < dropmenu.width())
                wfinal = dropmenu.width();

            menu.css({ 'top': top, 'left': left, 'width': wfinal + options.marginWidth }).slideDown('fast').show();
            bt.removeClass("hover");
            if (menu.width() > w)
                bts.addClass("activelarge");
            else
                bts.addClass("active");

            // Posicionando submenus...conforme a largura final do menu...
            menu.find('ul.subnav').css({ 'left': menu.width() });

            // Fechar ao clicar fora do dropmenu
            if (!options.closeover) { $(document).bind('click', hide); };

        };

        this.close = function () {

            if (dropmenu.find("li.more ul.subnav")[0])
                dropmenu.find("li.more ul.subnav").slideUp('fast', function () {
                    menu.slideUp('slow', function () {
                        bt.removeClass("hover");
                        bts.removeClass("active").removeClass("activelarge");
                        dropmenu.find("a").removeClass("selected");
                        $(document).unbind('click', hide);
                    });
                });
            else {
                menu.slideUp('slow', function () {
                    bt.removeClass("hover");
                    bts.removeClass("active").removeClass("activelarge");
                    dropmenu.find("a").removeClass("selected");
                    $(document).unbind('click', hide);
                });

            }

        };


        if (dropmenu.length) {
            return init();
        };

    };

})(jQuery);




 
