/* Cached on Thu, 30 Jan 2025 18:15:22 */
(function( $ ) {
    $.contextMenu = function(config) {
        if (!config || typeof(config) != 'object') {
            throw ('Config missed!');
        }
        var
            cM,
            _this = this,
            cMTargetE,
            itemByKey = {};
        this.temp = {};
        cM = construct();
        function construct() {
            var list = $('<ul class="contextMenu">')
                .on('contextmenu', function() {
                    return false;
                });
            $(config.items).each(function(k, item) {
                $(list)
                    .append(getItem(item));
            });
            return list;
        }
        function getItem(item) {
            var menuItem = $('<li>');
            if (item.key)
                itemByKey[item.key] = menuItem;
            if (item == 'stripe') {
                $(menuItem)
                    .addClass('stripe')
            } else {
                $(menuItem).text(item.label)
                if (item.select)
                    $(menuItem)
                        .mousedown(function(e) {
                            if (! $(this).hasClass('disabled')) {
                                _hideCm();
                                if (item.select(cMTargetE, _this) === false)
                                    _show(cMTargetE);
                            }
                        })
                        .addClass('click_me');
                if (item.subItems) {
                    var subMenu = $('<ul>');
                    $(item.subItems).each(function(k, itm) {
                        $(subMenu)
                            .append(getItem(itm));
                    });
                    $(menuItem).append('<span>»</span>');
                    $(menuItem).append(subMenu);
                }
                if (item.disabled)
                    $(menuItem).addClass('disabled');
                if (item.hidden)
                    $(menuItem)
                        .hide();
            }
            return menuItem;
        }
        function findByKey(key) {
            return $.grep(config.items, function(item) {return item.key == key})[0];
        }
        function _addItem(item, after) {
            if (!item)
                throw ('Item required');
            if (after != -1) {
                after = (after && $(cM).children().length >= after) ? after : $(cM).children().length;
            }
            var menuItem = getItem(item);
            if (after != -1)
                $(cM)
                    .children(':nth-child('+after+')')
                    .after(menuItem);
            else
                $(cM).prepend(menuItem);
        }
        this.addItem = function(item, after) {
            after = after || false;
            _addItem(item, after);
        }
        function _disable(key) {
            $(itemByKey[key])
                .addClass('disabled');
        }
        this.disable = function(item) {
            _disable(item);
        }
        function _enable(key) {
            $(itemByKey[key])
                .removeClass('disabled');
        }
        this.enable = function(item) {
            _enable(item);
        }
        function _hideItem(key) {
            $(itemByKey[key])
                .hide();
        }
        this.hideItem = function(item) {
            _hideItem(item);
        }
        function _hideAll() {
            $(cM).children('li').hide();
        }
        this.hideAll = function() {
            _hideAll();
        }
        function _showItem(key) {
            $(itemByKey[key])
                .show();
        }
        this.showItem = function(item) {
            _showItem(item);
        }
        function _showAll() {
            $(cM).children('li').show();
        }
        this.showAll = function() {
            _showAll();
        }


        function _show(e) {
            cMTargetE = e;
            if (!$('body').find(cM).length)
                $(cM)
                    .appendTo('body');
            if (config.onOpen)
                config.onOpen(e, _this);
            $(cM)
                .position({
                    my: 'left top',
                    of: e,
                    collision: 'fit'
                })
        }
        this.show = function(e) {
            _show(e);
        }
        function _hideCm() {
            $(cM).css('left', '-1000px');
        }
        this.getWidget = function() {
            return cM;
        }
    }
    $.fn.contextMenu = function(menu) {
        if (!menu || !menu instanceof $.contextMenu) {
            console.error('$.contextMenu object is required');
            return false;
        }
        return this.each(function() {
            $(this).on('contextmenu', function(e){
                menu.show(e);
                return false;
            })
        })
    }
    $.contextMenu.hideAll = function(e) {
        var cM = $('.contextMenu:not([style*=1000])');
        if (cM.length && !$(e.target).closest(cM).length) {
            e.stopPropagation();
            //$(cM).remove();
            $(cM).css('left','-1000px');
        }
    }
    $.contextMenu.addBaseForLink = function(menu) {
        var base = [
            'stripe',
            {
                label: 'Открыть ссылку в новой вкладке',
                select: function(e) {
                    window.open(e.target.href, '_blank');
                }
            }
        ];
        if (menu.length == undefined)
            menu = [menu];
        for(var i in menu)
            for (var p in base)
                menu[i].addItem(base[p], -1);
    }
    $(document).click(function(e) {
        $.contextMenu.hideAll(e);
    })
    $(window).on('contextmenu',function(e) {
        $.contextMenu.hideAll(e);
    })
    $.contextMenuForm = function(formName, data, callback) {
        var form;
        $.ajax({
            url: '/cp/etc/cMForm/' + formName + '.php',
            type: 'GET',
            data: {
                data: data
            },
            async: false,
            success: function(r) {
                form = $(r);
            }
        });
        if (callback)
            form.find('.cMFormSubmit,.cMFormCancel')
                .click(function(e) {
                    callback(e);
                })
        function _show(e) {
            $(form)
                .appendTo('body')
                .position({
                    my: 'left center',
                    of: e,
                    collision: 'fit'
                })
        }
        this.show = function(e) {
            _show(e);
        }
        return this;
    }
})(jQuery)