PageSourceSearch

https://www.bullardfurniture.com/components/swiper-slideshow/slideshowv2.min.js

js bullardfurniture.com collected 2026-09-26 11:41:22 UTC 6,061 bytes, 189 lines download raw bytes

1// /components/swiper-slideshow/slideshowv2.js
2// Requires jQuery and Swiper to be loaded BEFORE this file.
3
4(function (global, $) {
5    'use strict';
6
7    function parseBool(v) {
8        return v === true || v === 'true' || v === '1';
9    }
10
11    function parseIntOr(v, fallback) {
12        var n = parseInt(v, 10);
13        return isNaN(n) ? fallback : n;
14    }
15
16    function initElement(el) {
17        var $el = $(el);
18        var $wrapper = $el.closest('.slideshowv2-swiper');
19        if (!$wrapper.length) return null;
20
21        // Avoid double initialization
22        if (el.swiper) {
23            el.swiper.destroy(true, true);
24        }
25
26        var selector = '#' + el.id;
27        var ds = el.dataset || {};
28
29        var slidesPerView = parseIntOr(ds.slidesPerView, 1);
30
31        var config = {
32            effect: ds.effect || 'slide',
33            speed: parseIntOr(ds.speed, 400),
34            loop: parseBool(ds.loop),
35            autoHeight: parseBool(ds.autoHeight),
36            slidesPerView: slidesPerView,
37            preloadImages: false,
38            lazy: true,
39            breakpoints: {
40                880: { slidesPerView: 1 }
41            },
42            watchOverflow: true,
43            touchEventsTarget: 'wrapper',
44            centeredSlides: true
45        };
46
47        // Pagination
48        if (parseBool(ds.pager)) {
49            config.pagination = {
50                el: selector + ' .swiper-pagination',
51                clickable: true
52            };
53        }
54
55        // Next/Prev controls
56        if (parseBool(ds.controls)) {
57            config.navigation = {
58                nextEl: selector + ' .swiper-button-next',
59                prevEl: selector + ' .swiper-button-prev'
60            };
61        }
62
63        // Autoplay + related flags
64        var auto = parseBool(ds.auto);
65        var pause = parseIntOr(ds.pause, 5000);
66        var autoStart = ds.autoStart === undefined ? true : parseBool(ds.autoStart);
67        var autoHover = parseBool(ds.autoHover);
68        var autoControls = parseBool(ds.autoControls);
69        var autoControlsCombine = parseBool(ds.autoControlsCombine);
70
71        var startText = ds.startText || 'Play';
72        var stopText = ds.stopText || 'Pause';
73
74        if (auto) {
75            config.autoplay = { delay: pause };
76        }
77
78        // Create Swiper instance
79        var swiper = new Swiper(el, config);
80        el.swiper = swiper;
81
82        // Re-init helper if needed later
83        $wrapper.data('reinit', function () {
84            var swiperParams = el.swiper.params;
85            if (el.swiper) el.swiper.destroy(true, true);
86            var reinitSwiper = new Swiper(el, swiperParams);
87            el.swiper = reinitSwiper;
88        });
89
90        // Stop autoplay initially if requested
91        if (auto && !autoStart && swiper.autoplay) {
92            swiper.autoplay.stop();
93        }
94
95        // Hover pause/resume (if no manual controls)
96        if (auto && autoHover && autoStart && !autoControls) {
97            $wrapper.hover(
98                function () {
99                    if (swiper.autoplay) swiper.autoplay.stop();
100                },
101                function () {
102                    if (swiper.autoplay) swiper.autoplay.start();
103                }
104            );
105        }
106
107        // Autoplay controls – combined wrapper or separate buttons
108        if (auto && autoControls) {
109            var startSelector, stopSelector;
110
111            if (autoControlsCombine) {
112                startSelector = selector + ' ~ .swiper-auto-combined .swiper-auto-start';
113                stopSelector = selector + ' ~ .swiper-auto-combined .swiper-auto-stop';
114            } else {
115                startSelector = selector + ' ~ .swiper-auto-buttons .swiper-auto-start';
116                stopSelector = selector + ' ~ .swiper-auto-buttons .swiper-auto-stop';
117            }
118
119            var $startBtn = $(startSelector);
120            var $stopBtn = $(stopSelector);
121
122            $startBtn.on('click', function () {
123                if (!swiper.autoplay) return;
124
125                // If already active, do nothing
126                if ($startBtn.hasClass('__active')) return;
127
128                swiper.autoplay.start();
129
130                $startBtn
131                    .addClass('__active')
132                    .attr('aria-pressed', 'true');
133
134                $stopBtn
135                    .removeClass('__active')
136                    .attr('aria-pressed', 'false');
137            });
138
139            $stopBtn.on('click', function () {
140                if (!swiper.autoplay) return;
141
142                if ($stopBtn.hasClass('__active')) return;
143
144                swiper.autoplay.stop();
145
146                $stopBtn
147                    .addClass('__active')
148                    .attr('aria-pressed', 'true');
149
150                $startBtn
151                    .removeClass('__active')
152                    .attr('aria-pressed', 'false');
153            });
154        }
155
156        // Accessibility: Enter/Space triggers click on controls
157        $(
158            selector + ' ~ .swiper-auto-combined .swiper-auto-button, ' +
159            selector + ' ~ .swiper-auto-buttons .swiper-auto-start, ' +
160            selector + ' ~ .swiper-auto-buttons .swiper-auto-stop, ' +
161            selector + ' .swiper-button-next, ' +
162            selector + ' .swiper-button-prev'
163        ).on('keydown', function (e) {
164            if (e.key === 'Enter' || e.key === ' ') {
165                e.preventDefault();
166                $(this).trigger('click');
167            }
168        });
169
170        return swiper;
171    }
172
173    function initAll() {
174        var nodes = document.querySelectorAll('[data-slideshowv2="true"]');
175        nodes.forEach(initElement);
176    }
177
178    // Expose API + auto-init
179    global.SlideshowV2 = {
180        initElement: initElement,
181        initAll: initAll
182    };
183
184    $(function () {
185        if (!global.Swiper) return;
186        initAll();
187    });
188
189})(window, jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.