class CustomMegaMenuHandler extends elementorModules.frontend.handlers.Base {
getDefaultSettings(){
return {
selectors: {
wrapper: '.cmm-0fc4c63b-wrapper',
nav: '.cmm-0fc4c63b-nav',
topItem: '.cmm-0fc4c63b-top-item.cmm-has-dropdown',
topLink: '.cmm-0fc4c63b-top-link',
dropdown: '.cmm-0fc4c63b-dropdown',
toggle: '.cmm-0fc4c63b-toggle',
close: '.cmm-0fc4c63b-close',
overlay: '.cmm-0fc4c63b-overlay',
drawer: '.cmm-0fc4c63b-drawer',
},
classes: {
active: 'cmm-active',
isMobile: 'cmm-is-mobile',
isOpen: 'cmm-is-open',
isReady: 'cmm-is-ready',
bodyLocked: 'cmm-0fc4c63b-body-locked',
},
};}
getDefaultElements(){
var selectors=this.getSettings('selectors');
var $el=this.$element;
return {
$wrapper: $el.find(selectors.wrapper).addBack(selectors.wrapper).first(),
};}
bindEvents(){
var self=this;
var wrapper=this.elements.$wrapper;
if(!wrapper.length) return;
this._wrapper=wrapper;
this._wrapperEl=wrapper[0];
this._selectors=this.getSettings('selectors');
this._classes=this.getSettings('classes');
this._breakpoint=parseInt(wrapper.attr('data-breakpoint'), 10)||1024;
this._trigger=wrapper.attr('data-trigger')||'hover';
this._hoverTimers={};
this._isMobile=null;
this._outsideHandler=null;
this._mql=window.matchMedia('(max-width: ' + this._breakpoint + 'px)');
this._mqlListener=function (){ self._evaluateViewport(); };
if(this._mql.addEventListener){
this._mql.addEventListener('change', this._mqlListener);
}else if(this._mql.addListener){
this._mql.addListener(this._mqlListener);
}
this._evaluateViewport();
this._bindMobileControls();
this._observeClassChanges();
var wrapperEl=this._wrapperEl;
var readyClass=this._classes.isReady;
if(typeof requestAnimationFrame!=='undefined'){
requestAnimationFrame(function (){
requestAnimationFrame(function (){
wrapperEl.classList.add(readyClass);
});
});
}else{
setTimeout(function (){ wrapperEl.classList.add(readyClass); }, 50);
}}
getID(){
if(!this._id){
this._id=Math.random().toString(36).slice(2, 9);
}
return this._id;
}
onElementChange(){
this._evaluateViewport();
}
_debounce(fn, wait){
var t;
return function (){
var args=arguments, ctx=this;
clearTimeout(t);
t=setTimeout(function (){ fn.apply(ctx, args); }, wait);
};}
_observeClassChanges(){
var self=this;
if(typeof MutationObserver==='undefined'||!this._wrapperEl) return;
this._classObserver=new MutationObserver(function (mutations){
for (var i=0; i < mutations.length; i++){
if(mutations[i].attributeName!=='class') continue;
if(self._isMobile&&!self._wrapperEl.classList.contains(self._classes.isMobile)){
self._wrapperEl.classList.add(self._classes.isMobile);
}
if(!self._isMobile&&self._wrapperEl.classList.contains(self._classes.isMobile)){
self._wrapperEl.classList.remove(self._classes.isMobile);
}}
});
this._classObserver.observe(this._wrapperEl, { attributes: true, attributeFilter: ['class'] });
}
_evaluateViewport(){
var isMobile=this._mql ? this._mql.matches:(window.innerWidth <=this._breakpoint);
if(isMobile===this._isMobile) return;
this._isMobile=isMobile;
this._teardownDesktop();
this._teardownMobile();
if(isMobile){
this._wrapper.addClass(this._classes.isMobile);
this._setupMobile();
}else{
this._wrapper.removeClass(this._classes.isMobile);
this._closeDrawer();
this._setupDesktop();
}}
_setupDesktop(){
var self=this;
var topItems=this._wrapper.find(this._selectors.topItem);
if(this._trigger==='hover'){
topItems.each(function (i){
var item=jQuery(this);
item.on('mouseenter.cmm0fc4c63b-d', function (){
if(self._hoverTimers[i]){
clearTimeout(self._hoverTimers[i]);
self._hoverTimers[i]=null;
}
self._openDropdown(item);
});
item.on('mouseleave.cmm0fc4c63b-d', function (){
self._hoverTimers[i]=setTimeout(function (){
self._closeDropdown(item);
}, 150);
});
});
}else{
topItems.each(function (){
var item=jQuery(this);
var link=item.find('> ' + self._selectors.topLink);
link.on('click.cmm0fc4c63b-d', function (e){
e.preventDefault();
if(item.hasClass(self._classes.active)){
self._closeDropdown(item);
}else{
self._closeAllDropdowns();
self._openDropdown(item);
}});
});
this._outsideHandler=function (e){
if(!jQuery(e.target).closest(self._selectors.wrapper).length){
self._closeAllDropdowns();
}};
jQuery(document).on('click.cmm0fc4c63b-d', this._outsideHandler);
}
topItems.find('> ' + this._selectors.topLink).on('keydown.cmm0fc4c63b-d', function (e){
var item=jQuery(this).parent();
if(e.key==='Enter'||e.key===' '){
e.preventDefault();
if(item.hasClass(self._classes.active)){
self._closeDropdown(item);
}else{
self._closeAllDropdowns();
self._openDropdown(item);
}}else if(e.key==='Escape'){
self._closeDropdown(item);
jQuery(this).trigger('focus');
}});
}
_teardownDesktop(){
this._wrapper.find(this._selectors.topItem).off('.cmm0fc4c63b-d');
this._wrapper.find(this._selectors.topLink).off('.cmm0fc4c63b-d');
jQuery(document).off('click.cmm0fc4c63b-d');
this._closeAllDropdowns();
for (var k in this._hoverTimers){
if(this._hoverTimers[k]) clearTimeout(this._hoverTimers[k]);
}
this._hoverTimers={};}
_bindMobileControls(){
var self=this;
this._wrapper.find(this._selectors.toggle).on('click.cmm0fc4c63b-m', function (e){
e.preventDefault();
self._toggleDrawer();
});
this._wrapper.find(this._selectors.close).on('click.cmm0fc4c63b-m', function (e){
e.preventDefault();
self._closeDrawer();
});
this._wrapper.find(this._selectors.overlay).on('click.cmm0fc4c63b-m', function (){
self._closeDrawer();
});
jQuery(document).on('keydown.cmm0fc4c63b-m-' + this.getID(), function (e){
if(e.key==='Escape'&&self._wrapper.hasClass(self._classes.isOpen)){
self._closeDrawer();
}});
}
_setupMobile(){
var self=this;
var topItems=this._wrapper.find(this._selectors.topItem);
topItems.each(function (){
var item=jQuery(this);
var link=item.find('> ' + self._selectors.topLink);
link.on('click.cmm0fc4c63b-m', function (e){
e.preventDefault();
if(item.hasClass(self._classes.active)){
self._closeDropdown(item);
}else{
self._closeAllDropdowns();
self._openDropdown(item);
}});
});
}
_teardownMobile(){
this._wrapper.find(this._selectors.topItem)
.find('> ' + this._selectors.topLink)
.off('click.cmm0fc4c63b-m');
}
_toggleDrawer(){
if(this._wrapper.hasClass(this._classes.isOpen)){
this._closeDrawer();
}else{
this._openDrawer();
}}
_openDrawer(){
this._wrapper.addClass(this._classes.isOpen);
this._wrapper.find(this._selectors.toggle).attr('aria-expanded', 'true');
jQuery('body').addClass(this._classes.bodyLocked);
}
_closeDrawer(){
this._wrapper.removeClass(this._classes.isOpen);
this._wrapper.find(this._selectors.toggle).attr('aria-expanded', 'false');
jQuery('body').removeClass(this._classes.bodyLocked);
}
_openDropdown(item){
item.addClass(this._classes.active);
var link=item.find('> ' + this._selectors.topLink);
var dropdown=item.find('> ' + this._selectors.dropdown);
link.attr('aria-expanded', 'true');
dropdown.attr('aria-hidden', 'false');
}
_closeDropdown(item){
item.removeClass(this._classes.active);
var link=item.find('> ' + this._selectors.topLink);
var dropdown=item.find('> ' + this._selectors.dropdown);
link.attr('aria-expanded', 'false');
dropdown.attr('aria-hidden', 'true');
}
_closeAllDropdowns(){
var self=this;
this._wrapper.find(this._selectors.topItem).each(function (){
self._closeDropdown(jQuery(this));
});
}}
jQuery(window).on('elementor/frontend/init', function (){
var addHandler=function ($element){
elementorFrontend.elementsHandler.addHandler(CustomMegaMenuHandler, { $element: $element });
};
elementorFrontend.hooks.addAction('frontend/element_ready/custom_mega_menu_0fc4c63b.default', addHandler);
});