1( function( $ ) { 2 'use strict'; 3 4 var JetMenuPlugin = function( element, options ) { 5 6 this.defaultSettings = { 7 enabled: false, 8 mouseLeaveDelay: 500, 9 openSubType: 'click', // hover, click 10 ajaxLoad: true, 11 megaWidthType: 'container', 12 megaWidthSelector: '', 13 mainMenuSelector: '.jet-menu', 14 menuItemSelector: '.jet-menu-item', 15 moreMenuContent: '···', 16 rollUpDelta: 0, 17 } 18 19 this.settings = $.extend( this.defaultSettings, options ); 20 21 this.$window = $( window ); 22 23 this.$document = $( document ); 24 25 this.$element = $( element ); 26 27 this.$instance = $( this.settings.mainMenuSelector, this.$element ); 28 29 this.$menuItems = $( '>' + this.settings.menuItemSelector, this.$instance ); 30 31 this.menuItemsData = this.$menuItems.toArray().map( ( item ) => { 32 return { 33 element: item, 34 outerWidth: $( item ).outerWidth( true ) + this.settings.rollUpDelta, 35 } 36 } ); 37 38 this.$moreItemsInstance = null; 39 40 this.hiddenItemsArray = []; 41 42 this.createMenuInstance(); 43 44 this.$instance.trigger( 'jetMenuCreated' ); 45 46 return this; 47 } 48 49 JetMenuPlugin.prototype = { 50 constructor: JetMenuPlugin, 51 52 self: this, 53 54 createMenuInstance: function() { 55 var self = this, 56 mainMenuWidth, 57 totalVisibleItemsWidth = 0; 58 59 this.subMenuRebuild(); 60 this.subMegaMenuRebuild(); 61 62 // Add available items list 63 if ( ! tools.isEmpty( this.settings.moreMenuContent ) && self.settings.enabled ) { 64 self.$instance.append( '<li class="jet-menu-item jet-menu-item-has-children jet-simple-menu-item jet-responsive-menu-available-items" hidden><a href="#" class="top-level-link"><div class="jet-menu-item-wrapper">' + this.settings.moreMenuContent + '</div></a><ul class="jet-sub-menu"></ul></li>' ); 65 self.$moreItemsInstance = $( '> .jet-responsive-menu-available-items', this.$instance ); 66 self.$moreItemsInstance.attr( { 'hidden': 'hidden' } ); 67 } 68 69 this.rebuildItems(); 70 71 this.$instance.trigger( 'rebuildItems' ); // subMenu position rebuild 72 73 this.subMenuHandler(); 74 75 this.watch(); 76 }, 77 78 /** 79 * SubMenu items Handler. 80 * 81 * @return {void} 82 */ 83 subMenuHandler: function() { 84 var self = this, 85 transitionend = 'transitionend oTransitionEnd webkitTransitionEnd', 86 prevClickedItem = null, 87 menuItem, 88 menuItemParents, 89 timer; 90 91 switch ( this.settings.openSubType ) { 92 case 'hover': 93 this.$instance.on( 'mouseenter', '.jet-menu-item > a', { instance: this }, mouseEnterHandler ); 94 this.$instance.on( 'mouseleave', '.jet-menu-item > a', mouseLeaveHandler ); 95 break; 96 97 case 'click': 98 this.$instance.on( 'click', '.jet-menu-item > a', { instance: this }, clickHandler ); 99 break; 100 } 101 102 this.$instance.on( 'mouseenter', '.jet-sub-menu, .jet-sub-mega-menu', mouseEnterSubMenuHandler ); 103 this.$instance.on( 'mouseenter', mouseEnterInstanceHandler ); 104 this.$instance.on( 'mouseleave', mouseLeaveInstanceHandler ); 105 106 function clickHandler( event ) { 107 var $this, 108 $siblingsItems, 109 $link, 110 $currentTarget, 111 subMenu, 112 templateId, 113 instance = event.data.instance; 114 115 event.preventDefault(); 116 event.stopPropagation(); 117 118 $currentTarget = $( event.currentTarget ); 119 $this = $currentTarget.closest('.jet-menu-item'); 120 $siblingsItems = $this.siblings( '.jet-menu-item.jet-menu-item-has-children' ); 121 $link = $( '> a', $this ); 122 subMenu = $( '.jet-sub-menu:first, .jet-sub-mega-menu', $this ); 123 templateId = subMenu.data( 'template-id' ) || false; 124 125 if ( $siblingsItems[0] ) { 126 $siblingsItems.removeClass( 'jet-menu-hover' ); 127 $( 'jet-menu-item-has-children', $siblingsItems ).removeClass( 'jet-menu-hover' ); 128 } 129 130 if ( ! $( '.jet-sub-menu, .jet-sub-mega-menu', $this )[0] || $this.hasClass('jet-menu-hover') ) { 131 let itemLink = $link.attr( 'href' ) || '#', 132 target = $link.attr( 'target' ) || '_self'; 133 134 window.open( itemLink, target ); 135 136 return false; 137 } 138 139 if ( subMenu[0] ) { 140 $this.addClass( 'jet-menu-hover' ); 141 142 if ( templateId ) { 143 instance.maybeTemplateLoad( templateId, subMenu ); 144 } 145 } 146 } 147 148 function mouseEnterHandler( event ) { 149 var subMenu, 150 templateId, 151 instance; 152 153 menuItem = $( event.target ).parents( '.jet-menu-item' ); 154 subMenu = menuItem.children( '.jet-sub-menu, .jet-sub-mega-menu' ).first(); 155 templateId = subMenu.data( 'template-id' ) || false; 156 instance = event.data.instance; 157 158 $( '.jet-menu-hover', this.$instance ).removeClass( 'jet-menu-hover' ); 159 160 if ( subMenu[0] ) { 161 menuItem.addClass( 'jet-menu-hover' ); 162 163 if ( templateId ) { 164 instance.maybeTemplateLoad( templateId, subMenu ); 165 } 166 } 167 } 168 169 function mouseLeaveHandler( event ) { 170 // Item Mouse Leave Event 171 } 172 173 function mouseEnterSubMenuHandler( event ) { 174 clearTimeout( timer ); 175 } 176 177 function mouseEnterInstanceHandler( event ) { 178 clearTimeout( timer ); 179 } 180 181 function mouseLeaveInstanceHandler( event ) { 182 timer = setTimeout( function() { 183 $( '.jet-menu-hover', this.$instance ).removeClass( 'jet-menu-hover' ); 184 }, self.settings.mouseLeaveDelay ); 185 } 186 187 var windowWidth = $( window ).width(); 188 189 self.$window.on( 'orientationchange resize', function( event ) { 190
191 // Do not trigger a change if the viewport hasn't actually changed. Scrolling on iOS will trigger a resize. 192 if ( $( window ).width() === windowWidth ) { 193 return; 194 } 195 196 windowWidth = $( window ).width(); 197 198 self.$instance.find( '.jet-menu-item' ).removeClass( 'jet-menu-hover' ); 199 } ); 200 201 self.$document.on( 'touchend', function( event ) { 202 203 if ( $( event.target ).closest( '.jet-menu-item' ).length ) { 204 return; 205 } 206 207 self.$instance.find( '.jet-menu-item' ).removeClass( 'jet-menu-hover' ); 208 } ); 209 210 }, 211 212 maybeTemplateLoad: function( templateId, $templateContainer ) { 213 214 if ( ! this.settings.ajaxLoad ) { 215 return; 216 } 217 218 if ( $templateContainer.hasClass( 'template-loaded' ) ) { 219 return; 220 } 221 222 $.ajax( { 223 type: 'GET', 224 url: window.jetMenuPublicSettings.getElementorTemplateApiUrl, 225 dataType: 'json', 226 data: { 227 'id': templateId, 228 'dev': window.jetMenuPublicSettings.devMode 229 }, 230 beforeSend: function( jqXHR, ajaxSettings ) { 231 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 232 }, 233 success: function( responce, textStatus, jqXHR ) { 234 var templateContent = responce['content'], 235 templateScripts = responce['scripts'], 236 templateStyles = responce['styles']; 237 238 for ( var scriptHandler in templateScripts ) { 239 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 240 } 241 242 for ( var styleHandler in templateStyles ) { 243 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 244 } 245 246 $templateContainer.addClass( 'template-loaded' ); 247 248 jetMenu.elementorContentRender( $templateContainer, templateContent ); 249 } 250 } ); 251 }, 252 253 /** 254 * Responsive menu watcher function. 255 * 256 * @param {number} Watcher debounce delay. 257 * @return {void} 258 */ 259 watch: function( delay ) { 260 var delay = delay || 10; 261 262 $( window ).on( 'resize.jetResponsiveMenu orientationchange.jetResponsiveMenu load.jetResponsiveMenu', this.debounce( delay, this.watcher.bind( this ) ) ); 263 this.$instance.trigger( 'containerResize' ); 264 }, 265 266 /** 267 * Responsive menu watcher callback. 268 * 269 * @param {Object} Resize or Orientationchange event. 270 * @return {void} 271 */ 272 watcher: function( event ) { 273 this.rebuildItems(); 274 //this.$instance.trigger( 'rebuildItems' ); // subMenu position rebuild 275 this.$instance.trigger( 'containerResize' ); 276 }, 277 278 /** 279 * Responsive Menu rebuilding function. 280 * 281 * @return {void} 282 */ 283 rebuildItems: function() { 284 285 if ( ! this.settings.enabled ) { 286 return false; 287 } 288 289 var self = this, 290 mainMenuWidth = this.$instance.width(), 291 correctedMenuWidth = this.$instance.width() - self.$moreItemsInstance.outerWidth( true ), 292 iterationVisibleItemsWidth = 0, 293 iterationHiddenItemsWidth = this.getVisibleItemsWidth(), 294 visibleItemsArray = [], 295 hiddenItemsArray = []; 296 297 self.$menuItems.each( function() { 298 var $this = $( this ); 299 300 iterationVisibleItemsWidth += $this.outerWidth( true ); 301 302 if ( iterationVisibleItemsWidth > correctedMenuWidth && ! tools.inArray( this, hiddenItemsArray ) ) { 303 hiddenItemsArray.push( this ); 304 } else { 305 visibleItemsArray.push( this ); 306 } 307 308 } ); 309 310 hiddenItemsArray.forEach( function( item ) { 311 var $item = $( item ); 312 313 $item.attr( { 'hidden': 'hidden' } ); 314 } ); 315 316 visibleItemsArray.forEach( function( item, index ) { 317 var $item = $( item ); 318 319 $item.removeAttr( 'hidden' ); 320 } ); 321 322 $( '> .jet-sub-menu', self.$moreItemsInstance ).empty(); 323 324 hiddenItemsArray.forEach( function( item ) { 325 var $clone = $( item ).clone(); 326 327 // Remove sub-mega-menu content 328 $( '.jet-sub-mega-menu', $clone ).remove(); 329 330 $clone.addClass( 'jet-sub-menu-item' ); 331 332 $clone.removeAttr( 'hidden' ); 333 334 $( '> .top-level-link', $clone ).toggleClass( 'top-level-link sub-level-link' ); 335 336 $( '> .jet-sub-menu', self.$moreItemsInstance ).append( $clone ); 337 } ); 338 339 if ( 0 == hiddenItemsArray.length ) { 340 self.$moreItemsInstance.attr( { 'hidden': 'hidden' } ); 341 self.$moreItemsInstance.addClass( 'jet-empty' ); 342 } else { 343 self.$moreItemsInstance.removeAttr( 'hidden' ); 344 self.$moreItemsInstance.removeClass( 'jet-empty' ); 345 } 346 347 self.hiddenItemsArray = hiddenItemsArray; 348 }, 349 350 /*rebuildItems() { 351 352 if ( ! this.settings.enabled ) { 353 return false;
354 } 355 356 var self = this, 357 mainMenuWidth = this.$instance.width(), 358 iterationVisibleItemsWidth = 0, 359 visibleItemsArray = [], 360 hiddenItemsArray = []; 361 362 $( '> .jet-sub-menu', self.$moreItemsInstance ).empty(); 363 364 for ( let menuItem of self.menuItemsData ) { 365 let element = menuItem.element; 366 367 iterationVisibleItemsWidth += menuItem.outerWidth; 368 369 if ( iterationVisibleItemsWidth > mainMenuWidth ) { 370 element.hidden = true; 371 hiddenItemsArray.push( element ); 372 } else { 373 element.hidden = false; 374 visibleItemsArray.push( element ); 375 } 376 } 377 378 for ( let hiddenMenuItem of hiddenItemsArray ) { 379 let $hiddenClone = $( hiddenMenuItem ).clone(); 380 381 $hiddenClone[0].hidden = false; 382 383 // Remove sub-mega-menu content 384 $( '.jet-sub-mega-menu', $hiddenClone ).remove(); 385 $( '> .top-level-link', $hiddenClone ).toggleClass( 'top-level-link sub-level-link' ); 386 $hiddenClone.addClass( 'jet-sub-menu-item' ); 387 $( '> .jet-sub-menu', self.$moreItemsInstance ).append( $hiddenClone ); 388 } 389 390 this.$moreItemsInstance[0].hidden = hiddenItemsArray.length ? false : true; 391 392 this.$instance.trigger( 'rebuildItems' ); 393 },*/ 394 395 /** 396 * Sub Menu rebuilding function. 397 * 398 * @return {void} 399 */ 400 subMenuRebuild: function() { 401 var self = this, 402 initSubMenuPosition = false; 403 404 this.$instance.on( 'rebuildItems', function() { 405 var $subMenuList = $( '.jet-sub-menu', self.$instance ), 406 maxWidth = self.$window.outerWidth( true ), 407 isRTL = $( 'body' ).hasClass( 'rtl' ); 408 409 if ( ! $subMenuList[0] ) { 410 return; 411 } 412 413 if ( initSubMenuPosition ) { 414 $subMenuList.removeClass( 'inverse-side' ); 415 initSubMenuPosition = false; 416 } 417 418 $subMenuList.each( function() { 419 var $this = $( this ), 420 subMenuOffset = $this.offset().left, 421 subMenuPos = subMenuOffset + $this.outerWidth( true ); 422 423 if ( ! isRTL ) { 424 if ( subMenuPos >= maxWidth ) { 425 $this.addClass( 'inverse-side' ); 426 $this.find( '.jet-sub-menu' ).addClass( 'inverse-side' ); 427 428 initSubMenuPosition = true; 429 } else if ( subMenuOffset < 0 ) { 430 $this.removeClass( 'inverse-side' ); 431 $this.find( '.jet-sub-menu' ).removeClass( 'inverse-side' ); 432 } 433 } else { 434 if ( subMenuOffset < 0 ) { 435 $this.addClass( 'inverse-side' ); 436 $this.find( '.jet-sub-menu' ).addClass( 'inverse-side' ); 437 438 initSubMenuPosition = true; 439 } else if ( subMenuPos >= maxWidth ) { 440 $this.removeClass( 'inverse-side' ); 441 $this.find( '.jet-sub-menu' ).removeClass( 'inverse-side' ); 442 } 443 } 444 445 } ); 446 } ); 447 }, 448 449 /** 450 * Sub Mega Menu rebuilding function. 451 * 452 * @return {void} 453 */ 454 subMegaMenuRebuild: function() { 455 var self = this; 456 457 this.$instance.on( 'containerResize', function() { 458 var $megaMenuList = $( '.jet-sub-mega-menu', self.$instance ), 459 maxWidth = $( 'body' ).outerWidth( true ); 460 461 switch( self.settings.megaWidthType ) { 462 case 'items': 463 var visibleItemsWidth = self.getVisibleItemsWidth(), 464 firstOffset = $( '> .jet-menu-item:first', self.$instance ).position().left; 465 466 $megaMenuList.css( { 467 'width': visibleItemsWidth + 'px', 468 'left': firstOffset 469 } ); 470 break; 471 case 'selector': 472 var customSelector = $( self.settings.megaWidthSelector ), 473 instanceOffset = null, 474 customSelectorOffset = null; 475 476 if ( customSelector[0] ) { 477 instanceOffset = self.$instance.offset().left; 478 customSelectorOffset = customSelector.offset().left; 479 480 $megaMenuList.css( { 481 'width': customSelector.outerWidth(), 482 'left': (customSelectorOffset - instanceOffset ) + 'px' 483 } ); 484 } 485 486 break; 487 } 488 489 if ( $megaMenuList[0] ) { 490 $megaMenuList.css( { 491 'maxWidth': '' 492 } ); 493 494 $megaMenuList.each( function() { 495 var $this = $( this ), 496 megaMenuOffsetLeft = $this.offset().left, 497 megaMenuOffsetRight = megaMenuOffsetLeft + $this.outerWidth( true ); 498 499 if ( megaMenuOffsetRight >= maxWidth ) { 500 $this.css( { 501 'maxWidth': maxWidth - megaMenuOffsetLeft 502 } ); 503 } 504 } ); 505 } 506 } ); 507 }, 508 509 /** 510 * Get visible items total width 511 * 512 * @return {int} 513 */ 514 getVisibleItemsWidth: function() { 515 var totalVisibleItemsWidth = 0; 516 517 this.$menuItems.each( function() { 518 var $this = $( this ); 519 520 if ( ! $this.hasAttr( 'hidden' ) ) { 521 totalVisibleItemsWidth += $this.outerWidth( true ); 522 } 523 } ); 524 525 return totalVisibleItemsWidth; 526 }, 527 528 /** 529 * Mobile and tablet check funcion. 530 * 531 * @return {boolean} Mobile Status 532 */ 533 mobileAndTabletcheck: function() { 534 var check = false;
535 536 (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera); 537 538 return check; 539 }, 540 541 /** 542 * Debounce the function call 543 * 544 * @param {number} threshold The delay. 545 * @param {Function} callback The function. 546 */ 547 debounce: function ( threshold, callback ) { 548 var timeout; 549 550 return function debounced( $event ) { 551 function delayed() { 552 callback.call( this, $event ); 553 timeout = null; 554 } 555 556 if ( timeout ) { 557 clearTimeout( timeout ); 558 } 559 560 timeout = setTimeout( delayed, threshold ); 561 }; 562 } 563 } 564 565 /* 566 * Js tools 567 */ 568 var tools = { 569 isEmpty: function( value ) { 570 return ( ( false === value ) || ( '' === value ) || ( null === value ) || ( undefined === value )); 571 }, 572 573 isEmptyObject: function( value ) { 574 return ( true === this.isEmpty( value ) ) || ( 0 === value.length ); 575 }, 576 577 isString: function(value) { 578 return ( ( 'string' === typeof value ) || ( value instanceof String ) ); 579 }, 580 581 isArray: function( value ) { 582 return $.isArray( value ); 583 }, 584 585 inArray: function( value, array ) { 586 return ( $.inArray( value, array ) !== -1); 587 } 588 }; 589 590 /* 591 * Jq tools 592 */ 593 $.fn.hasAttr = function( name ) { 594 return this.attr( name ) !== undefined; 595 }; 596 597 // jQuery plugin 598 $.fn.JetMenuPlugin = function( options ) { 599 return this.each( function() { 600 var $this = $( this ), 601 pluginOptions = ( 'object' === typeof options ) ? options : {}; 602 603 if ( ! $this.data( 'JetMenuPlugin' ) ) { 604 605 // create plugin instance (only if not exists) and expose the entire instance API 606 $this.data( 'JetMenuPlugin', new JetMenuPlugin( this, pluginOptions ) ); 607 } 608 } ); 609 }; 610 611}( jQuery ) ); 612 613( function( $ ) { 614 'use strict'; 615 616 /** 617 * JetMegaMenuClass 618 */ 619 class JetMegaMenuClass { 620 621 /** 622 * [constructor description] 623 * @return {[type]} [description] 624 */ 625 constructor( element, options ) { 626 this.defaultSettings = { 627 enabled: true, 628 threshold: 768, // Minimal menu width, when this plugin activates 629 mouseLeaveDelay: 500, 630 openSubType: 'hover', // hover, click 631 mainMenuSelector: '.menu', 632 menuItemSelector: '.menu-item', 633 moreMenuContent: '···', 634 templates: { 635 hasChildItemMarker: '<span class="has-child-marker"></span>' 636 }, 637 labels: { 638 back: 'Back' 639 } 640 } 641 642 this.settings = $.extend( this.defaultSettings, options ); 643 644 this.$window = $( window ); 645 646 this.$document = $( document ); 647 648 this.$element = $( element ); 649 650 this.$document.on( 'mpi-theme-js/header/switch-to-mobile-layout/before', function() { 651 this.resetItems(); 652 }.bind( this ) ); 653 654 this.$document.on( 'mpi-theme-js/header/switch-to-desktop-layout/after', function() { 655 this.rebuildItems(); 656 }.bind( this ) ); 657 658 this.createInstance(); 659 } 660 661 createInstance() { 662
663 this.$instance = $( this.settings.mainMenuSelector, this.$element ); 664 665 this.$menuItems = $( '>' + this.settings.menuItemSelector, this.$instance ); 666 667 this.menuItemsData = this.$menuItems.toArray().map( function( item ) { 668 return { 669 element: item, 670 outerWidth: $( item ).outerWidth( true ), 671 } 672 } ); 673 674 // Add available items list 675 if ( '' !== this.settings.moreMenuContent && this.settings.enabled && ! $( '.menu-item--more', this.$instance )[0] ) { 676 this.$instance.append( '<li class="menu-item menu-item-has-children menu-item--more" hidden><a href="#">' + this.settings.moreMenuContent + '</a><ul class="sub-menu"></ul></li>' ); 677 this.$moreItemsInstance = $( '> .menu-item--more', this.$instance ); 678 } 679 680 this.watchTick(); 681 682 this.rebuildWatcher(); 683 684 this.$instance.addClass( 'menu--roll-up-inited' ); 685 686 this.$document.trigger( 'MpiMenuCreated' ); 687 } 688 689 /** 690 * Responsive menu watcher function. 691 * 692 * @param {number} Watcher debounce delay. 693 * @return {void} 694 */ 695 rebuildWatcher( delay ) { 696 var delay = delay || 10; 697 698 $( window ).off( 'resize.MpiMenu' ).on( 'resize.MpiMenu orientationchange.MpiMenu', this.debounce( delay, this.watchTick.bind( this ) ) ); 699 700 this.$instance.trigger( 'containerResize' ); 701 } 702 703 /** 704 * Responsive menu watcher callback. 705 * 706 * @param {Object} Resize or Orientationchange event. 707 * @return {void} 708 */ 709 watchTick( event ) { 710 711 if ( ! this.isThreshold() ) { 712 this.rebuildItems(); 713 } 714 } 715 716 /** 717 * Responsive Menu rebuilding function. 718 * 719 * @return {void} 720 */ 721 rebuildItems() { 722 723 if ( ! this.settings.enabled ) { 724 return false; 725 } 726 727 var self = this, 728 mainMenuWidth = this.$instance.width(), 729 iterationVisibleItemsWidth = 0, 730 visibleItemsArray = [], 731 hiddenItemsArray = []; 732 733 $( '> .sub-menu', self.$moreItemsInstance ).empty(); 734 735 for ( let menuItem of self.menuItemsData ) { 736 let element = menuItem.element; 737 738 iterationVisibleItemsWidth += menuItem.outerWidth; 739 740 if ( iterationVisibleItemsWidth > mainMenuWidth ) { 741 element.hidden = true; 742 hiddenItemsArray.push( element ); 743 } else { 744 element.hidden = false; 745 visibleItemsArray.push( element ); 746 } 747 } 748 749 for ( let hiddenMenuItem of hiddenItemsArray ) { 750 let $hiddenClone = $( hiddenMenuItem ).clone(); 751 752 $hiddenClone[0].hidden = false; 753 754 $( '> .sub-menu', self.$moreItemsInstance ).append( $hiddenClone ); 755 } 756 757 this.$moreItemsInstance[0].hidden = hiddenItemsArray.length ? false : true; 758 759 this.$instance.trigger( 'rebuildItems' ); 760 } 761 762 /** 763 * Reset Items 764 * @return {[type]} [description] 765 */ 766 resetItems() { 767 $( '> .sub-menu', self.$moreItemsInstance ).empty(); 768 this.$moreItemsInstance[0].hidden = true; 769 770 for ( let menuItem of this.menuItemsData ) { 771 let element = menuItem.element; 772 773 element.hidden = false; 774 } 775 } 776 777 /** 778 * Get mobile status. 779 * 780 * @return {boolean} Mobile Status 781 */ 782 isThreshold() { 783 return ( this.$window.width() < this.settings.threshold ) ? true : false; 784 } 785 786 /** 787 * Mobile and tablet check funcion. 788 * 789 * @return {boolean} Mobile Status 790 */ 791 mobileAndTabletcheck() { 792 var check = false; 793 794 (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|
794sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera); 795 796 return check; 797 } 798 799 /** 800 * Debounce the function call 801 * 802 * @param {number} threshold The delay. 803 * @param {Function} callback The function. 804 */ 805 debounce( threshold, callback ) { 806 var timeout; 807 808 return function debounced( $event ) { 809 function delayed() { 810 callback.call( this, $event ); 811 timeout = null; 812 } 813 814 if ( timeout ) { 815 clearTimeout( timeout ); 816 } 817 818 timeout = setTimeout( delayed, threshold ); 819 }; 820 } 821 } 822 823 // jQuery plugin 824 $.fn.JetMegaMenu = function( options ) { 825 return this.each( function() { 826 var $this = $( this ), 827 pluginOptions = ( 'object' === typeof options ) ? options : {}; 828 829 if ( ! $this.data( 'JetMegaMenu' ) ) { 830 // create plugin instance (only if not exists) and expose the entire instance API 831 $this.data( 'JetMegaMenu', new JetMegaMenuClass( this, pluginOptions ) ); 832 } 833 } ); 834 }; 835} ( jQuery )); 836 837( function( $ ) { 838 'use strict'; 839 840 window.jetMenu = { 841 842 addedScripts: {}, 843 844 addedStyles: {}, 845 846 addedAssetsPromises: [], 847 848 initedMobileMenuInstance: [], 849 850 eventBus: new Vue(), 851 852 $body: $( 'body' ), 853 854 init: function() { 855 this.initDesktopMenu(); 856 this.mobileVueComponents(); 857 this.initMobileMenu(); 858 }, 859 860 initDesktopMenu: function() { 861 var rollUp = false, 862 jetMenuMouseleaveDelay = 500, 863 jetMenuMegaWidthType = 'container', 864 jetMenuMegaWidthSelector = '', 865 jetMenuMegaOpenSubType = 'hover', 866 jetMenuMegaAjax = false; 867 868 if ( window.jetMenuPublicSettings && window.jetMenuPublicSettings.menuSettings ) { 869 rollUp = ( 'true' === jetMenuPublicSettings.menuSettings.jetMenuRollUp ) ? true : false; 870 jetMenuMouseleaveDelay = jetMenuPublicSettings.menuSettings.jetMenuMouseleaveDelay || 500; 871 jetMenuMegaWidthType = jetMenuPublicSettings.menuSettings.jetMenuMegaWidthType || 'container'; 872 jetMenuMegaWidthSelector = jetMenuPublicSettings.menuSettings.jetMenuMegaWidthSelector || ''; 873 jetMenuMegaOpenSubType = jetMenuPublicSettings.menuSettings.jetMenuMegaOpenSubType || 'hover'; 874 jetMenuMegaAjax = ( 'true' === jetMenuPublicSettings.menuSettings.jetMenuMegaAjax ) ? true : false; 875 } 876 877 $( '.jet-menu-container' ).JetMenuPlugin( { 878 enabled: rollUp, 879 mouseLeaveDelay: +jetMenuMouseleaveDelay, 880 megaWidthType: jetMenuMegaWidthType, 881 megaWidthSelector: jetMenuMegaWidthSelector, 882 openSubType: jetMenuMegaOpenSubType, 883 ajaxLoad: jetMenuMegaAjax, 884 } ); 885 886 }, 887 888 initMobileMenu: function() { 889 890 let mobileMenuList = $( '.jet-mobile-menu--location-wp-nav' ); 891 892 if ( ! mobileMenuList[0] ) { 893 return false; 894 } 895 896 if ( 'true' === window.jetMenuPublicSettings.devMode ) { 897 Vue.config.devtools = true; 898 } 899 900 mobileMenuList.each( function() { 901 let $this = $( this ), 902 menuInstanceId = $this.attr( 'id' ), 903 menuId = $this.data( 'menu-id' ) || false, 904 menuOptions = $this.data( 'menu-options' ) || {}; 905 906 jetMenu.createMobileMenuInstance( menuInstanceId, menuId, menuOptions ); 907 } ); 908 }, 909 910 createMobileMenuInstance: function( menuInstanceId, menuId, menuOptions ) { 911 912 if ( jetMenu.initedMobileMenuInstance.includes( menuInstanceId ) ) { 913 return; 914 } 915 916 jetMenu.initedMobileMenuInstance.push( menuInstanceId ); 917 918 let mobileRenderInstance = new Vue( { 919 el: '#' + menuInstanceId, 920 data: { 921 uniqId: menuInstanceId, 922 menuOptions: menuOptions, 923 refsHtml: {}, 924 }, 925 mounted: function() { 926 let refsHtml = {}; 927 928 for ( var ref in this.$refs ) { 929 Object.assign( refsHtml, { [ ref ]: this.$refs[ ref ].innerHTML } ); 930 } 931 932 this.refsHtml = refsHtml; 933 } 934 } ); 935 }, 936 937 mobileVueComponents: function() { 938 939 Vue.component( 'mobile-menu-item', { 940 template: '#mobile-menu-item-template', 941 942 props: { 943 itemDataObject: Object, 944 depth: Number 945 }, 946 947 data: function() { 948 return ( { 949 ajaxRequest: null, 950 templateLoadStatus: false, 951 subDropdownVisible: false 952 } ) 953 }, 954 955 computed: { 956 957 itemClasses: function() { 958 let itemClasses = [ 959 'jet-mobile-menu__item', 960 'jet-menu-item-' + this.itemDataObject.itemId, 961 'jet-mobile-menu__item--sub-trigger-' + ( this.$root.menuOptions.subTrigger || 'item' ), 962 ]; 963
964 let customClasses = this.itemDataObject.classes; 965 966 if ( 0 !== customClasses.length ) { 967 itemClasses = itemClasses.concat( customClasses ); 968 } 969 970 if ( window.location.href === this.itemDataObject.url ) { 971 itemClasses.push( 'jet-mobile-menu__item--active' ); 972 } 973 974 return itemClasses; 975 }, 976 977 itemLinkClasses: function() { 978 let classes = [ 979 'mobile-link', 980 0 === this.depth ? 'mobile-top-level-link' : 'mobile-sub-level-link', 981 ]; 982 983 return classes; 984 }, 985 986 isСhildrenDefine: function() { 987 return this.itemDataObject.children ? true : false; 988 }, 989 990 isTemplateDefine: function() { 991 return false !== this.itemDataObject.megaTemplateId ? true : false; 992 }, 993 994 isSub: function() { 995 return this.isСhildrenDefine || this.isTemplateDefine ? true : false; 996 }, 997 998 isTopLevel: function() { 999 return 0 === this.depth ? true : false; 1000 }, 1001 1002 isDropdownLayout: function() { 1003 return this.isSub && ! this.isTemplateDefine && 'dropdown' === this.$root.menuOptions.subOpenLayout; 1004 }, 1005 1006 depthClass: function() { 1007 return 0 === this.depth ? 'mobile-top-level-link' : 'mobile-sub-level-link'; 1008 }, 1009 1010 dropdownIconHtml: function() { 1011 let dropdownIcon = this.$root.refsHtml.dropdownIcon ? this.$root.refsHtml.dropdownIcon : '<span class="dashicons dashicons-arrow-right"></span>', 1012 dropdownOpenedIcon = this.$root.refsHtml.dropdownOpenedIcon ? this.$root.refsHtml.dropdownOpenedIcon : '<span class="dashicons dashicons-arrow-down"></span>'; 1013 1014 if ( this.subDropdownVisible ) { 1015 dropdownIcon = dropdownOpenedIcon; 1016 } 1017 1018 return dropdownIcon; 1019 }, 1020 1021 itemIconHtml: function() { 1022 return this.itemDataObject.itemIcon; 1023 }, 1024 1025 isIconVisible: function() { 1026 let iconVisible = this.$root.menuOptions.itemIconVisible; 1027 1028 return ! iconVisible || '' === this.itemDataObject.itemIcon || ! this.itemDataObject.itemIcon ? false : true; 1029 }, 1030 1031 isBadgeVisible: function() { 1032 let badgeVisible = this.$root.menuOptions.itemBadgeVisible; 1033 1034 return false === badgeVisible || '' === this.itemDataObject.badgeText || ! this.itemDataObject.badgeText ? false : true; 1035 }, 1036 1037 isLabelVisible: function() { 1038 let labelVisible = ! this.itemDataObject.hideItemText; 1039 1040 return false === labelVisible || '' === this.itemDataObject.name || ! this.itemDataObject.name ? false : true; 1041 }, 1042 1043 isDescVisible: function() { 1044 let descVisible = this.$root.menuOptions.itemDescVisible; 1045 1046 return false === descVisible || '' === this.itemDataObject.description || ! this.itemDataObject.description ? false : true; 1047 }, 1048 1049 loaderColor: function() { 1050 return this.$root.menuOptions.loaderColor || '#3a3a3a'; 1051 }, 1052 }, 1053 1054 methods: { 1055 itemSubHandler: function( event ) { 1056 let target = event.target, 1057 mobileLink = $( target ).closest( '.mobile-link' ); 1058 1059 if ( 'item' !== this.$root.menuOptions.subTrigger ) { 1060 return; 1061 } 1062 1063 if ( this.isSub && mobileLink ) { 1064 event.preventDefault(); 1065 } 1066 1067 if ( ! this.isSub && mobileLink && this.$root.menuOptions.closeAfterNavigate ) { 1068 jetMenu.eventBus.$emit( 'closeMenu', { 1069 menuUniqId: this.$root.menuOptions.menuUniqId, 1070 } ); 1071 } 1072 1073 this.switchToSub( event ); 1074 }, 1075 1076 markerSubHandler: function( event ) { 1077 1078 if ( 'submarker' !== this.$root.menuOptions.subTrigger ) { 1079 return; 1080 } 1081 1082 this.switchToSub( event ); 1083 }, 1084 1085 switchToSub: function( event ) { 1086 1087 if ( ! this.isSub ) { 1088 return; 1089 } 1090 1091 if ( ! this.isTemplateDefine ) { 1092 1093 if ( this.isDropdownLayout ) { 1094 this.subDropdownVisible = !this.subDropdownVisible; 1095 1096 return; 1097 } 1098 1099 jetMenu.eventBus.$emit( 'itemsSubSwitch', { 1100 menuUniqId: this.$root.menuOptions.menuUniqId, 1101 id: this.itemDataObject.id, 1102 name: this.itemDataObject.name, 1103 children: this.itemDataObject.children || false 1104 } ); 1105 1106 } else { 1107 1108 if ( ! this.itemDataObject.megaContent ) { 1109 this.getElementorTemplate(); 1110 } else { 1111 1112 jetMenu.eventBus.$emit( 'showTemplateContent', {
1113 menuUniqId: this.$root.menuOptions.menuUniqId, 1114 id: this.itemDataObject.id, 1115 name: this.itemDataObject.name, 1116 megaContent: this.itemDataObject.megaContent 1117 } ); 1118 } 1119 } 1120 }, 1121 1122 getElementorTemplate: function() { 1123 var vueInstance = this; 1124 1125 vueInstance.ajaxRequest = $.ajax( { 1126 type: 'GET', 1127 url: window.jetMenuPublicSettings.getElementorTemplateApiUrl, 1128 dataType: 'json', 1129 data: { 1130 'id': vueInstance.itemDataObject.megaTemplateId, 1131 'dev': window.jetMenuPublicSettings.devMode 1132 }, 1133 beforeSend: function( jqXHR, ajaxSettings ) { 1134 1135 if ( null !== vueInstance.ajaxRequest ) { 1136 vueInstance.ajaxRequest.abort(); 1137 } 1138 1139 vueInstance.templateLoadStatus = true; 1140 1141 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 1142 }, 1143 success: function( responce, textStatus, jqXHR ) { 1144 var templateContent = responce['content'], 1145 templateScripts = responce['scripts'], 1146 templateStyles = responce['styles']; 1147 1148 for ( var scriptHandler in templateScripts ) { 1149 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 1150 } 1151 1152 for ( var styleHandler in templateStyles ) { 1153 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 1154 } 1155 1156 vueInstance.templateLoadStatus = false; 1157 1158 vueInstance.itemDataObject.megaContent = templateContent; 1159 1160 jetMenu.eventBus.$emit( 'showTemplateContent', { 1161 menuUniqId: vueInstance.$root.menuOptions.menuUniqId, 1162 id: vueInstance.itemDataObject.id, 1163 name: vueInstance.itemDataObject.name, 1164 megaContent: vueInstance.itemDataObject.megaContent 1165 } ); 1166 } 1167 } ); 1168 } 1169 } 1170 1171 }); 1172 1173 Vue.component( 'mobile-menu-list', { 1174 template: '#mobile-menu-list-template', 1175 props: { 1176 depth: Number, 1177 childrenObject: Object 1178 } 1179 } ); 1180 1181 Vue.component( 'mobile-menu', { 1182 template: '#mobile-menu-template', 1183 1184 data: function() { 1185 return ( { 1186 menuOpen: false, 1187 children: false, 1188 itemsRawData: {}, 1189 trail:[], 1190 breadcrumbsData: [], 1191 animation: 'items-next-animation', 1192 ajaxRequest: null, 1193 templateVisible: false, 1194 instanceLoadStatus: false, 1195 itemTemplateContent: false, 1196 headerTemplate: this.$root.menuOptions['headerTemplate'] || 0, 1197 headerContent: false, 1198 headerTemplateVisible: false, 1199 beforeTemplate: this.$root.menuOptions['beforeTemplate'] || 0, 1200 beforeContent: false, 1201 afterTemplate: this.$root.menuOptions['afterTemplate'] || 0, 1202 afterContent: false, 1203 ajaxPromises: [], 1204 } ) 1205 }, 1206 1207 mounted: function() { 1208 let vueInstance = this; 1209 1210 if ( this.menuOpen ) { 1211 jetMenu.$body.addClass( 'jet-mobile-menu-visible' ); 1212 1213 if ( 'slide-out' === this.$root.menuOptions.menuLayout ) { 1214 jetMenu.$body.addClass( 'jet-menu-body-blocker' ); 1215 } 1216 } 1217 1218 let menuInstanceRenderData = false, 1219 renderDataElement = document.getElementById( 'jetMenuMobileWidgetRenderData' + this.$root.menuOptions.menuUniqId ); 1220 1221 if ( renderDataElement ) { 1222 eval( renderDataElement.innerHTML ); 1223 menuInstanceRenderData = window[ 'jetMenuMobileWidgetRenderData' + this.$root.menuOptions.menuUniqId ] || false; 1224 } 1225 1226 if ( menuInstanceRenderData ) { 1227 this.itemsRawData = menuInstanceRenderData['items']; 1228 1229 const headerTemplateData = menuInstanceRenderData.headerTemplateData || false, 1230 beforeTemplateData = menuInstanceRenderData.beforeTemplateData || false, 1231 afterTemplateData = menuInstanceRenderData.afterTemplateData || false; 1232 1233 if ( headerTemplateData ) { 1234 this.headerContent = headerTemplateData.content; 1235 } 1236 1237 if ( beforeTemplateData ) { 1238 this.beforeContent = beforeTemplateData.content; 1239 } 1240 1241 if ( afterTemplateData ) { 1242 this.afterContent = afterTemplateData.content; 1243 } 1244 } 1245 1246 /*this.ajaxPromises.push( 1247 new Promise( function( resolve, reject ) { 1248 $.ajax( { 1249 type: 'GET', 1250 url: window.jetMenuPublicSettings.menuItemsApiUrl, 1251 dataType: 'json', 1252 data: { 1253 'menu_id': vueInstance.menuId, 1254 'dev': window.jetMenuPublicSettings.devMode, 1255 'lang': window.jetMenuPublicSettings.wpmlLanguageCode || false 1256 }, 1257 beforeSend: function( jqXHR, ajaxSettings ) { 1258 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 1259 }, 1260 success: function( responce, textStatus, jqXHR ) { 1261 let responceData = responce.data.items; 1262 1263 vueInstance.itemsRawData = responceData; 1264 1265 resolve(); 1266 } 1267 } ); 1268 } ) 1269 );*/ 1270 1271 /*if ( 0 !== +this.headerTemplate ) { 1272 this.ajaxPromises.push( 1273 new Promise( function( resolve, reject ) { 1274 $.ajax( { 1275 type: 'GET', 1276 url: window.jetMenuPublicSettings.getElementorTemplateApiUrl, 1277 dataType: 'json', 1278 data: { 1279 'id': vueInstance.headerTemplate, 1280 'dev': window.jetMenuPublicSettings.devMode 1281 }, 1282 beforeSend: function( jqXHR, ajaxSettings ) { 1283 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 1284 }, 1285 success: function( responce, textStatus, jqXHR ) { 1286 let templateContent = responce['content'], 1287 templateScripts = responce['scripts'], 1288 templateStyles = responce['styles']; 1289 1290 for ( let scriptHandler in templateScripts ) { 1291 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 1292 } 1293 1294 for ( let styleHandler in templateStyles ) { 1295 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 1296 } 1297 1298 vueInstance.headerContent = templateContent; 1299 vueInstance.headerTemplateVisible = true; 1300 1301 resolve(); 1302 } 1303 } ); 1304 } ) 1305 ); 1306 } 1307 1308 if ( 0 !== +this.beforeTemplate ) { 1309 this.ajaxPromises.push( 1310 new Promise( function( resolve, reject ) { 1311 $.ajax( { 1312 type: 'GET', 1313 url: window.jetMenuPublicSettings.getElementorTemplateApiUrl, 1314 dataType: 'json', 1315 data: { 1316 'id': vueInstance.beforeTemplate, 1317 'dev': window.jetMenuPublicSettings.devMode 1318 }, 1319 beforeSend: function( jqXHR, ajaxSettings ) { 1320 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 1321 }, 1322 success: function( responce, textStatus, jqXHR ) { 1323 let templateContent = responce['content'], 1324 templateScripts = responce['scripts'], 1325 templateStyles = responce['styles']; 1326 1327 for ( let scriptHandler in templateScripts ) { 1328 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 1329 } 1330 1331 for ( let styleHandler in templateStyles ) { 1332 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 1333 } 1334 1335 vueInstance.beforeContent = templateContent; 1336 1337 resolve(); 1338 } 1339 } ); 1340 } ) 1341 ); 1342 } 1343 1344 if ( 0 !== +this.afterTemplate ) { 1345 this.ajaxPromises.push( 1346 new Promise( function( resolve, reject ) { 1347 $.ajax( { 1348 type: 'GET', 1349 url: window.jetMenuPublicSettings.getElementorTemplateApiUrl, 1350 dataType: 'json', 1351 data: { 1352 'id': vueInstance.afterTemplate, 1353 'dev': window.jetMenuPublicSettings.devMode 1354 }, 1355 beforeSend: function( jqXHR, ajaxSettings ) { 1356 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 1357 }, 1358 success: function( responce, textStatus, jqXHR ) { 1359 let templateContent = responce['content'], 1360 templateScripts = responce['scripts'], 1361 templateStyles = responce['styles']; 1362 1363 for ( let scriptHandler in templateScripts ) { 1364 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 1365 } 1366 1367 for ( let styleHandler in templateStyles ) { 1368 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 1369 } 1370 1371 vueInstance.afterContent = templateContent; 1372 resolve(); 1373 } 1374 } ); 1375 } ) 1376 ); 1377 }*/ 1378 1379 this.instanceLoadStatus = true; 1380 1381 Promise.all( this.ajaxPromises ).then( function() { 1382 vueInstance.instanceLoadStatus = false;
1383 }, function( reason ) { 1384 console.log( 'Script Loaded Error' ); 1385 } ); 1386 1387 jetMenu.eventBus.$on( 'itemsSubSwitch', function ( payLoad ) { 1388 1389 if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) { 1390 return; 1391 } 1392 1393 vueInstance.trail.push( payLoad.children ); 1394 vueInstance.children = payLoad.children; 1395 vueInstance.animation = 'items-next-animation'; 1396 vueInstance.breadcrumbsData.push( payLoad.name ); 1397 } ); 1398 1399 jetMenu.eventBus.$on( 'showTemplateContent', function ( payLoad ) { 1400 1401 if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) { 1402 return; 1403 } 1404 1405 vueInstance.itemTemplateContent = payLoad.megaContent.content; 1406 vueInstance.templateVisible = true; 1407 vueInstance.breadcrumbsData.push( payLoad.name ); 1408 vueInstance.animation = 'items-next-animation'; 1409 1410 const templateData = { 1411 content: payLoad.megaContent.content, 1412 contentElements: payLoad.megaContent.contentElements, 1413 } 1414 1415 vueInstance.showTemplateContent( templateData ); 1416 } ); 1417 1418 jetMenu.eventBus.$on( 'closeMenu', function( payLoad ) { 1419 1420 if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) { 1421 return; 1422 } 1423 1424 vueInstance.closeMenu(); 1425 } ); 1426 1427 }, 1428 1429 watch: { 1430 menuOpen: function( curr, prev ) { 1431 1432 if ( curr ) { 1433 jetMenu.$body.addClass( 'jet-mobile-menu-visible' ); 1434 1435 if ( 'slide-out' === this.$root.menuOptions.menuLayout ) { 1436 jetMenu.$body.addClass( 'jet-menu-body-blocker' ); 1437 } 1438 1439 this.initTemplatesContent(); 1440 } 1441 1442 if ( ! curr ) { 1443 jetMenu.$body.removeClass( 'jet-mobile-menu-visible' ); 1444 1445 if ( 'slide-out' === this.$root.menuOptions.menuLayout ) { 1446 jetMenu.$body.removeClass( 'jet-menu-body-blocker' ); 1447 } 1448 1449 this.clearStates(); 1450 } 1451 } 1452 }, 1453 1454 computed: { 1455 instanceClass: function() { 1456 let classes = [ 1457 'jet-mobile-menu__instance', 1458 'jet-mobile-menu__instance--' + this.$root.menuOptions.menuLayout + '-layout', 1459 this.$root.menuOptions.menuPosition + '-container-position', 1460 ( this.$root.menuOptions.togglePosition || 'default' ) + '-toggle-position', 1461 ]; 1462 1463 return classes; 1464 }, 1465 1466 menuContainerVisible: function() { 1467 return this.menuOpen && !this.instanceLoadStatus; 1468 }, 1469 1470 menuId: function() { 1471 1472 if ( this.$root.menuOptions.mobileMenuId ) { 1473 return this.$root.menuOptions.mobileMenuId; 1474 } 1475 1476 return this.$root.menuOptions.menuId; 1477 }, 1478 1479 coverVisible: function() { 1480 1481 let avaliableForLayout = [ 1482 'slide-out' 1483 ]; 1484 1485 return avaliableForLayout.includes( this.$root.menuOptions.menuLayout ); 1486 }, 1487 1488 itemsList: function() { 1489 1490 if ( ! this.children ) { 1491 return this.itemsRawData; 1492 } 1493 1494 return this.children; 1495 }, 1496 1497 isClose: function() { 1498 let avaliableForLayout = [ 1499 'slide-out' 1500 ]; 1501 1502 return avaliableForLayout.includes( this.$root.menuOptions.menuLayout ); 1503 }, 1504 1505 isBack: function() { 1506 return this.children || this.templateVisible ? true : false; 1507 }, 1508 1509 isBreadcrumbs: function() { 1510 return this.$root.menuOptions.useBreadcrumb && 0 !== this.breadcrumbsData.length ? true : false; 1511 }, 1512 1513 breadcrumbsPathData: function() { 1514 1515 if ( 'minimal' === this.$root.$root.menuOptions.breadcrumbPath && 1 < this.breadcrumbsData.length ) { 1516 return this.breadcrumbsData.filter( ( item, index, breadcrumbsData ) => { 1517 return index === breadcrumbsData.length - 1; 1518 } ); 1519 } 1520 1521 return this.breadcrumbsData; 1522 }, 1523 1524 depth: function() { 1525 return this.trail.length; 1526 }, 1527 1528 containerPosition: function() { 1529 return this.$root.menuOptions.menuPosition; 1530 }, 1531 1532 showAnimation: function() { 1533 1534 let animation = false; 1535 1536 switch( this.$root.menuOptions.menuLayout ) { 1537 1538 case 'slide-out': 1539 animation = 'right' === this.containerPosition ? 'menu-container-left-animation' : 'menu-container-right-animation'; 1540 break; 1541 1542 case 'dropdown': 1543 animation = 'menu-container-dropdown-animation'; 1544 break; 1545 1546 case 'push': 1547 animation = 'menu-container-expand-animation'; 1548 break; 1549 } 1550 1551 return animation; 1552 }, 1553 1554 toggleClosedIcon: function() { 1555 return this.$root.refsHtml.toggleClosedIcon || ''; 1556 }, 1557 1558 toggleOpenedIcon: function() { 1559 return this.$root.refsHtml.toggleOpenedIcon || ''; 1560 }, 1561 1562 toggleText: function() { 1563 return '' !== this.$root.menuOptions.toggleText ? this.$root.menuOptions.toggleText : false;
1564 }, 1565 1566 closeIcon: function() { 1567 return this.$root.refsHtml.closeIcon || ''; 1568 }, 1569 1570 backIcon: function() { 1571 let backIcon = this.$root.refsHtml.backIcon || '', 1572 backText = '' !== this.$root.menuOptions.backText ? '<span>' + this.$root.menuOptions.backText + '</span>' : '', 1573 backHtml = backIcon + backText; 1574 1575 return backHtml; 1576 }, 1577 1578 backText: function() { 1579 return '' !== this.$root.menuOptions.backText ? this.$root.menuOptions.backText : false; 1580 }, 1581 1582 breadcrumbIcon: function() { 1583 return this.$root.refsHtml.breadcrumbIcon || ''; 1584 }, 1585 1586 loaderColor: function() { 1587 return this.$root.menuOptions.loaderColor || '#3a3a3a'; 1588 }, 1589 1590 toggleLoaderVisible: function() { 1591 return this.$root.menuOptions.toggleLoader && this.instanceLoadStatus && this.menuOpen ? true : false; 1592 }, 1593 1594 beforeTemplateVisible: function() { 1595 return this.beforeContent ? true : false; 1596 }, 1597 1598 afterTemplateVisible: function() { 1599 return this.afterContent ? true : false; 1600 } 1601 1602 }, 1603 1604 methods: { 1605 menuToggle: function() { 1606 this.menuOpen = ! this.menuOpen; 1607 }, 1608 1609 closeMenu: function() { 1610 this.menuOpen = false; 1611 }, 1612 1613 clearStates: function() { 1614 this.trail = []; 1615 this.children = false; 1616 this.breadcrumbsData = []; 1617 this.templateVisible = false; 1618 }, 1619 1620 goBack: function() { 1621 1622 this.animation = 'items-prev-animation'; 1623 1624 if ( ! this.templateVisible ) { 1625 this.$delete( this.trail, this.trail.length - 1 ); 1626 this.children = this.trail.slice(-1)[0] || false; 1627 } else { 1628 this.templateVisible = false; 1629 } 1630 1631 this.$delete(this.breadcrumbsData, this.breadcrumbsData.length - 1); 1632 }, 1633 1634 escapeKeyHandler: function() { 1635 1636 if ( this.isBack ) { 1637 this.goBack(); 1638 } else { 1639 this.closeMenu(); 1640 } 1641 }, 1642 1643 showTemplateContent: function( templateData ) { 1644 let vueInstance = this; 1645 1646 this.$nextTick( function() { 1647 let $templateContainer = $( vueInstance.$refs['template-content'] ).find( '.jet-mobile-menu__template-content' ); 1648 1649 jetMenu.elementorContentRender( $templateContainer, templateData.content ); 1650 } ); 1651 }, 1652 1653 initTemplatesContent: function() { 1654 let vueInstance = this; 1655 1656 this.$nextTick( function() { 1657 1658 if ( vueInstance.headerContent ) { 1659 let $headerContainer = $( vueInstance.$refs['header-template-content'] ); 1660 1661 jetMenu.elementorContentRender( $headerContainer ); 1662 } 1663 1664 if ( vueInstance.beforeContent ) { 1665 let $beforeContainer = $( vueInstance.$refs['before-template-content'] ); 1666 1667 jetMenu.elementorContentRender( $beforeContainer ); 1668 } 1669 1670 if ( vueInstance.afterContent ) { 1671 let $afterContainer = $( vueInstance.$refs['after-template-content'] ); 1672 1673 jetMenu.elementorContentRender( $afterContainer ); 1674 } 1675 } ); 1676 }, 1677 1678 breadcrumbHandle: function( index ) { 1679 1680 if ( index === this.breadcrumbsData.length ) { 1681 return; 1682 } 1683 1684 if ( 'minimal' === this.$root.menuOptions.breadcrumbPath ) { 1685 this.goBack(); 1686 1687 return; 1688 } 1689 1690 this.animation = 'items-prev-animation'; 1691 this.trail = this.trail.slice( 0, index ); 1692 this.children = this.trail.slice( -1 )[0] || false; 1693 this.templateVisible = false; 1694 this.breadcrumbsData = this.breadcrumbsData.slice( 0, index ); 1695 } 1696 1697 } 1698 }); 1699 }, 1700 1701 loadScriptAsync: function( script, uri ) { 1702 1703 if ( jetMenu.addedScripts.hasOwnProperty( script ) ) { 1704 return script; 1705 } 1706 1707 jetMenu.addedScripts[ script ] = uri; 1708 1709 return new Promise( function( resolve, reject ) { 1710 var tag = document.createElement( 'script' ); 1711 1712 tag.src = uri; 1713 tag.async = true; 1714 tag.onload = function() { 1715 resolve( script ); 1716 }; 1717 1718 document.head.appendChild( tag ); 1719 } ); 1720 }, 1721 1722 loadStyle: function( style, uri ) { 1723 1724 if ( jetMenu.addedStyles.hasOwnProperty( style ) && jetMenu.addedStyles[ style ] === uri) { 1725 return style; 1726 } 1727 1728 jetMenu.addedStyles[ style ] = uri; 1729 1730 return new Promise( function( resolve, reject ) { 1731 var tag = document.createElement( 'link' ); 1732 1733 tag.id = style; 1734 tag.rel = 'stylesheet'; 1735 tag.href = uri; 1736 tag.type = 'text/css'; 1737 tag.media = 'all'; 1738 tag.onload = function() { 1739 resolve( style ); 1740 }; 1741 1742 document.head.appendChild( tag ); 1743 }); 1744 }, 1745 1746 elementorContentRender: function( $templateContainer, templateContent ) { 1747 let content = templateContent || false; 1748 1749 Promise.all( jetMenu.addedAssetsPromises ).then( function( value ) { 1750 1751 if ( templateContent ) { 1752 $templateContainer.html( templateContent ); 1753 } 1754 1755 // Before ajax frontend init 1756 $( window ).trigger( 'jet-menu/ajax/frontend-init/before', { 1757 $container: $templateContainer, 1758 content: content, 1759 } ); 1760 1761 jetMenu.elementorFrontendInit( $templateContainer ); 1762 1763 // Before ajax frontend init 1764 $( window ).trigger( 'jet-menu/ajax/frontend-init/after', { 1765 $container: $templateContainer, 1766 content: content, 1767 } ); 1768 }, function( reason ) { 1769 console.log( 'Script Loaded Error' ); 1770 }); 1771 }, 1772 1773 elementorFrontendInit: function( $templateContainer ) { 1774 1775 $templateContainer.find( 'div[data-element_type]' ).each( function() { 1776 var $this = $( this ), 1777 elementType = $this.data( 'element_type' ); 1778 1779 if ( ! elementType ) { 1780 return; 1781 } 1782 1783 try { 1784 if ( 'widget' === elementType ) { 1785 elementType = $this.data( 'widget_type' ); 1786 1787 if ( window.elementorFrontend && window.elementorFrontend.hooks ) { 1788 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ ); 1789 } 1790 } 1791 1792 if ( window.elementorFrontend && window.elementorFrontend.hooks ) { 1793 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ ); 1794 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ ); 1795 } 1796 1797 } catch ( err ) { 1798 console.log(err); 1799 1800 $this.remove(); 1801 1802 return false;
1803 } 1804 } ); 1805 } 1806 1807 }; 1808 1809 jetMenu.init(); 1810 1811} ( jQuery ) );
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.