Uname: Linux p3plzcpnl499967.prod.phx3.secureserver.net 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
Software: Apache
PHP version: 8.2.30 [ PHP INFO ] PHP os: Linux
Server Ip: 208.109.40.231
Your Ip: 216.73.216.26
User: nayff91c5tsx (10005085) | Group: nayff91c5tsx (10005085)
Safe Mode: OFF
Disable Function:
NONE

name : sticky-navigation.js
WpbfPremium.stickyNavigation = (function ($) {
	var isInsideCustomizer = WpbfPremium.site.isInsideCustomizer;
	var opts = {};
	var state = {};
	var data = {};

	/**
	 * Call main functions.
	 */
	function init() {
		listenPartialRefresh();
		setupData();
		setupStickyNavScroll();
	}

	/**
	 * Setup general options.
	 */
	function setupData() {
		opts.nav = document.querySelector(".wpbf-navigation");
		if (!opts.nav) return;

		// Options.
		opts.$nav = $(opts.nav);
		opts.sticky = opts.nav.dataset.sticky;
		opts.delay = opts.nav.dataset.stickyDelay;
		opts.animation = opts.nav.dataset.stickyAnimation;
		opts.duration = opts.nav.dataset.stickyAnimationDuration;
		opts.duration = parseInt(opts.duration, 10);
		opts.distance = parseInt(opts.$nav.offset().top) + parseInt(opts.delay, 10);

		// Scrolling states.
		state.prevScrollTop = window.pageYOffset;
		state.isFired = 0;

		// Logo urls.
		data.menuActiveLogoUrl = $(".wpbf-logo").data("menu-active-logo");
		data.menuLogoUrl = $(".wpbf-logo img").attr("src");
		data.mobileMenuLogoUrl = $(".wpbf-mobile-logo img").attr("src");
	}

	/**
	 * Listen to WordPress selective refresh inside customizer.
	 */
	function listenPartialRefresh() {
		if (!isInsideCustomizer) return;

		wp.customize.selectiveRefresh.bind(
			"partial-content-rendered",
			function (placement) {
				/**
				 * We won't be filtering the "placement.partial.id" here since it will be too much.
				 * Imagine how many customizer controls have partialRefresh on page header.
				 * Because the page header is changed not only on "placement.partial.id === 'sticky_navigation'".
				 */
				setupData();
				setupStickyNavScroll();
			},
		);
	}

	/**
	 * Setup sticky navigation scroll.
	 */
	function setupStickyNavScroll() {
		/**
		 * Remove navOnScroll event listener regardless of sticky state.
		 *
		 * This is to prevent multiple event listeners from being added when inside customizer
		 * when partial refresh is triggered.
		 */
		$(window).off("scroll", navOnScroll);

		if (opts.sticky) {
			$(window).on("scroll", navOnScroll);
		} else {
			$(window).off("scroll", navOnScroll);
		}
	}

	/**
	 * Function to run on nav on scroll.
	 */
	function navOnScroll() {
		if (isInsideCustomizer && (!opts.nav || !opts.sticky)) return;
		checkStickyNav();
		if (opts.animation === "scroll") hideOnScroll();
	}

	/**
	 * Check sticky navigation.
	 */
	function checkStickyNav() {
		// How far we are away from the top.
		var scrollTop = $(window).scrollTop();

		// Height of the navigation bar.
		var navHeight = opts.$nav.outerHeight();

		// Animations.
		if (scrollTop > opts.distance && !state.isFired) {
			opts.nav.classList.add("wpbf-navigation-active");

			// Slide animation.
			if (opts.animation === "slide") {
				opts.$nav
					.css({ position: "fixed", left: "0", zIndex: "666", top: -navHeight })
					.stop()
					.animate({ top: 0 }, opts.duration);
			} else if (opts.animation === "fade") {
				// Fade animation.
				opts.$nav
					.css({
						display: "none",
						position: "fixed",
						top: "0",
						left: "0",
						zIndex: "666",
					})
					.stop()
					.fadeIn(opts.duration);
			} else if (opts.animation === "shrink") {
				// Shrink animation.
				opts.$nav.css({
					position: "fixed",
					top: "0",
					left: "0",
					zIndex: "666",
				});
				if (opts.animation === "shrink")
					opts.nav.classList.add("wpbf-navigation-shrink");
			} else {
				// No animation.
				opts.$nav.css({
					position: "fixed",
					top: "0",
					left: "0",
					zIndex: "666",
				});
				if (opts.animation === "scroll")
					opts.nav.classList.add("wpbf-navigation-animate");
			}

			// Apply top margin to page header if transparent header is not enabled, prevents jumpy behaviour.
			if (!document.body.classList.contains("wpbf-transparent-header")) {
				$(".wpbf-page-header").css("marginTop", navHeight);
			}

			// Apply sticky navigation logos for desktop and mobiles if set.
			if (data.menuActiveLogoUrl) {
				$(".wpbf-logo img").attr("src", data.menuActiveLogoUrl);
				$(".wpbf-mobile-logo img").attr("src", data.menuActiveLogoUrl);
			}

			state.isFired = 1;
		} else if (scrollTop < opts.distance && state.isFired) {
			opts.nav.classList.remove("wpbf-navigation-active");
			opts.nav.classList.remove("wpbf-navigation-animate");
			opts.nav.classList.remove("wpbf-navigation-shrink");

			// Reset.
			if (!$("body").hasClass("wpbf-transparent-header")) {
				opts.$nav.css({ position: "", top: "", left: "", zIndex: "" });
				$(".wpbf-page-header").css("marginTop", "");
			} else {
				opts.$nav.css({ position: "absolute", top: "", left: "", zIndex: "" });
			}

			if (data.menuActiveLogoUrl) {
				$(".wpbf-logo img").attr("src", data.menuLogoUrl);
				$(".wpbf-mobile-logo img").attr("src", data.mobileMenuLogoUrl);
			}

			state.isFired = 0;
		}
	}

	/**
	 * Hide on scroll.
	 */
	function hideOnScroll() {
		var scrollTop = $(window).scrollTop();
		var navHeight = opts.$nav.outerHeight();

		if (scrollTop > state.prevScrollTop && scrollTop > navHeight) {
			// Scroll down.
			$(".wpbf-navigation").css({ top: -navHeight });
			$(".wpbf-navigation")
				.removeClass("wpbf-navigation-scroll-up")
				.addClass("wpbf-navigation-scroll-down");
		} else {
			// Scroll up.
			if (scrollTop + $(window).height() < $(document).height()) {
				$(".wpbf-navigation").css({ top: "0px" });
				$(".wpbf-navigation")
					.removeClass("wpbf-navigation-scroll-down")
					.addClass("wpbf-navigation-scroll-up");
			}
		}

		state.prevScrollTop = scrollTop;
	}

	init();

	return {
		opts: opts,
		state: state,
		data: data,
	};
})(jQuery);
© 2026 GrazzMean