b0y-101 Mini Shell


Current Path : E:/www/risk/modules/mod_djmegamenu/assets/js/
File Upload :
Current File : E:/www/risk/modules/mod_djmegamenu/assets/js/jquery.djmegamenu.js

/**
 * @package DJ-MegaMenu
 * @copyright Copyright (C) 2022 DJ-Extensions.com, All rights reserved.
 * @license DJ-Extensions.com Proprietary Use License
 * @author url: https://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski, Artur Kaczmarek
 */

 var DJMegaMenu;

(function($){
	DJMegaMenu = function (menu, options) {

		this.options = {
			openDelay: 250, // delay before open sub-menu
			closeDelay: 500, // delay before close sub-menu
			animIn: 'fadeIn',
			animOut: 'fadeOut',
			animSpeed: 'normal',
			duration: 450, // depends on speed: normal - 450, fast - 250, slow - 650
			wrap: null,
			direction: 'ltr',
			event: 'mouseenter',
			eventClose: 'mouseleave',
			parentOpen: 0,
			touch: (('ontouchstart' in window) || (navigator.MaxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)), // touch screens detection
			offset: 0,
			wcag: 1,
			overlay: 0
		};

		this.init(menu, options);
	};

	DJMegaMenu.prototype.init = function (menu, options) {

		var self = this;

		jQuery.extend(self.options, options);

		console.log(self.options);

		if ( !menu.length ) return;

		// remove hidden menu items from the DOM
		menu.find('.dj-hideitem').remove();

		// add active class
		menu.find('.modules-wrap ul.nav li.current').each(function () {
			var $this = $(this);
			$this.parents('ul.dj-submenu > li, li.dj-up').each(function () {
				$this.addClass('active').find('> a').addClass('active');
			});
		});

    if( ! menu.find('.dj-up.active').length ) {
      menu.find('li.active').first().parents('li').each(function() {
        $(this).addClass('active').find('> a').addClass('active');
      });
    }

    self.options.activeParent = menu.find('.dj-up.active.parent').first();

		self.options.menu = menu;
		self.options.blurTimer = null;

		switch (self.options.animSpeed) {
			case 'fast':
				self.options.duration = 250;
				break;
			case 'slow':
				self.options.duration = 650;
				break;
		}

		if( self.options.animIn == '0' && self.options.animOut == '0' ) {
			self.options.duration = 0;
		}

		menu.addClass('dj-megamenu-js ' + self.options.animSpeed);

		var kids = menu.find('li.dj-up');
		self.kids = [];

		self.options.wrap = $('#' + self.options.wrap);
		if (!self.options.wrap.length) self.options.wrap = menu.parents('div').last();

		if (self.options.touch) menu.on('touchstart', function (e) {
			e.stopPropagation();
		}); // stop propagation

		kids.each(function (index) { //main items init
			var kid = $(this);
			self.kids[index] = new DJMMenuItem(kid, 0, self, self.options);
		});

		if (self.options.fixed == 1) {
			$(document).on('djmegamenu:pageload', function() {
				self.makeSticky(menu);
			});
		}

		//close submenu
		if( self.options.touch || self.options.eventClose == 'click' ) {
			$(document).on('mouseup', function (e) {
				if( ! $(e.target).closest('.dj-megamenu').length ) { //if click outside menu, close it
					self.hideAllSubs();
				}
			});
		}

		//keyboard navigation
		if (self.options.wcag == 1) {
			//disable tab
			var anchors = menu.find('a');
			anchors.attr('tabindex', -1);
			anchors.first().attr('tabindex', 0);

			$(document.body).on('keydown', function ( event ) {
				if(event.key == 'Escape') {
					self.hideAllSubs();
				}
			});
		}

		//parent open
		if(self.options.parentOpen > 0 && self.options.activeParent.length) {
			self.options.activeParent.find('> a').trigger('click');
		}

		//overlay
		if(self.options.overlay == 1) {
			var body = $(document.body);
			var wrapper = self.options.menu.parent();
			$(document).on('djmegamenu:showsubmenu', function() {
				if( ! body.hasClass('dj-megamenu-overlay') ) {
					body.addClass('dj-megamenu-overlay');
					var overlay = $('<div class="dj-megamenu-overlay-box" />');
					overlay.appendTo(wrapper).fadeIn(300);
				}
			});

			$(document).on('djmegamenu:hidesubmenu djmegamenu:leaveitem', function() {
				if( self.options.eventClose == 'mouseleave' && self.options.menu.find('.parent.hover').length ) return; //make sure that any dropdowns are not opened
				body.removeClass('dj-megamenu-overlay');
				wrapper.find('.dj-megamenu-overlay-box').fadeOut(300, function() { $(this).remove() });
			});
		}
	};

	DJMegaMenu.prototype.hideAllSubs= function () {
		var self = this;

		var opened = self.options.menu.find('.hover');
    if( opened.length ) {
      opened.get().reverse();
      $.each(opened, function (index, item) {
        $(item).trigger('djmegamenu:hideSub');
      });
    }
	};

	DJMegaMenu.prototype.makeSticky = function (menu) {

		var self = this;

		self.sticky = false;
		var wrapper = $('#' + menu.attr('id') + 'sticky');
		var placeholder = $('<div />');
		placeholder.css({
			display: 'none',
			opacity: 0,
			height: menu.height()
		});
		placeholder.attr('id', menu.attr('id') + 'placeholder');
		placeholder.insertBefore(wrapper);
		$(window).scroll(self.scroll.bind(self, wrapper, menu, placeholder, false));
		$(window).resize(self.scroll.bind(self, wrapper, menu, placeholder, true));
		self.scroll(wrapper, menu, placeholder, false);
		$(window).on('orientationchange', function () {
			setTimeout(function () {
				$(window).trigger('resize');
			}, 500);
		});
	};

	DJMegaMenu.prototype.scroll = function (wrapper, menu, placeholder, resize) {

		var self = this;

		if (menu.is(':hidden')) return;
		var scroll = $(window).scrollTop();
		var step = (self.sticky ? placeholder.offset().top : menu.offset().top) - parseInt(self.options.offset);

		// we need to clean the sticky styles and classes on scroll above the step or window resize
		if (self.sticky && (scroll < step || resize)) {

			menu.css({
				position: '',
				top: '',
				background: '',
				width: '',
				height: ''
			});

			menu.removeClass('dj-megamenu-fixed');
			wrapper.find('.dj-stickylogo').css('display', 'none');

			wrapper.css({
				position: '',
				top: '',
				height: '',
				left: '',
				width: '',
				display: 'none'
			});

			placeholder.css({
				display: 'none',
				'min-width': ''
			});
			// remove the max height for the submenu in sticky megamenu
			menu.find('.dj-up > .dj-subwrap').css({
				'max-height': '',
				'overflow-y': ''
			});
			self.sticky = false;
		}

		// if menu is not sticky (also on resize) we add styles and classes to make it sticky
		if (!self.sticky && scroll >= step) {

			wrapper.css({
				position: 'fixed',
				top: parseInt(self.options.offset),
				left: 0,
				width: '100%',
				display: 'block'
			});

			placeholder.css({
				'min-width': menu.outerWidth(true),
				display: ''
			});

			var lh = 0;
			var logo = wrapper.find('.dj-stickylogo');
			if (logo.length) {
				logo.css('display', '');
				if (logo.hasClass('dj-align-center')) {
					lh = logo.outerHeight(true);
					//console.log(lh);
				}
			}
			menu.css({
				position: 'fixed',
				top: parseInt(self.options.offset) + lh,
				background: 'transparent',
				height: 'auto'
			});

			menu.addClass('dj-megamenu-fixed');
			menu.css('width', placeholder.width() ? placeholder.width() + 1 : 'auto');
			placeholder.css('height', menu.outerHeight());
			// add place for sticky logo
			wrapper.css('height', lh + menu.outerHeight());
			// set the max height for the submenu in sticky megamenu
			var mh = $(window).height() - parseInt(self.options.offset) - wrapper.height();
			menu.find('.dj-up > .dj-subwrap').each(function () {
				if (!$(this).find('.dj-subwrap').length) {
					$(this).css({
						'max-height': mh,
						'overflow-y': 'auto'
					});
				}
			});
			self.sticky = true;
		}
	};

	/* DJMenuItem private constructor class */
	var DJMMenuItem = function (menu, level, parent, options) {
		this.options = {};
		this.init(menu, level, parent, options);
	};

	DJMMenuItem.prototype.init = function (menu, level, parent, options) {

		var self = this;

		jQuery.extend(self.options, options);

		self.menu = menu;
		self.level = level;
		self.parent = parent;

		self.timer = null;
		self.blurTimer = null;

		self.sub = self.menu.find('> .dj-subwrap').first();

		var subitems = self.menu.find('.dj-submenu > li, .dj-subtree > li');

		//console.log(self.menu);
		//menu.mouseenter(function(){console.log(subitems)});

		if ( ! subitems.length ) {
			// no subitems, clean and change to non-parent item
			self.sub.remove();
			self.menu.removeClass('parent');
			self.menu.find('span.dj-drop').removeClass('dj-drop');
			self.menu.find('i.arrow').remove();
		}

		var anchor = self.menu.find('> a').first();
		if ( ! anchor.attr('href') && ! self.menu.hasClass('separator')) self.menu.addClass('separator');

		var separator = ( self.menu.hasClass('separator') ) ? self.menu : false;
		if ( separator ) anchor.css('cursor', 'pointer');

		if( self.options.touch || self.options.event == 'click_all' || (self.options.event == 'click' && separator) ) {
			anchor.on('touchend click', function (e) {
				if( self.sub.length && ! self.menu.hasClass('hover') ) {
					e.preventDefault();
					if (e.type == 'touchend') self.menu.trigger('click');
				}
			});
		}

		//show submenu
		self.menu.on('click', function(e) {
			if( ! self.menu.hasClass('hover') ) { //if submenu hidden, display it
				self.showSub();
			} else if( separator && self.options.event == 'click' ) { //if is separator and submenu visible, close it
				self.hideSub();
			}
		}.bind(self));

		if( self.options.event == 'mouseenter' || (self.options.event == 'click' && ! separator) ) {
			self.menu.on('mouseenter', function (e) {
				//console.log('mouseenter');
				self.showSub();
			}.bind(self));
		}

		if( self.options.eventClose == 'mouseleave' ) {
			self.menu.on('mouseleave', function (e) {
				//console.log('mouseleave');
				if ( $(e.target).is('input') ) return;
				self.hideSub();
			});
		}

		self.menu.on('djmegamenu:showSub', function (e) {
			e.stopPropagation();
			//console.log('djmegamenu:showSub');
			self.showSub();
		});

		self.menu.on('djmegamenu:hideSub', function (e) {
			e.stopPropagation();
			//console.log('djmegamenu:hideSub');
			self.hideSub();
		});

		//init lower levels of menu
		if (self.sub.length) {
			self.initKids();
		}

		//self.menu.on("click mouseenter mouseleave touchstart touchend", function(e){ console.log(e.type + ' => ' + e.currentTarget.localName); });

		if (self.options.wcag == 1) {
			self.keyboardNavigation();
		}

	};

	DJMMenuItem.prototype.keyboardNavigation = function () {
		var self = this;

		var nextItem = function( item ) { // item is current LI
			var next = item.next();
			if ( item.is(':last-of-type') ) {
				//console.log('last-of-type');
				var column = item.closest('.dj-subcol');

				var next_column = column.next('.dj-subcol');
				var prev_column = column.prev('.dj-subcol');
				var first_column = column.parent().children().first();

				var menu_mod = item.closest('.nav.menu'); //check if item from module
				var menu_mod_submenu = ( item.closest('.nav-child').length ) ? true : false;
				var target = ( menu_mod.length ) ? '> .dj-submenu > li .menu > li' : '> .dj-submenu > li';

				if( next_column.length && !menu_mod_submenu ) {
					next = next_column.find(target).first();
				} else if( prev_column.length  && !menu_mod_submenu) {
					next = first_column.find(target).first();
				} else {
					next = item.closest('ul').find('> li').first();
				}
			} else if( ! next.length ) {
				next = item;
			}
			return next;
		}

		var prevItem = function( item ) { // item is current LI
			var prev = item.prev();
			if ( item.is(':first-of-type') ) {
				//console.log('first-of-type');
				var column = item.closest('.dj-subcol');

				var prev_column = column.prev('.dj-subcol');
				var next_column = column.next('.dj-subcol');
				var last_column = column.parent().children().last();

				var menu_mod = item.closest('.nav.menu'); //check if item from module
				var menu_mod_submenu = ( item.closest('.nav-child').length ) ? true : false;
				var target = ( menu_mod.length ) ? '> .dj-submenu > li .menu > li' : '> .dj-submenu > li';

				if( prev_column.length && !menu_mod_submenu  ) {
					prev = prev_column.find(target).last();
				} else if( next_column.length && !menu_mod_submenu ) {
					prev = last_column.find(target).last();
				} else {
					prev = item.closest('ul').find('> li').last();
				}
			} else if( ! prev.length ) {
				prev = item;
			}
			return prev;
		}

		var submenuLastItem = function( submenu ) {
			var column = submenu.find(' > .dj-subwrap-in > .dj-subcol').last();
			var menu_mod = column.find('.nav.menu');
			var target = ( menu_mod.length ) ? '> .dj-submenu > li .nav.menu > li' : '> .dj-submenu > li';
			var item = column.find(target).last();
			return item;
		}

		var findCharacter = function( item, character ) {

			var items;

			var submenu = item.closest('.dj-subwrap-in');
			if( submenu.length ) {
				var menu_mod = item.closest('.nav.menu');
				var target = ( menu_mod.length ) ? '> .dj-subcol > ul > li .nav.menu > li' : '> .dj-subcol > ul > li';
				items = submenu.find(target);
			} else {
				items = item.parent().find(' > li');
			}

			var i = items.index(item);

			var items_next = items.slice(i+1, items.length);
			var items_prev = items.slice(0, i);

			var next = items_next.filter('[data-key="' + character + '"]');
			var prev = items_prev.filter('[data-key="' + character+ '"]');

			if( next.length ) {
				return next.first();
			} else if( prev.length ) {
				return prev.first();
			} else {
				return item;
			}
		}

		var anchors = self.menu.find('a'); //all anchors, DJMenuItem and menu modules
		anchors.each(function() {
			var $this = $(this);
			var letter = $this.text().charAt(0).toLowerCase();
	
			$this.parent().attr('data-key', letter); //LI
		});

		anchors.on('focus', function(){
			//set tabindex on focus
			if(self.level === 0) { //only for main items
				self.options.menu.find('[tabindex="0"]').attr('tabindex', -1);
				$(this).attr('tabindex', 0);
			}
		});

		anchors.on('blur', function(){
			//console.log('blur');
			self.blurTimer = setTimeout(function() {
				if( ! self.options.menu.find(':focus').length ){
					var firstLvl = self;
					while(firstLvl.level > 0) {
						firstLvl.hideSub();
						firstLvl = firstLvl.parent;
					}
					firstLvl.hideSub();

					//when leave menu, reset tabindex
					self.options.menu.find('[tabindex="0"]').attr('tabindex', -1);
					firstLvl.menu.find('> a').attr('tabindex', 0);
				}
			}, self.options.openDelay);
		});

		self.options.menu.on('click', function(){ clearTimeout(self.blurTimer); });

		self.menu.on('keydown', function ( event ) {
			event.stopPropagation();

			$this = $(this);

			switch ( event.key ) {

				// ARROW RIGHT
				case 'ArrowRight':
					event.preventDefault();

					self.hideSub();

					if( self.level === 0 ) { //main item
						nextItem( $this ).find('> a').focus();
					} else if( self.sub.length ) { //have sub

						//If focus is on an item with a submenu, opens the submenu and places focus on the first item.

						self.showSub();
						setTimeout(function () {
							self.sub.find('a').first().focus();
						}, self.options.openDelay);
					} else if( $this.hasClass('subtree') ) {
						$this.find('.dj-subtree > li > a').first().focus();
					} else { //no sub

						//If focus is on an item that does not have a submenu:
						// Closes submenu.
						// Moves focus to next item in the menubar.
						// Opens submenu of newly focused menubar item, keeping focus on that parent menubar item.

						nextItem( self.menu.closest('.dj-up') ).trigger('djmegamenu:showSub').find('> a').focus();
					}
					break;
				
				// ARROW LEFT
				case 'ArrowLeft':
					event.preventDefault();

					self.hideSub();

					if( self.level === 0 ) { //main item
						prevItem( $this ).find('> a').focus();
					} else if( self.level == 1 ) {

						//If parent menu item is in the menubar, also:
						// moves focus to previous item in the menubar.
						// Opens submenu of newly focused menubar item, keeping focus on that parent menubar item.

						var parent = self.menu.closest('.dj-up');
						prevItem( parent ).trigger('djmegamenu:showSub').find('> a').focus();

					} else {

						//Closes submenu and moves focus to parent menu item.
						
						self.parent.menu.trigger('djmegamenu:hideSub').find('> a').focus();
					}
					return;

				// ARROW UP
				case 'ArrowUp':
					event.preventDefault();

					if( self.level === 0 ) { //main item
						if( self.sub.length ){
							self.showSub();
							setTimeout(function () {
								submenuLastItem( self.sub ).find('> a').focus();
							}, self.options.openDelay);
						}
					} else { //child items
						prevItem( $this ).find('> a').focus();
					}
					break;

				// ARROW DOWN
				case 'ArrowDown':
					event.preventDefault();

					if( self.level === 0 ) { //main item
						if( self.sub.length ){
							self.showSub();
							setTimeout(function () {
								self.sub.find('a').first().focus();
							}, self.options.openDelay);
						}
					} else { //child items
						nextItem( $this ).find('> a').focus();
					}
					break;


				// SPACE and ENTER
				case ' ': case 'Spacebar': case 'Enter':

					//Opens submenu and moves focus to first item in the submenu.

					if(event.key == ' ' || event.key == 'Spacebar') event.preventDefault();

					if( self.sub.length && (event.key == ' ' || event.key == 'Spacebar' || self.menu.hasClass('separator'))) { //have submenu and space
						self.showSub();
						setTimeout(function () {
							self.sub.find('a').first().focus();
						}, self.options.openDelay);
					} else { //no sub, trigger click
						$this.find('> a')[0].click();
					}

					break;

				// ESCAPE
				case 'Escape':
					if( self.level > 0 ) {
						event.preventDefault();
						self.parent.menu.trigger('djmegamenu:hideSub').find('> a').focus();
					} else {
						self.hideSub();
					}
					break;

				// HOME
				case 'Home':
					event.preventDefault();
					$this.parent().children().first().find('> a').focus();
					break;

				// END
				case 'End':
					event.preventDefault();
					$this.parent().children().last().find('> a').focus();
					break;

				default:
					// character keyboard support
					findCharacter($this, event.key).find('> a').focus();

			}

		});

		// menu modules and tree events
		self.menu.find('.nav.menu li, .dj-subtree li').on('keydown', function ( event ) {

			$this = $(this);
			switch ( event.key ) {

				// ARROW RIGHT
				case 'ArrowRight':
					event.preventDefault();
					if( $this.hasClass('parent') ) {
						event.stopPropagation();
						$this.find('> ul > li > a').first().focus();
					} else if( $this.parent().parent().hasClass('parent') ) {
						event.stopPropagation();
						$this.parent().parent().next().find('> a').focus();
					}
					break;
				
				// ARROW LEFT
				case 'ArrowLeft':
					event.preventDefault();
					if( $this.parent().parent().hasClass('parent') ) {
						event.stopPropagation();
						// li < ul < li
						$this.parent().parent().find('> a').focus();
					}
					break;

				// ARROW UP
				case 'ArrowUp':
					event.stopPropagation();
					event.preventDefault();

					prevItem( $this ).find('> a').focus();

					break;
				
				// ARROW DOWN
				case 'ArrowDown':
					event.stopPropagation();
					event.preventDefault();

					nextItem( $this ).find('> a').focus();

					break;

				// HOME
				case 'Home':
					event.stopPropagation();
					event.preventDefault();
					$this.closest('ul').find('> li').first().find('> a').focus();
					break;

				// END
				case 'End':
					event.stopPropagation();
					event.preventDefault();
					$this.closest('ul').find('> li').last().find('> a').focus();
					break;

				// ESCAPE
				case 'Escape':
					event.stopPropagation();
					event.preventDefault();
					$this.parents('li').find('> a').focus();
					break;

				// SPACE
				case ' ': case 'Spacebar':
					event.stopPropagation();
					if(event.key == ' ' || event.key == 'Spacebar') event.preventDefault();
					$this.find('> a')[0].click();

					break;

				default:
					// character keyboard support
					event.stopPropagation();
					findCharacter($this, event.key).find('> a').focus();
			}
		});

	}

	DJMMenuItem.prototype.showSub = function () {

		//console.log('showSub');

		var self = this;

		clearTimeout(self.timer);

		if (self.menu.hasClass('hover') && !self.sub.hasClass(self.options.animOut)) {
			return; // do nothing if menu is open
		}

		if (self.sub.length) {
			self.sub.css('display', 'none');
		}

		self.timer = setTimeout(function () {

			clearTimeout(self.animTimer);

			self.menu.addClass('hover');
			self.hideOther(); // hide other submenus at the same level

			if (self.sub.length) {
				self.sub.css('display', '');
				self.sub.removeClass(self.options.animOut);
				self.checkDir();
				self.sub.addClass(self.options.animIn);
				self.menu.find('> a').attr('aria-expanded', 'true');
				self.menu.trigger('djmegamenu:showsubmenu');
				if (self.sub.find('.modules-wrap').length) {
					// it's required to refresh the modules inside the submenu
					$(window).trigger('resize');
				}
			}
		}, self.options.openDelay);
	};

	DJMMenuItem.prototype.hideSub = function () {

		var self = this;

		//console.log('hideSub');
		
		clearTimeout(self.timer);

    if( '2' === self.options.parentOpen && self.options.activeParent.length && self.options.activeParent.hasClass('hover') ) {
        return; //do nothing
    }

		if (self.sub.length/* && self.options.eventClose != 'click'*/) {
			self.timer = setTimeout(function () {
				self.sub.removeClass(self.options.animIn);
				self.sub.addClass(self.options.animOut);
				self.animTimer = setTimeout(function () {
					self.menu.removeClass('hover');
					self.menu.find('> a').attr('aria-expanded', 'false');
					self.menu.trigger('djmegamenu:hidesubmenu');

          if( '2' === self.options.parentOpen && self.options.activeParent.length ) {
              self.options.activeParent.find('> a').trigger('click'); //re-open submenu
          }

				}, self.options.duration);
			}, self.options.closeDelay);
		} else {
			self.menu.removeClass('hover');
			self.menu.trigger('djmegamenu:leaveitem');
		}

	};

	DJMMenuItem.prototype.checkDir = function () {

		//console.log('checkDir');

		var self = this;

		self.sub.css('left', '');
		self.sub.css('right', '');
		self.sub.css('margin-left', '');
		self.sub.css('margin-right', '');

    var sub = self.sub.offset();
    var wrap = self.options.wrap.offset();

    if( self.menu.hasClass('fullwidth') ) {
      if (self.options.direction == 'ltr') {
        self.sub.css('left', -(sub.left));
        //self.sub.find('> .dj-subwrap-in').css('padding-left', sub.left);
      } else {
        self.sub.css('right', sub.left);
        //self.sub.find('> .dj-subwrap-in').css('padding-right', sub.left);
      }
      self.sub.css('width', document.body.clientWidth);
      return;
    }

		if ( self.menu.hasClass('fullsub') ) return;

		//console.log(sub);
		//if(self.options.wrap.hasClass('dj-megamenu')) { // fix wrapper position for sticky menu
		//var placeholder = $('#'+self.options.wrap.attr('id')+'placeholder');
		//if(placeholder.length) wrap = placeholder.offset();
		//}

		if (self.options.direction == 'ltr') {
			var offset = sub.left + self.sub.outerWidth() - self.options.wrap.outerWidth() - wrap.left;
			//console.log(offset+' = '+sub.left+' + '+self.sub.outerWidth()+' - '+self.options.wrap.outerWidth()+' - '+wrap.left);
			if (offset > 0 || self.sub.hasClass('open-left')) {
				if (self.level) {
					self.sub.css('right', self.menu.outerWidth());
					self.sub.css('left', 'auto');
				} else {
					if (self.sub.hasClass('open-left')) {
						self.sub.css('right', self.sub.css('left'));
						self.sub.css('left', 'auto');
					} else {
						self.sub.css('margin-left', -offset);
					}
				}
			}
		} else if (self.options.direction == 'rtl') {
			var offset = sub.left - wrap.left;
			//console.log(offset+' = '+sub.left+' - '+wrap.left);
			if (offset < 0 || self.sub.hasClass('open-right')) {
				if (self.level) {
					self.sub.css('left', self.menu.outerWidth());
					self.sub.css('right', 'auto');
				} else {
					if (self.sub.hasClass('open-right')) {
						self.sub.css('left', self.sub.css('right'));
						self.sub.css('right', 'auto');
					} else {
						self.sub.css('margin-right', offset);
					}
				}
			}
		}
	};

	DJMMenuItem.prototype.initKids = function () {

		var self = this;

		self.kids = [];

		var kids = self.sub.find('> .dj-subwrap-in > .dj-subcol > ul.dj-submenu > li');

		kids.each(function (index) {
			var kid = $(this);
			self.kids[index] = new DJMMenuItem(kid, self.level + 1, self, self.options);
		});
	};

	DJMMenuItem.prototype.hideOther = function () {

		//console.log('hideOther');

		var self = this;

		$.each(self.parent.kids, function (index, kid) {

			if (kid.menu.hasClass('hover') && kid != self) {

				if (kid.sub.length) {
					kid.hideOtherSub(); // hide next levels immediately

					kid.sub.removeClass(kid.options.animIn);
					kid.sub.addClass(kid.options.animOut);
					kid.animTimer = setTimeout(function () {
						kid.menu.removeClass('hover');
						kid.menu.find('> a').attr('aria-expanded', 'false');
					}, self.options.duration);
				} else {
					kid.menu.removeClass('hover');
				}
			}
		});
	};

	DJMMenuItem.prototype.hideOtherSub = function () {

		var self = this;

		$.each(self.kids, function (index, kid) {
			if (kid.sub.length) {
				kid.hideOtherSub();
				kid.sub.removeClass(kid.options.animIn);
				kid.sub.removeClass(kid.options.animOut);
			}
			kid.menu.removeClass('hover');
		});
	};
})(jQuery);

var initMenu = function() {
  if (typeof jQuery == 'undefined') {
		console.log('DJ-Megamenu: jQuery missing');
	} else {
		jQuery('.dj-megamenu[data-options]').each(function () {
			var menu = jQuery(this);
			menu.data();
			var options = menu.data('options');
			menu.removeAttr('data-options');
			new DJMegaMenu(menu, options);
		});
	}
}

if (document.readyState !== 'loading') {
  initMenu();
} else {
  document.addEventListener('DOMContentLoaded', function() {
    initMenu();
  });
}

window.addEventListener('load', function() {
	if (typeof jQuery == 'undefined') {
		console.log('DJ-Megamenu: jQuery missing');
	} else {
		jQuery(document).trigger('djmegamenu:pageload');
	}
});

Copyright © 2019 by b0y-101