/
home
/
techb158
/
balacoffee.com
/
wp-content
/
plugins
/
coming-soon
/
public
/
js
/
/home/techb158/balacoffee.com/wp-content/plugins/coming-soon/public/js
mkdir
upload
Name
Size
Mode
Actions
animate-dynamic.js
19723
0644
edit
dl
rm
dynamic-text.js
33685
0644
edit
dl
rm
iframeResizer.contentWindow.js
34490
0644
edit
dl
rm
iframeResizer.contentWindow.min.js
13389
0644
edit
dl
rm
iframeResizer.js
32053
0644
edit
dl
rm
iframeResizer.min.js
12380
0644
edit
dl
rm
imagesloaded.pkgd.min.js
5594
0644
edit
dl
rm
img-previewer.js
23368
0644
edit
dl
rm
img-previewer.min.js
11271
0644
edit
dl
rm
isotope.pkgd.js
91398
0644
edit
dl
rm
jquery-numerator.js
4133
0644
edit
dl
rm
jquery-numerator.min.js
1906
0644
edit
dl
rm
jquery.animation.js
4940
0644
edit
dl
rm
jquery.animation.min.js
916
0644
edit
dl
rm
jquery.event.move.js
14530
0644
edit
dl
rm
jquery.lettering.js
1842
0644
edit
dl
rm
jquery.lettering.min.js
685
0644
edit
dl
rm
jquery.textillate.js
11188
0644
edit
dl
rm
jquery.textillate.min.js
5416
0644
edit
dl
rm
jquery.twentytwenty.js
5414
0644
edit
dl
rm
jquery.twentytwenty.min.js
5414
0644
edit
dl
rm
lightbox.js
20031
0644
edit
dl
rm
lightbox.min.js
10383
0644
edit
dl
rm
masonry.pkgd.js
63316
0644
edit
dl
rm
minimasonry.js
7493
0644
edit
dl
rm
sp-animateeffects.js
32333
0644
edit
dl
rm
sp-animateeffects.min.js
10720
0644
edit
dl
rm
sp-scripts.js
103407
0644
edit
dl
rm
sp-scripts.min.js
45640
0644
edit
dl
rm
toolbar.js
3660
0644
edit
dl
rm
tooltipster.bundle.min.js
39900
0644
edit
dl
rm
tsparticles.js
296710
0644
edit
dl
rm
tsparticles.min.js
140630
0644
edit
dl
rm
tubular.js
6974
0644
edit
dl
rm
xdLocalStorage.js
4439
0644
edit
dl
rm
Edit:
/home/techb158/balacoffee.com/wp-content/plugins/coming-soon/public/js/sp-scripts.js
(103407B)
"use strict"; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } /*! js-cookie v3.0.0-rc.0 | MIT */ !function (e, t) { "object" == (typeof exports === "undefined" ? "undefined" : _typeof(exports)) && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (e = e || self, function () { var r = e.Cookies, n = e.Cookies = t(); n.noConflict = function () { return e.Cookies = r, n; }; }()); }(void 0, function () { "use strict"; function e(e) { for (var t = 1; t < arguments.length; t++) { var r = arguments[t]; for (var n in r) e[n] = r[n]; } return e; } var t = { read: function read(e) { return e.replace(/%3B/g, ";"); }, write: function write(e) { return e.replace(/;/g, "%3B"); } }; return function r(n, i) { function o(r, o, u) { if ("undefined" != typeof document) { "number" == typeof (u = e({}, i, u)).expires && (u.expires = new Date(Date.now() + 864e5 * u.expires)), u.expires && (u.expires = u.expires.toUTCString()), r = t.write(r).replace(/=/g, "%3D"), o = n.write(String(o), r); var c = ""; for (var f in u) u[f] && (c += "; " + f, !0 !== u[f] && (c += "=" + u[f].split(";")[0])); return document.cookie = r + "=" + o + c; } } return Object.create({ set: o, get: function get(e) { if ("undefined" != typeof document && (!arguments.length || e)) { for (var r = document.cookie ? document.cookie.split("; ") : [], i = {}, o = 0; o < r.length; o++) { var u = r[o].split("="), c = u.slice(1).join("="), f = t.read(u[0]).replace(/%3D/g, "="); if (i[f] = n.read(c, f), e === f) break; } return e ? i[e] : i; } }, remove: function remove(t, r) { o(t, "", e({}, r, { expires: -1 })); }, withAttributes: function withAttributes(t) { return r(this.converter, e({}, this.attributes, t)); }, withConverter: function withConverter(t) { return r(e({}, this.converter, t), this.attributes); } }, { attributes: { value: Object.freeze(i) }, converter: { value: Object.freeze(n) } }); }(t, { path: "/" }); }); var seedprodCookies = Cookies.noConflict(); // optin form var sp_emplacementRecaptcha = []; var sp_option_id = ""; jQuery("form[id^=sp-optin-form]").submit(function (e) { e.preventDefault(); var form_id = jQuery(this).attr("id"); var id = form_id.replace("sp-optin-form-", ""); if (seeprod_enable_recaptcha === 1) { grecaptcha.execute(sp_emplacementRecaptcha[id]); } else { var token = ""; sp_send_request(token, id); } }); var sp_CaptchaCallback = function sp_CaptchaCallback() { jQuery("div[id^=recaptcha-]").each(function (index, el) { sp_option_id = el.id.replace("recaptcha-", ""); sp_emplacementRecaptcha[sp_option_id] = grecaptcha.render(el, { sitekey: "6LdfOukUAAAAAMCOEFEZ9WOSKyoYrxJcgXsf66Xr", badge: "bottomright", type: "image", size: "invisible", callback: function callback(token) { sp_send_request(token, sp_option_id); } }); }); }; function sp_send_request(token, id) { var data = jQuery("#sp-optin-form-" + id).serialize(); var j1 = jQuery.ajax({ url: seedprod_api_url + "subscribers", type: "post", dataType: "json", timeout: 5000, data: data }); // add ajax class jQuery("#sp-optin-form-" + id + ' .sp-optin-submit').addClass('sp-ajax-striped sp-ajax-animated'); //var j2 = jQuery.ajax( "/" ); var j2 = jQuery.ajax({ url: sp_subscriber_callback_url, type: 'post', timeout: 30000, data: data }); jQuery.when(j1, j2).done(function (a1, a2) { // take next action var action = jQuery("#sp-optin-form-" + id + " input[name^='seedprod_action']").val(); // show success message if (action == "1") { jQuery("#sp-optin-form-" + id).hide(); jQuery("#sp-optin-success-" + id).show(); } // redirect if (action === "2") { var redirect = jQuery("#sp-optin-form-" + id + " input[name^='redirect_url']").val(); window.location.href = redirect; } jQuery("#sp-optin-form-" + id + ' .sp-optin-submit').removeClass('sp-ajax-striped sp-ajax-animated'); // alert( "We got what we came for!" ); }).fail(function (jqXHR, textStatus, errorThrown) { jQuery("#sp-optin-form-" + id + ' .sp-optin-submit').removeClass('sp-ajax-striped sp-ajax-animated'); if (seeprod_enable_recaptcha === 1) { grecaptcha.reset(sp_emplacementRecaptcha[id]); } // var response = JSON.parse(j1.responseText); // var errorString = ''; // jQuery.each( response.errors, function( key, value) { // errorString += value ; // }); // alert(errorString); // console.log(j1); // console.log(j2); }); return; } // countdown var x = []; function countdown(type, ts, id, action, redirect) { var now = new Date().getTime(); if (type == 'vt') { ts = ts + now; var seedprod_enddate = seedprodCookies.get('seedprod_enddate_' + id); if (seedprod_enddate != undefined) { ts = seedprod_enddate; } else { seedprodCookies.set('seedprod_enddate_' + id, ts, { expires: 360 }); } } // Update the count down every 1 second x[id] = setInterval(function () { var now = new Date().getTime(); var distance = ts - now; var days = Math.floor(distance / (1000 * 60 * 60 * 24)); var hours = Math.floor(distance % (1000 * 60 * 60 * 24) / (1000 * 60 * 60)); var minutes = Math.floor(distance % (1000 * 60 * 60) / (1000 * 60)); var seconds = Math.floor(distance % (1000 * 60) / 1000); if (seconds == -1) { seconds = 0; minutes = 0; hours = 0; days = 0; } if (days == 0) { jQuery("#sp-cd-days-" + id).hide(); } else { jQuery("#sp-cd-days-" + id + " .sp-cd-amount").html(pad(days, 2)); } jQuery("#sp-cd-hours-" + id + " .sp-cd-amount").html(pad(hours, 2)); jQuery("#sp-cd-minutes-" + id + " .sp-cd-amount").html(pad(minutes, 2)); jQuery("#sp-cd-seconds-" + id + " .sp-cd-amount").html(pad(seconds, 2)); // document.getElementById(id).innerHTML = days + "d " + pad(hours,2) + "h " // + pad(minutes,2) + "m " + pad(seconds,2) + "s "; // If the count down is finished, write some text if (distance < 0) { clearInterval(x[id]); // show success message if (action == "1") { jQuery("#sp-countdown-" + id + " .sp-countdown-group").hide(); jQuery("#sp-countdown-expired-" + id).show(); } // redirect if (action == "2") { jQuery("#sp-countdown-" + id + " .sp-countdown-group").hide(); window.location.href = redirect; } // restart if (action == "3") { //console.log('remove' + id); seedprodCookies.remove('seedprod_enddate_' + id); //location.reload(); } } }, 1000); } function seedprod_animatedheadline(blockId, infiniteLoop, animationDuration, animationDelay) { //let animatewrapper = jQuery("#sp-animated-head-"+blockId+" .sp-title-highlight .sp-highlighted-text-wrapper"); if (infiniteLoop == "true") { window.setInterval(function () { jQuery('#sp-animated-head-' + blockId + ' .sp-title-highlight .sp-title--headline.sp-animated').addClass('sp-hide-highlight'); //jQuery("#sp-animated-head-"+blockId+" .sp-title-highlight .sp-highlighted-text-wrapper").addClass("sp-highlighted-hide-text-wrapper"); setTimeout(function () { jQuery('#sp-animated-head-' + blockId + ' .sp-title-highlight .sp-title--headline.sp-animated').removeClass('sp-hide-highlight'); //jQuery("#sp-animated-head-"+blockId+" .sp-title-highlight .sp-highlighted-text-wrapper").removeClass("sp-highlighted-hide-text-wrapper"); }, 200); }, animationDelay); } } function seedprod_rotateheadline(blockId, continueLoop, animationDuration) { var $animatedHead = jQuery("#sp-animated-head-" + blockId + ' .preview-sp-title'); var currentWidth = window.innerWidth; var view; // Determine the current view category // Determine the current view based on width if (currentWidth <= 480) { view = "mobile"; } else if (currentWidth > 480 && currentWidth <= 1024) { view = "tablet"; } else { view = "desktop"; } // Initialize only if not already initialized if (!$animatedHead.data('initialized')) { // Save the original HTML of the block $animatedHead.data('original-html', $animatedHead.html()); $animatedHead.data('last-view', view); // Save the initial view $animatedHead.data('initialized', true); // Run the shortcode for the first time $animatedHead.seedprod_responsive_title_shortcode(); } else { // Check if the view has changed var lastView = $animatedHead.data('last-view'); if (lastView !== view) { // Update the last view $animatedHead.data('last-view', view); // Restore the original HTML to the block $animatedHead.html($animatedHead.data('original-html')); // Re-run the shortcode with the original HTML $animatedHead.seedprod_responsive_title_shortcode(); } } } /* end of rotate js code */ function pad(n, width, z) { z = z || "0"; n = n + ""; return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n; } // remove any theme css jQuery(document).ready(function ($) { $('link[href*="/wp-content/themes/"]').remove(); $(".sp-imagecarousels-wrapper").each(function () { var $carousel = $(this); var carouselId = '#' + $carousel.attr('id'); // Get the ID of the current carousel var slides = $(carouselId + ' .sp-imagecarousel-wrapper'); // Get all slides within this carousel var navDots = $(carouselId + ' .sp-imagecarousel-nav button[data-index]'); // Get navigation dots var slideshowmaxAttr = $carousel.attr('data-slidetoshow'); var slideshowmax = slideshowmaxAttr ? parseInt(slideshowmaxAttr) : 1; if (isNaN(slideshowmax) || slideshowmax < 1) { slideshowmax = 1; // Default to 1 if attribute is missing or invalid } // Reset all slides to an inactive state first slides.css({ 'opacity': 0, 'height': '0', 'position': 'absolute' }); // Activate the first slide (or first set of slides if slideshowmax > 1) if (slides.length > 0) { for (var i = 0; i < slideshowmax && i < slides.length; i++) { slides.eq(i).css({ 'opacity': 1, 'height': 'auto', 'position': 'initial' }); } } // Reset all navigation dots to an inactive state navDots.css({ 'opacity': 0.25 }); // Activate the first navigation dot // This assumes that the first navDot corresponds to the first slide/group of slides. if (navDots.length > 0) { navDots.first().css({ 'opacity': 1 }); } }); }); // Dynamic Text jQuery(document).ready(function ($) { var default_format = "{MM}/{dd}/{yyyy}"; var html = $("body").html(); var newTxt = html.split("[#"); for (var i = 1; i < newTxt.length; i++) { var format = default_format; var tag = newTxt[i].split("]")[0]; var parts = tag.split(":"); if (parts.length > 1) { format = parts[1]; } else { format = default_format; } var d = Date.create(parts[0]); var regex = "\\[#" + tag + "]"; var re = new RegExp(regex, "g"); $("body *").replaceText(re, d.format(format)); } $(".sp-dynamic-text").contents().unwrap(); }); // Dynamic Query Parameter jQuery(document).ready(function ($) { var default_value = ""; var html = $("body").html(); var newTxt = html.split("[q:"); for (var i = 1; i < newTxt.length; i++) { var def_val = default_value; var tag = newTxt[i].split("]")[0]; var parts = tag.split("="); if (parts.length > 1) { def_val = parts[1]; } else { def_val = default_value; } var d = parts[0]; //Date.create(parts[0]); var regex = "\\[q:" + tag + "]"; var re = new RegExp(regex, "g"); var searchParams = new URLSearchParams(window.location.search); var paramdata = searchParams.get(d); if (paramdata != null) { def_val = paramdata; } // console.log(re); // console.log(def_val); // console.log(d); // console.log(def_val); // console.log(paramdata); //$("body *").replaceText(re,seedprod_escapeHtml(def_val)); var replaced = $("body").html().replace(re, seedprod_escapeHtml(def_val)); $("body").html(replaced); } $(".sp-dynamic-text").contents().unwrap(); }); function seedprod_escapeHtml(unsafe) { return unsafe.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'"); } /** * SeedProd Tab Block javascript */ function seedprod_tabbedlayout(blockId) { jQuery("#sp-" + blockId + ' ul.sp-tabbedlayout-wrapper li a').click(function () { jQuery("#sp-" + blockId + ' ul.sp-tabbedlayout-wrapper li a').removeClass('sp-active-tab'); var sp_tab = jQuery(this).attr('data-tab'); jQuery("#sp-" + blockId + ' ul.sp-tabbedlayout-wrapper li a.sp-tab-section-' + sp_tab).addClass('sp-active-tab'); jQuery("#sp-" + blockId + ' div.tab-content-box').addClass('sp-hidden'); jQuery("#sp-" + blockId + ' div.sp-tab-content-section-' + sp_tab).removeClass('sp-hidden'); }); } /*!----------------------------------------------------------------------------- * seedprod_bg_slideshow() * ---------------------------------------------------------------------------- * Example: * seedprod_bg_slideshow('body', ['IMG_URL', 'IMG_URL', 'IMG_URL'], 3000); * --------------------------------------------------------------------------*/ function seedprod_bg_slideshow(selector, slides) { var delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5000; var transition_timing = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'ease-in'; var transition_duration = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 500; document.querySelector(selector).style.backgroundSize = "cover"; document.querySelector(selector).style.backgroundRepeat = "no-repeat"; document.querySelector(selector).style.backgroundPosition = "center center"; // Set transitions var transition = "all " + transition_duration + 'ms ' + transition_timing; document.querySelector(selector).style.WebkitTransition = transition; document.querySelector(selector).style.MozTransition = transition; document.querySelector(selector).style.MsTransition = transition; document.querySelector(selector).style.OTransition = transition; document.querySelector(selector).style.transition = transition; var currentSlideIndex = 0; // Load first slide document.querySelector(selector).style.backgroundImage = "url('" + slides[currentSlideIndex] + "')"; currentSlideIndex++; // Load next slide every interval setInterval(function () { document.querySelector(selector).style.backgroundImage = "url('" + slides[currentSlideIndex] + "')"; currentSlideIndex++; // Reset counter if (currentSlideIndex >= slides.length) { currentSlideIndex = 0; } }, delay); // Preload slideshow images var preloadImages = new Array(); slides.forEach(function (val, i) { preloadImages[i] = new Image(); preloadImages[i].src = val; }); } jQuery('.sp-testimonial-nav button').click(function () { var currentId = '#' + jQuery(this).parents('.sp-testimonials-wrapper').attr('id'); var currentButtonIndex = jQuery(currentId + ' .sp-testimonial-nav button').index(this); var currentIndex = 0; var testimonials = jQuery('.sp-testimonial-wrapper', jQuery(this).parents(currentId)); var slideshowmax = jQuery(this).parents('.sp-testimonials-wrapper').attr('data-slidetoshow'); if (slideshowmax == undefined) { slideshowmax = 1; } /* jQuery(testimonials).each(function (index) { var o = jQuery(this).css('opacity'); if (o == 1) { currentIndex = index; } }) */ var slider_length = Math.ceil(testimonials.length / parseInt(slideshowmax)); for (var customindexdata = 0; customindexdata < slider_length; customindexdata++) { var opa = jQuery(currentId + ' .sp-testimonial-nav button[data-index="' + customindexdata + '"]').css('opacity'); if (opa >= 0.5) { //console.log("customindexdata is =" + customindexdata); currentIndex = customindexdata; } } var buttonsLength = jQuery(currentId + ' .sp-testimonial-nav button').length - 1; var currentButtonIndexData = jQuery(currentId + ' .sp-testimonial-nav button').eq(currentButtonIndex).attr('data-index'); // check for previous button click if (currentButtonIndex == 0) { if (0 == currentIndex) { currentIndex = Math.ceil(testimonials.length / parseInt(slideshowmax)) - 1; } else { currentIndex--; } } // check for next button click if (currentButtonIndex == buttonsLength) { if (Math.ceil(testimonials.length / parseInt(slideshowmax)) - 1 == currentIndex) { currentIndex = 0; } else { currentIndex++; } } // reset states testimonials.css({ 'opacity': 0, 'height': '0', 'position': 'absolute' }); jQuery(currentId + ' .sp-testimonial-nav button[data-index]').css({ 'opacity': 0.25 }); var startindex = parseInt(currentIndex * parseInt(slideshowmax)); var endindex = parseInt(startindex + parseInt(slideshowmax)); // select testimonial and button if (currentButtonIndexData !== undefined) { currentIndex = currentButtonIndexData; startindex = parseInt(currentIndex * parseInt(slideshowmax)); endindex = parseInt(startindex + parseInt(slideshowmax)); for (var i = startindex; i < endindex; i++) { jQuery(testimonials).eq(i).css({ 'opacity': 1, 'height': 'auto', 'position': 'initial' }); } //jQuery(testimonials).eq(currentIndex).css({ 'opacity': 1, 'height': 'auto', 'position': 'initial' }); jQuery(currentId + ' .sp-testimonial-nav button').eq(currentButtonIndex).css({ 'opacity': 1 }); } else { startindex = parseInt(currentIndex * parseInt(slideshowmax)); endindex = parseInt(startindex + parseInt(slideshowmax)); for (var _i = startindex; _i < endindex; _i++) { jQuery(testimonials).eq(_i).css({ 'opacity': 1, 'height': 'auto', 'position': 'initial' }); //jQuery(currentId + ' .sp-imagecarousel-nav button').eq(currentButtonIndex).css({ 'opacity': 1 }) } //jQuery(testimonials).eq(currentIndex).css({ 'opacity': 1, 'height': 'auto', 'position': 'initial' }); jQuery(currentId + ' .sp-testimonial-nav button').eq(currentIndex + 1).css({ 'opacity': 1 }); } }); var testimonial_timers = {}; jQuery(".sp-testimonials-wrapper").each(function () { var currentId = '#' + jQuery(this).attr('id'); var autoPlay = jQuery(this).attr('data-autoplay'); var speed = jQuery(this).attr('data-speed'); if (speed === '') { speed = 5000; } else { speed = parseInt(speed) * 1000; } if (autoPlay !== undefined) { testimonial_timers[currentId] = setInterval(function () { var clickEvent = jQuery.Event('click'); clickEvent.preventDefault(); jQuery(currentId + ' .sp-testimonial-nav button:last-child').triggerHandler(clickEvent); }, speed); } }); jQuery(".sp-testimonials-wrapper").hover(function () { var id = '#' + jQuery(this).attr('id'); clearInterval(testimonial_timers[id]); }); jQuery(".sp-testimonials-wrapper").mouseleave(function () { var currentId = '#' + jQuery(this).attr('id'); var autoPlay = jQuery(this).attr('data-autoplay'); var speed = jQuery(this).attr('data-speed'); if (speed === '') { speed = 5000; } else { speed = parseInt(speed) * 1000; } if (autoPlay !== undefined) { testimonial_timers[currentId] = setInterval(function () { var clickEvent = jQuery.Event('click'); clickEvent.preventDefault(); jQuery(currentId + ' .sp-testimonial-nav button:last-child').triggerHandler(clickEvent); }, speed); } }); /* start of twitter timline js code */ function seedprod_twitterembedtimeline(blockId, timelineid, showReplies, width, height, chrome, align, borderColors, colorScheme, lang) { //jQuery("#sp-animated-head-"+blockId+' .preview-sp-title' ).seedprod_responsive_title_shortcode(); twttr.ready(function (twttr) { window.twttr.widgets.createTimeline({ sourceType: "profile", screenName: timelineid }, document.getElementById('sp-twitterembedtimeline-preview-' + blockId), { showReplies: showReplies, width: width, height: height, chrome: chrome, align: align, borderColor: borderColors, theme: colorScheme, lang: lang }).then(function (el) { //console.log('Tweet added.'); }); }); } function seedprod_twittertweetbutton(blockId, tweetUrl, buttonSize, tweetText, tweetHashTag, viaHandle, relatedTweet, lang) { twttr.ready(function (twttr) { window.twttr.widgets.createShareButton(tweetUrl, document.getElementById('sp-twittertweetbutton-preview-' + blockId), { size: buttonSize, text: tweetText, hashtags: tweetHashTag, via: viaHandle, related: relatedTweet, lang: lang }); }); } /* end of twitter timline js code */ /* this is image carousel block code */ jQuery('.sp-imagecarousel-nav button').click(function () { var currentId = '#' + jQuery(this).parents('.sp-imagecarousels-wrapper').attr('id'); var currentButtonIndex = jQuery(currentId + ' .sp-imagecarousel-nav button').index(this); var currentIndex = 0; var currentIndexOfNav = 0; var imagecarousels = jQuery('.sp-imagecarousel-wrapper', jQuery(this).parents(currentId)); var slideshowmax = jQuery(this).parents('.sp-imagecarousels-wrapper').attr('data-slidetoshow'); if (slideshowmax == undefined) { slideshowmax = 1; } //console.log("new slidershow value = " + slideshowmax); /* jQuery(imagecarousels).each(function (index) { var o = jQuery(this).css('opacity'); if (o == 1) { currentIndex = index; } }) */ var slider_length = Math.ceil(imagecarousels.length / parseInt(slideshowmax)); for (var customindexdata = 0; customindexdata < slider_length; customindexdata++) { var opa = jQuery(currentId + ' .sp-imagecarousel-nav button[data-index="' + customindexdata + '"]').css('opacity'); if (opa >= 0.5) { //console.log("customindexdata is =" + customindexdata); currentIndex = customindexdata; } } var buttonsLength = jQuery(currentId + ' .sp-imagecarousel-nav button').length - 1; var currentButtonIndexData = jQuery(currentId + ' .sp-imagecarousel-nav button').eq(currentButtonIndex).attr('data-index'); // check for previous button click if (currentButtonIndex == 0) { if (0 == currentIndex) { currentIndex = Math.ceil(imagecarousels.length / parseInt(slideshowmax)) - 1; } else { currentIndex--; } } // check for next button click if (currentButtonIndex == buttonsLength) { if (Math.ceil(imagecarousels.length / parseInt(slideshowmax)) - 1 == currentIndex) { currentIndex = 0; } else { currentIndex++; } } var startindex = parseInt(currentIndex * parseInt(slideshowmax)); var endindex = parseInt(startindex + parseInt(slideshowmax)); // reset states imagecarousels.css({ 'opacity': 0, 'height': '0', 'position': 'absolute' }); jQuery(currentId + ' .sp-imagecarousel-nav button[data-index]').css({ 'opacity': 0.25 }); // select imagecarousel and button if (currentButtonIndexData !== undefined) { currentIndex = currentButtonIndexData; startindex = parseInt(currentIndex * parseInt(slideshowmax)); endindex = parseInt(startindex + parseInt(slideshowmax)); for (var i = startindex; i < endindex; i++) { jQuery(imagecarousels).eq(i).css({ 'opacity': 1, 'height': 'auto', 'position': 'initial' }); } //jQuery(imagecarousels).eq(currentIndex).css({ 'opacity': 1, 'height': 'auto', 'position': 'initial' }); jQuery(currentId + ' .sp-imagecarousel-nav button').eq(currentButtonIndex).css({ 'opacity': 1 }); } else { startindex = parseInt(currentIndex * parseInt(slideshowmax)); endindex = parseInt(startindex + parseInt(slideshowmax)); for (var _i2 = startindex; _i2 < endindex; _i2++) { jQuery(imagecarousels).eq(_i2).css({ 'opacity': 1, 'height': 'auto', 'position': 'initial' }); //jQuery(currentId + ' .sp-imagecarousel-nav button').eq(currentButtonIndex).css({ 'opacity': 1 }) } //jQuery(imagecarousels).eq(currentIndex).css({ 'opacity': 1, 'height': 'auto', 'position': 'initial' }); jQuery(currentId + ' .sp-imagecarousel-nav button').eq(currentIndex + 1).css({ 'opacity': 1 }); } }); var imagecarousel_timers = {}; jQuery(".sp-imagecarousels-wrapper").each(function (index) { var currentId = '#' + jQuery(this).attr('id'); var autoPlay = jQuery(this).attr('data-autoplay'); var speed = jQuery(this).attr('data-speed'); if (speed === '') { speed = 5000; } else { speed = parseInt(speed) * 1000; } if (autoPlay !== undefined) { imagecarousel_timers[currentId] = setInterval(function () { var clickEvent = jQuery.Event('click'); clickEvent.preventDefault(); jQuery(currentId + ' .sp-imagecarousel-nav button:last-child').triggerHandler(clickEvent); }, speed); } }); jQuery(".sp-imagecarousels-wrapper").hover(function () { var id = '#' + jQuery(this).attr('id'); clearInterval(imagecarousel_timers[id]); }); jQuery(".sp-imagecarousels-wrapper").mouseleave(function () { var currentId = '#' + jQuery(this).attr('id'); var autoPlay = jQuery(this).attr('data-autoplay'); var speed = jQuery(this).attr('data-speed'); if (speed === '') { speed = 5000; } else { speed = parseInt(speed) * 1000; } if (autoPlay !== undefined) { imagecarousel_timers[currentId] = setInterval(function () { var clickEvent = jQuery.Event('click'); clickEvent.preventDefault(); jQuery(currentId + ' .sp-imagecarousel-nav button:last-child').triggerHandler(clickEvent); }, speed); } }); function PureDropdown(dropdownParent) { var PREFIX = 'seedprod-', ACTIVE_CLASS_NAME = PREFIX + 'menu-active', ARIA_ROLE = 'role', ARIA_HIDDEN = 'aria-hidden', MENU_OPEN = 0, MENU_CLOSED = 1, MENU_ACTIVE_SELECTOR = '.menu-item-active', MENU_LINK_SELECTOR = '.menu-item a', MENU_SELECTOR = '.sub-menu', DISMISS_EVENT = window.hasOwnProperty && window.hasOwnProperty('ontouchstart') ? 'touchstart' : 'mousedown', ARROW_KEYS_ENABLED = true, ddm = this; // drop down menu this._state = MENU_CLOSED; this.show = function () { if (this._state !== MENU_OPEN) { this._dropdownParent.classList.add(ACTIVE_CLASS_NAME); this._menu.setAttribute(ARIA_HIDDEN, false); this._state = MENU_OPEN; } }; this.hide = function () { if (this._state !== MENU_CLOSED) { this._dropdownParent.classList.remove(ACTIVE_CLASS_NAME); this._menu.setAttribute(ARIA_HIDDEN, true); this._link.focus(); this._state = MENU_CLOSED; } }; this.toggle = function () { this[this._state === MENU_CLOSED ? 'show' : 'hide'](); }; this.halt = function (e) { e.stopPropagation(); e.preventDefault(); }; this._dropdownParent = dropdownParent; this._link = this._dropdownParent.querySelector(MENU_LINK_SELECTOR); this._menu = this._dropdownParent.querySelector(MENU_SELECTOR); this._firstMenuLink = this._menu.querySelector(MENU_LINK_SELECTOR); // Set ARIA attributes this._link.setAttribute('aria-haspopup', 'true'); this._menu.setAttribute(ARIA_ROLE, 'menu'); this._menu.setAttribute('aria-labelledby', this._link.getAttribute('id')); this._menu.setAttribute('aria-hidden', 'true'); [].forEach.call(this._menu.querySelectorAll('li'), function (el) { el.setAttribute(ARIA_ROLE, 'presentation'); }); [].forEach.call(this._menu.querySelectorAll('a'), function (el) { el.setAttribute(ARIA_ROLE, 'menuitem'); }); // Toggle on click this._link.addEventListener('click', function (e) { // e.stopPropagation(); // e.preventDefault(); // ddm.toggle(); if (ddm._state !== MENU_OPEN) { e.stopPropagation(); e.preventDefault(); ddm.show(); } }); // Toggle on hover this._link.addEventListener('mouseover', function (e) { e.stopPropagation(); e.preventDefault(); var isDesktop = window.matchMedia('only screen and (min-width: 768px)').matches; if (isDesktop) { // Only run this for desktop only. Submenu is shown on hover using CSS but we have no way to track it in JS. This does that. ddm.toggle(); } }); // Close menu when hovered out of - Desktop. this._link.addEventListener('mouseout', function (e) { e.stopPropagation(); e.preventDefault(); var isDesktop = window.matchMedia('only screen and (min-width: 768px)').matches; if (isDesktop) { ddm.hide(); ddm._link.blur(); } }); // Keyboard navigation document.addEventListener('keydown', function (e) { var currentLink, previousSibling, nextSibling, previousLink, nextLink; // if the menu isn't active, ignore if (ddm._state !== MENU_OPEN) { return; } // if the menu is the parent of an open, active submenu, ignore if (ddm._menu.querySelector(MENU_ACTIVE_SELECTOR)) { return; } currentLink = ddm._menu.querySelector(':focus'); // Dismiss an open menu on ESC if (e.keyCode === 27) { /* Esc */ ddm.halt(e); ddm.hide(); } // Go to the next link on down arrow else if (ARROW_KEYS_ENABLED && e.keyCode === 40) { /* Down arrow */ ddm.halt(e); // get the nextSibling (an LI) of the current link's LI nextSibling = currentLink ? currentLink.parentNode.nextSibling : null; // if the nextSibling is a text node (not an element), go to the next one while (nextSibling && nextSibling.nodeType !== 1) { nextSibling = nextSibling.nextSibling; } nextLink = nextSibling ? nextSibling.querySelector('.menu-item a') : null; // if there is no currently focused link, focus the first one if (!currentLink) { ddm._menu.querySelector('.menu-item a').focus(); } else if (nextLink) { nextLink.focus(); } } // Go to the previous link on up arrow else if (ARROW_KEYS_ENABLED && e.keyCode === 38) { /* Up arrow */ ddm.halt(e); // get the currently focused link previousSibling = currentLink ? currentLink.parentNode.previousSibling : null; while (previousSibling && previousSibling.nodeType !== 1) { previousSibling = previousSibling.previousSibling; } previousLink = previousSibling ? previousSibling.querySelector('.menu-item a') : null; // if there is no currently focused link, focus the last link if (!currentLink) { ddm._menu.querySelector('.menu-item:last-child .menu-item a').focus(); } // else if there is a previous item, go to the previous item else if (previousLink) { previousLink.focus(); } } }); // Dismiss an open menu on outside event document.addEventListener(DISMISS_EVENT, function (e) { var target = e.target; if (target !== ddm._link && !ddm._menu.contains(target)) { ddm.hide(); ddm._link.blur(); } }); } function initDropdowns() { var dropdownParents = document.querySelectorAll('.menu-item-has-children'); for (var i = 0; i < dropdownParents.length; i++) { var ddm = new PureDropdown(dropdownParents[i]); } } jQuery('.hamburger').click(function () { jQuery(this).toggleClass("active"); jQuery(this).next('.nav-menu').toggleClass("active"); }); function seedprod_add_basic_lightbox(blockId) { jQuery("#sp-" + blockId + " a").click(function () { return false; }); var imgbasicpreview = new ImgPreviewer('#sp-' + blockId, { scrollbar: true, dataUrlKey: 'href' }); imgbasicpreview.update(); } function seedprod_add_gallery_lightbox(blockId) { jQuery("#sp-" + blockId + " a.sp-gallery-items").click(function () { return false; }); var imgpreview = new ImgPreviewer('#sp-' + blockId + " .sp-gallery-block", { scrollbar: true, dataUrlKey: 'href' }); imgpreview.update(); jQuery("#sp-" + blockId + " .sp-gallery-tabs a.sp-gallery-tab-title").click(function () { var activeTabIndex = jQuery(this).attr("data-gallery-index"); jQuery('#sp-' + blockId + ' .sp-gallery-tab-title').removeClass('sp-tab-active'); jQuery(this).addClass('sp-tab-active'); jQuery.each(jQuery('#sp-' + blockId + ' .sp-gallery-items'), function (i, v) { jQuery(this).removeClass('sp-hidden-items'); jQuery(this).removeClass('zoom-in'); // Hide images that do not match the active tab index. if (activeTabIndex !== 'all') { var currentTabIndex = jQuery(v).data('tags'); var cleanCurrentTabIndex = currentTabIndex.split(','); if (!cleanCurrentTabIndex.includes(activeTabIndex)) { jQuery(this).addClass('sp-hidden-items'); } } }); imgpreview.update(); }); } function seedprod_add_gallery_js(blockId) { jQuery("#sp-" + blockId + " .sp-gallery-tabs a.sp-gallery-tab-title").click(function () { var activeTabIndex = jQuery(this).attr("data-gallery-index"); jQuery('#sp-' + blockId + ' .sp-gallery-tab-title').removeClass('sp-tab-active'); jQuery(this).addClass('sp-tab-active'); jQuery.each(jQuery('#sp-' + blockId + ' .sp-gallery-items'), function (i, v) { jQuery(this).removeClass('sp-hidden-items'); jQuery(this).removeClass('zoom-in'); // Hide images that do not match the active tab index. if (activeTabIndex !== 'all') { var currentTabIndex = jQuery(v).data('tags'); var cleanCurrentTabIndex = currentTabIndex.split(','); if (!cleanCurrentTabIndex.includes(activeTabIndex)) { jQuery(this).addClass('sp-hidden-items'); } } }); }); } jQuery.fn.isInViewport = function () { var elementTop = jQuery(this).offset().top; var elementBottom = elementTop + jQuery(this).outerHeight(); var viewportTop = jQuery(window).scrollTop(); var viewportBottom = viewportTop + jQuery(window).height(); return elementBottom > viewportTop && elementTop < viewportBottom; }; // Check if an element is in the viewport with a threshold percentage. jQuery.fn.isInViewportWithThreshold = function () { var threshold = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 50; var elementTop = this.offset().top; var elementBottom = elementTop + this.outerHeight(); var viewportTop = jQuery(window).scrollTop(); var viewportBottom = viewportTop + jQuery(window).height(); // Only consider it "in viewport" if a threshold percentage is visible var elementVisible = Math.min(elementBottom, viewportBottom) - Math.max(elementTop, viewportTop); return elementVisible / this.outerHeight() * 100 >= threshold; }; // Trigger counter block. function counter(blockId) { var duration = jQuery("#sp-counter-".concat(blockId, " .sp-counter-text-wrapper .sp-counter-number")).attr('data-duration'); var startNumber = jQuery("#sp-counter-".concat(blockId, " .sp-counter-text-wrapper .sp-counter-number")).attr('data-start-number'); var endNumber = jQuery("#sp-counter-".concat(blockId, " .sp-counter-text-wrapper .sp-counter-number")).attr('data-end-number'); var thousandsSeparator = jQuery("#sp-counter-".concat(blockId, " .sp-counter-text-wrapper .sp-counter-number")).attr('data-thousands-separator'); var separator = jQuery("#sp-counter-".concat(blockId, " .sp-counter-text-wrapper .sp-counter-number")).attr('data-separator'); var options = {}; var delimeter = { 'default': ',', 'space': ' ', 'dot': '.' }; options.duration = duration; options.delimiter = thousandsSeparator ? delimeter[separator] : ''; options.toValue = endNumber; jQuery("#sp-counter-number-".concat(blockId)).html(startNumber); jQuery("#sp-counter-number-".concat(blockId)).numerator(options); } // Render dynamic tags. function image_dynamic_tags(blockId) { // Replace image src if source is dynamic tags jQuery(".sp-image-block-".concat(blockId)).each(function () { var _this = this; // If data-image-src === dynamictags var imageSrc = jQuery(this).attr('data-image-src'); if ('dynamictags' === imageSrc) { var imageLink = jQuery(this).attr('data-dynamic-tag'); if (imageLink) { // Pre-load the image var img = new Image(); img.onload = function () { // Set new src when the image has loaded jQuery(_this).attr('src', imageLink); }; img.src = imageLink; } } }); } function postcomments(blockId) { // Get comment policy content. var commentPolicyElement = "#sp-".concat(blockId, " .sp-postcomments-content-policy-").concat(blockId); var commentPolicyContent = jQuery(commentPolicyElement).html(); // Create comment policy element, add class & append content. var commentPolicyHtml = jQuery('<p class="commentpolicy"></p>').html(commentPolicyContent); // Find commentform on current block & append comment policy var currentBlock = "#sp-".concat(blockId, " #commentform"); var currentBlockHtml = document.querySelector(currentBlock); if (currentBlockHtml) { jQuery(currentBlock).prepend(commentPolicyHtml); } } function beforeafterslider(blockId, options) { /* let options1 = { default_offset_pct: 0.5, orientation: "horizontal", before_label: "Before", after_label: "After", no_overlay: false,//self.block.settings.overlayColor, move_slider_on_hover: true, move_with_handle_only: true, click_to_move: true }; */ jQuery("#sp-toggle-".concat(blockId, " .twentytwenty-container")).twentytwenty(options); } function hotspotTooltips(blockId, items) { var trigger = jQuery("#sp-".concat(blockId, " .sp-hotspot-image")).attr('data-tooltip-trigger'); var animation = jQuery("#sp-".concat(blockId, " .sp-hotspot-image")).attr('data-tooltip-animation'); var duration = jQuery("#sp-".concat(blockId, " .sp-hotspot-image")).attr('data-tooltip-duration'); var position = jQuery("#sp-".concat(blockId, " .sp-hotspot-image")).attr('data-tooltip-position'); var showArrow = jQuery("#sp-".concat(blockId, " .sp-hotspot-image")).attr('data-tooltip-show-arrow'); var maxWidth = jQuery("#sp-".concat(blockId, " .sp-hotspot-image")).attr('data-tooltip-max-width'); items = JSON.parse(items); items.map(function (item, index) { var $myElement = "#sp-".concat(blockId, " #hotspot-").concat(blockId, "-").concat(index); jQuery($myElement).tooltipster({ animation: animation, delay: duration, trigger: trigger, side: position, arrow: 'true' === showArrow ? true : false, maxWidth: maxWidth, content: item.tooltipContent, contentCloning: true, contentAsHTML: true }); }); } function seedprod_add_content_toggle_js(blockId) { if (jQuery(this).is(":checked") == false) { jQuery("#sp-contenttoggle-" + blockId + " .sp-toggle-sections .sp-toggle-sections1").removeClass("sp-hidden"); jQuery("#sp-contenttoggle-" + blockId + " .sp-toggle-sections .sp-toggle-sections2").addClass("sp-hidden"); } else { jQuery("#sp-contenttoggle-" + blockId + " .sp-toggle-sections .sp-toggle-sections1").addClass("sp-hidden"); jQuery("#sp-contenttoggle-" + blockId + " .sp-toggle-sections .sp-toggle-sections2").removeClass("sp-hidden"); } jQuery("#sp-contenttoggle-" + blockId + " .sp-content-toggle-area .sp-toggle-switch").change(function () { if (jQuery(this).is(":checked") == false) { jQuery("#sp-contenttoggle-" + blockId + " .sp-toggle-sections .sp-toggle-sections1").removeClass("sp-hidden"); jQuery("#sp-contenttoggle-" + blockId + " .sp-toggle-sections .sp-toggle-sections2").addClass("sp-hidden"); } else { jQuery("#sp-contenttoggle-" + blockId + " .sp-toggle-sections .sp-toggle-sections1").addClass("sp-hidden"); jQuery("#sp-contenttoggle-" + blockId + " .sp-toggle-sections .sp-toggle-sections2").removeClass("sp-hidden"); } }); } jQuery('.sp-type-alert button.sp-alert-close').click(function () { jQuery(this).parents('.sp-type-alert').hide(); }); /** * businessreview javascript */ jQuery('.sp-businessreview-nav button').click(function () { var currentId = '#' + jQuery(this).parents('.sp-businessreview-wrapper').attr('id'); var currentButtonIndex = jQuery(currentId + ' .sp-businessreview-nav button').index(this); var currentIndex = 0; var businessreviews = jQuery('.seedprod-business-review-wrapper', jQuery(this).parents(currentId)); var slideshowmax = jQuery(this).parents('.sp-businessreview-wrapper').attr('data-slidetoshow'); if (slideshowmax == undefined) { slideshowmax = 1; } var slider_length = Math.ceil(businessreviews.length / parseInt(slideshowmax)); for (var customindexdata = 0; customindexdata < slider_length; customindexdata++) { var opa = jQuery(currentId + ' .sp-businessreview-nav button[data-index="' + customindexdata + '"]').css('opacity'); if (opa >= 0.5) { //console.log("customindexdata is =" + customindexdata); currentIndex = customindexdata; } } var buttonsLength = jQuery(currentId + ' .sp-businessreview-nav button').length - 1; var currentButtonIndexData = jQuery(currentId + ' .sp-businessreview-nav button').eq(currentButtonIndex).attr('data-index'); // check for previous button click if (currentButtonIndex == 0) { if (0 == currentIndex) { currentIndex = Math.ceil(businessreviews.length / parseInt(slideshowmax)) - 1; } else { currentIndex--; } } // check for next button click if (currentButtonIndex == buttonsLength) { if (Math.ceil(businessreviews.length / parseInt(slideshowmax)) - 1 == currentIndex) { currentIndex = 0; } else { currentIndex++; } } // reset states businessreviews.css({ 'z-index': 999, 'opacity': 0, 'height': '0', 'position': 'absolute' }); jQuery(currentId + ' .sp-businessreview-nav button[data-index]').css({ 'opacity': 0.25 }); var startindex = parseInt(currentIndex * parseInt(slideshowmax)); var endindex = parseInt(startindex + parseInt(slideshowmax)); // select businessreviews and button if (currentButtonIndexData !== undefined) { currentIndex = currentButtonIndexData; startindex = parseInt(currentIndex * parseInt(slideshowmax)); endindex = parseInt(startindex + parseInt(slideshowmax)); for (var i = startindex; i < endindex; i++) { jQuery(businessreviews).eq(i).css({ 'opacity': 1, 'height': 'auto', 'position': 'initial' }); } //jQuery(businessreviews).eq(currentIndex).css({ 'opacity': 1, 'height': 'auto', 'position': 'initial' }); jQuery(currentId + ' .sp-businessreview-nav button').eq(currentButtonIndex).css({ 'opacity': 1 }); } else { startindex = parseInt(currentIndex * parseInt(slideshowmax)); endindex = parseInt(startindex + parseInt(slideshowmax)); for (var _i3 = startindex; _i3 < endindex; _i3++) { jQuery(businessreviews).eq(_i3).css({ 'opacity': 1, 'height': 'auto', 'position': 'initial' }); //jQuery(currentId + ' .sp-imagecarousel-nav button').eq(currentButtonIndex).css({ 'opacity': 1 }) } //jQuery(businessreviews).eq(currentIndex).css({ 'opacity': 1, 'height': 'auto', 'position': 'initial' }); jQuery(currentId + ' .sp-businessreview-nav button').eq(currentIndex + 1).css({ 'opacity': 1 }); } }); var businessreview_timers = {}; jQuery(".sp-businessreview-wrapper").each(function (index) { var currentId = '#' + jQuery(this).attr('id'); var autoPlay = jQuery(this).attr('data-autoplay'); var speed = jQuery(this).attr('data-speed'); if (speed === '') { speed = 5000; } else { speed = parseInt(speed) * 1000; } if (autoPlay !== undefined) { businessreview_timers[currentId] = setInterval(function () { var clickEvent = jQuery.Event('click'); clickEvent.preventDefault(); jQuery(currentId + ' .sp-businessreview-nav button:last-child').triggerHandler(clickEvent); }, speed); } }); jQuery(".sp-businessreview-wrapper").hover(function () { var id = '#' + jQuery(this).attr('id'); clearInterval(businessreview_timers[id]); }); jQuery(".sp-businessreview-wrapper").mouseleave(function () { var currentId = '#' + jQuery(this).attr('id'); var autoPlay = jQuery(this).attr('data-autoplay'); var speed = jQuery(this).attr('data-speed'); if (speed === '') { speed = 5000; } else { speed = parseInt(speed) * 1000; } if (autoPlay !== undefined) { businessreview_timers[currentId] = setInterval(function () { var clickEvent = jQuery.Event('click'); clickEvent.preventDefault(); jQuery(currentId + ' .sp-businessreview-nav button:last-child').triggerHandler(clickEvent); }, speed); } }); function seedprod_particlessectionjs(blockId, particlesconfig) { var particlesJSON = particlesconfig; particlesJS("tsparticles-preview-sp-" + blockId, particlesJSON); } function seedprod_pro_video_pop_up_trigger_video(blockId, videoHtml, blockOptions) { var options = JSON.parse(blockOptions); var responsiveClass = options.source === 'custom' ? 'sp-video-responsive-video' : 'sp-video-responsive'; var videoWrapper = jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)); var videoResponsive = jQuery("#sp-".concat(blockId, " #sp-video-responsive-").concat(blockId)); var banner = jQuery("#sp-".concat(blockId, " #sp-video-pop-up-banner-").concat(blockId)); // Only enable if image overlay is enabled. if (options.enable_image_overlay) { if (options.enable_lightbox) { // Open lightbox modal onclick jQuery("#sp-".concat(blockId, " .sp-video-pop-up-image-overlay-container")).click(function () { // Set modal content html jQuery("#sp-".concat(blockId, " #video-pop-up-lightbox-modal-").concat(blockId, " .modal-content")).html("<div id=\"sp-video-responsive-".concat(blockId, "\" class=\"").concat(responsiveClass, " sp-video-pop-up-video\">").concat(videoHtml, "</div>")); jQuery("#sp-".concat(blockId, " #video-pop-up-lightbox-modal-").concat(blockId)).css('display', 'block'); }); // Close lightbox jQuery("#sp-".concat(blockId, " #video-pop-up-lightbox-modal-").concat(blockId, " span.close")).click(function () { jQuery("#sp-".concat(blockId, " #video-pop-up-lightbox-modal-").concat(blockId)).css('display', 'none'); }); } else { // When image overlay is clicked, display video. jQuery("#sp-".concat(blockId, " .sp-video-pop-up-image-overlay-container")).click(function () { jQuery("#sp-".concat(blockId, " .sp-video-pop-up-image-overlay-container")).remove(); // Create video element. jQuery("#sp-".concat(blockId, " .sp-video-wrapper")).append("<div id=\"sp-video-responsive-".concat(blockId, "\" class=\"").concat(responsiveClass, " sp-video-pop-up-video\">").concat(videoHtml, "</div>")); jQuery("#sp-".concat(blockId, " #sp-video-responsive-").concat(blockId)).css('aspect-ratio', options.aspect_ratio); }); } } if (options.enable_sticky_video && !options.enable_lightbox) { // On scroll/resize jQuery(window).on('resize scroll', throttle(function () { // Disable for mobile. if (window.matchMedia('only screen and (min-width: 960px)').matches) { // Check if video is in viewport if (jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).isInViewportWithThreshold()) { // Return original class videoWrapper.removeClass('sp-video-wrapper-sticky').addClass('sp-video-wrapper'); videoResponsive.removeClass('sp-video-responsive-sticky').addClass(responsiveClass); if (options.enable_banner) { // Check if video is custom if (options.source === 'custom') { banner.removeClass('sp-video-pop-up-banner-custom-sticky').addClass('sp-video-pop-up-banner'); } else if (options.source === 'vimeo') { banner.removeClass('sp-video-pop-up-banner-vimeo-sticky').addClass('sp-video-pop-up-banner'); } else { banner.removeClass('sp-video-pop-up-banner-sticky').addClass('sp-video-pop-up-banner'); } } // Remove isolation & reset z-index // Section if (jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-section').length > 0) { if (seedprod_pro_check_for_entrance_animation(jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-section'))) { videoWrapper.parents('.sp-el-section').css('isolation', 'initial'); videoWrapper.parents('.sp-el-section').css('z-index', 'auto'); } } // Col if (jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-col').length > 0) { if (seedprod_pro_check_for_entrance_animation(jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-col'))) { jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-col').css('isolation', 'initial'); jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-col').css('z-index', 'auto'); } } // Row if (jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-row').length > 0) { if (seedprod_pro_check_for_entrance_animation(jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-row'))) { jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-row').css('isolation', 'initial'); jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-row').css('z-index', 'auto'); } } } else { // Add sticky class videoWrapper.removeClass('sp-video-wrapper').addClass('sp-video-wrapper-sticky'); videoResponsive.removeClass(responsiveClass).addClass('sp-video-responsive-sticky'); if (options.enable_banner) { // Check if video is custom or vimeo if (options.source === 'custom') { banner.removeClass('sp-video-pop-up-banner').addClass('sp-video-pop-up-banner-custom-sticky'); } else if (options.source === 'vimeo') { banner.removeClass('sp-video-pop-up-banner').addClass('sp-video-pop-up-banner-vimeo-sticky'); } else { banner.removeClass('sp-video-pop-up-banner').addClass('sp-video-pop-up-banner-sticky'); } } // Check if parent row/col/section has an entrance animation. // Section if (jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-section').length > 0) { if (seedprod_pro_check_for_entrance_animation(jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-section'))) { // If entrance animation is set, check if z-index is 0 or empty if (videoWrapper.parents('.sp-el-section').css('z-index') === '0' || videoWrapper.parents('.sp-el-section').css('z-index') === '' || videoWrapper.parents('.sp-el-section').css('z-index') === 'auto') { videoWrapper.parents('.sp-el-section').css('z-index', 1); videoWrapper.parents('.sp-el-section').css('isolation', 'isolate'); } } } // Col if (jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-col').length > 0) { if (seedprod_pro_check_for_entrance_animation(jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-col'))) { // If entrance animation is set, check if z-index is 0 or empty if (jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-col').css('z-index') === '0' || jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-col').css('z-index') === '' || jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-col').css('z-index') === 'auto') { videoWrapper.parents('.sp-el-col').css('z-index', 1); videoWrapper.parents('.sp-el-col').css('isolation', 'isolate'); } } } // Row if (jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-row').length > 0) { if (seedprod_pro_check_for_entrance_animation(jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).parents('.sp-el-row'))) { // If entrance animation is set, check if z-index is 0 or empty if (videoWrapper.parents('.sp-el-row').css('z-index') === '0' || videoWrapper.parents('.sp-el-row').css('z-index') === '' || videoWrapper.parents('.sp-el-row').css('z-index') === 'auto') { videoWrapper.parents('.sp-el-row').css('z-index', 1); videoWrapper.parents('.sp-el-row').css('isolation', 'isolate'); } } } } } }, 2000)); } // Teaser Video if (options.enable_teaser_video) { // When teaser video icon is clicked, play unmuted video. jQuery("#sp-".concat(blockId, " .sp-video-pop-up-teaser-video-play-icon-display, #sp-").concat(blockId, " .sp-video-pop-up-teaser-video-play-icon-display i")).click(function () { // Sticky video. var stickyVideoClass = ''; if (options.enable_sticky_video) { // Disable for mobile. if (window.matchMedia('only screen and (min-width: 960px)').matches) { if (jQuery("#sp-".concat(blockId, " #sp-video-wrapper-").concat(blockId)).isInViewportWithThreshold()) { stickyVideoClass = "sp-video-wrapper ".concat(responsiveClass); } else { stickyVideoClass = 'sp-video-wrapper-sticky sp-video-responsive-sticky'; } } } else { stickyVideoClass = "sp-video-wrapper ".concat(responsiveClass); } // Set mute to false & show controls. if (options.source === 'custom') { videoHtml = videoHtml.replace('muted', 'controls'); } if (options.source === 'youtube') { videoHtml = videoHtml.replace('mute=1', 'mute=0'); videoHtml = videoHtml.replace('controls=0', 'controls=1'); } if (options.source === 'vimeo') { videoHtml = videoHtml.replace('muted=1', 'muted=0'); videoHtml = videoHtml.replace('controls=0', 'controls=1'); } jQuery("#sp-".concat(blockId, " .sp-video-pop-up-teaser-video-play-icon-display")).remove(); jQuery("#sp-".concat(blockId, " .sp-video-pop-up-teaser-video")).remove(); // Create video element. videoWrapper.append("<div id=\"sp-video-responsive-".concat(blockId, "\" class=\"").concat(stickyVideoClass, " sp-video-pop-up-video\">").concat(videoHtml, "</div>")); videoResponsive.css('aspect-ratio', options.aspect_ratio); }); } } /** * Initialize background video sizing for frontend/preview pages * This replicates the ResizeObserver logic from the Vue builder * Now includes lazy loading with Intersection Observer for better performance * * @param {string} sectionId - The ID of the section containing the background video */ function seedprod_pro_init_background_video(sectionId) { var section = document.getElementById('sp-' + sectionId); if (!section) return; // Check if Intersection Observer is supported if ('IntersectionObserver' in window) { // Use Intersection Observer for lazy loading var observer = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) { // Video section is now visible - initialize it initializeVideo(sectionId); // Stop observing once loaded observer.unobserve(entry.target); } }); }, { // Start loading when video is 100px away from viewport rootMargin: '100px' }); // Start observing the section observer.observe(section); } else { // Fallback for older browsers - load immediately initializeVideo(sectionId); } } /** * Actually initialize the video (called when section is visible) */ function initializeVideo(sectionId) { // Check connection speed before loading video if (window.navigator && window.navigator.connection) { var connection = navigator.connection; // Skip video loading on slow connections or data saver mode if (connection.saveData || connection.effectiveType === '2g' || connection.effectiveType === 'slow-2g') { // Just hide the video wrapper - section background image will show through var section = document.getElementById('sp-' + sectionId); if (section) { var videoWrapper = section.querySelector('.sp-section-video-wrapper'); if (videoWrapper) { videoWrapper.style.display = 'none'; } } return; } } function updateVideoSize() { var section = document.getElementById('sp-' + sectionId); if (!section) return; var videoWrapper = section.querySelector('.sp-section-video-wrapper'); if (!videoWrapper) return; // Wrapper fills section via CSS (inset: 0), so get its dimensions var wrapperWidth = videoWrapper.offsetWidth; var wrapperHeight = videoWrapper.offsetHeight; // Find video element (iframe or video tag) var videoElement = videoWrapper.querySelector('iframe, video'); if (!videoElement) return; // Calculate video dimensions to cover the wrapper (16:9 aspect ratio) var videoAspectRatio = 16 / 9; var wrapperAspectRatio = wrapperWidth / wrapperHeight; var videoWidth, videoHeight; if (wrapperAspectRatio > videoAspectRatio) { // Wrapper is wider than video - fit to width videoWidth = wrapperWidth; videoHeight = wrapperWidth / videoAspectRatio; } else { // Wrapper is taller than video - fit to height videoWidth = wrapperHeight * videoAspectRatio; videoHeight = wrapperHeight; } // Apply dimensions and centering videoElement.style.width = Math.ceil(videoWidth) + 'px'; videoElement.style.height = Math.ceil(videoHeight) + 'px'; videoElement.style.position = 'absolute'; videoElement.style.top = '50%'; videoElement.style.left = '50%'; videoElement.style.transform = 'translate(-50%, -50%)'; videoElement.style.minWidth = '100%'; videoElement.style.minHeight = '100%'; videoElement.style.objectFit = 'cover'; // Disable right-click and all interactions videoElement.oncontextmenu = function (e) { e.preventDefault(); return false; }; } // Initial sizing with delay to ensure section has proper height setTimeout(updateVideoSize, 50); setTimeout(updateVideoSize, 200); setTimeout(updateVideoSize, 500); // Use ResizeObserver if available (modern browsers) if (typeof ResizeObserver !== 'undefined') { var observer = new ResizeObserver(function () { updateVideoSize(); }); var section = document.getElementById('sp-' + sectionId); if (section) { observer.observe(section); } } else { // Fallback for older browsers - watch window resize jQuery(window).on('resize.bgvideo-' + sectionId, throttle(function () { updateVideoSize(); }, 250)); } // Update when images load (they can affect section height) jQuery('#sp-' + sectionId + ' img').on('load', function () { updateVideoSize(); }); // YouTube Player API integration (matching Elementor's approach) var section = document.getElementById('sp-' + sectionId); if (section) { var youtubeIframe = section.querySelector('.sp-section-video-wrapper iframe[src*="youtube.com"]'); if (youtubeIframe && youtubeIframe.src.indexOf('enablejsapi=1') !== -1) { // Give iframe an ID if it doesn't have one if (!youtubeIframe.id) { youtubeIframe.id = 'sp-yt-player-' + sectionId; } // Store init function in array for batch processing if (!window.seedprodYTPlayersToInit) { window.seedprodYTPlayersToInit = []; } // Store active players and their intervals for cleanup if (!window.seedprodYTPlayers) { window.seedprodYTPlayers = {}; } // Add cleanup function if (!window.seedprodCleanupYTPlayer) { window.seedprodCleanupYTPlayer = function (iframeId) { if (window.seedprodYTPlayers && window.seedprodYTPlayers[iframeId]) { var playerData = window.seedprodYTPlayers[iframeId]; // Clear interval if exists if (playerData.checkInterval) { clearInterval(playerData.checkInterval); playerData.checkInterval = null; } // Remove from storage delete window.seedprodYTPlayers[iframeId]; } }; } // Add page unload cleanup if (!window.seedprodYTCleanupAttached) { window.seedprodYTCleanupAttached = true; window.addEventListener('beforeunload', function () { // Clean up all YouTube players on page unload if (window.seedprodYTPlayers) { Object.keys(window.seedprodYTPlayers).forEach(function (iframeId) { window.seedprodCleanupYTPlayer(iframeId); }); } }); } // Add this player to the queue window.seedprodYTPlayersToInit.push({ iframeId: youtubeIframe.id, sectionId: sectionId }); // Initialize player when API is ready var initYouTubePlayer = function initYouTubePlayer() { if (window.YT && window.YT.Player) { try { // Extract settings from iframe URL var iframeSrc = youtubeIframe.src; var startTime = null; var endTime = null; var isLooping = iframeSrc.indexOf('loop=1') !== -1; // Extract start time from URL (format: start=NUMBER) var startMatch = iframeSrc.match(/[?&]start=(\d+)/); if (startMatch) { startTime = parseInt(startMatch[1], 10); } // Extract end time from URL (format: end=NUMBER) var endMatch = iframeSrc.match(/[?&]end=(\d+)/); if (endMatch) { endTime = parseInt(endMatch[1], 10); } var player = new YT.Player(youtubeIframe.id, { events: { 'onReady': function onReady(event) { // Store player instance window.seedprodYTPlayers[youtubeIframe.id] = { player: player, checkInterval: null }; // Handle start/end time with looping using polling if (endTime !== null) { var lastSeekTime = 0; var checkInterval = setInterval(function () { try { if (player && player.getCurrentTime) { var currentTime = player.getCurrentTime(); // Synchronous, not a Promise // Check if we've reached the end time // Seek slightly before the end (0.5s buffer) to prevent flicker if (currentTime >= endTime - 0.5 && currentTime < endTime + 1) { // Prevent multiple seeks in quick succession var now = Date.now(); if (now - lastSeekTime > 800) { // Only seek once per 800ms lastSeekTime = now; if (isLooping) { // Loop back to start time (or 0 if no start time) player.seekTo(startTime || 0, true); } else { // Pause and show thumbnail player.pauseVideo(); var videoWrapper = section.querySelector('.sp-section-video-wrapper'); if (videoWrapper) { videoWrapper.classList.add('video-ended'); } clearInterval(checkInterval); // Clear from global storage too if (window.seedprodYTPlayers[youtubeIframe.id]) { window.seedprodYTPlayers[youtubeIframe.id].checkInterval = null; } } } } } } catch (e) { // Ignore errors } }, 200); // Check more frequently (200ms) for smoother transitions // Store interval for cleanup if (window.seedprodYTPlayers[youtubeIframe.id]) { window.seedprodYTPlayers[youtubeIframe.id].checkInterval = checkInterval; } } }, 'onStateChange': function onStateChange(event) { // When video ends naturally (no custom end time) if (event.data === YT.PlayerState.ENDED) { if (isLooping && !endTime) { // Loop from beginning (no custom end time, but loop is on) player.seekTo(startTime || 0, true); player.playVideo(); } else if (!isLooping) { // Show thumbnail overlay when loop is off var videoWrapper = section.querySelector('.sp-section-video-wrapper'); if (videoWrapper) { videoWrapper.classList.add('video-ended'); } } } } } }); } catch (e) { // Silently handle YouTube Player API errors } } }; // Load YouTube IFrame API if not already loaded if (!window.YT && !window.seedprodYTAPILoading) { window.seedprodYTAPILoading = true; var tag = document.createElement('script'); tag.src = 'https://www.youtube.com/iframe_api'; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); // Set up global callback - preserve existing callback if present (e.g., from tubular.js) var originalCallback = window.onYouTubeIframeAPIReady; window.onYouTubeIframeAPIReady = function () { // Call original callback first if it exists if (originalCallback && typeof originalCallback === 'function') { originalCallback(); } // Initialize all queued players if (window.seedprodYTPlayersToInit) { setTimeout(function () { window.seedprodYTPlayersToInit.forEach(function (playerInfo) { var section = document.getElementById('sp-' + playerInfo.sectionId); if (section && window.YT && window.YT.Player) { try { // Get iframe to extract settings var iframe = document.getElementById(playerInfo.iframeId); if (!iframe) return; var iframeSrc = iframe.src; var startTime = null; var endTime = null; var isLooping = iframeSrc.indexOf('loop=1') !== -1; // Extract start time var startMatch = iframeSrc.match(/[?&]start=(\d+)/); if (startMatch) { startTime = parseInt(startMatch[1], 10); } // Extract end time var endMatch = iframeSrc.match(/[?&]end=(\d+)/); if (endMatch) { endTime = parseInt(endMatch[1], 10); } var player = new YT.Player(playerInfo.iframeId, { events: { 'onReady': function onReady(event) { // Store player instance window.seedprodYTPlayers[playerInfo.iframeId] = { player: player, checkInterval: null }; // Handle start/end time with looping using polling if (endTime !== null) { var lastSeekTime = 0; var checkInterval = setInterval(function () { try { if (player && player.getCurrentTime) { var currentTime = player.getCurrentTime(); // Synchronous, not a Promise // Check if we've reached the end time // Seek slightly before the end (0.5s buffer) to prevent flicker if (currentTime >= endTime - 0.5 && currentTime < endTime + 1) { // Prevent multiple seeks in quick succession var now = Date.now(); if (now - lastSeekTime > 800) { // Only seek once per 800ms lastSeekTime = now; if (isLooping) { // Loop back to start time (or 0 if no start time) player.seekTo(startTime || 0, true); } else { // Pause and show thumbnail player.pauseVideo(); var videoWrapper = section.querySelector('.sp-section-video-wrapper'); if (videoWrapper) { videoWrapper.classList.add('video-ended'); } clearInterval(checkInterval); // Clear from global storage too if (window.seedprodYTPlayers[playerInfo.iframeId]) { window.seedprodYTPlayers[playerInfo.iframeId].checkInterval = null; } } } } } } catch (e) { // Ignore errors } }, 200); // Check more frequently (200ms) for smoother transitions // Store interval for cleanup if (window.seedprodYTPlayers[playerInfo.iframeId]) { window.seedprodYTPlayers[playerInfo.iframeId].checkInterval = checkInterval; } } }, 'onStateChange': function onStateChange(event) { // When video ends naturally (no custom end time) if (event.data === YT.PlayerState.ENDED) { if (isLooping && !endTime) { // Loop from beginning (no custom end time, but loop is on) player.seekTo(startTime || 0, true); player.playVideo(); } else if (!isLooping) { // Show thumbnail overlay when loop is off var videoWrapper = section.querySelector('.sp-section-video-wrapper'); if (videoWrapper) { videoWrapper.classList.add('video-ended'); } } } } } }); } catch (e) { // Silently handle YouTube Player API errors } } }); }, 1000); } }; } else if (window.YT && window.YT.Player) { // API already loaded, init immediately setTimeout(initYouTubePlayer, 1000); } } // Vimeo Player API integration (matching Elementor's approach) var vimeoIframe = section.querySelector('.sp-section-video-wrapper iframe[src*="vimeo.com"]'); if (vimeoIframe) { var initVimeoPlayer = function initVimeoPlayer() { try { // Create Vimeo Player instance var player = new Vimeo.Player(vimeoIframe); // Store player instance for cleanup window.seedprodVimeoPlayers[vimeoIframe.id] = { player: player }; // Get settings from iframe URL var iframeSrc = vimeoIframe.src; var startTime = null; var endTime = null; var isLooping = iframeSrc.indexOf('loop=1') !== -1; // Extract start/end times from hash (format: #t=85s,95s) var timeMatch = iframeSrc.match(/#t=(\d+)s(?:,(\d+)s)?/); if (timeMatch) { startTime = parseInt(timeMatch[1], 10); if (timeMatch[2]) { endTime = parseInt(timeMatch[2], 10); } } // Handle start time - jump to start when video first plays if (startTime) { player.on('play', function (data) { // Only seek on first play (when at 0 seconds) if (data.seconds === 0) { player.setCurrentTime(startTime); } }); } // Handle end time and looping using timeupdate (Elementor approach) player.on('timeupdate', function (data) { // Check if we've reached the end time if (endTime && data.seconds >= endTime) { if (isLooping) { // Loop back to start player.setCurrentTime(startTime || 0); } else { // Pause at end (shows last frame - no related videos!) player.pause(); } } // Special case: Start time but no end time // Loop back when near the natural end of video if (startTime && !endTime && !isLooping) { player.getDuration().then(function (duration) { if (data.seconds > duration - 0.5) { player.pause(); } }); } else if (startTime && !endTime && isLooping) { player.getDuration().then(function (duration) { if (data.seconds > duration - 0.5) { player.setCurrentTime(startTime); } }); } }); // Remove loading class when ready player.ready().then(function () { section.classList.remove('seedprod-video-loading'); }); } catch (e) { // Silently handle Vimeo Player API errors } }; // Generate unique ID for iframe if it doesn't have one if (!vimeoIframe.id) { vimeoIframe.id = 'vimeo-' + sectionId + '-' + Date.now(); } // Store active Vimeo players for cleanup if (!window.seedprodVimeoPlayers) { window.seedprodVimeoPlayers = {}; } // Add cleanup function if (!window.seedprodCleanupVimeoPlayer) { window.seedprodCleanupVimeoPlayer = function (iframeId) { if (window.seedprodVimeoPlayers && window.seedprodVimeoPlayers[iframeId]) { var playerData = window.seedprodVimeoPlayers[iframeId]; // Remove event listeners using Vimeo API off() method if (playerData.player) { try { playerData.player.off('play'); playerData.player.off('timeupdate'); } catch (e) { // Silently handle errors during cleanup } } // Remove from storage delete window.seedprodVimeoPlayers[iframeId]; } }; } // Add page unload cleanup if (!window.seedprodVimeoCleanupAttached) { window.seedprodVimeoCleanupAttached = true; window.addEventListener('beforeunload', function () { // Clean up all Vimeo players on page unload if (window.seedprodVimeoPlayers) { Object.keys(window.seedprodVimeoPlayers).forEach(function (iframeId) { window.seedprodCleanupVimeoPlayer(iframeId); }); } }); } // Clean up existing player if re-initializing if (window.seedprodVimeoPlayers[vimeoIframe.id]) { window.seedprodCleanupVimeoPlayer(vimeoIframe.id); } // Load Vimeo Player API if not already loaded if (!window.Vimeo || !window.Vimeo.Player) { var script = document.createElement('script'); script.src = 'https://player.vimeo.com/api/player.js'; script.onload = function () { initVimeoPlayer(); }; document.head.appendChild(script); } else { initVimeoPlayer(); } } // Custom HTML5 Video handling for start/end time var customVideo = section.querySelector('.sp-section-video-wrapper video.sp-section-video-element'); if (customVideo) { // Generate unique ID for video if it doesn't have one if (!customVideo.id) { customVideo.id = 'custom-video-' + sectionId + '-' + Date.now(); } // Store active custom videos for cleanup if (!window.seedprodCustomVideos) { window.seedprodCustomVideos = {}; } // Add cleanup function if (!window.seedprodCleanupCustomVideo) { window.seedprodCleanupCustomVideo = function (videoId) { if (window.seedprodCustomVideos && window.seedprodCustomVideos[videoId]) { var videoData = window.seedprodCustomVideos[videoId]; var video = videoData.element; // Remove event listeners if (video && videoData.listeners) { video.removeEventListener('loadedmetadata', videoData.listeners.loadedmetadata); video.removeEventListener('timeupdate', videoData.listeners.timeupdate); } // Remove from storage delete window.seedprodCustomVideos[videoId]; } }; } // Add page unload cleanup if (!window.seedprodCustomVideoCleanupAttached) { window.seedprodCustomVideoCleanupAttached = true; window.addEventListener('beforeunload', function () { // Clean up all custom videos on page unload if (window.seedprodCustomVideos) { Object.keys(window.seedprodCustomVideos).forEach(function (videoId) { window.seedprodCleanupCustomVideo(videoId); }); } }); } // Clean up existing video if re-initializing if (window.seedprodCustomVideos[customVideo.id]) { window.seedprodCleanupCustomVideo(customVideo.id); } // Get data attributes or settings from the video element var videoWrapper = section.querySelector('.sp-section-video-wrapper'); // Read settings from data attributes (set by Vue component) var startTime = null; var endTime = null; var isLooping = false; if (videoWrapper && videoWrapper.dataset) { startTime = videoWrapper.dataset.startTime ? parseInt(videoWrapper.dataset.startTime, 10) : null; endTime = videoWrapper.dataset.endTime ? parseInt(videoWrapper.dataset.endTime, 10) : null; isLooping = videoWrapper.dataset.loop === '1'; } // Fallback: check native loop attribute if no data-loop attribute if (videoWrapper && !videoWrapper.dataset.loop) { isLooping = customVideo.loop || customVideo.hasAttribute('loop'); } // Define event handlers var loadedmetadataHandler = function loadedmetadataHandler() { if (startTime && customVideo.currentTime === 0) { customVideo.currentTime = startTime; } }; var timeupdateHandler = function timeupdateHandler() { // Check if we've reached the end time if (endTime && customVideo.currentTime >= endTime) { if (isLooping) { // Loop back to start time customVideo.currentTime = startTime || 0; } else { // Pause at end time customVideo.pause(); } } // Handle natural video end with start time if (!endTime && customVideo.currentTime >= customVideo.duration - 0.1) { if (isLooping && startTime) { customVideo.currentTime = startTime; } } }; // Add event listeners customVideo.addEventListener('loadedmetadata', loadedmetadataHandler); customVideo.addEventListener('timeupdate', timeupdateHandler); // Store video data for cleanup window.seedprodCustomVideos[customVideo.id] = { element: customVideo, listeners: { loadedmetadata: loadedmetadataHandler, timeupdate: timeupdateHandler } }; } } } // Make the functions globally accessible to prevent uglify from mangling the names window.seedprod_pro_init_background_video = seedprod_pro_init_background_video; window.initializeVideo = initializeVideo; /** Throttle function */ function throttle(callback, limit) { var waiting = false; return function () { if (!waiting) { callback.apply(this, arguments); waiting = true; setTimeout(function () { waiting = false; }, limit); } }; } /** Check if a section/col/row has an entrance animation and if it has a z-index of 0 or empty */ function seedprod_pro_check_for_entrance_animation(element) { // Check if element contains an entrance animation of class 'sp-entrance-animation' if (element.hasClass('sp_animated_start')) { return true; } return false; } /** * post carousel javascript */ jQuery('.sp-postblock-nav button').click(function () { var currentId = '#' + jQuery(this).parents('.sp-posts-block-wrapper').attr('id'); var currentButtonIndex = jQuery(currentId + ' .sp-postblock-nav button').index(this); var currentIndex = 0; var postblock_data = jQuery('.sp-posts-single-block', jQuery(this).parents(currentId)); var slideshowmax = jQuery(this).parents('.sp-posts-block-wrapper').attr('data-slidetoshow'); if (slideshowmax == undefined) { slideshowmax = 1; } var slider_length = Math.ceil(postblock_data.length / parseInt(slideshowmax)); for (var customindexdata = 0; customindexdata < slider_length; customindexdata++) { var opa = jQuery(currentId + ' .sp-postblock-nav button[data-index="' + customindexdata + '"]').css('opacity'); if (opa >= 0.5) { currentIndex = customindexdata; } } var buttonsLength = jQuery(currentId + ' .sp-postblock-nav button').length - 1; var currentButtonIndexData = jQuery(currentId + ' .sp-postblock-nav button').eq(currentButtonIndex).attr('data-index'); // check for previous button click if (currentButtonIndex == 0) { if (0 == currentIndex) { currentIndex = Math.ceil(postblock_data.length / parseInt(slideshowmax)) - 1; } else { currentIndex--; } } // check for next button click if (currentButtonIndex == buttonsLength) { if (Math.ceil(postblock_data.length / parseInt(slideshowmax)) - 1 == currentIndex) { currentIndex = 0; } else { currentIndex++; } } // reset states postblock_data.css({ 'z-index': 999, 'opacity': 0, 'height': '0', 'position': 'absolute' }); jQuery(currentId + ' .sp-postblock-nav button[data-index]').css({ 'opacity': 0.25 }); var startindex = parseInt(currentIndex * parseInt(slideshowmax)); var endindex = parseInt(startindex + parseInt(slideshowmax)); // select postblock_data and button if (currentButtonIndexData !== undefined) { currentIndex = currentButtonIndexData; startindex = parseInt(currentIndex * parseInt(slideshowmax)); endindex = parseInt(startindex + parseInt(slideshowmax)); for (var i = startindex; i < endindex; i++) { jQuery(postblock_data).eq(i).css({ 'opacity': 1, 'height': 'auto', 'position': '' }); } jQuery(currentId + ' .sp-postblock-nav button').eq(currentButtonIndex).css({ 'opacity': 1 }); } else { startindex = parseInt(currentIndex * parseInt(slideshowmax)); endindex = parseInt(startindex + parseInt(slideshowmax)); for (var _i4 = startindex; _i4 < endindex; _i4++) { jQuery(postblock_data).eq(_i4).css({ 'opacity': 1, 'height': 'auto', 'position': '' }); } jQuery(currentId + ' .sp-postblock-nav button').eq(currentIndex + 1).css({ 'opacity': 1 }); } }); var postblock_timers = {}; jQuery(".sp-posts-block-wrapper.sp-posts-skinlayout-carousel").each(function (index) { var currentId = '#' + jQuery(this).attr('id'); var autoPlay = jQuery(this).attr('data-autoplay'); var speed = jQuery(this).attr('data-speed'); if (speed === '') { speed = 5000; } else { speed = parseInt(speed) * 1000; } if (autoPlay !== undefined) { postblock_timers[currentId] = setInterval(function () { var clickEvent = jQuery.Event('click'); clickEvent.preventDefault(); jQuery(currentId + ' .sp-postblock-nav button:last-child').triggerHandler(clickEvent); }, speed); } }); jQuery(".sp-posts-block-wrapper.sp-posts-skinlayout-carousel").hover(function () { var id = '#' + jQuery(this).attr('id'); clearInterval(postblock_timers[id]); }); jQuery(".sp-posts-block-wrapper.sp-posts-skinlayout-carousel").mouseleave(function () { var currentId = '#' + jQuery(this).attr('id'); var autoPlay = jQuery(this).attr('data-autoplay'); var speed = jQuery(this).attr('data-speed'); if (speed === '') { speed = 5000; } else { speed = parseInt(speed) * 1000; } if (autoPlay !== undefined) { postblock_timers[currentId] = setInterval(function () { var clickEvent = jQuery.Event('click'); clickEvent.preventDefault(); jQuery(currentId + ' .sp-postblock-nav button:last-child').triggerHandler(clickEvent); }, speed); } }); /** * Masonary Layout */ if (jQuery(".sp-skin-block.sp-layout-masonary .seedprod-masonary-post-block").length > 0) { jQuery(".sp-skin-block.sp-layout-masonary .seedprod-masonary-post-block").imagesLoaded(function (e) { jQuery(" .sp-skin-block.sp-layout-masonary .seedprod-masonary-post-block").isotope({ layoutMode: "masonry", itemSelector: '.sp-posts-single-block' }); }); } /** * Table of Contents Block - Pro Version * Dynamically generates TOC from headings on the page */ function seedprod_pro_generate_toc(blockId, options) { var $toc = jQuery('#sp-toc-' + blockId + ' .sp-toc-list'); var $container = jQuery(options.container); if (!$container.length) { return; } var headings = $container.find(options.headings); // Always exclude headings inside the TOC block itself headings = headings.not('#sp-toc-' + blockId + ' *'); // Filter out excluded elements if (options.exclude) { var excludeSelectors = options.exclude.split(',').map(function (s) { return s.trim(); }); excludeSelectors.forEach(function (selector) { if (selector) { headings = headings.not(selector); } }); } // Clear existing items $toc.empty(); if (headings.length === 0) { var noHeadingsMsg = options.noHeadingsText || 'No headings found'; $toc.html('<li style="padding: 10px; color: #999;">' + noHeadingsMsg + '</li>'); return; } // Track heading numbers for hierarchical numbering var numbers = {}; var minLevel = 6; // Find the minimum heading level to use as base headings.each(function () { var level = parseInt(this.tagName.substring(1)); if (level < minLevel) { minLevel = level; } }); // Generate TOC items headings.each(function (index) { var $heading = jQuery(this); // Handle line breaks - replace <br> tags with spaces before getting text var $clone = $heading.clone(); $clone.find('br').replaceWith(' '); var text = $clone.text().trim(); var level = parseInt(this.tagName.substring(1)); // Skip if no text if (!text) { return; } // Generate anchor ID if not present var anchor = $heading.attr('id'); if (!anchor) { anchor = 'toc-heading-' + blockId + '-' + index; $heading.attr('id', anchor); } // Calculate hierarchical number and depth var numberText = ''; var showNumberSpan = false; var hierarchyDepth = 0; // Track visual hierarchy depth if (options.showNumbers && options.listStyle === 'none') { showNumberSpan = true; if (options.hierarchical) { // Initialize level counters if (!numbers[level]) { numbers[level] = 0; } numbers[level]++; // Reset deeper levels for (var i = level + 1; i <= 6; i++) { numbers[i] = 0; } // Build number string var numParts = []; for (var i = minLevel; i <= level; i++) { if (numbers[i]) { numParts.push(numbers[i]); } } numberText = numParts.join('.') + '. '; // Use number of parts to determine visual depth (not level difference) hierarchyDepth = numParts.length - 1; } else { numberText = index + 1 + '. '; } } else if (options.hierarchical) { // Even without numbers, calculate hierarchy depth for indentation if (!numbers[level]) { numbers[level] = 0; } numbers[level]++; // Reset deeper levels for (var i = level + 1; i <= 6; i++) { numbers[i] = 0; } // Count active levels for depth var activeLevels = 0; for (var i = minLevel; i <= level; i++) { if (numbers[i]) { activeLevels++; } } hierarchyDepth = activeLevels - 1; } // Calculate progressive indentation based on hierarchy depth (only if hierarchical is enabled) var paddingLeft = 0; if (options.hierarchical) { var indentBase = parseInt(options.listIndent) || 20; paddingLeft = hierarchyDepth * indentBase; } // Create list item with progressive indentation (only if hierarchical) var linkHtml = '<a href="#' + anchor + '">'; if (showNumberSpan && numberText) { linkHtml += '<span class="sp-toc-number">' + numberText + '</span>'; } linkHtml += text + '</a>'; var $li = jQuery('<li>').addClass('sp-toc-level-' + level).css('padding-left', paddingLeft + 'px').html(linkHtml); $toc.append($li); }); // Add smooth scroll if (options.smoothScroll) { jQuery('#sp-toc-' + blockId + ' a').on('click', function (e) { e.preventDefault(); var target = jQuery(this.getAttribute('href')); if (target.length) { jQuery('html, body').animate({ scrollTop: target.offset().top - options.offset }, 500); } }); } // Add minimize box functionality if (options.minimizeBox) { var $wrapper = jQuery('#sp-toc-' + blockId); var $title = $wrapper.find('.sp-toc-title'); var $list = $wrapper.find('.sp-toc-list'); var $inner = $wrapper.find('.sp-toc-inner'); // Create toggle button with FontAwesome icons var expandIcon = options.expandIcon || 'fas fa-chevron-down'; var collapseIcon = options.collapseIcon || 'fas fa-chevron-up'; var $toggleBtn = jQuery('<span class="sp-toc-toggle"></span>').css({ 'cursor': 'pointer', 'float': 'right', 'font-size': '16px', 'line-height': '1', 'user-select': 'none' }); // Create icon element var $icon = jQuery('<i></i>').addClass(collapseIcon); $toggleBtn.append($icon); if ($title.length) { $title.append($toggleBtn); $title.css('cursor', 'pointer'); } else { // If no title, add toggle button at top of container var $toggleWrapper = jQuery('<div class="sp-toc-toggle-wrapper"></div>').css({ 'text-align': 'right', 'margin-bottom': '10px' }).append($toggleBtn); $inner.prepend($toggleWrapper); } // Toggle function var toggleTOC = function toggleTOC() { var isCollapsed = $wrapper.hasClass('sp-toc-collapsed'); if (isCollapsed) { // Expanding - show content $wrapper.removeClass('sp-toc-collapsed'); $list.slideDown(300); // Swap icon classes $icon.removeClass(expandIcon).addClass(collapseIcon); } else { // Collapsing - hide content $wrapper.addClass('sp-toc-collapsed'); $list.slideUp(300); // Swap icon classes $icon.removeClass(collapseIcon).addClass(expandIcon); } }; // Ensure TOC starts expanded on frontend (remove any collapsed state from builder) $wrapper.removeClass('sp-toc-collapsed'); $list.show(); $icon.removeClass(expandIcon).addClass(collapseIcon); // Add click handlers if ($title.length) { $title.on('click', toggleTOC); } else { $toggleBtn.on('click', toggleTOC); } // Check minimized state based on screen size var checkMinimizedState = function checkMinimizedState() { var width = jQuery(window).width(); var minimizedOn = options.minimizedOn || ''; var shouldCollapse = false; if (minimizedOn === 'mobile' && width < 768) { shouldCollapse = true; } else if (minimizedOn === 'tablet' && width < 1025) { shouldCollapse = true; } else if (minimizedOn === 'both' && width < 1025) { shouldCollapse = true; } if (shouldCollapse && !$wrapper.hasClass('sp-toc-collapsed')) { $list.hide(); $wrapper.addClass('sp-toc-collapsed'); // Update icon classes $icon.removeClass(collapseIcon).addClass(expandIcon); } }; // Check on load and resize checkMinimizedState(); // Simple debounced resize handler var resizeTimer; jQuery(window).on('resize', function () { clearTimeout(resizeTimer); resizeTimer = setTimeout(checkMinimizedState, 250); }); } // Add collapse subitems functionality if (options.collapseSubitems && options.hierarchical) { jQuery('#sp-toc-' + blockId + ' .sp-toc-list li').each(function () { var $li = jQuery(this); var classes = $li.attr('class') || ''; var levelMatch = classes.match(/sp-toc-level-(\d+)/); if (!levelMatch) { return; // Skip if no level class found } var level = parseInt(levelMatch[1]); // Check if this item has subitems (next sibling with higher level) var $next = $li.next(); if ($next.length) { var nextClasses = $next.attr('class') || ''; var nextLevelMatch = nextClasses.match(/sp-toc-level-(\d+)/); if (!nextLevelMatch) { return; // Skip if next item has no level class } var nextLevel = parseInt(nextLevelMatch[1]); if (nextLevel > level) { // This item has subitems - add collapse toggle var $collapseToggle = jQuery('<span class="sp-toc-collapse-toggle"></span>').css({ 'cursor': 'pointer', 'margin-left': '8px', 'font-size': '0.85em', 'user-select': 'none', 'display': 'inline-block', 'vertical-align': 'middle' }); // Add FontAwesome icon for subitems var $subitemIcon = jQuery('<i></i>').addClass('fas fa-chevron-down').css({ 'transition': 'transform 0.2s ease', 'display': 'inline-block' }); $collapseToggle.append($subitemIcon); // Add toggle after the link text var $link = $li.find('a').first(); if ($link.length) { $link.append($collapseToggle); } // Mark subitems - collect all child items var $subitems = jQuery(); var $current = $li.next(); while ($current.length) { var currentClasses = $current.attr('class') || ''; var currentLevelMatch = currentClasses.match(/sp-toc-level-(\d+)/); if (!currentLevelMatch) { break; } var currentLevel = parseInt(currentLevelMatch[1]); if (currentLevel > level) { $subitems = $subitems.add($current); $current.addClass('sp-toc-subitem sp-toc-parent-' + $li.index()); $current = $current.next(); } else { break; } } // Start collapsed by default if option is enabled if ($subitems.length > 0) { $subitems.hide(); $li.addClass('sp-toc-item-collapsed'); $subitemIcon.css('transform', 'rotate(-90deg)'); } // Toggle handler $collapseToggle.on('click', function (e) { e.preventDefault(); e.stopPropagation(); if ($li.hasClass('sp-toc-item-collapsed')) { $subitems.slideDown(250); $li.removeClass('sp-toc-item-collapsed'); $subitemIcon.css('transform', 'rotate(0deg)'); } else { $subitems.slideUp(250); $li.addClass('sp-toc-item-collapsed'); $subitemIcon.css('transform', 'rotate(-90deg)'); } }); } } }); } // Add sticky positioning if (options.position === 'sticky' || options.position === 'fixed') { var $wrapper = jQuery('#sp-toc-' + blockId); var topOffset = parseInt(options.topOffset) || 80; if (options.position === 'sticky') { $wrapper.css({ 'position': 'sticky', 'top': topOffset + 'px', 'z-index': '100' }); } else if (options.position === 'fixed') { // Save original position for fixed var originalOffset = $wrapper.offset(); var $placeholder = jQuery('<div class="sp-toc-placeholder"></div>').css({ 'height': $wrapper.outerHeight(), 'display': 'none' }).insertBefore($wrapper); var checkFixed = function checkFixed() { var scrollTop = jQuery(window).scrollTop(); if (scrollTop > originalOffset.top - topOffset) { if (!$wrapper.hasClass('sp-toc-fixed')) { $wrapper.addClass('sp-toc-fixed').css({ 'position': 'fixed', 'top': topOffset + 'px', 'z-index': '100', 'width': $wrapper.outerWidth() }); $placeholder.show(); } } else { if ($wrapper.hasClass('sp-toc-fixed')) { $wrapper.removeClass('sp-toc-fixed').css({ 'position': '', 'top': '', 'width': '' }); $placeholder.hide(); } } }; jQuery(window).on('scroll', checkFixed); checkFixed(); } } } /** * Table of Contents Block - Lite Version * Simplified version for free plugin */ function seedprod_lite_generate_toc(blockId, options) { var $toc = jQuery('#sp-toc-' + blockId + ' .sp-toc-list'); var $container = jQuery(options.container); if (!$container.length) { return; } var headings = $container.find(options.headings); // Always exclude headings inside the TOC block itself headings = headings.not('#sp-toc-' + blockId + ' *'); // Filter out excluded elements if (options.exclude) { var excludeSelectors = options.exclude.split(',').map(function (s) { return s.trim(); }); excludeSelectors.forEach(function (selector) { if (selector) { headings = headings.not(selector); } }); } // Clear existing items $toc.empty(); if (headings.length === 0) { var noHeadingsMsg = options.noHeadingsText || 'No headings found'; $toc.html('<li style="padding: 10px; color: #999;">' + noHeadingsMsg + '</li>'); return; } // Generate TOC items (flat list for lite version) headings.each(function (index) { var $heading = jQuery(this); var text = $heading.text().trim(); var level = parseInt(this.tagName.substring(1)); // Skip if no text if (!text) { return; } // Generate anchor ID if not present var anchor = $heading.attr('id'); if (!anchor) { anchor = 'toc-heading-' + blockId + '-' + index; $heading.attr('id', anchor); } // Create number text var numberText = ''; if (options.showNumbers) { numberText = index + 1 + '. '; } // Calculate indent (simple version) var indentLevel = (level - 2) * 20; // Create list item var $li = jQuery('<li>').addClass('sp-toc-level-' + level).css('margin-left', Math.max(0, indentLevel) + 'px').html('<a href="#' + anchor + '"><span class="sp-toc-number">' + numberText + '</span>' + text + '</a>'); $toc.append($li); }); // Add smooth scroll if (options.smoothScroll) { jQuery('#sp-toc-' + blockId + ' a').on('click', function (e) { e.preventDefault(); var target = jQuery(this.getAttribute('href')); if (target.length) { jQuery('html, body').animate({ scrollTop: target.offset().top - options.offset }, 500); } }); } }
Save
cmd:
run