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 isDescVisible: function() { 1038 let descVisible = this.$root.menuOptions.itemDescVisible; 1039 1040 return false === descVisible || '' === this.itemDataObject.description || ! this.itemDataObject.description ? false : true; 1041 }, 1042 1043 loaderColor: function() { 1044 return this.$root.menuOptions.loaderColor || '#3a3a3a'; 1045 }, 1046 }, 1047 1048 methods: { 1049 itemSubHandler: function( event ) { 1050 let target = event.target, 1051 mobileLink = $( target ).closest( '.mobile-link' ); 1052 1053 if ( 'item' !== this.$root.menuOptions.subTrigger ) { 1054 return; 1055 } 1056 1057 if ( this.isSub && mobileLink ) { 1058 event.preventDefault(); 1059 } 1060 1061 if ( ! this.isSub && mobileLink && this.$root.menuOptions.closeAfterNavigate ) { 1062 jetMenu.eventBus.$emit( 'closeMenu', { 1063 menuUniqId: this.$root.menuOptions.menuUniqId, 1064 } ); 1065 } 1066 1067 this.switchToSub( event ); 1068 }, 1069 1070 markerSubHandler: function( event ) { 1071 1072 if ( 'submarker' !== this.$root.menuOptions.subTrigger ) { 1073 return; 1074 } 1075 1076 this.switchToSub( event ); 1077 }, 1078 1079 switchToSub: function( event ) { 1080 1081 if ( ! this.isSub ) { 1082 return; 1083 } 1084 1085 if ( ! this.isTemplateDefine ) { 1086 1087 if ( this.isDropdownLayout ) { 1088 this.subDropdownVisible = !this.subDropdownVisible; 1089 1090 return; 1091 } 1092 1093 jetMenu.eventBus.$emit( 'itemsSubSwitch', { 1094 menuUniqId: this.$root.menuOptions.menuUniqId, 1095 id: this.itemDataObject.id, 1096 name: this.itemDataObject.name, 1097 children: this.itemDataObject.children || false 1098 } ); 1099 1100 } else { 1101 1102 if ( ! this.itemDataObject.megaContent ) { 1103 this.getElementorTemplate(); 1104 } else { 1105 1106 jetMenu.eventBus.$emit( 'showTemplateContent', { 1107 menuUniqId: this.$root.menuOptions.menuUniqId, 1108 id: this.itemDataObject.id, 1109 name: this.itemDataObject.name, 1110 megaContent: this.itemDataObject.megaContent 1111 } ); 1112 } 1113 } 1114 }, 1115 1116 getElementorTemplate: function() { 1117 var vueInstance = this; 1118 1119 vueInstance.ajaxRequest = $.ajax( { 1120 type: 'GET', 1121 url: window.jetMenuPublicSettings.getElementorTemplateApiUrl, 1122 dataType: 'json', 1123 data: { 1124 'id': vueInstance.itemDataObject.megaTemplateId, 1125 'dev': window.jetMenuPublicSettings.devMode 1126 }, 1127 beforeSend: function( jqXHR, ajaxSettings ) { 1128 1129 if ( null !== vueInstance.ajaxRequest ) { 1130 vueInstance.ajaxRequest.abort(); 1131 } 1132 1133 vueInstance.templateLoadStatus = true; 1134 1135 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 1136 }, 1137 success: function( responce, textStatus, jqXHR ) { 1138 var templateContent = responce['content'], 1139 templateScripts = responce['scripts'], 1140 templateStyles = responce['styles']; 1141 1142 for ( var scriptHandler in templateScripts ) { 1143 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 1144 } 1145 1146 for ( var styleHandler in templateStyles ) { 1147 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 1148 } 1149 1150 vueInstance.templateLoadStatus = false;
1151 1152 vueInstance.itemDataObject.megaContent = templateContent; 1153 1154 jetMenu.eventBus.$emit( 'showTemplateContent', { 1155 menuUniqId: vueInstance.$root.menuOptions.menuUniqId, 1156 id: vueInstance.itemDataObject.id, 1157 name: vueInstance.itemDataObject.name, 1158 megaContent: vueInstance.itemDataObject.megaContent 1159 } ); 1160 } 1161 } ); 1162 } 1163 } 1164 1165 }); 1166 1167 Vue.component( 'mobile-menu-list', { 1168 template: '#mobile-menu-list-template', 1169 props: { 1170 depth: Number, 1171 childrenObject: Object 1172 } 1173 } ); 1174 1175 Vue.component( 'mobile-menu', { 1176 template: '#mobile-menu-template', 1177 1178 data: function() { 1179 return ( { 1180 menuOpen: false, 1181 children: false, 1182 itemsRawData: {}, 1183 trail:[], 1184 breadcrumbsData: [], 1185 animation: 'items-next-animation', 1186 ajaxRequest: null, 1187 templateVisible: false, 1188 instanceLoadStatus: false, 1189 itemTemplateContent: false, 1190 headerTemplate: this.$root.menuOptions['headerTemplate'] || 0, 1191 headerContent: false, 1192 headerTemplateVisible: false, 1193 beforeTemplate: this.$root.menuOptions['beforeTemplate'] || 0, 1194 beforeContent: false, 1195 afterTemplate: this.$root.menuOptions['afterTemplate'] || 0, 1196 afterContent: false, 1197 ajaxPromises: [], 1198 } ) 1199 }, 1200 1201 mounted: function() { 1202 let vueInstance = this; 1203 1204 if ( this.menuOpen ) { 1205 jetMenu.$body.addClass( 'jet-mobile-menu-visible' ); 1206 1207 if ( 'slide-out' === this.$root.menuOptions.menuLayout ) { 1208 jetMenu.$body.addClass( 'jet-menu-body-blocker' ); 1209 } 1210 } 1211 1212 let menuInstanceRenderData = false, 1213 renderDataElement = document.getElementById( 'jetMenuMobileWidgetRenderData' + this.$root.menuOptions.menuUniqId ); 1214 1215 if ( renderDataElement ) { 1216 eval( renderDataElement.innerHTML ); 1217 menuInstanceRenderData = window[ 'jetMenuMobileWidgetRenderData' + this.$root.menuOptions.menuUniqId ] || false; 1218 } 1219 1220 if ( menuInstanceRenderData ) { 1221 this.itemsRawData = menuInstanceRenderData['items']; 1222 1223 const headerTemplateData = menuInstanceRenderData.headerTemplateData || false, 1224 beforeTemplateData = menuInstanceRenderData.beforeTemplateData || false, 1225 afterTemplateData = menuInstanceRenderData.afterTemplateData || false; 1226 1227 if ( headerTemplateData ) { 1228 this.headerContent = headerTemplateData.content; 1229 } 1230 1231 if ( beforeTemplateData ) { 1232 this.beforeContent = beforeTemplateData.content; 1233 } 1234 1235 if ( afterTemplateData ) { 1236 this.afterContent = afterTemplateData.content; 1237 } 1238 } 1239 1240 /*this.ajaxPromises.push( 1241 new Promise( function( resolve, reject ) { 1242 $.ajax( { 1243 type: 'GET', 1244 url: window.jetMenuPublicSettings.menuItemsApiUrl, 1245 dataType: 'json', 1246 data: { 1247 'menu_id': vueInstance.menuId, 1248 'dev': window.jetMenuPublicSettings.devMode, 1249 'lang': window.jetMenuPublicSettings.wpmlLanguageCode || false 1250 }, 1251 beforeSend: function( jqXHR, ajaxSettings ) { 1252 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 1253 }, 1254 success: function( responce, textStatus, jqXHR ) { 1255 let responceData = responce.data.items; 1256 1257 vueInstance.itemsRawData = responceData; 1258 1259 resolve(); 1260 } 1261 } ); 1262 } ) 1263 );*/ 1264 1265 /*if ( 0 !== +this.headerTemplate ) { 1266 this.ajaxPromises.push( 1267 new Promise( function( resolve, reject ) { 1268 $.ajax( { 1269 type: 'GET', 1270 url: window.jetMenuPublicSettings.getElementorTemplateApiUrl, 1271 dataType: 'json', 1272 data: { 1273 'id': vueInstance.headerTemplate, 1274 'dev': window.jetMenuPublicSettings.devMode 1275 }, 1276 beforeSend: function( jqXHR, ajaxSettings ) { 1277 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 1278 }, 1279 success: function( responce, textStatus, jqXHR ) { 1280 let templateContent = responce['content'], 1281 templateScripts = responce['scripts'], 1282 templateStyles = responce['styles']; 1283 1284 for ( let scriptHandler in templateScripts ) { 1285 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 1286 } 1287 1288 for ( let styleHandler in templateStyles ) { 1289 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 1290 } 1291 1292 vueInstance.headerContent = templateContent; 1293 vueInstance.headerTemplateVisible = true; 1294 1295 resolve(); 1296 } 1297 } ); 1298 } ) 1299 ); 1300 } 1301 1302 if ( 0 !== +this.beforeTemplate ) { 1303 this.ajaxPromises.push( 1304 new Promise( function( resolve, reject ) { 1305 $.ajax( { 1306 type: 'GET', 1307 url: window.jetMenuPublicSettings.getElementorTemplateApiUrl, 1308 dataType: 'json', 1309 data: { 1310 'id': vueInstance.beforeTemplate, 1311 'dev': window.jetMenuPublicSettings.devMode 1312 }, 1313 beforeSend: function( jqXHR, ajaxSettings ) { 1314 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 1315 }, 1316 success: function( responce, textStatus, jqXHR ) { 1317 let templateContent = responce['content'], 1318 templateScripts = responce['scripts'], 1319 templateStyles = responce['styles']; 1320 1321 for ( let scriptHandler in templateScripts ) { 1322 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 1323 } 1324 1325 for ( let styleHandler in templateStyles ) { 1326 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 1327 } 1328 1329 vueInstance.beforeContent = templateContent; 1330 1331 resolve(); 1332 } 1333 } ); 1334 } ) 1335 ); 1336 } 1337 1338 if ( 0 !== +this.afterTemplate ) { 1339 this.ajaxPromises.push( 1340 new Promise( function( resolve, reject ) { 1341 $.ajax( { 1342 type: 'GET', 1343 url: window.jetMenuPublicSettings.getElementorTemplateApiUrl, 1344 dataType: 'json', 1345 data: { 1346 'id': vueInstance.afterTemplate, 1347 'dev': window.jetMenuPublicSettings.devMode 1348 }, 1349 beforeSend: function( jqXHR, ajaxSettings ) { 1350 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 1351 }, 1352 success: function( responce, textStatus, jqXHR ) { 1353 let templateContent = responce['content'], 1354 templateScripts = responce['scripts'], 1355 templateStyles = responce['styles']; 1356 1357 for ( let scriptHandler in templateScripts ) { 1358 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 1359 } 1360 1361 for ( let styleHandler in templateStyles ) { 1362 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 1363 } 1364 1365 vueInstance.afterContent = templateContent; 1366 resolve(); 1367 } 1368 } ); 1369 } ) 1370 ); 1371 }*/ 1372 1373 this.instanceLoadStatus = true; 1374 1375 Promise.all( this.ajaxPromises ).then( function() { 1376 vueInstance.instanceLoadStatus = false;
1377 }, function( reason ) { 1378 console.log( 'Script Loaded Error' ); 1379 } ); 1380 1381 jetMenu.eventBus.$on( 'itemsSubSwitch', function ( payLoad ) { 1382 1383 if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) { 1384 return; 1385 } 1386 1387 vueInstance.trail.push( payLoad.children ); 1388 vueInstance.children = payLoad.children; 1389 vueInstance.animation = 'items-next-animation'; 1390 vueInstance.breadcrumbsData.push( payLoad.name ); 1391 } ); 1392 1393 jetMenu.eventBus.$on( 'showTemplateContent', function ( payLoad ) { 1394 1395 if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) { 1396 return; 1397 } 1398 1399 vueInstance.itemTemplateContent = payLoad.megaContent.content; 1400 vueInstance.templateVisible = true; 1401 vueInstance.breadcrumbsData.push( payLoad.name ); 1402 vueInstance.animation = 'items-next-animation'; 1403 1404 const templateData = { 1405 content: payLoad.megaContent.content, 1406 contentElements: payLoad.megaContent.contentElements, 1407 } 1408 1409 vueInstance.showTemplateContent( templateData ); 1410 } ); 1411 1412 jetMenu.eventBus.$on( 'closeMenu', function( payLoad ) { 1413 1414 if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) { 1415 return; 1416 } 1417 1418 vueInstance.closeMenu(); 1419 } ); 1420 1421 }, 1422 1423 watch: { 1424 menuOpen: function( curr, prev ) { 1425 1426 if ( curr ) { 1427 jetMenu.$body.addClass( 'jet-mobile-menu-visible' ); 1428 1429 if ( 'slide-out' === this.$root.menuOptions.menuLayout ) { 1430 jetMenu.$body.addClass( 'jet-menu-body-blocker' ); 1431 } 1432 1433 this.initTemplatesContent(); 1434 } 1435 1436 if ( ! curr ) { 1437 jetMenu.$body.removeClass( 'jet-mobile-menu-visible' ); 1438 1439 if ( 'slide-out' === this.$root.menuOptions.menuLayout ) { 1440 jetMenu.$body.removeClass( 'jet-menu-body-blocker' ); 1441 } 1442 1443 this.clearStates(); 1444 } 1445 } 1446 }, 1447 1448 computed: { 1449 instanceClass: function() { 1450 let classes = [ 1451 'jet-mobile-menu__instance', 1452 'jet-mobile-menu__instance--' + this.$root.menuOptions.menuLayout + '-layout', 1453 this.$root.menuOptions.menuPosition + '-container-position', 1454 ( this.$root.menuOptions.togglePosition || 'default' ) + '-toggle-position', 1455 ]; 1456 1457 return classes; 1458 }, 1459 1460 menuContainerVisible: function() { 1461 return this.menuOpen && !this.instanceLoadStatus; 1462 }, 1463 1464 menuId: function() { 1465 1466 if ( this.$root.menuOptions.mobileMenuId ) { 1467 return this.$root.menuOptions.mobileMenuId; 1468 } 1469 1470 return this.$root.menuOptions.menuId; 1471 }, 1472 1473 coverVisible: function() { 1474 1475 let avaliableForLayout = [ 1476 'slide-out' 1477 ]; 1478 1479 return avaliableForLayout.includes( this.$root.menuOptions.menuLayout ); 1480 }, 1481 1482 itemsList: function() { 1483 1484 if ( ! this.children ) { 1485 return this.itemsRawData; 1486 } 1487 1488 return this.children; 1489 }, 1490 1491 isClose: function() { 1492 let avaliableForLayout = [ 1493 'slide-out' 1494 ]; 1495 1496 return avaliableForLayout.includes( this.$root.menuOptions.menuLayout ); 1497 }, 1498 1499 isBack: function() { 1500 return this.children || this.templateVisible ? true : false; 1501 }, 1502 1503 isBreadcrumbs: function() { 1504 return this.$root.menuOptions.useBreadcrumb && 0 !== this.breadcrumbsData.length ? true : false; 1505 }, 1506 1507 breadcrumbsPathData: function() { 1508 1509 if ( 'minimal' === this.$root.$root.menuOptions.breadcrumbPath && 1 < this.breadcrumbsData.length ) { 1510 return this.breadcrumbsData.filter( ( item, index, breadcrumbsData ) => { 1511 return index === breadcrumbsData.length - 1; 1512 } ); 1513 } 1514 1515 return this.breadcrumbsData; 1516 }, 1517 1518 depth: function() { 1519 return this.trail.length; 1520 }, 1521 1522 containerPosition: function() { 1523 return this.$root.menuOptions.menuPosition; 1524 }, 1525 1526 showAnimation: function() { 1527 1528 let animation = false; 1529 1530 switch( this.$root.menuOptions.menuLayout ) { 1531 1532 case 'slide-out': 1533 animation = 'right' === this.containerPosition ? 'menu-container-left-animation' : 'menu-container-right-animation'; 1534 break; 1535 1536 case 'dropdown': 1537 animation = 'menu-container-dropdown-animation'; 1538 break; 1539 1540 case 'push': 1541 animation = 'menu-container-expand-animation'; 1542 break; 1543 } 1544 1545 return animation; 1546 }, 1547 1548 toggleClosedIcon: function() { 1549 return this.$root.refsHtml.toggleClosedIcon || ''; 1550 }, 1551 1552 toggleOpenedIcon: function() { 1553 return this.$root.refsHtml.toggleOpenedIcon || ''; 1554 }, 1555 1556 toggleText: function() { 1557 return '' !== this.$root.menuOptions.toggleText ? this.$root.menuOptions.toggleText : false;
1558 }, 1559 1560 closeIcon: function() { 1561 return this.$root.refsHtml.closeIcon || ''; 1562 }, 1563 1564 backIcon: function() { 1565 let backIcon = this.$root.refsHtml.backIcon || '', 1566 backText = '' !== this.$root.menuOptions.backText ? '<span>' + this.$root.menuOptions.backText + '</span>' : '', 1567 backHtml = backIcon + backText; 1568 1569 return backHtml; 1570 }, 1571 1572 backText: function() { 1573 return '' !== this.$root.menuOptions.backText ? this.$root.menuOptions.backText : false; 1574 }, 1575 1576 breadcrumbIcon: function() { 1577 return this.$root.refsHtml.breadcrumbIcon || ''; 1578 }, 1579 1580 loaderColor: function() { 1581 return this.$root.menuOptions.loaderColor || '#3a3a3a'; 1582 }, 1583 1584 toggleLoaderVisible: function() { 1585 return this.$root.menuOptions.toggleLoader && this.instanceLoadStatus && this.menuOpen ? true : false; 1586 }, 1587 1588 beforeTemplateVisible: function() { 1589 return this.beforeContent ? true : false; 1590 }, 1591 1592 afterTemplateVisible: function() { 1593 return this.afterContent ? true : false; 1594 } 1595 1596 }, 1597 1598 methods: { 1599 menuToggle: function() { 1600 this.menuOpen = ! this.menuOpen; 1601 }, 1602 1603 closeMenu: function() { 1604 this.menuOpen = false; 1605 }, 1606 1607 clearStates: function() { 1608 this.trail = []; 1609 this.children = false; 1610 this.breadcrumbsData = []; 1611 this.templateVisible = false; 1612 }, 1613 1614 goBack: function() { 1615 1616 this.animation = 'items-prev-animation'; 1617 1618 if ( ! this.templateVisible ) { 1619 this.$delete( this.trail, this.trail.length - 1 ); 1620 this.children = this.trail.slice(-1)[0] || false; 1621 } else { 1622 this.templateVisible = false; 1623 } 1624 1625 this.$delete(this.breadcrumbsData, this.breadcrumbsData.length - 1); 1626 }, 1627 1628 escapeKeyHandler: function() { 1629 1630 if ( this.isBack ) { 1631 this.goBack(); 1632 } else { 1633 this.closeMenu(); 1634 } 1635 }, 1636 1637 showTemplateContent: function( templateData ) { 1638 let vueInstance = this; 1639 1640 this.$nextTick( function() { 1641 let $templateContainer = $( vueInstance.$refs['template-content'] ).find( '.jet-mobile-menu__template-content' ); 1642 1643 jetMenu.elementorContentRender( $templateContainer, templateData.content ); 1644 } ); 1645 }, 1646 1647 initTemplatesContent: function() { 1648 let vueInstance = this; 1649 1650 this.$nextTick( function() { 1651 1652 if ( vueInstance.headerContent ) { 1653 let $headerContainer = $( vueInstance.$refs['header-template-content'] ); 1654 1655 jetMenu.elementorContentRender( $headerContainer ); 1656 } 1657 1658 if ( vueInstance.beforeContent ) { 1659 let $beforeContainer = $( vueInstance.$refs['before-template-content'] ); 1660 1661 jetMenu.elementorContentRender( $beforeContainer ); 1662 } 1663 1664 if ( vueInstance.afterContent ) { 1665 let $afterContainer = $( vueInstance.$refs['after-template-content'] ); 1666 1667 jetMenu.elementorContentRender( $afterContainer ); 1668 } 1669 } ); 1670 }, 1671 1672 breadcrumbHandle: function( index ) { 1673 1674 if ( index === this.breadcrumbsData.length ) { 1675 return; 1676 } 1677 1678 if ( 'minimal' === this.$root.menuOptions.breadcrumbPath ) { 1679 this.goBack(); 1680 1681 return; 1682 } 1683 1684 this.animation = 'items-prev-animation'; 1685 this.trail = this.trail.slice( 0, index ); 1686 this.children = this.trail.slice( -1 )[0] || false; 1687 this.templateVisible = false; 1688 this.breadcrumbsData = this.breadcrumbsData.slice( 0, index ); 1689 } 1690 1691 } 1692 }); 1693 }, 1694 1695 loadScriptAsync: function( script, uri ) { 1696 1697 if ( jetMenu.addedScripts.hasOwnProperty( script ) ) { 1698 return script; 1699 } 1700 1701 jetMenu.addedScripts[ script ] = uri; 1702 1703 return new Promise( function( resolve, reject ) { 1704 var tag = document.createElement( 'script' ); 1705 1706 tag.src = uri; 1707 tag.async = true; 1708 tag.onload = function() { 1709 resolve( script ); 1710 }; 1711 1712 document.head.appendChild( tag ); 1713 } ); 1714 }, 1715 1716 loadStyle: function( style, uri ) { 1717 1718 if ( jetMenu.addedStyles.hasOwnProperty( style ) && jetMenu.addedStyles[ style ] === uri) { 1719 return style; 1720 } 1721 1722 jetMenu.addedStyles[ style ] = uri; 1723 1724 return new Promise( function( resolve, reject ) { 1725 var tag = document.createElement( 'link' ); 1726 1727 tag.id = style; 1728 tag.rel = 'stylesheet'; 1729 tag.href = uri; 1730 tag.type = 'text/css'; 1731 tag.media = 'all'; 1732 tag.onload = function() { 1733 resolve( style ); 1734 }; 1735 1736 document.head.appendChild( tag ); 1737 }); 1738 }, 1739 1740 elementorContentRender: function( $templateContainer, templateContent ) { 1741 let content = templateContent || false; 1742 1743 Promise.all( jetMenu.addedAssetsPromises ).then( function( value ) { 1744 1745 if ( templateContent ) { 1746 $templateContainer.html( templateContent ); 1747 } 1748 1749 // Before ajax frontend init 1750 $( window ).trigger( 'jet-menu/ajax/frontend-init/before', { 1751 $container: $templateContainer, 1752 content: content, 1753 } ); 1754 1755 jetMenu.elementorFrontendInit( $templateContainer ); 1756 1757 // Before ajax frontend init 1758 $( window ).trigger( 'jet-menu/ajax/frontend-init/after', { 1759 $container: $templateContainer, 1760 content: content, 1761 } ); 1762 }, function( reason ) { 1763 console.log( 'Script Loaded Error' ); 1764 }); 1765 }, 1766 1767 elementorFrontendInit: function( $templateContainer ) { 1768 1769 $templateContainer.find( 'div[data-element_type]' ).each( function() { 1770 var $this = $( this ), 1771 elementType = $this.data( 'element_type' ); 1772 1773 if ( ! elementType ) { 1774 return; 1775 } 1776 1777 try { 1778 if ( 'widget' === elementType ) { 1779 elementType = $this.data( 'widget_type' ); 1780 1781 if ( window.elementorFrontend && window.elementorFrontend.hooks ) { 1782 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ ); 1783 } 1784 } 1785 1786 if ( window.elementorFrontend && window.elementorFrontend.hooks ) { 1787 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ ); 1788 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ ); 1789 } 1790 1791 } catch ( err ) { 1792 console.log(err); 1793 1794 $this.remove(); 1795 1796 return false;
1797 } 1798 } ); 1799 } 1800 1801 }; 1802 1803 jetMenu.init(); 1804 1805} ( 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.