(function($){

    var show = function(){
        this.css('visibility', 'visible');
    };
    var hide = function(){
        this.css('visibility', 'hidden');
    };
    
    // no ie, o filtro de opacidade forca o elemento a ficar com overflow hidden
    // o que acaba por esconder a aba do submenu, entao nao sera usada animacao
    if ($.support.opacity){
        var oldShow = show;
        show = function(){
            oldShow.call(this);
            this.clearQueue().stop().delay(80).animate({opacity: 1}, {duration: 200});
        };
        var oldHide = hide;
        hide = function(){
            this.clearQueue().stop().delay(100).animate({opacity: 0}, {complete: $.proxy(oldHide, this), duration: 200});
        };
    }
    
    var Menu = {
        setupSubmenus: function(){
            var self = this;
            this.element.find('ul.menu-itens > li').each(function(){
                var li = $(this), submenu = li.find('div.submenu');
                if (!submenu.length) return;

                var columns = li.find('div.conteudo-subitens:first > ul'),
                    nColumns = columns.length;
                columns.last().addClass('last');
                hide.call(submenu);
                if (nColumns > 1){
                    submenu.first().addClass('submenu-' + nColumns + 'colunas');
                }
                self.reflowSubmenuSide(li, submenu);
                li.hover($.proxy(show, submenu), $.proxy(hide, submenu));
            });
        },
        
        reflowSubmenuSide: function(li, submenu){
            // items de menu alinhados a direita (especiais) nao terao reflow
            if(li.hasClass('menu-item-especial')) return;
            // reposiciona o submenu para a esquerda para o caso de ele
            // ficar mais largo que o conteudo do site pela direita
            var rightDiff = (submenu.offset().left + submenu.width()) - (this.menuLeft + this.menuWidth);
            if (rightDiff > 0){
                li.addClass('menu-item-esq');
                // reposiciona o submenu para a esquerda para o caso de ele
                // ficar mais largo que o conteudo do site pela esquerda
                var leftDiff = this.menuLeft - submenu.offset().left;
                if (leftDiff > 0 && rightDiff < leftDiff){
                    li.removeClass('menu-item-esq');
                }
            }
        }
        
    };
    
    Menu[$.ui.version >= "1.8" ? '_create' : '_init'] = function(){
        this.menuLeft = this.element.offset().left;
        this.menuWidth = this.element.width();
        this.setupSubmenus();
    };
    
    $.widget('ui.glbmenu', Menu);
    
    $('#glb-menu').glbmenu();
    
})(jQuery);
