;(function($) { PPAdvancedMenu = function( $scope ) { this.node = $scope; this.menu_wrap = $scope.find('.pp-advanced-menu-main-wrapper'); this.wrap = $scope.find('.pp-advanced-menu__container'); this.menu = $scope.find('.pp-advanced-menu'); this.dropdownMenu = $scope.find('.pp-advanced-menu__container.pp-advanced-menu--dropdown'); this.menuToggle = $scope.find('.pp-menu-toggle'); // hamburger icon this.settings = $scope.find('.pp-advanced-menu__container').data('settings'); if ( ! this.settings ) { return; } this.menuId = this.settings.menu_id; this.menuType = this.settings.menu_type; this.menuLayout = this.settings.menu_layout; this.showSubmenuOn = this.settings.show_submenu_on; this.showSubmenuOnClick = ( this.showSubmenuOn == 'click' ); this.onepage_menu = this.settings.onepage_menu; this.duration = 400; this.init(); }; PPAdvancedMenu.prototype = { stretchElement: null, init: function () { if ( ! this.menu.length ) { return; } if ( jQuery.fn.smartmenus ) { // Override the default stupid detection jQuery.SmartMenus.prototype.isCSSOn = function() { return true; }; if ( elementorFrontend.config.is_rtl ) { jQuery.fn.smartmenus.defaults.rightToLeftSubMenus = true; } } if ( 'horizontal' === this.menuLayout ) { if ('undefined' !== typeof $.fn.smartmenus) { this.menu.smartmenus({ subIndicatorsText: '<i class="fa" aria-hidden="true"></i>', subIndicatorsPos: 'append', subMenusMaxWidth: '1000px', subMenusMinWidth: '', showOnClick: this.showSubmenuOnClick, }); } } if ( 'vertical' === this.menuLayout ) { if ('undefined' !== typeof $.fn.smartmenus) { this.menu.smartmenus({ subIndicatorsText: '', subIndicatorsPos: 'append', subMenusMaxWidth: '', subMenusMinWidth: '', mainMenuSubOffsetX: '0px', mainMenuSubOffsetY: '0px', subMenusSubOffsetX: '0px', subMenusSubOffsetY: '0px', showOnClick: this.showSubmenuOnClick, }); } } if ( 'default' === this.menuType ) { this.initStretchElement(); this.stretchMenu(); } if ('off-canvas' === this.menuType) { this.initOffCanvas(); } if ('full-screen' === this.menuType) { this.initFullScreen(); } this.bindEvents(); $(window).on('load', $.proxy(this.resetDimensions, this)); this.menu.smartmenus('refresh'); }, getElementSettings: function( setting ) { if ( 'undefined' !== typeof this.settings[setting] ) { return this.settings[setting]; } return false; }, bindEvents: function () { var self = this; if ( ! this.menu.length ) { return; } this.menuToggle.on('click', $.proxy( this.toggleMenu, this )); if ( 'yes' === this.onepage_menu ) { this.menu.on( 'click', '.menu-item > a[href*="#"]', function(e) { var $href = $(this).attr('href'), $targetID = ''; if ( $href !== '#' ) { $targetID = $href.split('#')[1]; if ( $('body').find('#' + $targetID).length > 0 ) { e.preventDefault(); $( this ).toggleClass( 'pp-active' ); /* setTimeout(function() { $('html, body').animate({ scrollTop: $('#'+ $targetID).offset().top }, 200, 'linear', function() { window.location.hash = $targetID; }); }, 500); */ } self.closeMenu(); } }); } if ('default' === this.menuType) { elementorFrontend.addListenerOnce(this.node.data('model-cid'), 'resize', $.proxy( this.stretchMenu, this) ); } //self.panelUpdate(); this.closeMenuESC(); }, panelUpdate: function() { var self = this; if ('undefined' !== typeof elementor && $('body').hasClass('elementor-editor-active')) { elementor.hooks.addAction('panel/open_editor/widget/pp-advanced-menu', function (panel, model, view) { panel.$el.find('select[data-setting="dropdown"]').on('change', function () { if (model.attributes.id === self.menuId) { if ($(this).val() === 'all') { self.node.find('.pp-advanced-menu--main').hide(); } if ($(this).val() !== 'all') { self.node.find('.pp-advanced-menu--main').show(); } } }); if (model.attributes.id === self.menuId && 'all' === self.settings.breakpoint) { self.toggleMenu(); } }); } }, initStretchElement: function () { this.stretchElement = new elementorFrontend.modules.StretchElement({ element: this.dropdownMenu }); }, stretchMenu: function () { if (this.getElementSettings('full_width')) { this.stretchElement.stretch(); this.dropdownMenu.css('top', this.menuToggle.outerHeight()); } else { this.stretchElement.reset(); } }, initOffCanvas: function () { $('.pp-menu-' + this.settings.menu_id).each(function(id, el) { if ($(el).parent().is('body') ) { $(el).remove(); } }); if ( $('.pp-offcanvas-container').length === 0 ) { var faProJs = $('#font-awesome-pro-js').length > 0 ? $('#font-awesome-pro-js').attr('src') : false; if ( faProJs ) { $('#font-awesome-pro-js').remove(); } $('body').wrapInner( '<div class="pp-offcanvas-container" />' ); this.node.find( '.pp-menu-' + this.settings.menu_id ).insertBefore('.pp-offcanvas-container'); if ( faProJs ) { $('body').append( '<script type="text/javascript" id="font-awesome-pro-js" src="' + faProJs + '"></script>' ); } } if ( this.menu_wrap.find('.pp-menu-off-canvas').length > 0 ) { if ( $('.pp-offcanvas-container > .pp-menu-' + this.settings.menu_id).length > 0 ) { $('.pp-offcanvas-container > .pp-menu-' + this.settings.menu_id).remove(); } if ( $('body > .pp-menu-' + this.settings.menu_id ).length > 0 ) { $('body > .pp-menu-' + this.settings.menu_id ).remove(); } $('body').prepend(this.node.find( '.pp-menu-' + this.settings.menu_id ) ); } $('.pp-menu-clear').fadeOut(400, function() { $(this).remove(); }); $('.pp-menu-' + this.settings.menu_id).css('height', window.innerHeight + 'px'); $('.pp-menu-' + this.settings.menu_id).find('.pp-menu-close').on( 'click', $.proxy( this.closeMenu, this )); }, initFullScreen: function () { $('body').addClass('pp-menu--full-screen'); $('.pp-menu-' + this.settings.menu_id).css('height', window.innerHeight + 'px'); $('.pp-menu-' + this.settings.menu_id).find('.pp-menu-close').on('click', $.proxy(this.closeMenu, this)); //$('.pp-menu-' + this.settings.menu_id).find('.menu-item a').on('click', $.proxy(this.closeMenu, this)); }, resetDimensions: function() { if ( 'full-screen' === this.menuType ) { $('.pp-menu-' + this.settings.menu_id).css('height', window.innerHeight + 'px'); } }, toggleMenu: function () { this.menuToggle.toggleClass('pp-active'); var menuType = this.getElementSettings('menu_type'); var isActive = this.menuToggle.hasClass('pp-active'); $('html').removeClass('pp-menu-toggle-open'); if ( isActive ) { $('html').addClass('pp-menu-toggle-open'); } if ('default' === menuType) { var $dropdownMenu = this.dropdownMenu; if (isActive) { $dropdownMenu.hide().slideDown(250, function () { $dropdownMenu.css('display', ''); }); this.stretchMenu(); } else { $dropdownMenu.show().slideUp(250, function () { $dropdownMenu.css('display', ''); }); } } if ('off-canvas' === menuType) { this.toggleOffCanvas(); } if ('full-screen' === menuType) { this.toggleFullScreen(); } }, toggleOffCanvas: function() { var isActive = this.menuToggle.hasClass('pp-active'), element = $('body').find('.pp-menu-' + this.menuId), time = this.duration, self = this; $('html').removeClass('pp-menu-toggle-open'); if ( isActive ) { $('body').addClass('pp-menu--off-canvas'); $('html').addClass('pp-menu-toggle-open'); time = 0; } else { time = this.duration; } $('.pp-menu-open').removeClass('pp-menu-open'); $('.pp-advanced-menu--toggle .pp-menu-toggle').not(this.menuToggle).removeClass('pp-active'); setTimeout(function() { $('.pp-menu-off-canvas').removeAttr('style'); if (isActive) { $('body').addClass('pp-menu-open'); element.addClass('pp-menu-open').css('z-index', '999999'); if ( $('.pp-menu-clear').length === 0 ) { $('body').append('<div class="pp-menu-clear" style="transition: none !important;"></div>'); } $('.pp-menu-clear').off('click').on('click', $.proxy(self.closeMenu, self)); $('.pp-menu-clear').fadeIn(); } else { $('.pp-menu-open').removeClass('pp-menu-open'); $('body').removeClass('pp-menu--off-canvas'); $('html').removeClass('pp-menu-toggle-open'); $('.pp-menu-clear').fadeOut(); } }, time); }, toggleFullScreen: function() { var isActive = this.menuToggle.hasClass('pp-active'), element = $('body').find('.pp-menu-' + this.menuId); $('html').removeClass('pp-menu-toggle-open'); if ( isActive ) { $('html').addClass('pp-menu-toggle-open'); this.node.find('.pp-menu-full-screen').addClass('pp-menu-open'); /* this.node.find('.pp-menu-full-screen').attr('data-scroll', $(window).scrollTop()); $(window).scrollTop(0); */ } }, closeMenu: function() { if ( 'default' !== this.menuType ) { $('.pp-menu-open').removeClass('pp-menu-open'); this.menuToggle.removeClass('pp-active'); $('html').removeClass('pp-menu-toggle-open'); if ( 'full-screen' === this.menuType ) { var scrollTop = this.node.find('.pp-menu-full-screen').data('scroll'); $(window).scrollTop(scrollTop); } $('.pp-menu-clear').fadeOut(); } }, closeMenuESC: function() { var self = this; // menu close on ESC key $(document).on('keydown', function (e) { if (e.keyCode === 27) { // ESC self.closeMenu(); } }); } }; })(jQuery);