(function () {
var BTN_PREV_ID = 'br-prev-1';
var BTN_NEXT_ID = 'br-next-1';
// Find the slider container closest to the buttons' section/column
function findLocalSliderRoot(btn) {
var section = btn.closest('.elementor-section, .elementor-container, .elementor-column, section') || document;
// Prefer a container that actually contains a wrapper
var wrapper = section.querySelector('.swiper-wrapper, .pxl-swiper-wrapper');
if (wrapper) {
var container = wrapper.closest('.swiper, .swiper-container, .pxl-swiper, .pxl-swiper-container') || wrapper.parentElement;
return { section, container, wrapper };
}
// Fallback: any visible swiper container in this section
var container = section.querySelector('.swiper, .swiper-container, .pxl-swiper, .pxl-swiper-container');
return { section, container, wrapper: container ? container.querySelector('.swiper-wrapper, .pxl-swiper-wrapper') : null };
}
function getSwiperInstance(container) {
if (!container) return null;
return (
container.swiper ||
container.__swiper ||
container.swiperInstance ||
(window.jQuery && window.jQuery(container).data && window.jQuery(container).data('swiper')) ||
null
);
}
function findNativeArrows(scope) {
return {
next: scope.querySelector('.swiper-button-next, .pxl-swiper-arrow-next, .pxl-arrow-next, .pxl-swiper-nav .next, [data-swiper="next"]'),
prev: scope.querySelector('.swiper-button-prev, .pxl-swiper-arrow-prev, .pxl-arrow-prev, .pxl-swiper-nav .prev, [data-swiper="prev"]')
};
}
function findBullets(scope) {
return Array.prototype.slice.call(scope.querySelectorAll('.swiper-pagination-bullet') || []);
}
function clickBullet(bullets, dir) {
if (!bullets.length) return false;
var idx = bullets.findIndex(function (b) { return b.classList.contains('swiper-pagination-bullet-active'); });
if (idx < 0) idx = 0;
var next = dir === 'next' ? (idx + 1) % bullets.length : (idx - 1 + bullets.length) % bullets.length;
bullets[next].click();
return true;
}
function handle(btn, dir) {
if (!btn) return;
btn.removeEventListener('click', btn._brHandler || function(){});
btn._brHandler = function () {
var refs = findLocalSliderRoot(btn);
if (!refs.container && !refs.wrapper) {
console.warn('[BR Tabs] No slider found near buttons. Move buttons into the same section/column as the slider.');
return;
}
var swiper = getSwiperInstance(refs.container);
var arrows = findNativeArrows(refs.section);
var bullets = findBullets(refs.section);
// 1) Native arrows (if the theme provides them)
if (dir === 'next' && arrows.next) { arrows.next.click(); return; }
if (dir === 'prev' && arrows.prev) { arrows.prev.click(); return; }
// 2) Swiper API
if (swiper) {
if (dir === 'next' && typeof swiper.slideNext === 'function') { swiper.slideNext(300); return; }
if (dir === 'prev' && typeof swiper.slidePrev === 'function') { swiper.slidePrev(300); return; }
}
// 3) Bullets
if (clickBullet(bullets, dir)) return;
// 4) Last resort debug
console.warn('[BR Tabs] Could not control the slider.', {
hasContainer: !!refs.container, hasWrapper: !!refs.wrapper, hasSwiper: !!swiper,
hasArrows: !!(arrows.next || arrows.prev), bulletsCount: bullets.length
});
};
btn.addEventListener('click', btn._brHandler);
}
function wire() {
handle(document.getElementById(BTN_NEXT_ID), 'next');
handle(document.getElementById(BTN_PREV_ID), 'prev');
}
document.addEventListener('DOMContentLoaded', wire);
window.addEventListener('load', wire);
if (window.elementorFrontend && elementorFrontend.hooks) {
elementorFrontend.hooks.addAction('frontend/element_ready/global', wire);
}
if (window.MutationObserver) {
var mo = new MutationObserver(wire);
mo.observe(document.documentElement, { childList: true, subtree: true });
}
})();