(function($) {
    var $body = $('body');
    if ($body.data('contextMenu.loaded')) {
        return;
    }
    $body.data('contextMenu.loaded', true);
    $(document).on('mouseenter', '.context-menu .pf-actions-icon', function() {
        var trigger = $(this);
        if (!trigger.data('contextMenu.initialized')) {
            trigger.data('contextMenu.initialized', true);
            (function() {
                // We need to initialize the menu ..
                var container = trigger.closest('.context-menu');
                var menuContainer = $('<div/>').addClass('context-menu-holder');
                var menu = container.find('.dropdown-menu').on('mouseleave', function() {
                    menuContainer.removeClass('open');
                }).appendTo(menuContainer);
                var dontClose = false;
                $body.on('contextMenu.close', function() {
                    if (dontClose) {
                        dontClose = false;
                        return;
                    }
                    menuContainer.removeClass('open');
                }).append(menuContainer);
                var menuStyle = menu.attr('style');
                Solid.patchLightboxAjaxLinks(menu.find('a.lightBoxAjaxLink'));
                trigger.on('contextMenu.show', function() {
                    dontClose = true;
                    menuContainer.css(trigger.offset()).addClass('open');
                    // Optimize positioning (i.e. decide whether to show right or left) ..
                    var maxVisiblePosition = $(window).width() + $(window).scrollLeft();
                    var maxRight = container.offset().left + menu.width() + trigger.width();
                    if (maxRight > maxVisiblePosition) {
                        menu.css('left', (-menu.width()) + 'px');
                    } else {
                        if (menuStyle) {
                            menu.attr('style', menuStyle);
                        } else {
                            menu.removeAttr('style');
                        }
                    }
                    // Close other context menus ..
                    $body.trigger('contextMenu.close');
                });
                var timeout;
                trigger.on('mouseleave', function() {
                    clearTimeout(timeout);
                    timeout = setTimeout(function() {
                        menuContainer.removeClass('open');
                    }, 1000);
                });
                menu.find("li a").click(function(){
                    menuContainer.removeClass('open');
                });
                menu.on('mouseenter', function() {
                    clearTimeout(timeout);
                });
            })();
        }
        trigger.trigger('contextMenu.show');
    });
})(jQuery);
