PageSourceSearch

https://www.gopinathgaudiyamath.com/wp-content/plugins/trx_addons/…/classes/Widgets/NavMenu/assets/NavMenu.js

js gopinathgaudiyamath.com collected 2026-10-02 14:15:55 UTC 17,532 bytes, 454 lines download raw bytes

1(function ($) {
2
3	"use strict";
4
5	var NavMenuHandler = function( $scope, $ ) {
6
7		var $widgetContainer = $scope.find('.trx-addons-nav-widget-container');
8
9		// we don't need to wait for content dom load since the script is loaded in the footer.
10		// $widgetContainer.removeClass('trx-addons-invisible');
11
12		if ( ! elementorFrontend.isEditMode() ) {
13			$widgetContainer.css({ visibility: 'inherit', opacity: 'inherit' });
14		}
15
16		var settings = $widgetContainer.data('settings');
17
18		if ( ! settings ) {
19			return;
20		}
21
22		var $menuContainer = $scope.find('.trx-addons-mobile-menu'),
23			$menuToggler = $scope.find('.trx-addons-hamburger-toggle'),
24			$hamMenuCloser = $scope.find('.trx-addons-mobile-menu-close'),
25			$centeredItems = $scope.find('.trx-addons-mega-content-centered'),
26			$fullWidthItems = $scope.find('.trx-addons-nav-menu-container').find('li.trx-addons-mega-nav-item,li[data-full-width="true"],li[class*="trx_addons_stretch_"]'),
27			disablePageScroll = $scope.hasClass('trx-addons-disable-scroll-yes') ? true : false,
28			hoverTimeout,
29			mobileMenuTransitionSpeed = trx_addons_apply_filters( 'trx_addons_filter_nav_menu_mobile_transition_speed' , 'normal' );
30
31		jQuery( document ).on( 'action.menu-collapse-items-moved', function( e, action ) {
32			$fullWidthItems = $scope.find('.trx-addons-nav-menu-container').find('li.trx-addons-mega-nav-item,li[data-full-width="true"],li[class*="trx_addons_stretch_"]');
33		} );
34
35		// Get Element On Page Option
36		$scope.find('div[data-mega-content]').each( function( index, elem ) {
37			var $currentItem = $(elem),
38				targetElement = $currentItem.data('mega-content');
39			if ( $(targetElement).length > 0 ) {
40				var $targetElement = $(targetElement);
41				$targetElement.attr( 'data-menu-id', $scope.data('id') );
42				$currentItem.append( $targetElement.clone(true).addClass('trx-addons-cloned-element') );
43			}
44		} );
45
46		// Remove Element On Page Option If on Frontend
47		if ( ! elementorFrontend.isEditMode() ) {
48			$('div[data-menu-id="' + $scope.data('id') + '"]').not('.trx-addons-cloned-element').remove();
49		}
50
51		/**
52		 * Save current device to use it later to determine if the device changed on resize.
53		 */
54		// window.trxCurrStickyDevice = elementorFrontend.getCurrentDeviceMode();
55
56		// make sure it's removed when the option is disabled.
57		if ( elementorFrontend.isEditMode() && ! disablePageScroll ) {
58			$('body').removeClass('trx-addons-scroll-disabled');
59		}
60
61		$centeredItems.each( function( index, item ) {
62			$(item).closest(".trx-addons-nav-menu-item").addClass("trx-addons-mega-item-static");
63		} );
64
65		if ( 'slide' === settings.mobileLayout || 'slide' === settings.mainLayout ) {
66			$scope.addClass('trx-addons-ver-hamburger-menu');
67		}
68
69		// check badges dot/grow effect.
70		if ( 'dot' === settings.hoverEffect ) {
71			var $badgedItems = $scope.find('.trx-addons-mega-content-container .trx-addons-badge-dot, .trx-addons-sub-menu .trx-addons-badge-dot');
72			$badgedItems.each( function( index, $item ) {
73				$( $item )
74					.mouseenter( function() {
75						$( $item ).removeClass('trx-addons-badge-dot');
76					} )
77					.mouseleave( function() {
78						$($item).addClass('trx-addons-badge-dot');
79					} );
80			} );
81		}
82
83		// close mobile menu after clicking.
84		if ( settings.closeAfterClick ) {
85			$menuContainer.find('.trx-addons-menu-link').on( 'click.trxAfterClick', function () {
86				// check if it has children
87				var hasChildern = itemHasChildren( this );
88
89				if ( ! hasChildern || jQuery(this).attr('href') !== '#' ) {
90					// close mobile menu
91					if ( 'slide' === settings.mainLayout || 'slide' === settings.mobileLayout ) {
92						// if ($scope.hasClass('trx-addons-nav-slide')) {
93						$hamMenuCloser.trigger( 'click' );
94					} else {
95						$menuToggler.trigger( 'click' );
96					}
97				}
98			} );
99		}
100
101		var isMobileMenu = null,
102			isDesktopMenu = null;
103
104		checkBreakPoint( settings );
105
106		if ( $scope.hasClass('trx-addons-nav-hor') ) {
107			$(window).trigger( 'resize' );
108			// Check dimensions after all other handlers are done.
109			setTimeout( checkMegaContentWidth, 100 );
110		}
111
112		// checkStickyEffect();
113
114		if ( ['hor', 'ver'].includes( settings.mainLayout ) ) {
115
116			if ( 'hover' === settings.submenuEvent ) {
117
118				$scope.find('.trx-addons-nav-menu-item')
119					.on( 'focus.trxItemHover', '> a', function(e) {
120						$(this).parent().trigger('mouseenter.trxItemHover');
121					} )
122					.on( 'mouseenter.trxItemHover', function(e) {
123						var $this = $(this);
124						e.stopPropagation();
125						clearTimeout( hoverTimeout );
126						$this.siblings().removeClass('trx-addons-item-hovered'); // unset hovered items only for this menu.
127						$this.find('.trx-addons-nav-menu-item.trx-addons-item-hovered').removeClass('trx-addons-item-hovered'); // unset hovered items for child submenus.
128						$this.addClass('trx-addons-item-hovered');
129						if ( $this.hasClass('trx-addons-sub-menu-item') ) {
130							$this.parents('.trx-addons-nav-menu-item').addClass('trx-addons-item-hovered');
131						}
132						initHiddenElements( $this );
133					} );
134
135				$scope.on('mouseleave.trxItemHover', function(e) {
136					var delay = getComputedStyle( $scope[0] ).getPropertyValue( '--trx-addons-mega-menu-delay' );
137					if ( isNaN( delay ) ) {
138						delay = 300;
139					}
140					hoverTimeout = setTimeout( function () {
141						$scope.find('.trx-addons-item-hovered').removeClass('trx-addons-item-hovered');
142					}, delay);
143				} );
144
145				// we need to make sure that trx-addons-item-hover is not removed when hovering over a sub/mega menu.
146				$scope.find('.trx-addons-sub-menu, .trx-addons-mega-content-container')
147					.on( 'mouseenter.trxItemHover', function(e) {
148						var $menuItem = $(this).parents('.trx-addons-nav-menu-item').first();
149						clearTimeout( hoverTimeout );
150						$menuItem.siblings().removeClass('trx-addons-item-hovered'); // remove it from the menu item in the same widget only
151						$menuItem.addClass('trx-addons-item-hovered');
152						initHiddenElements( $menuItem );
153					} )
154					.on( 'mouseleave.trxItemHover', function(e) {
155						clearTimeout( hoverTimeout );
156						// $(this).parents('.trx-addons-nav-menu-item').first().removeClass('trx-addons-item-hovered');
157					} );
158
159			} else { // click
160
161				var triggerSelector = 'item' === settings.submenuTrigger ? ' > .trx-addons-menu-link' : ' > .trx-addons-menu-link .trx-addons-dropdown-icon',
162					$trigger = $scope.find('.trx-addons-nav-menu-container .trx-addons-nav-menu-item.menu-item-has-children' + triggerSelector);
163
164				// To prevent events overlapping if the user switched between hover/click while building the menu.
165				if ( elementorFrontend.isEditMode() ) {
166					$scope.off( 'mouseleave.trxItemHover' );
167				}
168
169				$trigger.off( 'click.trxItemClick' ); // to prevent duplications.
170				$trigger.on( 'click.trxItemClick', function(e) {
171					e.preventDefault();
172					e.stopPropagation();
173					var $menuItem = $(this).parents('.trx-addons-nav-menu-item').first();
174					// remove it from the menu item in the same widget only
175					$menuItem.siblings().removeClass('trx-addons-item-hovered').find('.trx-addons-item-hovered').removeClass('trx-addons-item-hovered');
176					$menuItem.toggleClass('trx-addons-item-hovered');
177					initHiddenElements( $menuItem );
178				} );
179			}
180		}
181
182		// Close the menu when clicking outside of it (on the overlay).
183		$(document).on('click', '.trx-addons-nav-slide-overlay', function() {
184			$scope.find('.trx-addons-mobile-menu-outer-container, .trx-addons-nav-slide-overlay').removeClass('trx-addons-vertical-toggle-open');
185			$('body').removeClass('trx-addons-scroll-disabled');
186			$menuToggler
187				.removeClass('trx-addons-toggle-opened') // show/hide close icon/text.
188				.focus();
189		} );
190
191		// Close the menu when clicking on the close button.
192		$hamMenuCloser
193			.on( 'keypress', function (e) {
194				if ( e.which === 13 ) { // Enter key
195					$(this).trigger( 'click' );
196				}
197			} )
198			.on( 'click', function() {
199				$scope.find('.trx-addons-mobile-menu-outer-container, .trx-addons-nav-slide-overlay').removeClass('trx-addons-vertical-toggle-open');
200				$('body').removeClass('trx-addons-scroll-disabled');
201				$menuToggler
202					.removeClass('trx-addons-toggle-opened')	// show/hide close icon/text.
203					.focus();
204			} );
205
206		// Toggle the menu when clicking on the hamburger icon.
207		$menuToggler
208			.on( 'keypress', function (e) {
209				if ( e.which === 13 ) { // Enter key
210					$(this).trigger( 'click' );
211				}
212			} )
213			.on( 'click', function () {
214				if ('slide' === settings.mobileLayout || 'slide' === settings.mainLayout) {
215					$scope.find('.trx-addons-mobile-menu-outer-container, .trx-addons-nav-slide-overlay')
216						.addClass('trx-addons-vertical-toggle-open');
217					setTimeout( function() {
218						$scope.find('.trx-addons-mobile-menu-outer-container' ).find( 'a,button' ).eq(0).focus();
219					}, 300 );
220					if ( disablePageScroll ) {
221						$('body').addClass('trx-addons-scroll-disabled');
222					}
223				} else {
224					var $menuParent = $scope.find('.trx-addons-mobile-menu-container');
225					if ( $menuContainer.hasClass('trx-addons-active-menu') ) {
226						$menuParent.slideUp( mobileMenuTransitionSpeed, function () {
227							$menuContainer.removeClass('trx-addons-active-menu');
228							$menuParent.show();
229						} );
230					} else {
231						$menuParent.hide();
232						$menuContainer.addClass('trx-addons-active-menu');
233						$menuParent.slideDown( mobileMenuTransitionSpeed );
234					}
235				}
236				$menuToggler.toggleClass('trx-addons-toggle-opened'); // show/hide close icon/text.
237			} );
238
239		$menuContainer
240			.find( '.trx-addons-nav-menu-item.menu-item-has-children a[href="#"]'
241				+ ',.trx-addons-nav-menu-item.menu-item-has-children a:not([href="#"]) .trx-addons-dropdown-icon'
242				+ ',.trx-addons-mega-nav-item a[href="#"]'
243				+ ',.trx-addons-mega-nav-item a:not([href="#"]) .trx-addons-dropdown-icon' )
244			.on('click', function (e) {
245				var $self = $(this).hasClass( 'trx-addons-dropdown-icon' ) ? $(this).closest('a').eq(0) : $(this),
246					$parent = $self.parent( '.trx-addons-nav-menu-item' ),
247					$submenu = $self.next( '.trx-addons-submenu, .trx-addons-mega-content-container' );
248				if ( $self.find(".trx-addons-dropdown-icon").length < 1 ) {
249					return;
250				}
251				e.stopPropagation();
252				e.preventDefault();
253				var closeSubmenu = function( $item ) {
254					var $submenu = $item.find(' > .trx-addons-submenu, > .trx-addons-mega-content-container');
255					if ( $submenu.length ) {
256						$submenu.slideUp( mobileMenuTransitionSpeed, function () {
257							$item.removeClass('trx-addons-active-menu trx-addons-active-menu-closing');
258							$submenu.removeAttr('style');
259							// close all inner submenus.
260							$submenu
261								.find('.trx-addons-active-menu').removeClass('trx-addons-active-menu')
262								.find('>.trx-addons-submenu, >.trx-addons-mega-content-container').removeAttr('style');
263						} );
264					}
265				};
266				//If it was opened, then close it.
267				if ( $parent.hasClass('trx-addons-active-menu') ) {
268					closeSubmenu( $parent );
269				} else {
270					// Close any other opened items.
271					$parent.parents('.trx-addons-active-menu').addClass('trx-addons-active-menu-fix');
272					$menuContainer.find('.trx-addons-active-menu:not(.trx-addons-active-menu-fix)').each( function() {
273						var $item = $(this);
274						if ( ! $item.parents('.trx-addons-active-menu-closing').length ) {
275							closeSubmenu( $item.addClass('trx-addons-active-menu-closing') );
276						}
277					} );
278					$parent.parents('.trx-addons-active-menu-fix').removeClass('trx-addons-active-menu-fix');
279					// Then, open this item.
280					$submenu.slideDown( mobileMenuTransitionSpeed, function () {
281						$parent.addClass('trx-addons-active-menu');
282						$submenu.removeAttr('style');
283						initHiddenElements( $parent );
284					} );
285				}
286			} );
287
288		$(document).on('click.trxCloseMegaMenu', function (event) {
289			var isTabsItem = $(event.target).closest('.trx-addons-tabs-nav-list-item').length,
290				isWidgetContainer = $(event.target).closest('.trx-addons-nav-widget-container').length;
291
292			if ( ! isWidgetContainer && ! isTabsItem ) {
293				if ( $( $menuContainer ).hasClass('trx-addons-active-menu') ) {
294					$menuToggler.trigger( 'click' );
295				}
296				if ( 'click' === settings.submenuEvent ) {
297					$scope.find('.trx-addons-nav-menu-container .trx-addons-item-hovered').removeClass('trx-addons-item-hovered')
298				}
299			}
300		} );
301
302		$(window).on('resize', function () {
303
304			checkBreakPoint( settings );
305
306			if ( $scope.hasClass('trx-addons-nav-hor') ) {
307				checkMegaContentWidth();
308			}
309		} );
310
311		// vertical toggler.
312		if ( $scope.hasClass('trx-addons-ver-toggle-yes') && $scope.hasClass('trx-addons-ver-click') ) {
313			$scope.find('.trx-addons-ver-toggler').on('click', function() {
314				$widgetContainer.toggleClass( 'trx-addons-ver-collapsed', 500 );
315			} );
316		}
317
318		$widgetContainer.addClass( 'trx-addons-nav-menu-inited' );
319
320		//-------------------------------
321		//  Helper Functions
322		//-------------------------------
323
324		// Call action.init_hidden_elements to initialize hidden elements.
325		function initHiddenElements( $item ) {
326			checkMegaContentWidth();
327			if ( typeof window.trx_addons_shift_submenu !== 'undefined' ) {
328				var $submenu = $item.find('> .trx-addons-submenu, > .trx-addons-mega-content-container');
329				if ( $submenu.length ) {
330					window.trx_addons_shift_submenu( $submenu );
331				}
332			}
333
334			$(document).trigger( 'action.init_hidden_elements', [ $item ] );
335			// setTimeout( function() {
336			// }, 400 );
337		}
338
339		// Set menu items to full width
340		function checkMegaContentWidth() {
341			$fullWidthItems.each( function( index, item ) {
342				fullWidthContent( $(item).find('>ul') );
343			} );
344		}
345
346		// Full Width Mega Content.
347		function fullWidthContent( $item ) {
348			if ( typeof window.trx_addons_shift_submenu !== 'undefined' ) {
349				//window.trx_addons_stretch_submenu( $item );
350				window.trx_addons_shift_submenu( $item );
351			} else {
352				var is_mobile_menu = $item.closest( '.trx-addons-mobile-menu-container' ).length > 0;
353				if ( is_mobile_menu ) {
354					$item.removeAttr( 'style' );
355					return;
356				}
357				var isContainer = elementorFrontend.config.experimentalFeatures.container,
358					$parentSec = $scope.parents('.e-con').last();
359
360				$parentSec = ! isContainer || $parentSec.length < 1 ? $scope.closest('.elementor-top-section') : $parentSec;
361
362				var width = $parentSec.outerWidth(),
363					sectionLeft = $parentSec.offset().left - $item.offset().left;
364
365				$($item).removeClass('trx-addons-mega-item-static').find('.trx-addons-mega-content-container, > .trx-addons-sub-menu').css({
366					'width': width + 'px',
367					'max-width': 'none',
368					'left': sectionLeft + 'px',
369					'right': 'auto',
370					'transform': 'none'
371				} );
372			}
373		}
374
375		function checkBreakPoint( settings ) {
376
377			// Trigger small screen menu.
378			if ( settings.breakpoint >= $(window).outerWidth() && ! isMobileMenu ) {
379				// remove the vertical toggler.
380				$scope.find('.trx-addons-ver-toggler').css('display', 'none');
381				$scope.addClass('trx-addons-hamburger-menu');
382				$scope.find('.trx-addons-active-menu').removeClass('trx-addons-active-menu');
383				// stretchDropdown( $scope.find('.trx-addons-stretch-dropdown .trx-addons-mobile-menu-container') );
384
385				isMobileMenu = true;
386				isDesktopMenu = false;
387
388			// Trigger large screen menu.
389			} else if ( settings.breakpoint < $(window).outerWidth() && ! isDesktopMenu ) {
390
391				// show the vertical toggler if enabled.
392				if ( $scope.hasClass('trx-addons-ver-toggle-yes') ) {
393					$scope.find('.trx-addons-ver-toggler').css('display', 'flex');
394				}
395
396				$menuToggler.removeClass('trx-addons-toggle-opened');
397				$scope.find(".trx-addons-mobile-menu-container .trx-addons-active-menu").removeClass("trx-addons-active-menu");
398				$scope.removeClass('trx-addons-hamburger-menu trx-addons-ham-dropdown');
399				$scope.find('.trx-addons-vertical-toggle-open').removeClass('trx-addons-vertical-toggle-open');
400				$scope.find('.trx-addons-nav-default').removeClass('trx-addons-nav-default');
401
402				isDesktopMenu = true;
403				isMobileMenu = false;
404			}
405
406			// Stretch dropdown menu.
407			if ( $scope.hasClass( 'trx-addons-hamburger-menu' ) || $scope.hasClass( 'trx-addons-nav-dropdown' ) ) {
408				stretchDropdown( $scope.find('.trx-addons-stretch-dropdown .trx-addons-mobile-menu-container') );
409			}
410
411		}
412
413		// Full Width Option. Shows the mobile menu beneath the widget's parent(section).
414		function stretchDropdown( $menu ) {
415
416			if ( ! $menu.length ) {
417				return;
418			}
419
420			var isContainer = elementorFrontend.config.experimentalFeatures.container,
421				$parentSec = $scope.parents('.e-con').last();
422
423			$parentSec = ! isContainer || $parentSec.length < 1 ? $scope.closest('.elementor-top-section') : $parentSec;
424
425			var width = Math.min( trx_addons_window_width(), $($parentSec).outerWidth() ),
426				widgetTop = $scope.offset().top,
427				parentBottom = $($parentSec).offset().top + $($parentSec).outerHeight(),
428				stretchTop = parentBottom - widgetTop,
429				stretchLeft = $scope.offset().left - Math.max( 0, $($parentSec).offset().left );
430			
431			$( $menu ).css({
432				width: width + 'px',
433				left: '-' + stretchLeft + 'px',
434				top: stretchTop + 'px',
435			} );
436		}
437
438		/**
439		 * Check if the item has children.
440		 * 
441		 * @param {link} $item .trx-addons-menu-link
442		 * 
443		 * @returns boolean  true if the item has children.
444		 */
445		function itemHasChildren( $item ) {
446			return $( $item ).parent( '.trx-addons-nav-menu-item' ).hasClass( 'menu-item-has-children' );
447		}
448	};
449
450	$( window ).on( 'elementor/frontend/init', function () {
451		elementorFrontend.hooks.addAction('frontend/element_ready/trx_elm_nav_menu.default', NavMenuHandler);
452	} );
453
454}( 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.