File: /home/alfouzantranspor/www/wp-content/themes/businessexpo/assets/js/menu.js
(function() {
// Check if target matches to an element.
function businessexpoTargetMatches(selector) {
return event.target.matches ? event.target.matches(selector) : event.target.msMatchesSelector(selector);
}
// Get next sibling.
function businessexpoNextSibling(element) {
do {
element = element.nextSibling;
} while (element && element.nodeType !== 1);
return element;
}
// Handle sub-menu arrow clicks.
function businessexpoSubMenuArrowClick(subMenuArrow, subMenuArrows, subMenus) {
var businessexpoSubMenu = businessexpoNextSibling(subMenuArrow);
if(businessexpoSubMenu) {
// Accessibility support for dropdown menu.
var businessexpoSubMenuLink = subMenuArrow.previousSibling;
businessexpoSetTabIndex(subMenus, -1);
if(businessexpoSubMenu.classList.contains('sub-menu--open')) {
subMenuArrow.classList.remove('sub-menu-show');
businessexpoSubMenu.classList.remove('sub-menu--open');
businessexpoSubMenuLink.setAttribute('aria-expanded', 'false');
subMenuArrow.getElementsByClassName('menu-arrow-button-hide')[0].setAttribute('aria-hidden', 'true');
subMenuArrow.getElementsByClassName('menu-arrow-button-show')[0].setAttribute('aria-hidden', 'false');
} else {
if(subMenus.length) {
[].forEach.call(subMenus, function(el) {
el.classList.remove('sub-menu--open');
});
}
if(subMenuArrows.length) {
for(var i = 0; i < subMenuArrows.length; i++) {
subMenuArrows[i].classList.remove('sub-menu-show');
subMenuArrows[i].previousSibling.setAttribute('aria-expanded', 'false');
subMenuArrows[i].getElementsByClassName('menu-arrow-button-hide')[0].setAttribute('aria-hidden', 'true');
subMenuArrows[i].getElementsByClassName('menu-arrow-button-show')[0].setAttribute('aria-hidden', 'false');
}
}
subMenuArrow.classList.add('sub-menu-show');
businessexpoSubMenu.classList.add('sub-menu--open');
businessexpoSubMenuLink.setAttribute('aria-expanded', 'true');
subMenuArrow.getElementsByClassName('menu-arrow-button-hide')[0].setAttribute('aria-hidden', 'false');
subMenuArrow.getElementsByClassName('menu-arrow-button-show')[0].setAttribute('aria-hidden', 'true');
businessexpoSetTabIndex(businessexpoSubMenu, 0);
businessexpoSetTabIndex(businessexpoSubMenu.querySelectorAll('.sub-menu'), -1);
}
}
}
// Setup mobile menu.
function businessexpoMobileMenu() {
document.addEventListener('click', function(event) {
if(businessexpoTargetMatches('.menu-toggle')) {
event.preventDefault();
var businessexpoNavIcon = event.target || event.srcElement;
var businessexpoMainNav = document.querySelector('.main-navigation > .primary-menu-container');
// Slide mobile menu.
businessexpoNavIcon.classList.toggle('menu-toggle--open');
businessexpoMainNav.classList.toggle('primary-menu-container--open');
if(businessexpoNavIcon.classList.contains('menu-toggle--open')) {
businessexpoNavIcon.setAttribute('aria-expanded', 'true');
businessexpoSetTabIndex(document.querySelector('.main-navigation .menu'), 0);
businessexpoSetTabIndex(document.querySelectorAll('.main-navigation .sub-menu'), -1);
} else {
businessexpoNavIcon.setAttribute('aria-expanded', 'false');
}
} else if(businessexpoTargetMatches('.main-navigation .menu .sub-menu li.menu-item-has-children > .menu-arrow-button')) {
event.preventDefault();
var businessexpoSubMenuArrow1 = event.target || event.srcElement;
var businessexpoSubMenuArrows1 = document.querySelectorAll('.main-navigation .menu .sub-menu > li.menu-item-has-children > .menu-arrow-button');
var businessexpoSubMenus1 = document.querySelectorAll('.main-navigation .menu .sub-menu > li.menu-item-has-children > .sub-menu');
businessexpoSubMenuArrowClick(businessexpoSubMenuArrow1, businessexpoSubMenuArrows1, businessexpoSubMenus1);
} else if(businessexpoTargetMatches('.main-navigation .menu li.menu-item-has-children > .menu-arrow-button')) {
event.preventDefault();
var businessexpoSubMenuArrow2 = event.target || event.srcElement;
var businessexpoSubMenuArrows2 = document.querySelectorAll('.main-navigation .menu > li.menu-item-has-children > .menu-arrow-button');
var businessexpoSubMenus2 = document.querySelectorAll('.main-navigation .menu > li.menu-item-has-children > .sub-menu');
businessexpoSubMenuArrowClick(businessexpoSubMenuArrow2, businessexpoSubMenuArrows2, businessexpoSubMenus2);
} else {
var businessexpoSubMenuArrows3 = document.querySelectorAll('.main-navigation .menu > li.menu-item-has-children > .menu-arrow-button');
var businessexpoSubMenus3 = document.querySelectorAll('.main-navigation .menu > li.menu-item-has-children > .sub-menu');
if(businessexpoSubMenus3.length) {
[].forEach.call(businessexpoSubMenus3, function(el) {
el.classList.remove('sub-menu--open');
});
}
if(businessexpoSubMenuArrows3.length) {
for(var i = 0; i < businessexpoSubMenuArrows3.length; i++) {
businessexpoSubMenuArrows3[i].classList.remove('sub-menu-show');
businessexpoSubMenuArrows3[i].previousSibling.setAttribute('aria-expanded', 'false');
businessexpoSubMenuArrows3[i].getElementsByClassName('menu-arrow-button-hide')[0].setAttribute('aria-hidden', 'true');
businessexpoSubMenuArrows3[i].getElementsByClassName('menu-arrow-button-show')[0].setAttribute('aria-hidden', 'false');
}
}
businessexpoSetTabIndex(document.querySelectorAll('.main-navigation .sub-menu'), -1);
}
});
}
// Mobile menu.
businessexpoMobileMenu();
var businessexpoFocusableElements = 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])';
// Set tabindex of focusable elements.
function businessexpoSetTabIndex(element, value) {
if(NodeList.prototype.isPrototypeOf(element)) {
[].forEach.call(element, function(el) {
[].forEach.call(el.querySelectorAll(businessexpoFocusableElements), function(el) {
el.setAttribute('tabindex', value);
});
});
} else {
[].forEach.call(element.querySelectorAll(businessexpoFocusableElements), function(el) {
el.setAttribute('tabindex', value);
});
}
}
businessexpoSetTabIndex(document.querySelectorAll('.main-navigation .sub-menu'), -1);
document.addEventListener('keydown', function(event) {
var businessexpoIsTabPressed = ('Tab' === event.key || 9 === event.keyCode);
if(!businessexpoIsTabPressed) {
return;
}
var businessexpoNavIcon = document.querySelector('.menu-toggle');
if(businessexpoNavIcon && ('none' !== getComputedStyle(businessexpoNavIcon, null).display)) {
if(!businessexpoNavIcon.classList.contains('menu-toggle--open')) {
businessexpoSetTabIndex(document.querySelector('.main-navigation .menu'), -1);
}
if(!event.shiftKey) {
if(!document.activeElement.classList || !document.activeElement.classList.contains('sub-menu-show')) {
var businessexpoActiveElementArrow = businessexpoNextSibling(document.activeElement);
if(!businessexpoActiveElementArrow || (businessexpoActiveElementArrow.classList && !businessexpoActiveElementArrow.classList.contains('menu-arrow-button'))) {
var businessexpoActiveElementSibling = businessexpoNextSibling(document.activeElement.parentNode);
if(!businessexpoActiveElementSibling && document.activeElement.parentNode.parentNode.id && 'primary-menu' === document.activeElement.parentNode.parentNode.id) {
var businessexpoMenuFocusableElements = document.activeElement.parentNode.parentNode.querySelectorAll(businessexpoFocusableElements);
if(businessexpoMenuFocusableElements.length > 0) {
event.preventDefault();
businessexpoNavIcon.focus();
}
}
}
}
} else {
if(document.activeElement.classList && document.activeElement.classList.contains('menu-toggle--open')) {
var businessexpoLastMenuItemArrowButton = document.querySelector('.main-navigation .menu > li:last-child > .menu-arrow-button');
if(businessexpoLastMenuItemArrowButton) {
businessexpoLastMenuItemArrowButton.focus();
event.preventDefault();
} else {
var businessexpoLastMenuItemAnchor = document.querySelector('.main-navigation .menu > li:last-child > a');
if(businessexpoLastMenuItemAnchor) {
businessexpoLastMenuItemAnchor.focus();
event.preventDefault();
}
}
}
}
}
if(!event.shiftKey) {
if(!document.activeElement.classList || !document.activeElement.classList.contains('sub-menu-show')) {
var businessexpoActiveElementArrow = businessexpoNextSibling(document.activeElement);
if(!businessexpoActiveElementArrow || (businessexpoActiveElementArrow.classList && !businessexpoActiveElementArrow.classList.contains('menu-arrow-button'))) {
var businessexpoActiveElementSibling = businessexpoNextSibling(document.activeElement.parentNode);
if(!businessexpoActiveElementSibling && document.activeElement.parentNode.parentNode.classList && document.activeElement.parentNode.parentNode.classList.contains('sub-menu--open')) {
var subMenuFocusableElements = document.activeElement.parentNode.parentNode.querySelectorAll(businessexpoFocusableElements);
if(subMenuFocusableElements.length > 0) {
event.preventDefault();
subMenuFocusableElements[0].focus();
}
}
}
}
}
});
// Sticky menu.
var businessexpoMainMenuSticky = document.querySelector('.site-menu-content--sticky');
if(businessexpoMainMenuSticky) {
var businessexpoAfterMainMenu = businessexpoNextSibling(businessexpoMainMenuSticky);
if(businessexpoAfterMainMenu) {
var businessexpoSiteContent = businessexpoAfterMainMenu;
} else {
var businessexpoSiteContent = document.getElementById('site-content');
}
var businessexpoSiteContentMarginTop = window.getComputedStyle(businessexpoSiteContent, null).marginTop;
var businessexpoStickyMenuHeight = businessexpoMainMenuSticky.offsetHeight;
var businessexpoStickyMenuClass = 'sticky-menu';
var businessexpoStickyMenuInViewClass = 'sticky-menu-in-view';
var businessexpoHeaderHeight = document.querySelector('.site-menu-content').offsetHeight;
window.addEventListener('scroll', function() {
if(window.pageYOffset > businessexpoHeaderHeight) {
businessexpoMainMenuSticky.classList.add(businessexpoStickyMenuClass);
businessexpoSiteContent.style.marginTop = businessexpoStickyMenuHeight + 'px';
} else {
businessexpoMainMenuSticky.classList.remove(businessexpoStickyMenuClass);
businessexpoSiteContent.style.marginTop = businessexpoSiteContentMarginTop;
}
if(window.pageYOffset > (businessexpoHeaderHeight * 1)) {
businessexpoMainMenuSticky.classList.add(businessexpoStickyMenuInViewClass);
} else {
businessexpoMainMenuSticky.classList.remove(businessexpoStickyMenuInViewClass);
}
});
}
// Utility function.
function businessexpoUtil() {}
// Smooth scroll.
businessexpoUtil.scrollTo = function(final, duration, cb) {
var businessexpoStart = window.scrollY || document.documentElement.scrollTop,
businessexpoCurrentTime = null;
var businessexpoAnimateScroll = function(timestamp) {
if(!businessexpoCurrentTime) {
businessexpoCurrentTime = timestamp;
}
var businessexpoProgress = timestamp - businessexpoCurrentTime;
if(businessexpoProgress > duration) {
businessexpoProgress = duration;
}
var businessexpoVal = Math.easeInOutQuad(businessexpoProgress, businessexpoStart, final - businessexpoStart, duration);
window.scrollTo(0, businessexpoVal);
if(businessexpoProgress < duration) {
window.requestAnimationFrame(businessexpoAnimateScroll);
} else {
cb && cb();
}
};
window.requestAnimationFrame(businessexpoAnimateScroll);
};
// Animation curves.
Math.easeInOutQuad = function (t, b, c, d) {
t /= d/2;
if(t < 1) return c/2*t*t + b;
t--;
return -c/2 * (t*(t-2) - 1) + b;
};
// Back to top.
var businessexpoBackTop = document.querySelector('.back-to-top');
if(businessexpoBackTop) {
var businessexpoOffset = 300;
var businessexpoOffsetOpacity = 1200;
var businessexpoScrollDuration = 700;
var businessexpoScrolling = false;
window.addEventListener('scroll', function() {
if(!businessexpoScrolling) {
businessexpoScrolling = true;
(!window.requestAnimationFrame) ? setTimeout(businessexpoCheckBackToTop, 250) : window.requestAnimationFrame(businessexpoCheckBackToTop);
}
});
document.addEventListener('click', function(event) {
if(businessexpoTargetMatches('.back-to-top')) {
event.preventDefault();
(!window.requestAnimationFrame) ? window.scrollTo(0, 0) : businessexpoUtil.scrollTo(0, businessexpoScrollDuration);
}
});
}
function businessexpoCheckBackToTop() {
var businessexpoWindowTop = window.scrollY || document.documentElement.scrollTop;
( businessexpoWindowTop > businessexpoOffset ) ? businessexpoBackTop.classList.add('back-to-top--show') : businessexpoBackTop.classList.remove('back-to-top--show', 'back-to-top--fade-out');
( businessexpoWindowTop > businessexpoOffsetOpacity ) && businessexpoBackTop.classList.add('back-to-top--fade-out');
businessexpoScrolling = false;
}
})();