"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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
}

/** 
 * 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);
      }
    });
  }
}