File: //home/cssnet.org.uk/public_html-20250117120511/wp-content/themes/hestia/assets/js/src/scripts.js
/**
* Main scripts file
*
* @package Hestia
*/
/* global jQuery */
/* global Hammer */
/* global AOS */
/* global requestpost */
(function ( $ ) {
$.hestiaFeatures = {
/**
* Initalize masonry for blog.
*/
'initMasonry': function () {
if ( typeof requestpost === 'undefined' ) {
return;
}
if ( !requestpost.masonry ) {
return;
}
$( '.post-grid-display' ).masonry( {
// set itemSelector so .grid-sizer is not used in layout
itemSelector: '.card-no-width',
// use element for option
columnWidth: '.card-no-width',
percentPosition: true
} );
},
/**
* Initialize animations.
*/
'initAnimations': function () {
if ( typeof AOS !== 'undefined' ) {
var aosOpt = {
offset: 250,
delay: 300,
duration: 900,
once: true,
disable: 'mobile'
};
AOS.init( aosOpt );
}
},
/**
* Enable tooltips
* https://getbootstrap.com/docs/4.1/components/tooltips/
*/
'initTooltips': function () {
$( '[data-toggle="tooltip"], [rel="tooltip"]' ).tooltip();
}
};
$.utilitiesFunctions = {
/**
* Returns a function, that, as long as it continues to be invoked, will not
* be triggered. The function will be called after it stops being called for
* N milliseconds. If `immediate` is passed, trigger the function on the
* leading edge, instead of the trailing.
*/
'debounce': function ( func, wait, immediate ) {
var timeout;
return function () {
var context = this, args = arguments;
var later = function () {
timeout = null;
if ( !immediate ) {
func.apply( context, args );
}
};
var callNow = immediate && !timeout;
clearTimeout( timeout );
timeout = setTimeout( later, wait );
if ( callNow ) {
func.apply( context, args );
}
};
},
/**
* Determine if a class is in viewport or not.
* @param elem
* @returns {boolean}
*/
'isElementInViewport': function ( elem ) {
var $elem = $( elem );
// Get the scroll position of the page.
var viewportTop = $( window ).scrollTop();
var viewportBottom = viewportTop + $( window ).height();
// Get the position of the element on the page.
var elemTop = Math.round( $elem.offset().top );
var elemBottom = elemTop + $elem.height();
return ((elemTop < viewportBottom) && (elemBottom > viewportTop));
},
/**
* Get navbar height.
* @returns {*}
*/
'verifyNavHeight': function () {
var window_width = $( window ).width();
var navHeight;
if ( window_width < 768 ) {
navHeight = $( '.navbar' ).outerHeight();
} else {
navHeight = ($( '.navbar' ).outerHeight() - 15);
}
return navHeight;
},
/**
* Get window width
*/
'getWidth': function () {
if ( this.innerWidth ) {
return this.innerWidth;
}
if ( document.documentElement && document.documentElement.clientWidth ) {
return document.documentElement.clientWidth;
}
if ( document.body ) {
return document.body.clientWidth;
}
},
/**
* Add control-label for each contact form field
*/
'addControlLabel': function ( field ) {
var placeholderField = field.attr( 'placeholder' );
field.removeAttr( 'placeholder' );
$( '<label class="control-label"> ' + placeholderField + ' </label>' ).insertBefore( field );
}
};
$.hestia = {
'init': function () {
this.navSearch();
this.getPortfolioModalData();
this.fixHeaderPadding();
this.headerSpacingFrontpage();
this.initCarousel();
this.initCarouselSwipe();
this.scrollToTop();
this.detectIos();
this.parallaxHeader();
this.addViewCart();
this.setSearchSizeInput();
this.setControlLabel();
this.styleDefaultSubscribeWidget();
this.fixElementorTemplates();
this.handleGutenbergAlignment();
},
/**
* Fix elementor templates.
*/
'fixElementorTemplates': function () {
if ( $( '.elementor' ).length <= 0 ) {
return false;
}
var navHeight = $( '.navbar' ).outerHeight();
$( '.elementor-template-full-width header' ).css( 'margin-bottom', navHeight );
$( '.page-template-template-fullwidth .main.classic-blog' ).css( 'margin-top', navHeight );
return false;
},
/**
* Animation for search in menu.
*/
'navSearch': function () {
$( '.hestia-toggle-search' ).on( 'click', function () {
$( '.navbar' ).toggleClass( 'nav-searching' );
var navSearching = $( '.nav-searching' );
navSearching.find( '.hestia-nav-search' ).addClass( 'is-focused' );
navSearching.find( '.hestia-nav-search' ).find( '.search-field' ).focus();
$( this ).find( 'i' )
.fadeOut( 200, function () {
$( this ).toggleClass( 'fa-search' );
$( this ).toggleClass( 'fa-times' );
} ).fadeIn( 200 );
} );
},
/**
* This function is used for grabbing post content via Ajax.
* It triggers when the modal is open.
*/
'getPortfolioModalData': function () {
$( '#portfolio' ).find( 'a[data-toggle="modal"]' ).on( 'click', function ( e ) {
e.preventDefault();
var pid = $( this ).data( 'pid' );
$.ajax(
{
url: requestpost.ajaxurl,
type: 'post',
data: {
action: 'hestia_get_portfolio_item_data',
pid: pid
},
success: function ( result ) {
var modal = $( '.hestia-portfolio-modal' );
modal.find( '.modal-content' ).html( result );
modal.on( 'hidden.bs.modal', function () {
var html = '<div class="portfolio-loading text-center"><i class="fa fa-3x fa-spin fa-circle-o-notch"></i></div>';
$( this ).find( '.modal-content' ).html( html );
} );
}
}
);
} );
},
/**
* Add padding in post/page header
*/
'fixHeaderPadding': function () {
/**
* This code is related to hestia_header_layout control.
* Handle the classic blog header layout.
*
* Because of the scroll bar on Windows, $( window ).width() is not the same with the media query, so we
* need matchMedia to target the media queries.
* See more info here: https://www.sitepoint.com/javascript-media-queries/
*
* - On mobile < 600px with admin bar (which becomes fixed) we have to adjust the margin of the content container
* so that the navigation bar doesn't overlap it.
* - In all other cases we should just adjust the margin with the navigation bar height.
*/
var navbar_height = $( '.navbar-fixed-top' ).outerHeight();
var mobile_media = window.matchMedia( '(max-width: 600px)' );
if ( $( '#wpadminbar' ).length && mobile_media.matches ) {
$( '.wrapper.classic-blog' ).find( '.main' ).css( 'margin-top', navbar_height - 46 );
$( '.carousel .item .container' ).css( 'padding-top', navbar_height + 50 - 46 );
if ( $( '.home.page.page-template-default .navbar' ).hasClass( 'no-slider' ) ) {
$( '.home.page.page-template-default .main' ).css( 'margin-top', navbar_height - 46 );
}
} else {
$( '.header-layout-classic-blog' ).find( '.main' ).css( 'margin-top', navbar_height );
$( '.carousel .item .container' ).css( 'padding-top', navbar_height + 50 );
if ( $( '.home.page.page-template-default .navbar' ).hasClass( 'no-slider' ) ) {
$( '.home.page.page-template-default .main' ).css( 'margin-top', navbar_height );
}
}
if ( $( window ).width() > 768 ) {
var beaver_offset = 40;
if ( $( '.wrapper.classic-blog' ).length < 1 ) {
$( '.pagebuilder-section' ).css( 'padding-top', navbar_height );
} else {
$( '.pagebuilder-section' ).css( 'padding-top', 0 );
}
$( '.fl-builder-edit .pagebuilder-section' ).css( 'padding-top', navbar_height + beaver_offset );
$( '.page-header.header-small .container' ).css( 'padding-top', navbar_height + 100 );
var headerHeight = $( '.single-product .page-header' ).height();
var offset = headerHeight + 100;
$( '.single-product .page-header.header-small .container' ).css( 'padding-top', headerHeight - offset );
var marginOffset = headerHeight - navbar_height - 172;
$( '.woocommerce.single-product:not(.header-layout-classic-blog) .blog-post .col-md-12 > div[id^=product].product' ).css( 'margin-top', -marginOffset );
} else {
$( '.page-header.header-small .container , .woocommerce.single-product .blog-post .col-md-12 > div[id^=product].product' ).removeAttr( 'style' );
}
if ( $( '.no-content' ).length ) {
$( '.page-header.header-small' ).css( 'min-height', navbar_height + 230 );
}
},
/**
* Calculate height for .page-header on front page
*/
'headerSpacingFrontpage': function () {
if ( this.inIframe() && this.isMobileUA() ) {
return;
}
if ( $( '.home .carousel' ).length > 0 ) {
var pageHeader = $( '.page-header' ),
windowWidth = $( window ).width(),
windowHeight = $( window ).height();
if ( windowWidth > 768 ) {
pageHeader.css( 'min-height', (windowHeight * 0.9) ); // 90% of window height
} else {
pageHeader.css( 'min-height', (windowHeight) );
}
}
},
'inIframe': function () {
if ( window.self !== window.top ) {
return true;
}
return false;
},
'isMobileUA': function () {
return navigator.userAgent.match( /(iPhone|iPod|iPad|Android|BlackBerry|BB10|mobi|tablet|opera mini|nexus 7)/i );
},
/**
* Init Carousel
*/
'initCarousel': function () {
var settings = {
interval: 10000
};
/**
* Deactivate carousel slide if disable autoslide option in customizer is checked.
*/
if ( typeof requestpost.disable_autoslide !== 'undefined' && requestpost.disable_autoslide === '1' ) {
settings.interval = false;
}
/**
* Invert carousel buttons in RTL mode
*/
if ( $( 'body.rtl' ).length !== 0 ) {
$( '.carousel-control.left' ).click(
function () {
$( '.carousel' ).carousel( 'next' );
}
);
$( '.carousel-control.right' ).click(
function () {
$( '.carousel' ).carousel( 'prev' );
}
);
}
$( '.carousel' ).carousel(
settings
);
},
/**
* Init Carousel Swipe on touch devices.
*/
'initCarouselSwipe': function () {
if ( typeof Hammer === 'undefined' ) {
return;
}
var hammerLeft = 'swipeleft',
hammerRight = 'swiperight';
// RTL
if ( $( 'body.rtl' ).length !== 0 ) {
hammerLeft = 'swiperight';
hammerRight = 'swipeleft';
}
// Add swipe support on carousel
if ( $( '#carousel-hestia-generic' ).length !== 0 ) {
var hestiaCarousel = document.getElementById( 'carousel-hestia-generic' );
Hammer( hestiaCarousel ).on(
hammerLeft, function () {
$( '.carousel' ).carousel( 'next' );
}
);
Hammer( hestiaCarousel ).on(
hammerRight, function () {
$( '.carousel' ).carousel( 'prev' );
}
);
}
},
/**
* Scroll to top feature
*/
'scrollToTop': function () {
var showScrollToTop = 0;
$( window ).on( 'scroll', function () {
var y_scroll_pos = window.pageYOffset;
var headerElement = $( '.page-header' );
var scroll_pos_test = 0;
if ( headerElement.length > 0 ) {
scroll_pos_test = headerElement.height();
} else {
headerElement = $( '.container' );
scroll_pos_test = headerElement.offset().top - $( '.navbar' ).height();
scroll_pos_test = scroll_pos_test > 0 ? scroll_pos_test : 0;
}
if ( y_scroll_pos >= scroll_pos_test && showScrollToTop === 0 ) {
$( '.hestia-scroll-to-top' ).addClass( 'hestia-fade' );
showScrollToTop = 1;
}
if ( y_scroll_pos <= scroll_pos_test && showScrollToTop === 1 ) {
$( '.hestia-scroll-to-top' ).removeClass( 'hestia-fade' );
showScrollToTop = 0;
}
} );
$( '.hestia-scroll-to-top' ).on( 'click', function () {
window.scroll( {
top: 0,
behavior: 'smooth'
} );
} );
},
/**
* Woo sidebar toggle
*/
'sidebarToggle': function () {
// Sidebar toggle
if ( $( '.blog-sidebar-wrapper,.shop-sidebar-wrapper' ).length <= 0 ) {
return;
}
$( '.hestia-sidebar-open' ).click( function () {
$( '.sidebar-toggle-container' ).addClass( 'sidebar-open' );
}
);
$( '.hestia-sidebar-close' ).click(
function () {
$( '.sidebar-toggle-container' ).removeClass( 'sidebar-open' );
}
);
},
/**
* Detect if browser is iPhone or iPad then add body class
*/
'detectIos': function () {
if ( $( '.hestia-about' ).length > 0 || $( '.hestia-ribbon' ).length > 0 ) {
var iOS = /iPad|iPhone|iPod/.test( navigator.userAgent ) && !window.MSStream;
if ( iOS ) {
$( 'body' ).addClass( 'is-ios' );
}
}
},
/**
* Parallax on blog/archive/page header image
*/
'parallaxHeader': function () {
if ( $( '.header-footer-elementor' ).length > 0 ) {
return;
}
if ( $( '.elementor-location-header' ).length > 0 ) {
return;
}
if ( $( '.fl-theme-builder-header' ).length > 0 ) {
return;
}
var window_width = $( window ).width();
if ( window_width < 768 ) {
return;
}
var big_image = $( '.page-header[data-parallax="active"]' );
if ( big_image.length !== 0 ) {
$( window ).on(
'scroll', function () {
if ( $.utilitiesFunctions.isElementInViewport( big_image ) ) {
var oVal = ($( window ).scrollTop() / 3);
big_image.css(
{
'transform': 'translate3d(0,' + oVal + 'px,0)',
'-webkit-transform': 'translate3d(0,' + oVal + 'px,0)',
'-ms-transform': 'translate3d(0,' + oVal + 'px,0)',
'-o-transform': 'translate3d(0,' + oVal + 'px,0)'
}
);
}
}
);
}
},
/**
* Add view cart button in its place after adding a product in cart.
*/
'addViewCart': function () {
/**
* Mutation observer for cart button.
*
* @param {MutationRecord[]} mutationsList List of mutations
*/
var mutationCallback = function(mutationsList) {
for (var i = 0; i < mutationsList.length; i++) {
var mutation = mutationsList[i];
if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
Array.prototype.forEach.call(
mutation.addedNodes,
function(
/**
* Node that had a mutation in DOM.
*
* @type {Node}
*/
node
) {
if ( typeof node.classList === 'undefined' || typeof node.parentElement === 'undefined' ) {
return;
}
if (node.classList.contains('added_to_cart') && !node.parentElement.classList.contains('hestia-view-cart-wrapper')) {
var wrapper = document.createElement('div');
wrapper.classList.add('hestia-view-cart-wrapper');
node.parentNode.insertBefore(wrapper, node);
wrapper.appendChild(node);
}
});
}
}
};
var observer = new MutationObserver(mutationCallback);
observer.observe(document, { subtree: true, childList: true });
},
/**
* Add size for each search input in top-bar
*/
'setSearchSizeInput': function () {
if ( $( '.hestia-top-bar' ).find( 'input[type=search]' ).length > 0 ) {
$( '.hestia-top-bar input[type=search]' ).each(
function () {
$( this ).attr( 'size', $( this ).parent().find( '.control-label' ).text().replace( / |…/g, '' ).length );
}
);
}
},
/**
* Add control-label for each contact form field
*/
'setControlLabel': function () {
var searchForm = $( '.search-form label' );
if ( typeof (searchForm) !== 'undefined' ) {
var searchField = $( searchForm ).find( '.search-field' );
if ( $( searchField ).attr( 'value' ) === '' ) {
$( searchForm ).addClass( 'label-floating is-empty' );
} else {
$( searchForm ).addClass( 'label-floating' );
}
$.utilitiesFunctions.addControlLabel( searchField );
}
var wooSearchForm = $( '.woocommerce-product-search' );
if ( typeof (wooSearchForm) !== 'undefined' ) {
var wooSearchField = $( wooSearchForm ).find( '.search-field' );
if ( $( wooSearchField ).attr( 'value' ) === '' ) {
$( wooSearchForm ).addClass( 'label-floating is-empty' );
} else {
$( wooSearchForm ).addClass( 'label-floating' );
}
$.utilitiesFunctions.addControlLabel( wooSearchField );
}
if ( typeof $( '.contact_submit_wrap' ) !== 'undefined' ) {
$( '.pirate-forms-submit-button' ).addClass( 'btn btn-primary' );
}
if ( typeof $( '.form_captcha_wrap' ) !== 'undefined' ) {
if ( $( '.form_captcha_wrap' ).hasClass( 'col-sm-4' ) ) {
$( '.form_captcha_wrap' ).removeClass( 'col-sm-6' );
}
if ( $( '.form_captcha_wrap' ).hasClass( 'col-lg-6' ) ) {
$( '.form_captcha_wrap' ).removeClass( 'col-lg-6' );
}
$( '.form_captcha_wrap' ).addClass( 'col-md-12' );
}
if ( typeof $( 'form' ) !== 'undefined' ) {
$( 'form' ).addClass( 'form-group' );
}
if ( typeof $( 'input' ) !== 'undefined' ) {
if ( typeof $( 'input[type="text"]' ) !== 'undefined' ) {
$( 'input[type="text"]' ).addClass( 'form-control' );
}
if ( typeof $( 'input[type="email"]' ) !== 'undefined' ) {
$( 'input[type="email"]' ).addClass( 'form-control' );
}
if ( typeof $( 'input[type="url"]' ) !== 'undefined' ) {
$( 'input[type="url"]' ).addClass( 'form-control' );
}
if ( typeof $( 'input[type="password"]' ) !== 'undefined' ) {
$( 'input[type="password"]' ).addClass( 'form-control' );
}
if ( typeof $( 'input[type="tel"]' ) !== 'undefined' ) {
$( 'input[type="tel"]' ).addClass( 'form-control' );
}
if ( typeof $( 'input[type="search"]' ) !== 'undefined' ) {
$( 'input[type="search"]' ).addClass( 'form-control' );
}
if ( typeof $( 'input.select2-input' ) !== 'undefined' ) {
$( 'input.select2-input' ).removeClass( 'form-control' );
}
}
if ( typeof $( 'textarea' ) !== 'undefined' ) {
$( 'textarea' ).addClass( 'form-control' );
}
if ( typeof $( '.form-control' ) !== 'undefined' ) {
$( '.form-control' ).parent().addClass( 'form-group' );
$( window ).on(
'scroll', function () {
$( '.form-control' ).parent().addClass( 'form-group' );
}
);
}
},
/**
* Add classes for default subscribe widget.
*/
'styleDefaultSubscribeWidget': function () {
var sibForm = $( '.hestia-subscribe #sib_signup_form_1' );
sibForm.find( 'p.sib-email-area' ).before( '<span class="input-group-addon"><i class="fa fa-envelope"></i></span>' );
sibForm.find( 'p.sib-NAME-area' ).before( '<span class="input-group-addon"><i class="fa fa-user"></i></span>' );
sibForm.find( '.form-group' ).each( function () {
$( this ).addClass( 'is-empty' );
} );
},
/**
* Handle Gutenberg alignments.
* @returns {boolean}
*/
'handleGutenbergAlignment': function () {
var bodyNode = $( 'body' );
if (
bodyNode.hasClass( 'page-template-template-pagebuilder-full-width' ) ||
bodyNode.hasClass( 'page-template-template-pagebuilder-blank' ) ||
bodyNode.hasClass( 'page-template-template-page-sidebar' )
) {
return false;
}
if ( $( '.main #secondary' ).length > 0 ) {
return false;
}
var fullAlignments = $( '.alignfull' );
var wideAlignments = $( '.alignwide' );
if ( !fullAlignments.length && !wideAlignments.length ) {
return false;
}
var mainWrapWidth = $( '.main' ).innerWidth();
if ( fullAlignments.length ) {
$( fullAlignments ).each( function ( index, element ) {
$( element ).css( {
'margin-left': '0',
'margin-right': '0'
} );
var margin = (mainWrapWidth - $( element ).innerWidth()) / 2;
$( element ).css( {
'margin-left': '-' + margin + 'px',
'margin-right': '-' + margin + 'px'
} );
} );
}
if ( wideAlignments.length ) {
$( wideAlignments ).each( function ( index, element ) {
$( element ).css( {
'margin-left': '0',
'margin-right': '0'
} );
var margin = (mainWrapWidth - $( element ).innerWidth()) / 5;
$( element ).css( {
'margin-left': '-' + margin + 'px',
'margin-right': '-' + margin + 'px'
} );
} );
}
},
'isMobile': function () {
var windowWidth = window.innerWidth;
return windowWidth <= 991;
},
};
$.navigation = {
/**
* Initialize navigation.
*/
'init': function () {
this.toggleNavbarTransparency();
this.handleResponsiveDropdowns();
this.handleTouchDropdowns();
this.repositionDropdowns();
this.smoothScroll();
this.activeParentLink();
this.highlightMenu();
this.setBodyOverflow();
},
/**
* Handles dropdowns on touch devices.
* @returns {boolean}
*/
'handleTouchDropdowns': function () {
var windowWidth = window.innerWidth;
if ( windowWidth < 991 ) {
return false;
}
var self = this;
$( '.caret-wrap' ).on( 'touchstart', function ( e ) {
e.preventDefault();
e.stopPropagation();
var menuItem = $( this ).closest( 'li' );
if ( $( menuItem ).hasClass( 'dropdown-submenu' ) ) {
$( menuItem ).siblings().removeClass( 'open' ).find( 'dropdown-submenu' ).removeClass( 'open' );
$( menuItem ).siblings().find( '.caret-open' ).removeClass( 'caret-open' );
}
if ( $( this ).closest( 'li' ).parent().is( '.nav' ) ) {
self.clearDropdowns();
}
$( this ).toggleClass( 'caret-open' );
$( this ).closest( '.dropdown' ).toggleClass( 'open' );
self.createOverlay();
} );
return false;
},
/**
* Create helper overlay used for touch dropdowns.
* @returns {boolean}
*/
'createOverlay': function () {
var dropdownOverlay = $( '.dropdown-helper-overlay' );
if ( dropdownOverlay.length > 0 ) {
return false;
}
var self = this;
dropdownOverlay = document.createElement( 'div' );
dropdownOverlay.setAttribute( 'class', 'dropdown-helper-overlay' );
$( '#main-navigation' ).append( dropdownOverlay );
$( '.dropdown-helper-overlay' ).on( 'touchstart click', function () {
this.remove();
self.clearDropdowns();
} );
return false;
},
'clearDropdowns': function () {
$( '.dropdown.open' ).removeClass( 'open' );
$( '.caret-wrap.caret-open' ).removeClass( 'caret-open' );
},
/**
* Toggle navbar transparency
*/
'toggleNavbarTransparency': function () {
var navbarHome = $( '.navbar-color-on-scroll' );
if ( navbarHome.length === 0 ) {
return;
}
var transparent = true,
headerWithTopbar = 0;
if ( navbarHome.hasClass( 'header-with-topbar' ) ) {
headerWithTopbar = 40;
}
$( window ).on(
'scroll', $.utilitiesFunctions.debounce(
function () {
if ( !$( '.home.page .navbar' ).hasClass( 'no-slider' ) ) {
if ( $( document ).scrollTop() > headerWithTopbar ) {
if ( transparent ) {
transparent = false;
navbarHome.removeClass( 'navbar-transparent' );
navbarHome.addClass( 'navbar-not-transparent' );
}
} else {
if ( !transparent ) {
transparent = true;
navbarHome.addClass( 'navbar-transparent' );
navbarHome.removeClass( 'navbar-not-transparent' );
}
}
}
}, 17
)
);
},
/**
* Handle the responsive menus under 769px.
*/
'handleResponsiveDropdowns': function () {
var windowWidth = window.innerWidth;
if ( windowWidth > 768 ) {
return false;
}
$( '.navbar .dropdown > a .caret-wrap' ).on( 'click touchend',
function ( event ) {
var caret = $( this );
event.preventDefault();
event.stopPropagation();
//Change caret wrap.
$( caret ).toggleClass( 'caret-open' );
//Open dropdown.
$( caret ).parent().siblings().toggleClass( 'open' );
}
);
},
/**
* Smooth scroll when click on menu items anchors.
*/
'smoothScroll': function () {
$( '.navbar a[href*="#"], a.btn[href*="#"]' ).click(
function () {
//Do nothing if it's an empty hash.
if ( $( this ).attr( 'href' ) !== '#' ) {
if ( location.pathname.replace( /^\//, '' ) === this.pathname.replace( /^\//, '' ) && location.hostname === this.hostname ) {
var target = $( this.hash );
target = target.length ? target : $( '[name=' + this.hash.slice( 1 ) + ']' );
if ( target.length ) {
$( 'html,body' ).animate(
{
scrollTop: (target.offset().top - $.utilitiesFunctions.verifyNavHeight())
}, 1200
);
// Hide drop-down and submenu
if ( $( '.navbar .navbar-collapse' ).hasClass( 'in' ) ) {
$( '.navbar .navbar-collapse.in' ).removeClass( 'in' );
}
if ( $( 'body' ).hasClass( 'menu-open' ) ) {
$( 'body' ).removeClass( 'menu-open' );
$( '.navbar-collapse' ).css( 'height', '0' );
$( '.navbar-toggle' ).attr( 'aria-expanded', 'false' );
}
return false;
}
}
}
}
);
},
/**
* Add active parent links on navigation
*/
'activeParentLink': function () {
$( '.navbar .dropdown > a' ).click(
function () {
//Do nothing if it's an empty hash.
if ( $( this ).attr( 'href' ) === '#' ) {
return false;
}
location.href = this.href;
return false;
}
);
},
/**
* Highlight menu items when section is in viewport only if section is in root of menu, not submenu.
*/
'highlightMenu': function () {
$( window ).on(
'scroll', function () {
if ( $( 'body' ).hasClass( 'home' ) ) {
if ( $( window ).width() >= 751 ) {
var hestia_scrollTop = $( window ).scrollTop(); // cursor position
var headerHeight = $( '.navbar' ).outerHeight(); // header height
var isInOneSection = 'no'; // used for checking if the cursor is in one section or not
// for all sections check if the cursor is inside a section
$( '#carousel-hestia-generic, section' ).each(
function () {
var thisID = '#' + $( this ).attr( 'id' ); // section id
var hestia_offset = $( this ).offset().top; // distance between top and our section
var thisHeight = $( this ).outerHeight(); // section height
var thisBegin = hestia_offset - headerHeight; // where the section begins
var thisEnd = hestia_offset + thisHeight - headerHeight; // where the section ends
// if position of the cursor is inside of the this section
if ( hestia_scrollTop + $.utilitiesFunctions.verifyNavHeight() >= thisBegin &&
hestia_scrollTop + $.utilitiesFunctions.verifyNavHeight() <= thisEnd ) {
isInOneSection = 'yes';
$( 'nav .on-section' ).removeClass( 'on-section' );
$( 'nav a[href$="' + thisID + '"]' ).parent( 'li' ).addClass( 'on-section' ); // find the menu button with the same ID section
return false;
}
if ( isInOneSection === 'no' ) {
$( 'nav .on-section' ).removeClass( 'on-section' );
}
}
);
}
}
}
);
},
/**
* Set body overflow on mobile when menu is opened/closed.
*/
'setBodyOverflow': function () {
var navigation = $( '#main-navigation' );
navigation.on(
'show.bs.collapse', function () {
$( 'body' ).addClass( 'menu-open' );
}
);
navigation.on(
'hidden.bs.collapse', function () {
$( 'body' ).removeClass( 'menu-open' );
}
);
},
/**
* Reposition dropdowns if they are out of screen.
* @returns {boolean}
*/
'repositionDropdowns': function () {
var windowWidth = window.innerWidth;
//Do nothing on mobile.
if ( windowWidth <= 768 ) {
return false;
}
//Do nothing without dropdowns.
var dropdowns = $( '.dropdown-menu' );
if ( dropdowns.length === 0 ) {
return false;
}
//Loop dropdowns and move them if needed.
$.each( dropdowns, function ( key, dropdown ) {
var submenu = $( dropdown );
var bounding = submenu.offset().left;
if ( /webkit.*mobile/i.test( navigator.userAgent ) ) {
bounding -= window.scrollX;
}
var dropdownWidth = submenu.outerWidth();
if ( bounding + dropdownWidth >= windowWidth ) {
$( dropdown ).css( { 'right': '100%', 'left': 'auto' } );
}
} );
return false;
}
};
var navbarScrollPoint = 0;
$.hestiaNavBarScroll = {
/**
* Check navbar scroll point.
*/
'checkNavbarScrollPoint': function () {
if ( $( '.navbar-header' ).length === 0 ) {
return false;
}
// Window width bigger or equal with 768px
if ( $.utilitiesFunctions.getWidth() >= 768 ) {
if ( typeof $( '.navbar-header' ).offset() !== 'undefined' ) {
var topOffset = $( '.navbar-header' ).offset().top;
// Account for mobile safari (which reports broken values for offset).
if ( /webkit.*mobile/i.test( navigator.userAgent ) ) {
topOffset -= window.scrollY;
}
navbarScrollPoint = topOffset + $( '.navbar-header' ).height(); // Distance from top to the bottom of the logo
}
// Check if topbar is active when navbar is left aligned
if ( $( '.hestia_left.header-with-topbar' ).length !== 0 || $( '.full-screen-menu.header-with-topbar' ).length !== 0 ) {
navbarScrollPoint = 40;
}
// Window width less than 768px
} else {
// Check if topbar is active
if ( $( '.header-with-topbar' ).length !== 0 ) {
navbarScrollPoint = 40; // Topbar height
} else {
navbarScrollPoint = 0; // Topbar disabled
}
}
},
/**
* On screen scroll add scroll-related class.
* This function is related with top bar. It decides when to show or hide it.
*/
'addScrollClass': function () {
$( window ).on(
'scroll', function () {
if ( $( document ).scrollTop() >= navbarScrollPoint ) {
$( '.navbar' ).addClass( 'navbar-scroll-point' );
} else {
$( '.navbar' ).removeClass( 'navbar-scroll-point' );
}
}
);
}
};
}( jQuery ));
jQuery( document ).ready(
function () {
jQuery.material.init();
jQuery.hestia.init();
jQuery.navigation.init();
jQuery.hestiaFeatures.initAnimations();
jQuery.hestiaFeatures.initTooltips();
jQuery.hestiaNavBarScroll.checkNavbarScrollPoint();
jQuery.hestiaNavBarScroll.addScrollClass();
}
);
jQuery( window ).on( 'load',
function () {
jQuery.hestiaFeatures.initMasonry();
jQuery.hestia.sidebarToggle();
}
);
jQuery( window ).resize(
function () {
jQuery.hestiaFeatures.initMasonry();
jQuery.hestia.fixHeaderPadding();
jQuery.hestia.headerSpacingFrontpage();
jQuery.hestia.handleGutenbergAlignment();
jQuery.hestiaNavBarScroll.checkNavbarScrollPoint();
jQuery.navigation.repositionDropdowns();
}
);