/** * File custom.js. * * Theme Custom enhancements for a better user experience. * */ // the semi-colon before the function invocation is a safety // net against concatenated scripts and/or other plugins // that are not closed properly. ; (function($, window, document, undefined) { 'use strict'; var BUDDYX = window.BUDDYX || {}; /** * Utility: Create a focus trap within a container. * Keeps keyboard focus within the container when TAB is pressed. * * @param {jQuery} $container - The container element to trap focus within. * @param {Event} e - The keydown event. * @return {boolean} Whether focus was trapped. */ BUDDYX.trapFocus = function($container, e) { if (e.key !== 'Tab') { return false; } var $focusable = $container.find('a, button, input, select, textarea, [tabindex]:not([tabindex="-1"])').filter(':visible'); if (!$focusable.length) { return false; } var $first = $focusable.first(); var $last = $focusable.last(); if (e.shiftKey) { if (document.activeElement === $first[0]) { e.preventDefault(); $last.focus(); return true; } } else { if (document.activeElement === $last[0]) { e.preventDefault(); $first.focus(); return true; } } return false; }; /** * Key code constants for keyboard navigation. * Using key names instead of deprecated keyCode. */ BUDDYX.keys = { ESCAPE: 'Escape', TAB: 'Tab', ENTER: 'Enter' }; // Site Loader BUDDYX.siteLoader = function() { $('.site-loader').addClass('loaded'); }; // Header Height BUDDYX.headerClass = function() { var $document = $(document), $elementHeader = $('body.sticky-header, .sticky-header .site-header-wrapper'), className = 'has-sticky-header'; $document.on('scroll', function() { $elementHeader.toggleClass(className, $document.scrollTop() >= 1); }); }; // Header Scroll BUDDYX.headerScroll = function() { var header_height = $('.site-header-wrapper').height(); if ($('body').hasClass('has-sticky-header')) { $('.site').css("paddingTop", header_height + 10 + "px"); } else { $('.site').css("paddingTop", 0 + "px"); } }; // Header Search BUDDYX.headerSearch = function() { $('.search-icon').on('click', function(e) { e.preventDefault(); $('.site-header .top-menu-search-container').toggle(); }); $(document).on('mouseup', function(e) { var container = $(".top-menu-search-container"); if (!container.is(e.target) && container.has(e.target).length === 0) { container.fadeOut(); } }); $("#primary-menu a, .cart a.menu-icons-wrapper, .bp-icon-wrap, a.user-link, .site-sub-header a, .site-wrapper a").on('focusin', function() { $('.site-header .top-menu-search-container').hide(); }); }; // Desktop Menu Toggle BUDDYX.desktopMenuToggle = function() { $('.buddyx-desktop-menu #primary-menu').superfish({ delay: 600, animation: { opacity: 'show' }, animationOut: { opacity: 'hide' }, speed: 'fast', speedOut: 'fast', cssArrows: false, disableHI: false, }); $("#primary-menu a, .desktop-icons a, .bp-icon-wrap").on('focusin', function() { $('.user-link-wrap').removeClass("active"); }); $(".site-title a, .bp-msg .bp-icon-wrap, .user-link-wrap .user-link, button.menu-toggle").on('focusin', function() { $('.user-notifications').removeClass("active"); }); $(".user-link-wrap .user-link").on('focusin', function() { $(this).parent().removeClass("active"); $(this).parent().addClass("active"); }); $(document).on('click', '.user-link-wrap .user-link', function(e) { var container = $(".user-link-wrap"); container.removeClass('active'); }); $('.user-notifications .bp-icon-wrap').on('click', function(e) { e.preventDefault(); $(this).parent().toggleClass('active'); }); $(document).on('click', function(e) { if (!$(e.target).closest('.user-notifications').length) { $('.user-notifications').removeClass('active'); } }); $(".user-link-wrap ul#user-profile-menu > li:last-child a").on('focusout', function() { $('.user-link-wrap').removeClass("active"); }); $(".buddyx-mobile-menu").on('focusout', function() { $('.mobile-menu-heading .close-menu').trigger('focusin'); }); }; // Mobile Menu Toggle BUDDYX.mobileNav = function() { var widget = $('.menu-toggle'), body = $('body'), menuTriggerElement = null; widget.on('click', function(e) { e.preventDefault(); if (isOpened()) { closeWidget(); } else { menuTriggerElement = this; setTimeout(function() { openWidget(); }, 10); } }); body.on("click touchstart", ".mobile-menu-close", function() { if (isOpened()) { closeWidget(); } }); body.on("click", ".menu-close", function(e) { e.preventDefault(); if (isOpened()) { closeWidget(); } }); $(document).on('keyup', function(e) { if (e.key === BUDDYX.keys.ESCAPE && isOpened()) { closeWidget(); } }); // Focus trap for mobile menu - uses shared utility $(document).on('keydown', function(e) { if (!isOpened()) { return; } BUDDYX.trapFocus($('.buddyx-mobile-menu'), e); }); var closeWidget = function() { $('body').removeClass('mobile-menu-opened'); // Return focus to trigger element if (menuTriggerElement) { $(menuTriggerElement).focus(); menuTriggerElement = null; } }; var openWidget = function() { $('body').addClass('mobile-menu-opened'); // Focus first focusable element in mobile menu setTimeout(function() { var $mobileMenu = $('.buddyx-mobile-menu'); var $focusable = $mobileMenu.find('a, button, input, [tabindex]:not([tabindex="-1"])').filter(':visible'); if ($focusable.length) { $focusable.first().focus(); } }, 100); }; var isOpened = function() { return $('body').hasClass('mobile-menu-opened'); }; }; // Blog Layout BUDDYX.blogLayout = function() { $('.buddyx-article--masonry:not(.without-masonry)').isotope({ itemSelector: '.buddyx-article-col', percentPosition: true, masonry: { // use outer width of grid-sizer for columnWidth columnWidth: '.buddyx-grid-sizer', } }); }; // fitVids BUDDYX.fitVids = function() { // LearnDash Player fix if ( $( '.ld-video iframe' ).length > 0 ) { $( '.ld-video iframe' ).addClass( 'fitvidsignore' ); } // Tutor Player fix if ( $( '.tutor-video-player iframe' ).length > 0 ) { $( '.tutor-video-player iframe' ).addClass( 'fitvidsignore' ); } var doFitVids = function() { setTimeout( function() { var youtubeSelector = 'iframe[src*="youtube"]'; var vimeoSelector = ''; if ( ! $( '.tutor-course-details-page' ).length > 0 && ! $( '.tutor-course-single-content-wrapper' ).length > 0 ) { vimeoSelector = 'iframe[src*="vimeo"]'; } var dynamicSelector = youtubeSelector + ( vimeoSelector ? ',' + vimeoSelector : '' ); $( dynamicSelector ).parent().fitVids(); }, 300 ); }; doFitVids(); // Unbind previous before binding new to prevent duplicate handlers $( document ).off('ajaxComplete.buddyxFitVids').on('ajaxComplete.buddyxFitVids', function() { if ( !$( '.elementor-popup-modal .elementor-widget-video' ).length ) { doFitVids(); } $( '.elementor-video-container' ).addClass( 'fitvidsignore' ); } ); var doFitVidsOnLazyLoad = function( event, data ) { if ( typeof data !== 'undefined' && typeof data.element !== 'undefined' ) { // load iframe in correct dimension if ( data.element.getAttribute( 'data-lazy-type' ) == 'iframe' ) { doFitVids(); } } }; $( document ).on( 'bp_nouveau_lazy_load', doFitVidsOnLazyLoad ); }; // stickySidebar BUDDYX.stickySidebar = function() { var headerHeight = $('.site-header-wrapper').outerHeight(); var offsetTop = 32; // Calculate the offset based on the presence of sticky-header and admin-bar classes if ($('body').hasClass('sticky-header') && $('body').hasClass('admin-bar')) { offsetTop = headerHeight + 62; } else if ($('body').hasClass('sticky-header')) { offsetTop = headerHeight + 32; } else { offsetTop = headerHeight; } // Check the window width and apply sticky sidebar accordingly if (window.innerWidth > 959) { $('.sticky-sidebar-enable .sticky-sidebar').stick_in_parent({ offset_top: offsetTop, spacer: false // Remove the trailing comma here }); } else { $('.sticky-sidebar-enable .sticky-sidebar').trigger('sticky_kit:detach'); } // Recalculate sticky sidebar position after an Ajax call is completed if ($('.sticky-sidebar-enable .sticky-sidebar').length > 0) { $(document).on('ajaxComplete', function(event, request, settings) { setTimeout(function() { $(document.body).trigger('sticky_kit:recalc'); }, 150); }); } }; // tableDataAtt BUDDYX.tableDataAtt = function() { if ($('table').length) { var $th = $("thead th"); $('tbody tr td').attr('data-attr', function() { return $th.eq($(this).index()).text(); }); } }; // Gallery Slider BUDDYX.galleryPostSlider = function() { $('.buddyx-gallery-block .gallery').each(function() { var obj_rtl; if ($('body').hasClass("rtl")) { obj_rtl = true; } else { obj_rtl = false; } $('.buddyx-article--default .buddyx-gallery-block .gallery').slick({ infinite: false, slidesToShow: 4, slidesToScroll: 1, nextArrow: '', prevArrow: '', rtl: obj_rtl, responsive: [{ breakpoint: 768, settings: { slidesToShow: 2 } }, { breakpoint: 480, settings: { slidesToShow: 1 } } ] }); $('.buddyx-post-section .buddyx-gallery-block .gallery').slick({ infinite: false, slidesToShow: 2, slidesToScroll: 1, nextArrow: '', prevArrow: '', rtl: obj_rtl, responsive: [{ breakpoint: 480, settings: { slidesToShow: 1 } }] }); $('.buddyx-article--list .buddyx-gallery-block .gallery, .buddyx-article--masonry .buddyx-gallery-block .gallery, .buddyx-section-half .buddyx-gallery-block .gallery').slick({ infinite: false, slidesToShow: 1, slidesToScroll: 1, nextArrow: '', prevArrow: '', rtl: obj_rtl }); }); }; $(function() { BUDDYX.headerClass(); BUDDYX.headerSearch(); BUDDYX.desktopMenuToggle(); BUDDYX.mobileNav(); BUDDYX.stickySidebar(); BUDDYX.fitVids(); BUDDYX.tableDataAtt(); BUDDYX.galleryPostSlider(); }); $(window).on('resize', function() { // do stuff BUDDYX.headerClass(); }); $(window).on('scroll', function() { // do stuff BUDDYX.headerScroll(); }); $(window).on('load', function() { BUDDYX.headerClass(); BUDDYX.siteLoader(); BUDDYX.blogLayout(); }); })(jQuery, window, document);