PageSourceSearch

http://www.usinpac.com/wp-content/themes/thegem/js/thegem-menu_init.js?ver=5.3.25

js usinpac.com collected 2026-10-02 08:11:03 UTC 21,428 bytes, 667 lines download raw bytes

1function supportsTransitions() {
2	return getSupportedTransition() != '';
3}
4
5function getSupportedTransition() {
6	var b = document.body || document.documentElement,
7        s = b.style,
8        p = 'transition';
9
10    if (typeof s[p] == 'string') { return p; }
11
12    // Tests for vendor specific prop
13    var v = ['Moz', 'webkit', 'Webkit', 'Khtml', 'O', 'ms'];
14    p = p.charAt(0).toUpperCase() + p.substr(1);
15
16    for (var i=0; i<v.length; i++) {
17        if (typeof s[v[i] + p] == 'string') { return true; }
18    }
19
20    return '';
21}
22window.supportedTransition = getSupportedTransition();
23window.supportsTransitions = supportsTransitions();
24
25function supportsAnimations() {
26	return getSupportedAnimation() != '';
27}
28
29function getSupportedAnimation() {
30	var t,
31		el = document.createElement("fakeelement");
32
33	var animations = {
34		"animation"      : "animationend",
35		"OAnimation"     : "oAnimationEnd",
36		"MozAnimation"   : "animationend",
37		"WebkitAnimation": "webkitAnimationEnd",
38		'msAnimation' : 'MSAnimationEnd'
39	};
40
41	for (t in animations){
42		if (el.style[t] !== undefined) {
43			return t;
44		}
45	}
46	return '';
47}
48window.supportedAnimation = getSupportedAnimation();
49window.supportsAnimations = supportsAnimations();
50
51function getMobileMenuType() {
52	if(!document.getElementById('site-header')) return 'default';
53	var m = document.getElementById('site-header').className.match(/mobile-menu-layout-([a-zA-Z0-9]+)/);
54	window.gemMobileMenuType = m ? m[1] : 'default';
55	return window.gemMobileMenuType;
56}
57getMobileMenuType();
58
59(function() {
60	var logoFixTimeout = false;
61
62	function getElementPosition(elem) {
63		var w = elem.offsetWidth,
64			h = elem.offsetHeight,
65			l = 0,
66			t = 0;
67
68		while (elem) {
69			l += elem.offsetLeft;
70			t += elem.offsetTop;
71			elem = elem.offsetParent;
72		}
73		return {"left":l, "top":t, "width": w, "height":h};
74	}
75
76	function fixMenuLogoPosition() {
77		if (logoFixTimeout) {
78			clearTimeout(logoFixTimeout);
79		}
80
81		var headerMain = document.querySelector('#site-header .header-main');
82		if (headerMain == null) {
83			return false;
84		}
85
86		var headerMainClass = headerMain.className;
87		if (headerMainClass.indexOf('logo-position-menu_center') == -1 || headerMainClass.indexOf('header-layout-fullwidth_hamburger') != -1 || headerMainClass.indexOf('header-layout-vertical') != -1) {
88			return false;
89		}
90
91		logoFixTimeout = setTimeout(function() {
92			var page = document.getElementById('page'),
93				primaryMenu = document.getElementById('primary-menu'),
94				primaryNavigation = document.getElementById('primary-navigation'),
95				windowWidth = page.offsetWidth;
96
97			if (headerMainClass.indexOf('header-layout-fullwidth') != -1) {
98				var logoItem = primaryMenu.querySelector('.menu-item-logo'),
99					lastItem = primaryNavigation.querySelector('#primary-menu > li:last-child');
100
101				primaryMenu.style.display = '';
102				logoItem.style.marginLeft = '';
103				logoItem.style.marginRight = '';
104
105				if (windowWidth < 1212) {
106					return;
107				}
108
109				primaryMenu.style.display = 'block';
110
111				var pageCenter = windowWidth / 2,
112					logoOffset = getElementPosition(logoItem),
113					offset = pageCenter - logoOffset.left - logoItem.offsetWidth / 2;
114
115				logoItem.style.marginLeft = offset + 'px';
116
117				var primaryMenuOffsetWidth = primaryMenu.offsetWidth,
118					primaryMenuOffsetLeft = getElementPosition(primaryMenu).left,
119					lastItemOffsetWidth = lastItem.offsetWidth,
120					lastItemOffsetLeft = getElementPosition(lastItem).left,
121					rightItemsOffset = primaryMenuOffsetWidth - lastItemOffsetLeft - lastItemOffsetWidth + primaryMenuOffsetLeft;
122
123				logoItem.style.marginRight = rightItemsOffset + 'px';
124			} else {
125				if (windowWidth < 1212) {
126					primaryNavigation.style.textAlign = '';
127					primaryMenu.style.position = '';
128					primaryMenu.style.left = '';
129					return;
130				}
131
132				primaryNavigation.style.textAlign = 'left';
133				primaryMenu.style.left = 0 + 'px';
134
135				var pageCenter = windowWidth / 2,
136					logoOffset = getElementPosition(document.querySelector('#site-header .header-main #primary-navigation .menu-item-logo')),
137					pageOffset = getElementPosition(page),
138					offset = pageCenter - (logoOffset.left - pageOffset.left) - document.querySelector('#site-header .header-main #primary-navigation .menu-item-logo').offsetWidth / 2;
139
140				primaryMenu.style.position = 'relative';
141				primaryMenu.style.left = offset + 'px';
142			}
143		}, 50);
144	}
145
146	window.fixMenuLogoPosition = fixMenuLogoPosition;
147
148})();
149
150
151(function($) {
152    /* PRIMARY MENU */
153
154	var isVerticalMenu = $('.header-main').hasClass('header-layout-vertical'),
155		isHamburgerMenu = $('.header-main').hasClass('header-layout-fullwidth_hamburger');
156
157	$(window).resize(function() {
158	    window.updateGemClientSize(false);
159		window.updateGemInnerSize();
160	});
161
162	window.menuResizeTimeoutHandler = false;
163
164    var megaMenuSettings = {};
165
166    function getOffset(elem) {
167		if (elem.getBoundingClientRect && window.gemBrowser.platform.name != 'ios'){
168			var bound = elem.getBoundingClientRect(),
169				html = elem.ownerDocument.documentElement,
170				htmlScroll = getScroll(html),
171				elemScrolls = getScrolls(elem),
172				isFixed = (styleString(elem, 'position') == 'fixed');
173			return {
174				x: parseInt(bound.left) + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft,
175				y: parseInt(bound.top)  + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop
176			};
177		}
178
179		var element = elem, position = {x: 0, y: 0};
180		if (isBody(elem)) return position;
181
182		while (element && !isBody(element)){
183			position.x += element.offsetLeft;
184			position.y += element.offsetTop;
185
186			if (window.gemBrowser.name == 'firefox'){
187				if (!borderBox(element)){
188					position.x += leftBorder(element);
189					position.y += topBorder(element);
190				}
191				var parent = element.parentNode;
192				if (parent && styleString(parent, 'overflow') != 'visible'){
193					position.x += leftBorder(parent);
194					position.y += topBorder(parent);
195				}
196			} else if (element != elem && window.gemBrowser.name == 'safari'){
197				position.x += leftBorder(element);
198				position.y += topBorder(element);
199			}
200
201			element = element.offsetParent;
202		}
203		if (window.gemBrowser.name == 'firefox' && !borderBox(elem)){
204			position.x -= leftBorder(elem);
205			position.y -= topBorder(elem);
206		}
207		return position;
208	};
209
210	function getScroll(elem){
211		return {x: window.pageXOffset || document.documentElement.scrollLeft, y: window.pageYOffset || document.documentElement.scrollTop};
212	};
213
214	function getScrolls(elem){
215		var element = elem.parentNode, position = {x: 0, y: 0};
216		while (element && !isBody(element)){
217			position.x += element.scrollLeft;
218			position.y += element.scrollTop;
219			element = element.parentNode;
220		}
221		return position;
222	};
223
224	function styleString(element, style) {
225		return $(element).css(style);
226	};
227
228	function styleNumber(element, style){
229		return parseInt(styleString(element, style)) || 0;
230	};
231
232	function borderBox(element){
233		return styleString(element, '-moz-box-sizing') == 'border-box';
234	};
235
236	function topBorder(element){
237		return styleNumber(element, 'border-top-width');
238	};
239
240	function leftBorder(element){
241		return styleNumber(element, 'border-left-width');
242	};
243
244	function isBody(element){
245		return (/^(?:body|html)$/i).test(element.tagName);
246	};
247
248
249    function checkMegaMenuSettings() {
250		if (window.customMegaMenuSettings == undefined || window.customMegaMenuSettings == null) {
251			return false;
252		}
253
254		var uri = window.location.pathname;
255
256		window.customMegaMenuSettings.forEach(function(item) {
257			for (var i = 0; i < item.urls.length; i++) {
258				if (uri.match(item.urls[i])) {
259					megaMenuSettings[item.menuItem] = item.data;
260				}
261			}
262		});
263	}
264
265	function fixMegaMenuWithSettings() {
266		checkMegaMenuSettings();
267
268		$('#primary-menu > li.megamenu-enable').each(function() {
269			var m = this.className.match(/(menu-item-(\d+))/);
270			if (!m) {
271				return;
272			}
273
274			var itemId = parseInt(m[2]);
275			if (megaMenuSettings[itemId] == undefined || megaMenuSettings[itemId] == null) {
276				return;
277			}
278
279			var $item = $('> ul', this);
280
281			if (megaMenuSettings[itemId].masonry != undefined) {
282				if (megaMenuSettings[itemId].masonry) {
283					$item.addClass('megamenu-masonry');
284				} else {
285					$item.removeClass('megamenu-masonry');
286				}
287			}
288
289			if (megaMenuSettings[itemId].style != undefined) {
290				$(this).removeClass('megamenu-style-default megamenu-style-grid').addClass('megamenu-style-' + megaMenuSettings[itemId].style);
291			}
292
293			var css = {};
294
295			if (megaMenuSettings[itemId].backgroundImage != undefined) {
296				css.backgroundImage = megaMenuSettings[itemId].backgroundImage;
297			}
298
299			if (megaMenuSettings[itemId].backgroundPosition != undefined) {
300				css.backgroundPosition = megaMenuSettings[itemId].backgroundPosition;
301			}
302
303			if (megaMenuSettings[itemId].padding != undefined) {
304				css.padding = megaMenuSettings[itemId].padding;
305			}
306
307			if (megaMenuSettings[itemId].borderRight != undefined) {
308				css.borderRight = megaMenuSettings[itemId].borderRight;
309			}
310
311			$item.css(css);
312		});
313	}
314
315	function isResponsiveMenuVisible() {
316		// var menuToggleDisplay = $('.menu-toggle').css('display');
317		// return menuToggleDisplay == 'block' || menuToggleDisplay == 'inline-block';
318		return $('.menu-toggle').is(':visible');
319	}
320	window.isResponsiveMenuVisible = isResponsiveMenuVisible;
321
322	function isTopAreaVisible() {
323		return window.gemSettings.topAreaMobileDisable ? window.gemOptions.clientWidth >= 768 : true;
324	}
325	window.isTopAreaVisible = isTopAreaVisible;
326
327	function isVerticalToggleVisible() {
328		return window.gemOptions.clientWidth > 1600;
329	}
330
331	$('#primary-menu > li.megamenu-enable').hover(
332		function() {
333			fix_megamenu_position(this);
334		},
335		function() {}
336	);
337
338	$('#primary-menu > li.megamenu-enable:hover').each(function() {
339		fix_megamenu_position(this);
340	});
341
342	$('#primary-menu > li.megamenu-enable').each(function() {
343		var $item = $('> ul', this);
344		if($item.length == 0) return;
345		$item.addClass('megamenu-item-inited');
346	});
347
348	function fix_megamenu_position(elem) {
349		if (!$('.megamenu-inited', elem).length && isResponsiveMenuVisible()) {
350			return false;
351		}
352
353			var $item = $('> ul', elem);
354			if($item.length == 0) return;
355			var self = $item.get(0);
356
357			$item.addClass('megamenu-item-inited');
358
359			var default_item_css = {
360				width: 'auto',
361				height: 'auto'
362			};
363
364			if (!isVerticalMenu && !isHamburgerMenu) {
365				default_item_css.left = 0;
366			}
367
368			$item
369				.removeClass('megamenu-masonry-inited megamenu-fullwidth')
370				.css(default_item_css);
371
372			$(' > li', $item).css({
373				left: 0,
374				top: 0
375			}).each(function() {
376				var old_width = $(this).data('old-width') || -1;
377				if (old_width != -1) {
378					$(this).width(old_width).data('old-width', -1);
379				}
380			});
381
382			if (isResponsiveMenuVisible()) {
383				return;
384			}
385
386			if (isVerticalMenu) {
387				var container_width = window.gemOptions.clientWidth - $('#site-header-wrapper').outerWidth();
388			} else if (isHamburgerMenu) {
389				var container_width = window.gemOptions.clientWidth - $('#primary-menu').outerWidth();
390			} else {
391				var $container = $item.closest('.header-main'),
392					container_width = $container.width(),
393					container_padding_left = parseInt($container.css('padding-left')),
394					container_padding_right = parseInt($container.css('padding-right')),
395					parent_width = $item.parent().outerWidth();
396			}
397
398			var megamenu_width = $item.outerWidth();
399
400			if (megamenu_width > container_width) {
401				megamenu_width = container_width;
402				var new_megamenu_width = container_width - parseInt($item.css('padding-left')) - parseInt($item.css('padding-right'));
403				var columns = $item.data('megamenu-columns') || 4;
404				var column_width = parseFloat(new_megamenu_width - columns * parseInt($(' > li:first', $item).css('margin-left'))) / columns;
405				var column_width_int = parseInt(column_width);
406				$(' > li', $item).each(function() {
407					$(this).data('old-width', $(this).width()).css('width', column_width_int);
408				});
409				$item.addClass('megamenu-fullwidth').width(new_megamenu_width - (column_width - column_width_int) * columns);
410			}
411
412			if (!isVerticalMenu && !isHamburgerMenu) {
413				if (megamenu_width > parent_width) {
414					var left = -(megamenu_width - parent_width) / 2;
415				} else {
416					var left = 0;
417				}
418
419				var container_offset = getOffset($container[0]);
420				var megamenu_offset = getOffset(self);
421
422				if ((megamenu_offset.x - container_offset.x - container_padding_left + left) < 0) {
423					left = -(megamenu_offset.x - container_offset.x - container_padding_left);
424				}
425
426				if ((megamenu_offset.x + megamenu_width + left) > (container_offset.x + $container.outerWidth() - container_padding_right)) {
427					left -= (megamenu_offset.x + megamenu_width + left) - (container_offset.x + $container.outerWidth() - container_padding_right);
428				}
429
430				$item.css('left', left).css('left');
431			}
432
433			if ($item.hasClass('megamenu-masonry')) {
434				var positions = {},
435					max_bottom = 0;
436
437				$item.width($item.width() - 1);
438				var new_row_height = $('.megamenu-new-row', $item).outerHeight() + parseInt($('.megamenu-new-row', $item).css('margin-bottom'));
439
440				$('> li.menu-item', $item).each(function() {
441					var pos = $(this).position();
442					if (positions[pos.left] != null && positions[pos.left] != undefined) {
443						var top_position = positions[pos.left];
444					} else {
445						var top_position = pos.top;
446					}
447					positions[pos.left] = top_position + $(this).outerHeight() + new_row_height + parseInt($(this).css('margin-bottom'));
448					if (positions[pos.left] > max_bottom)
449						max_bottom = positions[pos.left];
450					$(this).css({
451						left: pos.left,
452						top: top_position
453					})
454				});
455
456				$item.height(max_bottom - new_row_height - parseInt($item.css('padding-top')) - 1);
457				$item.addClass('megamenu-masonry-inited');
458			}
459
460			if ($item.hasClass('megamenu-empty-right')) {
461				var mega_width = $item.width();
462				var max_rights = {
463					columns: [],
464					position: -1
465				};
466
467				$('> li.menu-item', $item).removeClass('megamenu-no-right-border').each(function() {
468					var pos = $(this).position();
469					var column_right_position = pos.left + $(this).width();
470
471					if (column_right_position > max_rights.position) {
472						max_rights.position = column_right_position;
473						max_rights.columns = [];
474					}
475
476					if (column_right_position == max_rights.position) {
477						max_rights.columns.push($(this));
478					}
479				});
480
481				if (max_rights.columns.length && max_rights.position >= (mega_width - 7)) {
482					max_rights.columns.forEach(function($li) {
483						$li.addClass('megamenu-no-right-border');
484					});
485				}
486			}
487
488			if (isVerticalMenu || isHamburgerMenu) {
489				var clientHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight,
490					itemOffset = $item.offset(),
491					itemHeight = $item.outerHeight(),
492					scrollTop = $(window).scrollTop();
493
494				if (itemOffset.top - scrollTop + itemHeight > clientHeight) {
495					$item.css({
496						top: clientHeight - itemOffset.top + scrollTop - itemHeight - 20
497					});
498				}
499			}
500
501			$item.addClass('megamenu-inited');
502	}
503
504	function primary_menu_reinit() {
505		if(isResponsiveMenuVisible()) {
506			if (window.gemMobileMenuType == 'default') {
507				var $submenuDisabled = $('#primary-navigation .dl-submenu-disabled');
508				if ($submenuDisabled.length) {
509					$submenuDisabled.addClass('dl-submenu').removeClass('dl-submenu-disabled');
510				}
511			}
512			if ($('#primary-menu').hasClass('no-responsive')) {
513				$('#primary-menu').removeClass('no-responsive');
514			}
515			if (!$('#primary-navigation').hasClass('responsive')) {
516				$('#primary-navigation').addClass('responsive');
517			}
518			window.fixMenuLogoPosition();
519		} else {
520			if (window.gemMobileMenuType == 'overlay' && !$('.header-layout-overlay').length && $('.menu-overlay').hasClass('active')) {
521				$('.mobile-menu-layout-overlay .menu-toggle').click();
522			}
523
524			$('#primary-navigation').addClass('without-transition');
525
526			if (window.gemMobileMenuType == 'default') {
527				$('#primary-navigation .dl-submenu').addClass('dl-submenu-disabled').removeClass('dl-submenu');
528			}
529			$('#primary-menu').addClass('no-responsive');
530			$('#primary-navigation').removeClass('responsive');
531
532			window.fixMenuLogoPosition();
533
534			setTimeout(function() {
535				$('#primary-menu ul:not(.minicart ul), #primary-menu .minicart, #primary-menu .minisearch').each(function() {
536					var $item = $(this);
537					var self = this;
538					$item.removeClass('invert');
539					$item.removeClass('vertical-invert');
540					$item.css({top: ''});
541					if ($item.closest('.megamenu-enable').size() == 0 && $item.closest('.header-layout-overlay').size() == 0) {
542						if($item.offset().left - $('#page').offset().left + $item.outerWidth() > $('#page').width()) {
543							$item.addClass('invert');
544						}
545						if($('.header-main').first().hasClass('header-style-vertical')) {
546							if($item.offset().top - $('#site-header').offset().top + $item.outerHeight() > $(window).height()) {
547								$item.addClass('vertical-invert');
548								$item.css({ top: -($item.offset().top - $('#site-header').offset().top + $item.outerHeight() - $(window).height()) + 'px' });
549							}
550						} else if($item, $item.parents('#primary-menu ul').length) {
551							if($item.offset().top - $('#site-header').offset().top + $item.outerHeight() > $(window).height()) {
552								$item.addClass('vertical-invert');
553								$item.css({ top: -($item.offset().top - $('#site-header').offset().top + $item.outerHeight() - $(window).height()) + 'px' });
554							}
555						}
556					}
557				});
558			}, 50);
559
560			$('#primary-navigation').removeClass('without-transition');
561		}
562	}
563
564	if (window.gemMobileMenuType == 'default') {
565		$('#primary-navigation .submenu-languages').addClass('dl-submenu');
566	}
567	$('#primary-navigation > ul> li.menu-item-language').addClass('menu-item-parent');
568
569	fixMegaMenuWithSettings();
570
571	if (window.gemMobileMenuType == 'default') {
572		$('#primary-navigation').dlmenu({
573			animationClasses: {
574				classin : 'dl-animate-in',
575				classout : 'dl-animate-out'
576			},
577			onLevelClick: function (el, name) {
578				$('html, body').animate({ scrollTop : 0 });
579			},
580			backLabel: thegem_dlmenu_settings.backLabel,
581			showCurrentLabel: thegem_dlmenu_settings.showCurrentLabel
582		});
583	}
584	primary_menu_reinit();
585
586	$('.hamburger-toggle').click(function(e) {
587		e.preventDefault();
588		$(this).closest('#primary-navigation').toggleClass('hamburger-active');
589		$('.hamburger-overlay').toggleClass('active');
590	});
591
592	$('.overlay-toggle, .mobile-menu-layout-overlay .menu-toggle').click(function(e) {
593		e.preventDefault();
594		if($('.menu-overlay').hasClass('active')) {
595			$('.menu-overlay').removeClass('active');
596			$(this).closest('#primary-navigation').addClass('close');
597			$(this).closest('#primary-navigation').one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(e) {
598				$(this).closest('#primary-navigation').removeClass('overlay-active close');
599				$('.overlay-menu-wrapper').removeClass('active');
600			});
601		} else {
602			$('.overlay-menu-wrapper').addClass('active');
603			$(this).closest('#primary-navigation').off('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend');
604			$(this).closest('#primary-navigation').addClass('overlay-active').removeClass('close');
605			$('.menu-overlay').addClass('active');
606		}
607	});
608
609	$('.header-layout-overlay #primary-menu a, .mobile-menu-layout-overlay #primary-navigation.responsive #primary-menu a').on('click', function(e) {
610		//if(!$('#primary-menu').hasClass('no-responsive')) return ;
611
612		var $itemLink = $(this);
613		var $item = $itemLink.closest('li');
614		if($item.hasClass('menu-item-parent')) {
615			e.preventDefault();
616			if($item.hasClass('menu-overlay-item-open')) {
617				$(' > ul, .menu-overlay-item-open > ul', $item).each(function() {
618					$(this).css({height: $(this).outerHeight()+'px'});
619				});
620				setTimeout(function() {
621					$(' > ul, .menu-overlay-item-open > ul', $item).css({height: 0});
622					$('.menu-overlay-item-open', $item).add($item).removeClass('menu-overlay-item-open');
623				}, 50);
624			} else {
625				var $oldActive = $('#primary-navigation .menu-overlay-item-open').not($item.parents());
626				$('> ul', $oldActive).not($item.parents()).each(function() {
627					$(this).css({height: $(this).outerHeight()+'px'});
628				});
629				setTimeout(function() {
630					$('> ul', $oldActive).not($item.parents()).css({height: 0});
631					$oldActive.removeClass('menu-overlay-item-open');
632				}, 50);
633				$('> ul', $item).css({height: 'auto'});
634				var itemHeight = $('> ul', $item).outerHeight();
635				$('> ul', $item).css({height: 0});
636				setTimeout(function() {
637					$('> ul', $item).css({height: itemHeight+'px'});
638					$item.addClass('menu-overlay-item-open');
639					$('> ul', $item).one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function() {
640						$('> ul', $item).css({height: 'auto'});
641					});
642				}, 50);
643			}
644		}
645	});
646
647	$('.vertical-toggle').click(function(e) {
648		e.preventDefault();
649		$(this).closest('#site-header-wrapper').toggleClass('vertical-active');
650	});
651
652	$(function() {
653		$(window).resize(function() {
654			if (window.menuResizeTimeoutHandler) {
655				clearTimeout(window.menuResizeTimeoutHandler);
656			}
657			window.menuResizeTimeoutHandler = setTimeout(primary_menu_reinit, 50);
658		});
659	});
660
661	$('#primary-navigation a').click(function(e) {
662		var $item = $(this);
663		if($('#primary-menu').hasClass('no-responsive') && window.gemSettings.isTouch && $item.next('ul').length) {
664			e.preventDefault();
665		}
666	});
667})(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.