reservation plugin - unbound request (unclean
[unfold.git] / portal / static / unbound_reservation_static / js / contextmenu / contextMenu.js
diff --git a/portal/static/unbound_reservation_static/js/contextmenu/contextMenu.js b/portal/static/unbound_reservation_static/js/contextmenu/contextMenu.js
new file mode 100644 (file)
index 0000000..0ccb3c1
--- /dev/null
@@ -0,0 +1,762 @@
+/*
+ *contextMenu.js v 1.3.0
+ *Author: Sudhanshu Yadav
+ *s-yadav.github.com
+ *Copyright (c) 2013 Sudhanshu Yadav.
+ *Dual licensed under the MIT and GPL licenses
+ */
+;(function ($, window, document, undefined) {
+    "use strict";
+
+    $.fn.contextMenu = function (method, selector, option) {
+
+        //parameter fix
+        if (!methods[method]) {
+            option = selector;
+            selector = method;
+            method = 'popup';
+        }
+
+
+        //need to check for array object
+        else if (selector) {
+            if (!((selector instanceof Array) || (typeof selector === 'string') || (selector.nodeType) || (selector.jquery))) {
+                option = selector;
+                selector = null;
+            }
+        }
+
+        if ((selector instanceof Array) && (method != 'update')) {
+            method = 'menu';
+        }
+
+        var myoptions = option;
+        if (method != 'update') {
+            option = iMethods.optionOtimizer(method, option);
+            myoptions = $.extend({}, $.fn.contextMenu.defaults, option);
+            if (!myoptions.baseTrigger) {
+                myoptions.baseTrigger = this;
+            }
+        }
+        methods[method].call(this, selector, myoptions);
+        return this;
+    };
+    $.fn.contextMenu.defaults = {
+        triggerOn: 'click', //avaliable options are all event related mouse plus enter option
+        displayAround: 'cursor', // cursor or trigger
+        mouseClick: 'left',
+        verAdjust: 0,
+        horAdjust: 0,
+        top: 'auto',
+        left: 'auto',
+        closeOther: true, //to close other already opened context menu
+        containment: window,
+        winEventClose: true,
+        sizeStyle: 'auto', //allowed values are auto and content (popup size will be according content size)
+        position: 'auto', //allowed values are top, left, bottom and right
+        closeOnClick: true, //close context menu on click/ trigger of any item in menu
+
+        //callback
+        onOpen: function (data, event) {},
+        afterOpen: function (data, event) {},
+        onClose: function (data, event) {}
+    };
+
+    var methods = {
+        menu: function (selector, option) {
+            var trigger = $(this);
+            selector = iMethods.createMenuList(trigger, selector, option);
+            iMethods.contextMenuBind.call(this, selector, option, 'menu');
+        },
+        popup: function (selector, option) {
+            $(selector).addClass('iw-contextMenu');
+            iMethods.contextMenuBind.call(this, selector, option, 'popup');
+        },
+        update: function (selector, option) {
+            var self = this;
+            this.each(function () {
+                var trgr = $(this),
+                    menuData = trgr.data('iw-menuData');
+                //refresh if any new element is added
+                if (!menuData) {
+                    self.contextMenu('refresh');
+                    menuData = trgr.data('iw-menuData');
+                }
+
+                var menu = menuData.menu;
+                if (typeof selector === 'object') {
+
+                    for (var i = 0; i < selector.length; i++) {
+                        var name = selector[i].name,
+                            disable = selector[i].disable,
+                            fun = selector[i].fun,
+                            img = selector[i].img,
+                            title = selector[i].title,
+                            className = selector[i].className,
+                            elm = menu.children('li').filter(function () {
+                                return $(this).contents().filter(function () {
+                                    return this.nodeType == 3;
+                                }).text() == name;
+                            }),
+                            subMenu = selector[i].subMenu;
+
+                        //toggle disable if provided on update method
+                        disable != undefined && (disable ? elm.addClass('iw-mDisable') : elm.removeClass('iw-mDisable'));
+                        
+                        //bind new function if provided
+                        fun && elm.unbind('click.contextMenu').bind('click.contextMenu',fun);
+                        
+                        //update title
+                        title != undefined && elm.attr('title',title);
+                        
+                        //update class name
+                        className!= undefined && elm.attr('class',className);
+                        
+                        //update image
+                        if(img){
+                            var imgIcon = elm.find('.iw-mIcon');
+                            if(imgIcon.length){
+                                imgIcon[0].src = img;
+                            }
+                            else{
+                                elm.prepend('<img src="' + img + '" align="absmiddle" class="iw-mIcon" />');
+                            }
+                        }
+                        
+                        //to change submenus
+                        if (subMenu) {
+                            elm.contextMenu('update', subMenu);
+                        }
+                    }
+
+                }
+
+                iMethods.onOff(menu);
+                menuData.option = $.extend({}, menuData.option, option);
+                trgr.data('iw-menuData', menuData);
+
+                //bind event again if trigger option has changed.
+                var eventType = menuData.option.triggerOn;
+                if (option) {
+                    if (eventType != option.triggerOn) {
+                        trgr.unbind('.contextMenu');
+                        //to bind event
+                        trgr.bind(eventType + '.contextMenu', iMethods.eventHandler);
+                    }
+                }
+            });
+        },
+        refresh: function () {
+            var menuData = this.filter(function () {
+                    return !!$(this).data('iw-menuData');
+                }).data('iw-menuData'),
+                newElm = this.filter(function () {
+                    return !$(this).data('iw-menuData');
+                });
+            //to change basetrigger on refresh  
+            menuData.option.baseTrigger = this;
+            iMethods.contextMenuBind.call(newElm, menuData.menuSelector, menuData.option);
+        },
+        open: function(sel,data){
+               data = data || {};
+               var e = data.event || new Event('click');
+               if(data.top) e.clientY = data.top;
+               if(data.left) e.clientX = data.left;
+            this.each(function(){
+                iMethods.eventHandler.call(this,e);
+            });
+        },
+        //to force context menu to close
+        close: function () {
+            var menuData = this.data('iw-menuData');
+            if (menuData) {
+                iMethods.closeContextMenu(menuData.option, this, menuData.menu, null);
+            }
+        },
+        //to get value of a key
+        value: function (key) {
+            var menuData = this.data('iw-menuData');
+            if (menuData[key]) {
+                return menuData[key];
+            } else if (menuData.option) {
+                return menuData.option[key];
+            }
+            return null;
+        },
+        destroy: function () {
+            this.each(function () {
+                var trgr = $(this),
+                    menuId = trgr.data('iw-menuData').menuId,
+                    menu = $('.iw-contextMenu[menuId=' + menuId + ']'),
+                    menuData = menu.data('iw-menuData');
+
+                //Handle the situation of dynamically added element.
+                if (!menuData) return;
+
+
+                if (menuData.noTrigger == 1) {
+                    if (menu.hasClass('iw-created')) {
+                        menu.remove();
+                    } else {
+                        menu.removeClass('iw-contextMenu ' + menuId)
+                            .removeAttr('menuId').removeData('iw-menuData');
+                        //to destroy submenus
+                        menu.find('li.iw-mTrigger').contextMenu('destroy');
+                    }
+                } else {
+                    menuData.noTrigger--;
+                    menu.data('iw-menuData', menuData);
+                }
+                trgr.unbind('.contextMenu').removeClass('iw-mTrigger').removeData('iw-menuData');
+            });
+        }
+    };
+    var iMethods = {
+        contextMenuBind: function (selector, option, method) {
+            var trigger = this,
+                menu = $(selector),
+                menuData = menu.data('iw-menuData');
+
+            //fallback
+            if (menu.length == 0) {
+                menu = trigger.find(selector);
+                if (menu.length == 0) {
+                    return;
+                }
+            }
+
+            if (method == 'menu') {
+                iMethods.menuHover(menu);
+            }
+            //get base trigger
+            var baseTrigger = option.baseTrigger;
+
+
+            if (!menuData) {
+                var menuId;
+                if (!baseTrigger.data('iw-menuData')) {
+                    menuId = Math.ceil(Math.random() * 100000);
+                    baseTrigger.data('iw-menuData', {
+                        'menuId': menuId
+                    });
+                } else {
+                    menuId = baseTrigger.data('iw-menuData').menuId;
+                }
+                //create clone menu to calculate exact height and width.
+                var cloneMenu = menu.clone();
+                cloneMenu.appendTo('body');
+
+                menuData = {
+                    'menuId': menuId,
+                    'menuWidth': cloneMenu.outerWidth(true),
+                    'menuHeight': cloneMenu.outerHeight(true),
+                    'noTrigger': 1,
+                    'trigger': trigger
+                };
+
+
+                //to set data on selector
+                menu.data('iw-menuData', menuData).attr('menuId', menuId);
+                //remove clone menu
+                cloneMenu.remove();
+            } else {
+                menuData.noTrigger++;
+                menu.data('iw-menuData', menuData);
+            }
+
+            //to set data on trigger
+            trigger.addClass('iw-mTrigger').data('iw-menuData', {
+                'menuId': menuData.menuId,
+                'option': option,
+                'menu': menu,
+                'menuSelector': selector,
+                'method': method
+            });
+
+            //hover fix
+            var eventType;
+            if (option.triggerOn == 'hover') {
+                eventType = 'mouseenter';
+                //hover out if display is of context menu is on hover
+                if (baseTrigger.index(trigger) != -1) {
+                    baseTrigger.add(menu).bind('mouseleave.contextMenu', function (e) {
+                        if ($(e.relatedTarget).closest('.iw-contextMenu').length == 0) {
+                            $('.iw-contextMenu[menuId="' + menuData.menuId + '"]').hide(100);
+                        }
+                    });
+                }
+
+            } else {
+                eventType = option.triggerOn;
+            }
+
+           trigger.delegate('input,a,.needs-click','click',function(e){ e.stopImmediatePropagation()});
+
+            //to bind event
+            trigger.bind(eventType + '.contextMenu', iMethods.eventHandler);
+
+            //to stop bubbling in menu
+            menu.bind('click mouseenter', function (e) {
+                e.stopPropagation();
+            });
+
+            menu.delegate('li', 'click', function (e) {
+                if (option.closeOnClick) iMethods.closeContextMenu(option, trigger, menu, e);
+            });
+        },
+        eventHandler: function (e) {
+            e.preventDefault();
+            var trigger = $(this),
+                trgrData = trigger.data('iw-menuData'),
+                menu = trgrData.menu,
+                menuData = menu.data('iw-menuData'),
+                option = trgrData.option,
+                cntnmnt = option.containment,
+                clbckData = {
+                    trigger: trigger,
+                    menu: menu
+                },
+                //check conditions
+                cntWin = cntnmnt == window,
+                btChck = option.baseTrigger.index(trigger) == -1;
+
+            //to close previous open menu.
+            if (!btChck && option.closeOther) {
+                $('.iw-contextMenu').css('display', 'none');
+            }
+
+            //to reset already selected menu item
+            menu.find('.iw-mSelected').removeClass('iw-mSelected');
+
+            //call open callback
+            option.onOpen.call(this, clbckData, e);
+
+
+            var cObj = $(cntnmnt),
+                cHeight = cObj.innerHeight(),
+                cWidth = cObj.innerWidth(),
+                cTop = 0,
+                cLeft = 0,
+                menuHeight = menuData.menuHeight,
+                menuWidth = menuData.menuWidth,
+                va, ha,
+                left = 0,
+                top = 0,
+                bottomMenu,
+                rightMenu,
+                verAdjust = va = parseInt(option.verAdjust),
+                horAdjust = ha = parseInt(option.horAdjust);
+
+            if (!cntWin) {
+                cTop = cObj.offset().top;
+                cLeft = cObj.offset().left;
+
+                //to add relative position if no position is defined on containment
+                if (cObj.css('position') == 'static') {
+                    cObj.css('position', 'relative');
+                }
+
+            }
+
+            if (option.sizeStyle == 'auto') {
+                menuHeight = Math.min(menuHeight, cHeight);
+                menuWidth = Math.min(menuWidth, cWidth);
+                menuWidth = menuWidth + 20;
+            }
+
+            if (option.displayAround == 'cursor') {
+                left = cntWin ? e.clientX : e.clientX + $(window).scrollLeft() - cLeft;
+                top = cntWin ? e.clientY : e.clientY + $(window).scrollTop() - cTop;
+                bottomMenu = top + menuHeight;
+                rightMenu = left + menuWidth;
+                //max height and width of context menu
+                if (bottomMenu > cHeight) {
+                    if ((top - menuHeight) < 0) {
+                        if ((bottomMenu - cHeight) < (menuHeight - top)) {
+                            top = cHeight - menuHeight;
+                            va = -1 * va;
+                        } else {
+                            top = 0;
+                            va = 0;
+                        }
+                    } else {
+                        top = top - menuHeight;
+                        va = -1 * va;
+                    }
+                }
+                if (rightMenu > cWidth) {
+                    if ((left - menuWidth) < 0) {
+                        if ((rightMenu - cWidth) < (menuWidth - left)) {
+                            left = cWidth - menuWidth;
+                            ha = -1 * ha;
+                        } else {
+                            left = 0;
+                            ha = 0;
+                        }
+                    } else {
+                        left = left - menuWidth;
+                        ha = -1 * ha;
+                    }
+                }
+            } else if (option.displayAround == 'trigger') {
+                var triggerHeight = trigger.outerHeight(true),
+                    triggerWidth = trigger.outerWidth(true),
+                    triggerLeft = cntWin ? trigger.offset().left - cObj.scrollLeft() : trigger.offset().left - cLeft,
+                    triggerTop = cntWin ? trigger.offset().top - cObj.scrollTop() : trigger.offset().top - cTop,
+                    leftShift = triggerWidth;
+
+                left = triggerLeft + triggerWidth;
+                top = triggerTop;
+
+
+                bottomMenu = top + menuHeight;
+                rightMenu = left + menuWidth;
+                //max height and width of context menu
+                if (bottomMenu > cHeight) {
+                    if ((top - menuHeight) < 0) {
+                        if ((bottomMenu - cHeight) < (menuHeight - top)) {
+                            top = cHeight - menuHeight;
+                            va = -1 * va;
+                        } else {
+                            top = 0;
+                            va = 0;
+                        }
+                    } else {
+                        top = top - menuHeight + triggerHeight;
+                        va = -1 * va;
+                    }
+                }
+                if (rightMenu > cWidth) {
+                    if ((left - menuWidth) < 0) {
+                        if ((rightMenu - cWidth) < (menuWidth - left)) {
+                            left = cWidth - menuWidth;
+                            ha = -1 * ha;
+                            leftShift = -triggerWidth;
+                        } else {
+                            left = 0;
+                            ha = 0;
+                            leftShift = 0;
+                        }
+                    } else {
+                        left = left - menuWidth - triggerWidth;
+                        ha = -1 * ha;
+                        leftShift = -triggerWidth;
+                    }
+                }
+                //test end
+                if (option.position == 'top') {
+                    menuHeight = Math.min(menuData.menuHeight, triggerTop);
+                    top = triggerTop - menuHeight;
+                    va = verAdjust;
+                    left = left - leftShift;
+                } else if (option.position == 'left') {
+                    menuWidth = Math.min(menuData.menuWidth, triggerLeft);
+                    left = triggerLeft - menuWidth;
+                    ha = horAdjust;
+                } else if (option.position == 'bottom') {
+                    menuHeight = Math.min(menuData.menuHeight, (cHeight - triggerTop - triggerHeight));
+                    top = triggerTop + triggerHeight;
+                    va = verAdjust;
+                    left = left - leftShift;
+                } else if (option.position == 'right') {
+                    menuWidth = Math.min(menuData.menuWidth, (cWidth - triggerLeft - triggerWidth));
+                    left = triggerLeft + triggerWidth;
+                    ha = horAdjust;
+                }
+            }
+            //to draw contextMenu
+            var outerLeftRight = menu.outerWidth(true) - menu.width(),
+                outerTopBottom = menu.outerHeight(true) - menu.height();
+
+
+            //applying css property
+            var cssObj = {
+                'position': (cntWin || btChck) ? 'fixed' : 'absolute',
+                'display': 'inline-block',
+                'height': '',
+                'width': '',
+                'overflow-y': menuHeight != menuData.menuHeight ? 'auto' : 'hidden',
+                'overflow-x': menuWidth != menuData.menuWidth ? 'auto' : 'hidden'
+            };
+
+            if (option.sizeStyle == 'auto') {
+                cssObj.height = menuHeight - outerTopBottom + 'px';
+                cssObj.width = menuWidth - outerLeftRight + 'px';
+            }
+
+            //to get position from offset parent
+            if (option.left != 'auto') {
+                left = iMethods.getPxSize(option.left, cWidth);
+            }
+            if (option.top != 'auto') {
+                top = iMethods.getPxSize(option.top, cHeight);
+            }
+            if (!cntWin) {
+                var oParPos = trigger.offsetParent().offset();
+                if (btChck) {
+                    left = left + cLeft - $(window).scrollLeft();
+                    top = top + cTop - $(window).scrollTop();
+                } else {
+                    left = left - (cLeft - oParPos.left);
+                    top = top - (cTop - oParPos.top);
+                }
+            }
+            cssObj.left = left + ha + 'px';
+            cssObj.top = top + va + 'px';
+
+            menu.css(cssObj);
+
+            //to call after open call back
+            option.afterOpen.call(this, clbckData, e);
+
+
+            //to add current menu class
+            if (trigger.closest('.iw-contextMenu').length == 0) {
+                $('.iw-curMenu').removeClass('iw-curMenu');
+                menu.addClass('iw-curMenu');
+            }
+
+
+            var dataParm = {
+                trigger: trigger,
+                menu: menu,
+                option: option,
+                method: trgrData.method
+            };
+            $('html').unbind('click', iMethods.clickEvent).click(dataParm, iMethods.clickEvent);
+            $(document).unbind('keydown', iMethods.keyEvent).keydown(dataParm, iMethods.keyEvent);
+            if (option.winEventClose) {
+                $(window).bind('scroll resize', dataParm, iMethods.scrollEvent);
+            }
+        },
+
+        scrollEvent: function (e) {
+            iMethods.closeContextMenu(e.data.option, e.data.trigger, e.data.menu, e);
+        },
+
+        clickEvent: function (e) {
+            var button = e.data.trigger.get(0);
+
+            if ((button !== e.target) && ($(e.target).closest('.iw-contextMenu').length == 0)) {
+                iMethods.closeContextMenu(e.data.option, e.data.trigger, e.data.menu, e);
+            }
+        },
+        keyEvent: function (e) {
+            e.preventDefault();
+            var menu = e.data.menu,
+                option = e.data.option,
+                keyCode = e.keyCode;
+            // handle cursor keys
+            if (keyCode == 27) {
+                iMethods.closeContextMenu(option, e.data.trigger, menu, e);
+            }
+            if (e.data.method == 'menu') {
+                var curMenu = $('.iw-curMenu'),
+                    optList = curMenu.children('li:not(.iw-mDisable)'),
+                    selected = optList.filter('.iw-mSelected'),
+                    index = optList.index(selected),
+                    focusOn = function (elm) {
+                        selected.removeClass('iw-mSelected');
+                        elm.addClass('iw-mSelected');
+                    },
+                    first = function () {
+                        focusOn(optList.filter(':first'));
+                    },
+                    last = function () {
+                        focusOn(optList.filter(':last'));
+                    },
+                    next = function () {
+                        focusOn(optList.filter(':eq(' + (index + 1) + ')'));
+                    },
+                    prev = function () {
+                        focusOn(optList.filter(':eq(' + (index - 1) + ')'));
+                    },
+                    subMenu = function () {
+                        var menuData = selected.data('iw-menuData');
+                        if (menuData) {
+                            selected.triggerHandler('mouseenter.contextMenu');
+                            var selector = menuData.menu;
+                            selector.addClass('iw-curMenu');
+                            curMenu.removeClass('iw-curMenu');
+                            curMenu = selector;
+                            optList = curMenu.children('li:not(.iw-mDisable)');
+                            selected = optList.filter('.iw-mSelected');
+                            first();
+                        }
+                    },
+                    parMenu = function () {
+                        var selector = curMenu.data('iw-menuData').trigger;
+                        var parMenu = selector.closest('.iw-contextMenu');
+                        if (parMenu.length != 0) {
+                            curMenu.removeClass('iw-curMenu').css('display', 'none');
+                            parMenu.addClass('iw-curMenu');
+                        }
+                    };
+                switch (keyCode) {
+                case 13:
+                    selected.click();
+                    break;
+                case 40:
+                    (index == optList.length - 1 || selected.length == 0) ? first(): next();
+                    break;
+                case 38:
+                    (index == 0 || selected.length == 0) ? last(): prev();
+                    break;
+                case 33:
+                    first();
+                    break;
+                case 34:
+                    last();
+                    break;
+                case 37:
+                    parMenu();
+                    break;
+                case 39:
+                    subMenu();
+                    break;
+                }
+            }
+        },
+        closeContextMenu: function (option, trigger, menu, e) {
+
+            //unbind all events from top DOM
+            $(document).unbind('keydown', iMethods.keyEvent);
+            $('html').unbind('click', iMethods.clickEvent);
+            $(window).unbind('scroll resize', iMethods.scrollEvent);
+            $('.iw-contextMenu').hide();
+            $(document).focus();
+
+            //call close function
+            option.onClose.call(this, {
+                trigger: trigger,
+                menu: menu
+            }, e);
+        },
+        getPxSize: function (size, of) {
+            if (!isNaN(size)) {
+                return size;
+            }
+            if (size.indexOf('%') != -1) {
+                return parseInt(size) * of / 100;
+            } else {
+                return parseInt(size);
+            }
+        },
+        menuHover: function (menu) {
+            menu.children('li').bind('mouseenter', function (e) {
+                //to make curmenu
+                $('.iw-curMenu').removeClass('iw-curMenu');
+                menu.addClass('iw-curMenu');
+                //to select the list
+                var selected = menu.find('li.iw-mSelected'),
+                    submenu = selected.find('.iw-contextMenu');
+                if ((submenu.length != 0) && (selected[0] != this)) {
+                    submenu.hide(100);
+                }
+                selected.removeClass('iw-mSelected');
+                $(this).addClass('iw-mSelected');
+            });
+        },
+        createMenuList: function (trgr, selector, option) {
+            var baseTrigger = option.baseTrigger,
+                randomNum = Math.floor(Math.random() * 10000);
+            if ((typeof selector == 'object') && (!selector.nodeType) && (!selector.jquery)) {
+                var menuList = $('<ul class="iw-contextMenu iw-created iw-cm-menu" id="iw-contextMenu' + randomNum + '"></ul>');
+                for (var i = 0; i < selector.length; i++) {
+                    var selObj = selector[i],
+                        name = selObj.name,
+                        fun = selObj.fun,
+                        subMenu = selObj.subMenu,
+                        img = selObj.img || '',
+                        title = selObj.title || "",
+                        className = selObj.className || "",
+                        disable = selObj.disable,
+                        list = $('<li title="' + title + '" class="' + className + '">' + name + '</li>');
+                    if (img) {
+                        list.prepend('<img src="' + img + '" align="absmiddle" class="iw-mIcon" />');
+                    }
+
+                    //to add disable
+                    if (disable) {
+                        list.addClass('iw-mDisable');
+                    }
+
+                    list.bind('click.contextMenu', fun);
+
+                    //to create sub menu
+                    menuList.append(list);
+                    if (subMenu) {
+                        list.append('<div class="iw-cm-arrow-right" />');
+                        iMethods.subMenu(list, subMenu, baseTrigger, option);
+                    }
+                }
+                if (baseTrigger.index(trgr[0]) == -1) {
+                    trgr.append(menuList);
+                } else {
+                    var par = option.containment == window ? 'body' : option.containment;
+                    $(par).append(menuList);
+                }
+
+                iMethods.onOff($('#iw-contextMenu' + randomNum));
+                return '#iw-contextMenu' + randomNum;
+            } else if ($(selector).length != 0) {
+                var element = $(selector);
+                element.removeClass('iw-contextMenuCurrent')
+                    .addClass('iw-contextMenu iw-cm-menu iw-contextMenu' + randomNum)
+                    .attr('menuId', 'iw-contextMenu' + randomNum)
+                    .css('display', 'none');
+
+                //to create subMenu
+                element.find('ul').each(function (index, element) {
+                    var subMenu = $(this),
+                        parent = subMenu.parent('li');
+                    parent.append('<div class="iw-cm-arrow-right" />');
+                    subMenu.addClass('iw-contextMenuCurrent');
+                    iMethods.subMenu(parent, '.iw-contextMenuCurrent', baseTrigger, option);
+                });
+                iMethods.onOff($('.iw-contextMenu' + randomNum));
+                return '.iw-contextMenu' + randomNum;
+            }
+        },
+        subMenu: function (trigger, selector, baseTrigger, option) {
+            trigger.contextMenu('menu', selector, {
+                triggerOn: 'hover',
+                displayAround: 'trigger',
+                position: 'auto',
+                baseTrigger: baseTrigger,
+                containment: option.containment
+            });
+        },
+        onOff: function (menu) {
+
+            menu.find('.iw-mOverlay').remove();
+            menu.find('.iw-mDisable').each(function () {
+                var list = $(this);
+                list.append('<div class="iw-mOverlay"/>');
+                list.find('.iw-mOverlay').bind('click mouseenter', function (event) {
+                    event.stopPropagation();
+                });
+
+            });
+
+        },
+        optionOtimizer: function (method, option) {
+            if (!option) {
+                return;
+            }
+            if (method == 'menu') {
+                if (!option.mouseClick) {
+                    option.mouseClick = 'right';
+                }
+            }
+            if ((option.mouseClick == 'right') && (option.triggerOn == 'click')) {
+                option.triggerOn = 'contextmenu';
+            }
+
+            if ($.inArray(option.triggerOn, ['hover', 'mouseenter', 'mouseover', 'mouseleave', 'mouseout', 'focusin', 'focusout']) != -1) {
+                option.displayAround = 'trigger';
+            }
+            return option;
+        }
+    };
+})(jQuery, window, document);
\ No newline at end of file