PageSourceSearch

https://wounds-uk.com/wp-content/plugins/dynamic-content-for-elementor/assets/js/acf-repeater.js?ver=3.4.14

js wounds-uk.com collected 2026-09-28 07:20:27 UTC 17,294 bytes, 546 lines download raw bytes

1function initializeSwiper(options, element) {
2	const asyncSwiper = elementorFrontend.utils.swiper;
3
4	new asyncSwiper(element, options)
5		.then((newSwiperInstance) => {
6			mySwiper = newSwiperInstance;
7		})
8		.catch((error) => console.log(error));
9}
10
11// Cannot initialize Swiper when hidden. This happens when it is inside a tab that is not the first.
12const manageAutoplayInsideTab = (tabWrapper, options, elementSwiper) => {
13	if (!tabWrapper.hidden) {
14		// it's in the first tab.
15		initializeSwiper(options, elementSwiper);
16	}
17	var observer = new MutationObserver(function (_, observer) {
18		if (!tabWrapper.hidden) {
19			initializeSwiper(options, elementSwiper);
20		}
21	});
22	var observerConfig = {
23		attributes: true,
24		attributeFilter: ["hidden"],
25	};
26	observer.observe(tabWrapper, observerConfig);
27};
28
29(function ($) {
30	var WidgetDyncontel_ACFRepeaterHandler = function ($scope, $) {
31		let accordion = function () {
32			let wrapper = $scope.find(".accordion");
33			let accordionStart = elementSettings.dce_acf_repeater_accordion_start;
34			let closeOtherSections = elementSettings.dce_acf_repeater_accordion_close;
35			let speed = elementSettings.accordion_speed?.size || 300;
36			
37			const buttons = wrapper.find('.accordion-button');
38			const contents = wrapper.find('.acc_content');
39			
40			buttons.each(function(index) {
41				const $button = $(this);
42				const $content = $($button.attr('aria-controls') ? '#' + $button.attr('aria-controls') : '');
43				const section = $button.closest('.acc_section');
44				
45				let shouldBeActive = false;
46				
47				if (accordionStart === 'first' && index === 0) {
48					shouldBeActive = true;
49				} else if (accordionStart === 'custom') {
50					const customIndex = elementSettings.accordion_start_custom || 1;
51					shouldBeActive = (index + 1) === customIndex;
52				} else if (accordionStart === 'all') {
53					shouldBeActive = true;
54				}
55				
56				if (shouldBeActive) {
57					$button.attr('aria-expanded', 'true');
58					$content.attr('aria-hidden', 'false').show();
59					section.addClass('acc_active');
60				} else {
61					$button.attr('aria-expanded', 'false');
62					$content.attr('aria-hidden', 'true').hide();
63					section.removeClass('acc_active');
64				}
65			});
66			
67			buttons.on('click', function(e) {
68				e.preventDefault();
69				const $button = $(this);
70				const $content = $($button.attr('aria-controls') ? '#' + $button.attr('aria-controls') : '');
71				const section = $button.closest('.acc_section');
72				const isExpanded = $button.attr('aria-expanded') === 'true';
73				
74				if (closeOtherSections && !isExpanded) {
75					buttons.not($button).each(function() {
76						const $otherButton = $(this);
77						const $otherContent = $($otherButton.attr('aria-controls') ? '#' + $otherButton.attr('aria-controls') : '');
78						const otherSection = $otherButton.closest('.acc_section');
79						
80						$otherButton.attr('aria-expanded', 'false');
81						$otherContent.attr('aria-hidden', 'true').slideUp(speed);
82						otherSection.removeClass('acc_active');
83					});
84				}
85				
86				if (isExpanded) {
87					$button.attr('aria-expanded', 'false');
88					$content.attr('aria-hidden', 'true').slideUp(speed);
89					section.removeClass('acc_active');
90				} else {
91					$button.attr('aria-expanded', 'true');
92					$content.attr('aria-hidden', 'false').slideDown(speed);
93					section.addClass('acc_active');
94				}
95			});
96		};
97
98		let elementSettings = dceGetElementSettings($scope);
99		var $block_acfgallery = ".dce-acf-repeater";
100
101		if (elementSettings.dce_acf_repeater_format == "accordion") {
102			let wrapper = $scope.find("ul.dce-acf-repeater-wrapper");
103			let accordionStart = elementSettings.dce_acf_repeater_accordion_start;
104			let activeIndex;
105
106			if (accordionStart === "none") {
107				activeIndex = false;
108			} else if (accordionStart === "first") {
109				activeIndex = 1;
110			} else if (accordionStart === "custom") {
111				activeIndex = elementSettings.accordion_start_custom || 1;
112			} else {
113				let elements = $scope.find("ul.dce-acf-repeater-wrapper .dce-acf-repeater-item").length;
114				activeIndex = [];
115				for (let i = 0; i <= elements; i++) {
116					activeIndex[i] = i;
117				}
118			}
119
120			let accordionJs = function (
121				wrapper,
122				closeOtherSections,
123				speed,
124				activeIndex,
125			) {
126				wrapper.accordionjs({
127					// Allow self close.(data-close-able)
128					closeAble: true,
129
130					// Close other sections.(data-close-other)
131					closeOther: Boolean(closeOtherSections),
132
133					// Animation Speed.(data-slide-speed)
134					slideSpeed: speed,
135
136					// The section open on first init. A number from 1 to X or false.(data-active-index)
137					activeIndex: activeIndex,
138					
139					openSection: function(section) {
140						$(section).find('.acc_button').attr('aria-expanded', 'true');
141						$(section).find('.acc_content').attr('aria-hidden', 'false');
142					},
143					
144					beforeOpenSection: function(section) {
145						if (Boolean(closeOtherSections)) {
146							wrapper.find('.acc_button').attr('aria-expanded', 'false');
147							wrapper.find('.acc_content').attr('aria-hidden', 'true');
148						}
149					},
150					
151					closeSection: function(section) {
152						$(section).find('.acc_button').attr('aria-expanded', 'false');
153						$(section).find('.acc_content').attr('aria-hidden', 'true');
154					}
155				});
156			};
157			
158			accordionJs(
159				wrapper,
160				elementSettings.dce_acf_repeater_accordion_close,
161				elementSettings.accordion_speed.size || 300,
162				activeIndex
163			);
164		}
165
166		if (elementSettings.dce_acf_repeater_format == "masonry") {
167			var $grid_dce_repeater = $scope.find($block_acfgallery).masonry({
168				// options
169				itemSelector: ".dce-acf-repeater-item",
170			});
171			// ---------- [ imagesLoaded ] ---------
172			$grid_dce_repeater.imagesLoaded().progress(function () {
173				$grid_dce_repeater.masonry("layout");
174			});
175		} else if (elementSettings.dce_acf_repeater_format == "justified") {
176			$scope
177				.find(".justified-grid")
178				.imagesLoaded()
179				.progress(function () {});
180
181			$scope.find(".justified-grid").justifiedGallery({
182				rowHeight:
183					Number(elementSettings.justified_rowHeight.size) || 170,
184				maxRowHeight: -1,
185				selector: "figure, div:not(.spinner)",
186				imgSelector: "> img, > a > img, > div > a > img, > div > img",
187				margins: Number(elementSettings.justified_margin.size) || 0,
188				lastRow: elementSettings.justified_lastRow,
189			});
190		} else if (
191			elementSettings.dce_acf_repeater_format == "slider_carousel"
192		) {
193			var elementSwiper = $scope.find(
194				".dce-acf-repeater-slider_carousel",
195			);
196			var id_scope = $scope.attr("data-id");
197			var id_post = $scope.closest(".elementor").attr("data-post-id");
198			var counter_id = $scope
199				.find(".dce-acf-repeater-slider_carousel")
200				.attr("counter-id");
201			var loopEnabled = Boolean(elementSettings.loop);
202			var slideInitNum = 0;
203			var slidesPerView = Number(elementSettings.slidesPerView);
204			
205			// Prevent text selection on navigation buttons
206			let nextElement = $scope.find(".swiper-button-next")[0];
207			let prevElement = $scope.find(".swiper-button-prev")[0];
208			if (nextElement) {
209				nextElement.addEventListener('mousedown', function(e) {
210					e.preventDefault();
211				});
212				// Keyboard accessibility for navigation buttons
213				nextElement.addEventListener('keydown', function(e) {
214					if (e.key === 'Enter' || e.key === ' ') {
215						e.preventDefault();
216						nextElement.click();
217					}
218				});
219			}
220			if (prevElement) {
221				prevElement.addEventListener('mousedown', function(e) {
222					e.preventDefault();
223				});
224				// Keyboard accessibility for navigation buttons
225				prevElement.addEventListener('keydown', function(e) {
226					if (e.key === 'Enter' || e.key === ' ') {
227						e.preventDefault();
228						prevElement.click();
229					}
230				});
231			}
232			
233			var swiperOptions = {
234				// Optional parameters
235				direction: "horizontal",
236				initialSlide: slideInitNum,
237				speed: Number(elementSettings.speed_slider) || 300,
238				autoHeight: Boolean(elementSettings.autoHeight), //false, // Set to true and slider wrapper will adopt its height to the height of the currently active slide
239				roundLengths: Boolean(elementSettings.roundLengths), //false, // Set to true to round values of slides width and height to prevent blurry texts onusual resolution screens (if you have such)
240				effect: elementSettings.effects || "slide",
241				slidesPerView: slidesPerView || "auto",
242				slidesPerGroup: Number(elementSettings.slidesPerGroup) || 1, // Set numbers of slides to define and enable group sliding. Useful to use with slidesPerView > 1
243				spaceBetween: Number(elementSettings.spaceBetween) || 0, // 30,
244				slidesOffsetBefore: 0, // Add (in px) additional slide offset in the beginning of the container (before all slides)
245				slidesOffsetAfter: 0, // Add (in px) additional slide offset in the end of the container (after all slides)
246				slidesPerColumn: Number(elementSettings.slidesColumn) || 1, // 1, // Number of slides per column, for multirow layout
247				slidesPerColumnFill: "row", // Could be 'column' or 'row'. Defines how slides should fill rows, by column or by row
248				centerInsufficientSlides:
249					elementSettings.centerInsufficientSlides === "yes",
250				watchOverflow: true,
251				centeredSlides: elementSettings.centeredSlides2 === "yes",
252				grabCursor: Boolean(elementSettings.grabCursor),
253				freeMode: Boolean(elementSettings.freeMode),
254				freeModeMomentum: Boolean(elementSettings.freeModeMomentum),
255				freeModeMomentumRatio:
256					Number(elementSettings.freeModeMomentumRatio) || 1,
257				freeModeMomentumVelocityRatio:
258					Number(elementSettings.freeModeMomentumVelocityRatio) || 1,
259				freeModeMomentumBounce: Boolean(
260					elementSettings.freeModeMomentumBounce,
261				),
262			freeModeMomentumBounceRatio: Number(elementSettings.speed) || 1,
263			freeModeMinimumVelocity: Number(elementSettings.speed) || 0.02,
264			freeModeSticky: Boolean(elementSettings.freeModeSticky),
265			loop: loopEnabled,
266			navigation: {
267					nextEl: nextElement,
268					prevEl: prevElement,
269				},
270				pagination: {
271					el: id_post
272						? ".dce-elementor-post-" +
273							id_post +
274							" .elementor-element-" +
275							id_scope +
276							" .pagination-" +
277							counter_id
278						: ".pagination-" + counter_id, //'.swiper-pagination', //'.pagination-acfslider-'+id_scope,
279					clickable: true,
280					type: String(elementSettings.pagination_type) || "bullets",
281					dynamicBullets: true,
282					renderFraction: function (currentClass, totalClass) {
283						return (
284							'<span class="' +
285							currentClass +
286							'"></span>' +
287							'<span class="separator">' +
288							String(elementSettings.fraction_separator) +
289							"</span>" +
290							'<span class="' +
291							totalClass +
292							'"></span>'
293						);
294					},
295				},
296				mousewheel: elementSettings.mousewheelControl
297					? {
298							releaseOnEdges: true,
299						}
300					: false,
301				keyboard: {
302					enabled: Boolean(elementSettings.keyboardControl),
303				},
304
305				on: {
306					init: function () {
307						$("body").attr(
308							"data-carousel-" + id_scope,
309							this.realIndex,
310						);
311					},
312					slideChange: function (e) {
313						$("body").attr(
314							"data-carousel-" + id_scope,
315							this.realIndex,
316						);
317					},
318				},
319			};
320			if (elementSettings.useAutoplay) {
321				//default
322				swiperOptions = $.extend(swiperOptions, { autoplay: true });
323
324				var autoplayDelay = Number(elementSettings.autoplay);
325				if (!autoplayDelay) {
326					autoplayDelay = 3000;
327				} else {
328					autoplayDelay = Number(elementSettings.autoplay);
329				}
330				swiperOptions = $.extend(swiperOptions, {
331					autoplay: {
332						delay: autoplayDelay,
333						disableOnInteraction: Boolean(
334							elementSettings.autoplayDisableOnInteraction,
335						),
336						stopOnLastSlide: Boolean(
337							elementSettings.autoplayStopOnLast,
338						),
339					},
340				});
341			}
342
343			// Responsive Params
344			swiperOptions.breakpoints = dynamicooo.makeSwiperBreakpoints(
345				{
346					slidesPerView: {
347						elementor_key: "slidesPerView",
348						default_value: "auto",
349					},
350					slidesPerGroup: {
351						elementor_key: "slidesPerGroup",
352						default_value: 1,
353					},
354					spaceBetween: {
355						elementor_key: "spaceBetween",
356						default_value: 1,
357					},
358					slidesPerColumn: {
359						elementor_key: "slidesColumn",
360						default_value: 1,
361					},
362				},
363				elementSettings,
364			);
365
366			{
367				let isCarousel =
368					elementSettings.dce_acf_repeater_format ==
369					"slider_carousel";
370				if (!isCarousel) {
371					initializeSwiper(swiperOptions, elementSwiper);
372				} else {
373					let elementorTab = elementSwiper.closest(
374						".elementor-tab-content",
375					);
376					if (elementorTab.length && elementSettings.useAutoplay) {
377						// we are inside a tab, autoplay needs to be updated.
378						manageAutoplayInsideTab(
379							elementorTab,
380							swiperOptions,
381							elementSwiper,
382						);
383					} else {
384						initializeSwiper(swiperOptions, elementSwiper);
385					}
386				}
387			}
388		} 		// end if SliderCarousel
389
390		// DataTables initialization
391		if (elementSettings.dce_acf_repeater_format === "table" && elementSettings.dce_acf_repeater_datatables) {
392			let initializeDataTables = function() {
393				var $table = $scope.find('table.dce-datatable');
394				
395				// Safety checks before initializing DataTables
396				if ($table.length === 0) {
397					return;
398				}
399				
400				// Check if table has valid structure
401				var $thead = $table.find('thead');
402				var $tbody = $table.find('tbody');
403				var $rows = $tbody.find('tr');
404				
405				if ($rows.length === 0) {
406					return;
407				}
408				
409
410				
411				// Get configuration from elementSettings
412				var config = {
413					autofill: elementSettings.dce_acf_repeater_style_table_data_autofill || false,
414					buttons: elementSettings.dce_acf_repeater_style_table_data_buttons || false,
415					colreorder: elementSettings.dce_acf_repeater_style_table_data_colreorder || false,
416					fixedcolumns: elementSettings.dce_acf_repeater_style_table_data_fixedcolumns || false,
417					fixedheader: elementSettings.dce_acf_repeater_style_table_data_fixedheader || false,
418					keytable: elementSettings.dce_acf_repeater_style_table_data_keytable || false,
419					responsive: elementSettings.dce_acf_repeater_style_table_data_responsive || false,
420					rowgroup: elementSettings.dce_acf_repeater_style_table_data_rowgroup || false,
421					rowreorder: elementSettings.dce_acf_repeater_style_table_data_rowreorder || false,
422					scroller: elementSettings.dce_acf_repeater_style_table_data_scroller || false,
423					scroller_y: elementSettings.dce_acf_repeater_style_table_data_scroller_y || false,
424					select: elementSettings.dce_acf_repeater_style_table_data_select || false,
425					// UI Options
426					search: elementSettings.dce_acf_repeater_style_table_data_search || false,
427					pagination: elementSettings.dce_acf_repeater_style_table_data_pagination || false,
428					info: elementSettings.dce_acf_repeater_style_table_data_info || false,
429					lengthMenu: elementSettings.dce_acf_repeater_style_table_data_length_menu || false,
430					ordering: elementSettings.dce_acf_repeater_style_table_data_ordering || false
431				};
432				
433				// Build DataTables options
434				var options = {
435					order: [],
436					autoWidth: false,
437					columnDefs: [
438						{ targets: '_all', defaultContent: '' }
439					],
440					// UI Options
441					searching: config.search,
442					paging: config.pagination,
443					info: config.info,
444					lengthChange: config.lengthMenu,
445					ordering: config.ordering
446				};
447				
448				// Add language URL from separate i18n files
449				if (typeof window.getDataTablesLanguageUrl === 'function') {
450					var language = $('html').attr('lang') || 'en';
451					var languageUrl = window.getDataTablesLanguageUrl(language);
452					
453					if (languageUrl) {
454						options.language = {
455							url: languageUrl
456						};
457					}
458				}
459				
460				// Apply conditional options based on configuration
461				if (config.autofill) {
462					options.autoFill = true;
463				}
464				
465				if (config.buttons) {
466					options.dom = 'Bfrtip';
467					options.buttons = [
468						'copyHtml5',
469						'excelHtml5',
470						'csvHtml5',
471						'pdfHtml5'
472					];
473				}
474				
475				if (config.colreorder) {
476					options.colReorder = true;
477				}
478				
479				if (config.fixedcolumns) {
480					options.fixedColumns = true;
481				}
482				
483				if (config.fixedheader) {
484					options.fixedHeader = true;
485				}
486				
487				if (config.keytable) {
488					options.keys = true;
489				}
490				
491				if (config.responsive) {
492					options.responsive = true;
493				}
494				
495				if (config.rowgroup) {
496					options.rowGroup = {
497						dataSrc: 'group'
498					};
499				}
500				
501				if (config.rowreorder) {
502					options.rowReorder = true;
503				}
504				
505				if (config.scroller) {
506					options.scroller = true;
507					options.scrollX = true;
508					if (config.scroller_y) {
509						options.scrollY = 200;
510					}
511					options.paging = true; // Scroller requires paging
512					options.deferRender = true;
513				}
514				
515				if (config.select) {
516					options.select = true;
517				}
518				
519				// Initialize DataTables
520				$table.DataTable(options);
521			};
522			
523			// Initialize DataTables
524			initializeDataTables();
525		}
526
527		if (elementSettings.enabled_wow) {
528			var wow = new WOW({
529				boxClass: 'wow',
530				animateClass: 'animated',
531				offset: 0,
532				mobile: true,
533				live: true,
534				scrollContainer: null
535			});
536			wow.init();
537		}
538	};
539
540	$(window).on("elementor/frontend/init", function () {
541		elementorFrontend.hooks.addAction(
542			"frontend/element_ready/dce-acf-repeater-v2.default",
543			WidgetDyncontel_ACFRepeaterHandler,
544		);
545	});
546})(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.