/** * Copyright © 2018 Codazon. All rights reserved. * See COPYING.txt for license details. */ define(['jquery', 'jquery-ui-modules/widget'], function($, domReady) { $.widget('codazon.megamenu', { options: { type: 'horizontal', fixedLeftParent: '.cdz-fix-left', dropdownEffect: 'normal', rtlClass: 'rtl-layout', verClass: 'cdz-vertical-menu', toggleMenuClass: 'cdz-toggle-menu', horClass: 'cdz-horizontal-menu', parent: '.parent', subMenu: '.groupmenu-drop, .cat-tree .groupmenu-nondrop', triggerClass: 'dropdown-toggle', stopClickOnPC: true, delay: 100, contPadding: false, jslLinks: ['#', 'javascript:void(0)', 'javascript:;'], tabletLinkText: 'Go to %1', tabletMinWidth: 768, tabletMaxWidth: 1024, pagingMenu: true, responsive: { 768: 'mobile', } }, _create: function() { var self = this, $body = $('body'), conf = this.options; if (conf.extraCss) { $.each(conf.extraCss, function(cssId, file) { if ($('#'+cssId).length == 0) $('').prependTo('head'); }); } if (conf.useAjaxMenu) { $.ajax({ url: conf.ajaxUrl, data: {menu: conf.menu, paging_menu: conf.pagingMenu, menu_type: conf.type}, type: 'GET', cache: true, success: function(rs) { rs.success ? self.element.replaceWith(rs.html) : rs ? self.element.replaceWith(rs) : null; $('body').trigger('contentUpdated'); } }); return; } this.options.trigger = '.' + conf.triggerClass; if (self.element.parents(conf.fixedLeftParent).length == 0) { self.element.parent().addClass(conf.fixedLeftParent.replace('.','')); var $fixedLeftParent = self.element.parent(); } else { var $fixedLeftParent = self.element.parents(conf.fixedLeftParent).first(); } if(conf.contPadding === false){ conf.contPadding = parseInt($fixedLeftParent.css('padding-left')); } var $menu = self.element; if(conf.type == 0){ self._dropdownWidthStyle(); } if ($menu.hasClass(conf.horClass) || $menu.parents('[data-action="navigation"]').length) { self._assignControls()._listen(); } if ($menu.hasClass(conf.horClass)) { conf.pagingMenu ? self._hideOverflowItems() : null; var alignDrop = function() { if ($body.hasClass(conf.rtlClass) || ($menu.parents('.'+conf.rtlClass).length > 0)) { self._alignMenuRight(conf); } else { self._alignMenuLeft(conf); } } alignDrop(); self.element.on('menuPageChanged', alignDrop); self._assignControls()._listen(); } else if ($menu.hasClass(conf.verClass) && (!$menu.hasClass('cdz-scroll-menu'))) { self._alignMenuTop(); } self._currentMode = self._getMode(); self._rebuildHtmlStructure(); self._setupMenu(); self._responsive(); self._lazyImages(); if (conf.type != 1) { self._dropdownEffect(); } self._menuTabs(); self.element.removeClass('no-loaded'); if (self.element.hasClass('cdz-scroll-menu')) { self.element.addClass('no-loaded'); require(['Codazon_MegaMenu/js/scroll-menu'], function(scrollMenu) { conf.menuWidget = self; scrollMenu(conf, self.element); self.element.removeClass('no-loaded'); }); } self._splitColumn(); $('body').trigger('cdzmenu.initialized', [this.element]); }, _lazyImages: function() { var self = this, conf = this.options; $('.item.level0', this.element).one('mouseover.lazyimages', function() { $('[data-menulazy]', $(this)).each(function() { var $img = $(this), src = $img.attr('data-menulazy'); $img.on('load', function() {$img.removeAttr('data-menulazy');}).attr('src', src); }); }); }, _isToggleMenu: function() { return this.element.hasClass(this.options.toggleMenuClass); }, _splitColumn: function() { this.element.find('[data-itpc]').each(function() { var $pr = $(this), itpc = parseInt($pr.data('itpc')); $('.groupmenu-drop', $pr).each(function() { var $ul = $(this), itCount = $(' > .item', $ul).length, cols = Math.ceil(itCount / itpc); if (cols > 1) $ul.addClass('multicols').get(0).style.setProperty('--tree-cols', cols); }); }) }, _hideOverflowItems: function() { var self = this; var $ul = self.element.children('.groupmenu:first'), $staticWrap = $('
'); $originalLis = $ul.children(); self.overFlowItems = []; $staticWrap.insertBefore(self.element); self.element.appendTo($staticWrap); var $controlWrap = $('