PageSourceSearch

https://www.iium.edu.my/wp-content/plugins/royal-elementor-addons/assets/js/frontend.js?ver=1.7.1065

js iium.edu.my collected 2026-09-24 08:51:18 UTC 572,423 bytes, 14,561 lines download raw bytes

1( function( $, elementor ) {
2
3	"use strict";
4
5	var actionTargetProductId;
6	var finalURL = window.location.href;
7	var gridLoadMoreItems;
8	var initialItems;
9	var paramsObj = {};
10
11	var WprElements = {
12
13		gridInitialItems: {},
14
15		init: function() {
16
17			var widgets = {
18				'wpr-nav-menu.default' : WprElements.widgetNavMenu,
19				'wpr-mega-menu.default' : WprElements.widgetMegaMenu,
20				'wpr-onepage-nav.default' : WprElements.widgetOnepageNav,
21				'wpr-grid.default' : WprElements.widgetGrid,
22				'wpr-magazine-grid.default' : WprElements.widgetMagazineGrid,
23				'wpr-media-grid.default' : WprElements.widgetGrid,
24				'wpr-woo-grid.default' : WprElements.widgetGrid,
25				'wpr-woo-category-grid-pro.default' : WprElements.widgetGrid,
26				'wpr-category-grid-pro.default' : WprElements.widgetGrid,
27				'wpr-featured-media.default' : WprElements.widgetFeaturedMedia,
28				'wpr-countdown.default' : WprElements.widgetCountDown,
29				'wpr-google-maps.default' : WprElements.widgetGoogleMaps,
30				'wpr-before-after.default' : WprElements.widgetBeforeAfter,
31				'wpr-mailchimp.default' : WprElements.widgetMailchimp,
32				'wpr-advanced-slider.default' : WprElements.widgetAdvancedSlider,
33				'wpr-testimonial.default' : WprElements.widgetTestimonialCarousel,
34				'wpr-search.default' : WprElements.widgetSearch,
35				'wpr-advanced-text.default' : WprElements.widgetAdvancedText,
36				'wpr-progress-bar.default' : WprElements.widgetProgressBar,
37				'wpr-image-hotspots.default' : WprElements.widgetImageHotspots,
38				'wpr-flip-box.default' : WprElements.widgetFlipBox,
39				'wpr-content-ticker.default' : WprElements.widgetContentTicker,
40				'wpr-tabs.default' : WprElements.widgetTabs,
41				'wpr-content-toggle.default' : WprElements.widgetContentToogle,
42				'wpr-back-to-top.default': WprElements.widgetBackToTop,
43				'wpr-lottie-animations.default': WprElements.widgetLottieAnimations,
44				'wpr-posts-timeline.default' : WprElements.widgetPostsTimeline,
45				'wpr-sharing-buttons.default' : WprElements.widgetSharingButtons,
46				'wpr-twitter-feed.default' : WprElements.widgetTwitterFeed,
47				'wpr-instagram-feed.default' : WprElements.widgetInstagramFeed,
48				'wpr-facebook-feed.default' : WprElements.widgetFacebookFeed,
49				'wpr-flip-carousel.default': WprElements.widgetFlipCarousel,
50				'wpr-feature-list.default' : WprElements.widgetFeatureList,
51				'wpr-advanced-accordion.default' : WprElements.widgetAdvancedAccordion,
52                'wpr-image-accordion.default' : WprElements.widgetImageAccordion,
53				'wpr-product-media.default' : WprElements.widgetProductMedia,
54				'wpr-product-add-to-cart.default' : WprElements.widgetProductAddToCart,
55				'wpr-product-mini-cart.default' : WprElements.widgetProductMiniCart,
56				'wpr-product-filters.default' : WprElements.widgetProductFilters,
57				'wpr-advanced-filters-pro.default' : WprElements.widgetAdvancedFilters,
58				'wpr-page-cart.default' : WprElements.widgetPageCart,
59				'wpr-my-account-pro.default' : WprElements.widgetPageMyAccount,
60				'wpr-reading-progress-bar.default' : WprElements.widgetReadingProgressBar,
61				'wpr-data-table.default' : WprElements.widgetDataTable,
62				'wpr-charts.default': WprElements.widgetCharts,
63				'wpr-taxonomy-list.default': WprElements.widgetTaxonomyList,
64				'wpr-offcanvas.default': WprElements.widgetOffcanvas,
65				'wpr-wishlist-button-pro.default' : WprElements.widgetWishlistButton,
66				'wpr-mini-wishlist-pro.default' : WprElements.widgetMiniWishlist,
67				'wpr-wishlist-pro.default' : WprElements.widgetWishlist,
68				'wpr-compare-button-pro.default' : WprElements.widgetCompareButton,
69				'wpr-mini-compare-pro.default' : WprElements.widgetMiniCompare,
70				'wpr-compare-pro.default' : WprElements.widgetCompare,
71				'wpr-form-builder.default': WprElements.widgetFormBuilder,
72				'wpr-image-scroll.default': WprElements.widgetImageScroll,
73				'wpr-video-playlist.default': WprElements.widgetVideoPlaylist,
74				'wpr-password-protected-content.default': WprElements.widgetPasswordProtectedContent,
75				'wpr-icon-box.default': WprElements.widgetIconBox,		
76				'wpr-separator.default': WprElements.widgetSeparator,
77				'wpr-circle-menu.default': WprElements.widgetCircleMenu,
78				'wpr-unfold.default': WprElements.widgetUnfold,
79				'wpr-google-reviews-pro.default' : WprElements.widgetGoogleReviews,
80
81				// Single
82				'wpr-post-media.default' : WprElements.widgetPostMedia,
83			};
84			
85			$.each( widgets, function( widget, callback ) {
86				window.elementorFrontend.hooks.addAction( 'frontend/element_ready/' + widget, callback );
87			});
88
89			window.elementorFrontend.hooks.addAction( 'frontend/element_ready/section', WprElements.initColumnSlider );
90			window.elementorFrontend.hooks.addAction( 'frontend/element_ready/container', WprElements.initColumnSlider );
91			window.elementorFrontend.hooks.addAction( 'frontend/element_ready/section', WprElements.equalHeight );
92			window.elementorFrontend.hooks.addAction( 'frontend/element_ready/container', WprElements.equalHeight );
93			window.elementorFrontend.hooks.addAction( 'frontend/element_ready/section', WprElements.widgetSection );
94			window.elementorFrontend.hooks.addAction( 'frontend/element_ready/container', WprElements.widgetSection );
95
96			WprElements.bindElementorTabsCompatibility();
97
98			// Remove Mega Menu Templates from "Edit with Elementor"
99			WprElements.changeAdminBarMenu();
100		},
101
102		bindElementorTabsCompatibility: function() {
103			var tabBindNamespace = '.wprTabsCompat';
104
105			$( document ).off( 'click' + tabBindNamespace + ' keyup' + tabBindNamespace, '.elementor-widget-tabs .elementor-tab-title' );
106			$( document ).on( 'click' + tabBindNamespace + ' keyup' + tabBindNamespace, '.elementor-widget-tabs .elementor-tab-title', function( event ) {
107				if ( 'keyup' === event.type && 'Enter' !== event.key && ' ' !== event.key ) {
108					return;
109				}
110
111				var $tabTitle = $( this );
112
113				setTimeout( function() {
114					var tabIndex = $tabTitle.attr( 'data-tab' ),
115						$tabsWidget = $tabTitle.closest( '.elementor-widget-tabs' ),
116						$activeTabContent = $tabsWidget.find( '.elementor-tab-content[data-tab="' + tabIndex + '"]' );
117
118					WprElements.runReadyTriggerForTabContent( $activeTabContent );
119				}, 80 );
120			} );
121
122			$( document ).off( 'click' + tabBindNamespace, '.e-n-tabs [role="tab"], .e-n-tabs .e-n-tab-title' );
123			$( document ).on( 'click' + tabBindNamespace, '.e-n-tabs [role="tab"], .e-n-tabs .e-n-tab-title', function() {
124				var $tabTitle = $( this );
125
126				setTimeout( function() {
127					var tabPanelId = $tabTitle.attr( 'aria-controls' ),
128						$tabPanel = tabPanelId ? $( '#' + tabPanelId ) : $();
129
130					WprElements.runReadyTriggerForTabContent( $tabPanel );
131				}, 80 );
132			} );
133
134			if ( window.elementorFrontend && window.elementorFrontend.elements && window.elementorFrontend.elements.$window ) {
135				window.elementorFrontend.elements.$window.off( 'elementor/nested-tabs/activate' + tabBindNamespace );
136				window.elementorFrontend.elements.$window.on( 'elementor/nested-tabs/activate' + tabBindNamespace, function( event, content ) {
137					WprElements.runReadyTriggerForTabContent( $( content ) );
138				} );
139			}
140		},
141
142		runReadyTriggerForTabContent: function( $tabContent ) {
143			if ( ! $tabContent || ! $tabContent.length || ! window.elementorFrontend || ! window.elementorFrontend.elementsHandler ) {
144				return;
145			}
146
147			var supportedTabWidgetTypes = {
148					'wpr-grid.default': true,
149					'wpr-magazine-grid.default': true,
150					'wpr-woo-grid.default': true,
151					'wpr-media-grid.default': true
152				},
153				hasGridTabWidgets = false;
154
155			$tabContent.find( '.elementor-element[data-widget_type]' ).each( function() {
156				var $element = $( this );
157				var widgetType = $element.attr( 'data-widget_type' );
158
159				if ( ! supportedTabWidgetTypes[ widgetType ] ) {
160					return;
161				}
162
163				hasGridTabWidgets = true;
164
165				if ( $element.attr( 'data-wpr-tab-ready' ) === 'yes' ) {
166					return;
167				}
168
169				window.elementorFrontend.elementsHandler.runReadyTrigger( $element );
170				$element.attr( 'data-wpr-tab-ready', 'yes' );
171			} );
172
173			if ( ! hasGridTabWidgets ) {
174				return;
175			}
176
177			setTimeout( function() {
178				$( window ).trigger( 'resize' );
179				if ( window.elementorFrontend && window.elementorFrontend.elements && window.elementorFrontend.elements.$window ) {
180					window.elementorFrontend.elements.$window.trigger( 'elementor-pro/motion-fx/recalc' );
181					window.elementorFrontend.elements.$window.trigger( 'elementor/bg-video/recalc' );
182				}
183			}, 0 );
184		},
185
186		widgetPostMedia: function( $scope ) {
187			// var gallery = $scope.find( '.wpr-gallery-slider' ),
188			// 	gallerySettings = gallery.attr( 'data-slick' );
189			
190			// gallery.animate({ 'opacity' : '1' }, 1000 );//tmp
191
192			// if ( '[]' !== gallerySettings ) {
193			// 	gallery.slick({
194			// 		appendDots : $scope.find( '.wpr-gallery-slider-dots' ),
195			// 		customPaging : function ( slider, i ) {
196			// 			var slideNumber = (i + 1),
197			// 				totalSlides = slider.slideCount;
198
199			// 			return '<span class="wpr-gallery-slider-dot"></span>';
200			// 		}
201			// 	});
202			// }
203
204			// Lightbox
205			var lightboxSettings = $( '.wpr-featured-media-image' ).attr( 'data-lightbox' );
206
207			if ( typeof lightboxSettings !== typeof undefined && lightboxSettings !== false && ! WprElements.editorCheck() ) {
208				var MediaWrap = $scope.find( '.wpr-featured-media-wrap' );
209					lightboxSettings = JSON.parse( lightboxSettings );
210
211				// Init Lightbox
212				MediaWrap.lightGallery( lightboxSettings );
213
214				// Show/Hide Controls
215				MediaWrap.on( 'onAferAppendSlide.lg, onAfterSlide.lg', function( event, prevIndex, index ) {
216					var lightboxControls = $( '#lg-actual-size, #lg-zoom-in, #lg-zoom-out, #lg-download' ),
217						lightboxDownload = $( '#lg-download' ).attr( 'href' );
218
219					if ( $( '#lg-download' ).length ) {
220						if ( -1 === lightboxDownload.indexOf( 'wp-content' ) ) {
221							lightboxControls.addClass( 'wpr-hidden-element' );
222						} else {
223							lightboxControls.removeClass( 'wpr-hidden-element' );
224						}
225					}
226
227					// Autoplay Button
228					if ( '' === lightboxSettings.autoplay ) {
229						$( '.lg-autoplay-button' ).css({
230							 'width' : '0',
231							 'height' : '0',
232							 'overflow' : 'hidden'
233						});
234					}
235				});
236			}
237		}, // End widgetFeaturedMedia
238
239		widgetSection: function( $scope ) {
240
241			if ( $scope.attr('data-wpr-particles') || $scope.find('.wpr-particle-wrapper').attr('data-wpr-particles-editor') ) {
242				particlesEffect();
243            }
244
245			if ( $scope.hasClass('wpr-jarallax') || $scope.hasClass('wpr-jarallax-yes') ) {
246				bindParallaxResize($scope);
247				observeParallax($scope);
248			}
249
250			if ( $scope.hasClass('wpr-parallax-yes') ) {
251				parallaxMultiLayer();
252			}
253
254			if ( $scope.hasClass('wpr-sticky-section-yes') && typeof WprConfig !== 'undefined' && WprConfig.sticky_section === 'on'  ) {
255				$(document).ready(function() {
256					stickySection();
257				});
258			}
259
260			function stickySection() {
261			    var positionType = !WprElements.editorCheck() ? $scope.attr('data-wpr-position-type') : $scope.find('.wpr-sticky-section-yes-editor').attr('data-wpr-position-type'),
262				    positionLocation = !WprElements.editorCheck() ? $scope.attr('data-wpr-position-location') : $scope.find('.wpr-sticky-section-yes-editor').attr('data-wpr-position-location'),
263				    positionOffset = !WprElements.editorCheck() ? $scope.attr('data-wpr-position-offset') : $scope.find('.wpr-sticky-section-yes-editor').attr('data-wpr-position-offset'),
264				    viewportWidth = $('body').prop('clientWidth') + 17,
265				    availableDevices = !WprElements.editorCheck() ? $scope.attr('data-wpr-sticky-devices') : $scope.find('.wpr-sticky-section-yes-editor').attr('data-wpr-sticky-devices'),
266				    activeDevices = !WprElements.editorCheck() ? $scope.attr('data-wpr-active-breakpoints') : $scope.find('.wpr-sticky-section-yes-editor').attr('data-wpr-active-breakpoints'),
267				    stickySectionExists = $scope.hasClass('wpr-sticky-section-yes') || $scope.find('.wpr-sticky-section-yes-editor') ? true : false,
268				    positionStyle,
269                    adminBarHeight,
270					stickyEffectsOffset = $(window).scrollTop(),
271					stickyHideDistance = 0,
272					$window = $(window),
273					prevScrollPos = $window.scrollTop(),
274				    stickyHeaderFooter = '',
275					stickyAnimation = 'none',
276					stickyAnimationHide = '',
277					headerFooterZIndex = !WprElements.editorCheck() ? $scope.attr('data-wpr-z-index') : $scope.find('.wpr-sticky-section-yes-editor').attr('data-wpr-z-index'),
278					stickType = !WprElements.editorCheck() ? $scope.attr('data-wpr-sticky-type') : $scope.find('.wpr-sticky-section-yes-editor').attr('data-wpr-sticky-type'),
279                    hiddenHeaderClass = $scope.next().hasClass('e-con') ? 'wpr-hidden-header-flex' : 'wpr-hidden-header',
280					distanceFromTop = $scope.offset().top,
281					windowHeight = $(window).height(),
282					elementHeight = $scope.outerHeight(true),
283					distanceFromBottom = $(document).height() - (distanceFromTop + elementHeight),
284					offsetTop;
285
286
287					if ( $scope.data('settings') && $scope.data('settings').sticky_animation ) {
288						stickyAnimation = $scope.data('settings').sticky_animation;
289					} else {
290						stickyAnimation = $scope.find('.wpr-sticky-section-yes-editor').attr('data-wpr-sticky-animation');
291					}
292
293					var stickyAnimDuration = $scope.attr('data-wpr-animation-duration') ? $scope.attr('data-wpr-animation-duration') + 's' : 500 + 's';
294
295				if ( $scope.closest('div[data-elementor-type="wp-post"]').length > 0 ) {
296					stickyHeaderFooter = $scope.closest('div[data-elementor-type="wp-post"]');
297				} else if ( $scope.closest('div[data-elementor-type="header"]').length > 0 ) {
298					stickyHeaderFooter = $scope.closest('div[data-elementor-type="header"]');
299				} else if ( $scope.closest('div[data-elementor-type="footer"]').length > 0 ) {
300					stickyHeaderFooter = $scope.closest('div[data-elementor-type="footer"]');
301				}
302
303			    if ( !$scope.find('.wpr-sticky-section-yes-editor').length) {
304			        positionType = $scope.attr('data-wpr-position-type');
305			        positionLocation = $scope.attr('data-wpr-position-location');
306			        positionOffset = $scope.attr('data-wpr-position-offset');
307			        availableDevices = $scope.attr('data-wpr-sticky-devices');
308			        activeDevices = $scope.attr('data-wpr-active-breakpoints');
309					headerFooterZIndex = $scope.attr('data-wpr-z-index');
310			    }
311
312                if ( 'top' === positionLocation && 'auto' === $scope.css('top') ) {
313                    var offsetTop = $scope.data('wpr-position-offset');
314                    $scope.css('top', offsetTop);
315                } else {
316                    var offsetTop = $scope.data('wpr-position-offset');
317                }
318
319			    if ( 0 == availableDevices.length ) {
320			        positionType = 'relative';
321			    }
322
323			    if ( WprElements.editorCheck() && availableDevices ) {
324			        var attributes = $scope.find('.wpr-sticky-section-yes-editor').attr('data-wpr-sticky-devices');
325			        $scope.attr('data-wpr-sticky-devices', attributes);
326			        availableDevices = $scope.attr('data-wpr-sticky-devices');
327			    }
328
329			    changePositionType();
330			    changeAdminBarOffset();
331
332			    $(window).smartresize(function() {
333					recalculateVariables();
334			    });
335
336				// Debounce function
337				function debounce(func, wait) {
338					let timeout;
339					return function(...args) {
340						const context = this;
341						clearTimeout(timeout);
342						timeout = setTimeout(() => func.apply(context, args), wait);
343					};
344				}// Adjust the debounce delay as needed
345
346				// Create a MutationObserver instance
347				if ( !WprElements.editorCheck() ) {
348					if ( 'yes' !== $scope.data('wpr-replace-header') && 'yes' !== $scope.data('wpr-sticky-hide') ) {
349						// Function to be called when mutations are observed
350						const handleMutations = debounce(function(mutationsList) {
351							// if (!$scope[0] || !document.body.contains($scope[0])) return;
352							// var isGTranslate = function(node) {
353							// 	if (!node || !node.getAttribute) return false;
354							// 	var id = node.getAttribute('id') || '';
355							// 	if (id.indexOf('google_translate') !== -1 || id.indexOf('gtranslate') !== -1) return true;
356							// 	return node.closest && (node.closest('#google_translate_element') || node.closest('.gtranslate'));
357							// };
358							for (let mutation of mutationsList) {
359								// if (mutation.type === 'childList' && !isGTranslate(mutation.target)) {
360								if (mutation.type === 'childList') {
361									$(window).trigger('scroll');
362									recalculateVariables();
363									break;
364								}
365							}
366						}, 100); 
367	
368						const observer = new MutationObserver(handleMutations);
369						observer.observe(document.body, { childList: true, subtree: true });
370					}
371				}
372
373				$(window).scroll(function() {
374					if ($scope && $scope.css('position') === 'relative') {
375						recalculateVariables();
376					}
377				});
378			    
379			    if (!stickySectionExists) {
380			        positionStyle = 'relative';
381			    }
382
383				function recalculateVariables() {
384					distanceFromTop = $scope.offset().top;
385					windowHeight = $(window).height(),
386					elementHeight = $scope.outerHeight(true),
387					distanceFromBottom = $(document).height() - (distanceFromTop + elementHeight);
388					
389			        viewportWidth = $('body').prop('clientWidth') + 17;
390					
391					changePositionType();
392				}
393
394			    function changePositionType() {
395			        if ( !$scope.hasClass('wpr-sticky-section-yes') && !$scope.find('.wpr-sticky-section-yes-editor') ) {
396			            positionStyle = 'relative';
397			            return;
398			        }
399
400                    var desktopDimension = activeDevices.includes('widescreen_sticky') ? 2400 : 4000
401			        var checkDevices = [['mobile_sticky', 768], ['mobile_extra_sticky', 881], ['tablet_sticky', 1025], ['tablet_extra_sticky', 1201], ['laptop_sticky', 1216],  ['desktop_sticky', 4000], ['widescreen_sticky', 4000]];
402			        var emptyVariables = [];
403
404			        var checkedDevices = checkDevices.filter((item, index) => {
405			            return activeDevices.indexOf(item[0]) != -1;
406			        }).reverse();
407			        
408			        checkedDevices.forEach((device, index) => {
409						if ( device[1] > viewportWidth ) {
410							var deviceName = device[0].replace("_sticky", "");
411
412							if ( 'desktop' == deviceName ) {
413								if ( $scope.data('settings') ) {
414									stickyEffectsOffset = distanceFromTop + $scope.data('settings').wpr_sticky_effects_offset;
415								} else {
416									stickyEffectsOffset = distanceFromTop + $scope.find('.wpr-sticky-section-yes-editor').attr('data-wpr-offset-settings');
417								}
418							} else {
419								if ( $scope.data('settings') ) {
420									stickyEffectsOffset = distanceFromTop + $scope.data('settings')['wpr_sticky_effects_offset_' + deviceName];
421								} else {
422									stickyEffectsOffset = distanceFromTop + $scope.find('.wpr-sticky-section-yes-editor').attr('data-wpr-offset-settings');
423								}
424							}
425
426							if ( availableDevices.indexOf(device[0]) === -1 ) {
427								positionStyle = activeDevices?.indexOf(device[0]) !== -1 ? 'relative' : (emptyVariables[index - 1] ? emptyVariables[index - 1] : positionType);
428								// positionStyle = activeDevices && activeDevices.indexOf(device[0]) !== -1 ? 'static' : (emptyVariables[index - 1] ? emptyVariables[index - 1] : positionType);
429								emptyVariables[index] = positionStyle;
430							} else if ( availableDevices.indexOf(device[0]) !== -1 ) {
431								positionStyle = positionType;
432							}
433						}
434			        });
435
436					var handleScroll = function() {
437						let scrollPos = $window.scrollTop();
438						
439						if ( 'fixed' != positionStyle ) {
440							if ( 'top' === positionLocation ) {
441								if ( scrollPos > distanceFromTop) {
442									applyPosition();
443								} else if ( scrollPos <= distanceFromTop ) {
444									$scope.css({'position': 'relative' });
445								}
446							}
447
448							if ( 'bottom' === positionLocation ) {
449								if ( scrollPos + windowHeight <= $(document).height() - distanceFromBottom ) {
450									applyPosition();
451								} else {
452									$scope.css({'position': 'relative' });
453								}
454							}
455						}
456
457						if ( 'relative' !== positionStyle ) {
458							if ( scrollPos > stickyEffectsOffset ) {
459								if ( 'yes' == $scope.data('wpr-replace-header') ) {
460
461									if ( 'yes' === $scope.data('wpr-sticky-hide') ) {
462
463										if ( scrollPos >= distanceFromTop ) {
464											$scope.addClass('wpr-visibility-hidden');
465										}
466
467										if ( scrollPos < prevScrollPos) {
468											$scope.next().addClass(hiddenHeaderClass).addClass('wpr-' + stickyAnimation + '-in');
469										}
470									} else {
471										$scope.addClass('wpr-visibility-hidden');
472										$scope.next().addClass(hiddenHeaderClass).addClass('wpr-' + stickyAnimation + '-in');
473									}
474								} else {
475									$scope.addClass('wpr-sticky-header');
476								}
477							} else if ( scrollPos <= stickyEffectsOffset ) {
478								if ( 'yes' == $scope.data('wpr-replace-header') ) {
479									$scope.next().removeClass(hiddenHeaderClass);
480									$scope.removeClass('wpr-visibility-hidden');
481									$scope.next().removeClass('wpr-' + stickyAnimation + '-in');
482								} else {
483									$scope.removeClass('wpr-sticky-header');
484								}
485							}
486						}
487
488						if ( 'yes' === $scope.data('wpr-sticky-hide') ) {
489							if ( scrollPos >= distanceFromTop ) {
490								if ( scrollPos < prevScrollPos ) {
491									// Scrolling up
492									if ( 'yes' === $scope.data('wpr-replace-header') ) {
493										$scope.next().removeClass('wpr-' + stickyAnimation + '-out');
494										$scope.next().addClass('wpr-' + stickyAnimation + '-in');
495									} else {
496										$scope.removeClass('wpr-' + stickyAnimation + '-out');
497										$scope.addClass('wpr-' + stickyAnimation + '-in');
498									}
499								} else {
500									// Scrolling down or no direction change
501									if ( 'yes' === $scope.data('wpr-replace-header') ) {
502										$scope.next().removeClass('wpr-' + stickyAnimation + '-in');
503										$scope.next().addClass('wpr-' + stickyAnimation + '-out');
504									} else {
505										$scope.removeClass('wpr-' + stickyAnimation + '-in');
506										$scope.addClass('wpr-' + stickyAnimation + '-out');
507									}
508								}
509							}
510
511							if ( 0 === $(window).scrollTop() && 'sticky' === positionType ) {
512								$scope.css('position', 'relative');
513							}
514						}
515
516						// Clear any previous timeout
517						clearTimeout(scrollEndTimeout);
518					  
519						// Set a new timeout to update prevScrollPos after 150 milliseconds (adjust the delay as needed)
520						scrollEndTimeout = setTimeout(() => {
521						  prevScrollPos = scrollPos;
522						}, 10);
523					}
524					
525					if ( 'sticky' == positionStyle ) {
526						$(window).scroll(handleScroll);
527					} else if ( 'fixed' == positionStyle ) {
528						applyPosition();
529						$(window).scroll(handleScroll);
530					}
531
532					if ( 'yes' == $scope.data('wpr-replace-header') ) {
533                        if ( 0 != $scope.next().length ) {
534                            $scope.next().get(0).style.setProperty('--wpr-animation-duration', stickyAnimDuration);
535                        }
536					}
537
538					let scrollEndTimeout;
539			    }
540			    
541			    function applyPosition() {
542			        var bottom = +window.innerHeight - (+$scope.css('top').slice(0, -2) + $scope.height());
543			        var top = +window.innerHeight - (+$scope.css('bottom').slice(0, -2) + $scope.height());
544
545					if ( 'yes' === $scope.data('wpr-sticky-hide') && prevScrollPos < $window.scrollTop() ) {
546						return;
547					}
548
549					if ( '' == stickType ) {
550						stickType = 'fixed';
551					}
552					
553					$scope.css({'position': stickType });
554
555                    if ( $('.wpr-close-cart span').length && !WprElements.editorCheck() ) {
556                        WprElements.closeSideBarOnReplace($scope, 200);
557                    }
558			    }
559
560			    function changeAdminBarOffset() {
561			        if ( $('#wpadminbar').length ) {
562			            adminBarHeight = $('#wpadminbar').css('height').slice(0, $('#wpadminbar').css('height').length - 2);
563
564			            if ( 'top'  ===  positionLocation && ( 'fixed' == $scope.css('position') ) ) {
565			                $scope.css('top', +adminBarHeight + offsetTop + 'px');
566			                $scope.css('bottom', 'auto');
567			            }
568			        }
569			    }
570			}
571
572			function particlesEffect() {
573				var elementType = $scope.data('element_type'),
574					sectionID = encodeURIComponent($scope.data('id')),
575					particlesJSON = ! WprElements.editorCheck() ? $scope.attr('data-wpr-particles') : $scope.find('.wpr-particle-wrapper').attr('data-wpr-particles-editor');
576
577				if ( ('section' === elementType || 'container' === elementType) && undefined !== particlesJSON ) {
578					// Frontend
579					if ( ! WprElements.editorCheck() ) {
580						$scope.prepend('<div class="wpr-particle-wrapper" id="wpr-particle-'+ sectionID +'"></div>');
581	
582						particlesJS('wpr-particle-'+ sectionID, $scope.attr('particle-source') == 'wpr_particle_json_custom' ? JSON.parse(particlesJSON) : modifyJSON(particlesJSON));
583
584						setTimeout(function() {
585							window.dispatchEvent(new Event('resize'));
586						}, 500);
587
588						setTimeout(function() {
589							window.dispatchEvent(new Event('resize'));
590						}, 1500);
591					// Editor
592					} else {
593						if ( $scope.hasClass('wpr-particle-yes') ) {
594							particlesJS( 'wpr-particle-'+ sectionID, $scope.find('.wpr-particle-wrapper').attr('particle-source') == 'wpr_particle_json_custom' ? JSON.parse(particlesJSON) : modifyJSON(particlesJSON));
595	
596							$scope.find('.elementor-column').css('z-index', 9);
597	
598							setTimeout(function() {
599								window.dispatchEvent(new Event('resize'));
600							}, 500);
601
602							setTimeout(function() {
603								window.dispatchEvent(new Event('resize'));
604							}, 1500);
605						} else {
606							$scope.find('.wpr-particle-wrapper').remove();
607						}
608					}
609				}
610			}
611
612			function modifyJSON(json) {
613				var wpJson = JSON.parse(json),
614					particles_quantity = ! WprElements.editorCheck() ? $scope.attr('wpr-quantity') : $scope.find('.wpr-particle-wrapper').attr('wpr-quantity'),
615					particles_color = ! WprElements.editorCheck() ? $scope.attr('wpr-color') || '#000000' : $scope.find('.wpr-particle-wrapper').attr('wpr-color') ? $scope.find('.wpr-particle-wrapper').attr('wpr-color') : '#000000',
616					particles_speed = ! WprElements.editorCheck() ? $scope.attr('wpr-speed') : $scope.find('.wpr-particle-wrapper').attr('wpr-speed'),
617					particles_shape = ! WprElements.editorCheck() ? $scope.attr('wpr-shape') : $scope.find('.wpr-particle-wrapper').attr('wpr-shape'),
618					particles_size = ! WprElements.editorCheck() ? $scope.attr('wpr-size')  : $scope.find('.wpr-particle-wrapper').attr('wpr-size');
619				
620				wpJson.particles.size.value = particles_size;
621				wpJson.particles.number.value = particles_quantity;
622				wpJson.particles.color.value = particles_color;
623				wpJson.particles.shape.type = particles_shape;
624				wpJson.particles.line_linked.color = particles_color;
625				wpJson.particles.move.speed = particles_speed;
626				
627				return wpJson;
628			}
629
630			function parallaxBackground() {
631				function getResponsiveJarallaxImage(desktopImage, mobileImage) {
632					var hasMobileImage = !! mobileImage;
633					var isMobileDevice = window.matchMedia('(max-width: 767px)').matches;
634
635					if ( hasMobileImage && isMobileDevice ) {
636						return mobileImage;
637					}
638
639					return desktopImage;
640				}
641
642				function cleanupJarallaxArtifacts(scopeElement) {
643					if ( ! scopeElement ) {
644						return;
645					}
646
647					scopeElement.querySelectorAll('[id^="jarallax-container-"]').forEach((container) => {
648						var containerId = container.getAttribute('id') || '';
649						var instanceId = containerId.replace('jarallax-container-', '');
650						var clipStyle = document.getElementById('jarallax-clip-' + instanceId);
651
652						if ( clipStyle && clipStyle.parentNode ) {
653							clipStyle.parentNode.removeChild(clipStyle);
654						}
655
656						if ( container.parentNode ) {
657							container.parentNode.removeChild(container);
658						}
659					});
660				}
661
662				if ( ! WprElements.editorCheck() && ( $scope.hasClass('wpr-jarallax') || $scope.hasClass('wpr-jarallax-yes') ) ) {
663					var targetImage = getResponsiveJarallaxImage($scope.attr('bg-image'), $scope.attr('bg-image-mobile'));
664
665					if ( ! targetImage ) {
666						return;
667					}
668
669					if ( $scope.attr('data-wpr-jarallax-initialized') === 'yes' && $scope.attr('data-wpr-jarallax-image') === targetImage ) {
670						return;
671					}
672
673					if ( typeof $scope.data('jarallax') !== 'undefined' ) {
674						$scope.jarallax('destroy');
675					}
676					cleanupJarallaxArtifacts($scope[0]);
677					$scope.removeData('jarallax');
678
679					$scope.css('background-image', 'url("' + targetImage + '")');
680
681					var scrollType = $scope.attr('scroll-effect');
682					var parallaxSpeed = parseFloat($scope.attr('speed-data'));
683
684					if ( isNaN(parallaxSpeed) ) {
685						parallaxSpeed = 0.5;
686					}
687
688					if ( scrollType === 'scroll' ) {
689						parallaxSpeed = Math.max(-0.8, Math.min(0.8, parallaxSpeed));
690					}
691
692					$scope.jarallax({
693						type: scrollType,
694						speed: parallaxSpeed,
695					});
696					$scope.attr('data-wpr-jarallax-image', targetImage);
697					$scope.attr('data-wpr-jarallax-initialized', 'yes');
698				} else if ( WprElements.editorCheck() ) {
699					var editorDesktopImage = $scope.find('> .wpr-jarallax').attr('bg-image-editor');
700					var editorMobileImage = $scope.find('> .wpr-jarallax').attr('bg-image-mobile-editor');
701					var editorTargetImage = getResponsiveJarallaxImage(editorDesktopImage, editorMobileImage);
702
703					if ( ! editorTargetImage ) {
704						return;
705					}
706
707					if ( $scope.attr('data-wpr-jarallax-initialized') === 'yes' && $scope.attr('data-wpr-jarallax-image') === editorTargetImage ) {
708						return;
709					}
710
711					if ( typeof $scope.data('jarallax') !== 'undefined' ) {
712						$scope.jarallax('destroy');
713					}
714					cleanupJarallaxArtifacts($scope[0]);
715					$scope.removeData('jarallax');
716
717					$scope.css('background-image', 'url("' + editorTargetImage + '")');
718
719					var editorType = $scope.find('> .wpr-jarallax').attr('scroll-effect-editor');
720					var editorSpeed = parseFloat($scope.find('> .wpr-jarallax').attr('speed-data-editor'));
721
722					if ( isNaN(editorSpeed) ) {
723						editorSpeed = 0.5;
724					}
725
726					if ( editorType === 'scroll' ) {
727						editorSpeed = Math.max(-0.8, Math.min(0.8, editorSpeed));
728					}
729
730					$scope.jarallax({
731						type: editorType,
732						speed: editorSpeed
733					});
734					$scope.attr('data-wpr-jarallax-image', editorTargetImage);
735					$scope.attr('data-wpr-jarallax-initialized', 'yes');
736				}
737			}
738
739			function observeParallax($scope) {
740				if ( ! $scope.length || $scope.attr('data-wpr-jarallax-observed') === 'yes' || $scope.attr('data-wpr-jarallax-initialized') === 'yes' ) {
741					return;
742				}
743
744				$scope.attr('data-wpr-jarallax-observed', 'yes');
745
746				const observer = new IntersectionObserver((entries, obs) => {
747					entries.forEach(entry => {
748						if (entry.isIntersecting) {
749							// Call your original function once
750							parallaxBackground.call(this, $scope);
751							obs.unobserve(entry.target); // Only trigger once
752						}
753					});
754				}, {
755					// rootMargin: '400px 0px',
756					// threshold: 0
757					rootMargin: '0px',
758					threshold: 0.1
759				});
760			
761				observer.observe($scope[0]);
762			}
763
764			function bindParallaxResize($scope) {
765				if ( $scope.attr('data-wpr-jarallax-resize-bound') === 'yes' ) {
766					return;
767				}
768
769				$scope.attr('data-wpr-jarallax-resize-bound', 'yes');
770
771				let resizeTimer;
772				window.addEventListener('resize', function() {
773					clearTimeout(resizeTimer);
774					resizeTimer = setTimeout(function() {
775						parallaxBackground.call(this, $scope);
776					}, 120);
777				});
778			}
779
780			function parallaxMultiLayer() {
781				if ( $scope.hasClass('wpr-parallax-yes') ) {
782					var scene = document.getElementsByClassName('wpr-parallax-multi-layer');
783
784					var parallaxInstance = Array.from(scene).map(item => {
785						return new Parallax(item, {
786							invertY: item.getAttribute('direction') == 'yes' ? true : false,
787							invertX: item.getAttribute('direction') == 'yes' ? true : false,
788							scalarX: item.getAttribute('scalar-speed'),
789							scalarY: item.getAttribute('scalar-speed'),
790							hoverOnly: true,
791							pointerEvents: true
792						});
793					});
794	
795					parallaxInstance.forEach(parallax => {
796						parallax.friction(0.2, 0.2);
797					});
798				}
799				if ( ! WprElements.editorCheck() ) {						
800					var newScene = [];
801
802					document.querySelectorAll('.wpr-parallax-multi-layer').forEach((element, index) => {
803						element.parentElement.style.position = "relative";
804						element.style.position = "absolute";
805						newScene.push(element);
806						element.remove();
807					});
808
809					document.querySelectorAll('.wpr-parallax-ml-children').forEach((element, index) => {
810						element.style.position = "absolute";
811						element.style.top = element.getAttribute('style-top');
812						element.style.left = element.getAttribute('style-left');
813					});
814
815					$('.wpr-parallax-yes').each(function(index) {
816						$(this).append(newScene[index]);
817					});
818				}
819			}
820		}, // end widgetSection
821
822		initColumnSlider: function( $scope ) {
823
824			if ( ! $scope.hasClass('wpr-column-slider-yes') ) {
825				return;
826			}
827			$scope.removeClass('wpr-column-slider-ready');
828
829			var swiperLoader = function swiperLoader(swiperElement, swiperConfig) {
830				if ('undefined' === typeof Swiper) {
831					var asyncSwiper = elementorFrontend.utils.swiper;
832					return new asyncSwiper(swiperElement, swiperConfig).then( function (newSwiperInstance) {
833						return newSwiperInstance;
834					});
835				}
836				return swiperPromise(swiperElement, swiperConfig);
837			};
838
839			var swiperPromise = function swiperPromise(swiperElement, swiperConfig) {
840				return new Promise(function (resolve, reject) {
841					var swiperInstance = new Swiper(swiperElement, swiperConfig);
842					resolve(swiperInstance);
843				});
844			};
845
846			var sliderInner = $scope.find('.elementor-container').first();
847
848			if ( ! sliderInner.length ) {
849				sliderInner = $scope.children('.e-con-inner').first();
850			}
851
852			if ( sliderInner.length ) {
853
854				sliderInner.css('flexWrap', 'nowrap');
855
856				var dataContainer = $scope;
857				var sliderSettings = dataContainer.data('wpr-column-slider');
858				var rawSliderSettings = dataContainer.attr && dataContainer.attr('data-wpr-column-slider');
859
860				if ( ! sliderSettings && WprElements.editorCheck() ) {
861					dataContainer = $scope.find('.wpr-column-slider-editor, [data-wpr-column-slider]').first();
862					sliderSettings = dataContainer.data('wpr-column-slider');
863					rawSliderSettings = dataContainer.attr && dataContainer.attr('data-wpr-column-slider');
864				}
865
866				if ( rawSliderSettings && 'string' === typeof rawSliderSettings ) {
867					try {
868						sliderSettings = JSON.parse(rawSliderSettings);
869					} catch (err) {}
870				} else if ( ! sliderSettings && rawSliderSettings ) {
871					try {
872						sliderSettings = JSON.parse(rawSliderSettings);
873					} catch (err2) {}
874				}
875				if ( sliderSettings ) {
876
877					if ( $scope[0] && $scope[0].swiper ) {
878						try {
879							$scope[0].swiper.destroy(true, true);
880						} catch (e) {}
881					}
882
883					$scope.find('> .swiper-button-prev, > .swiper-button-next, > .swiper-pagination').remove();
884					sliderInner.removeClass('swiper-wrapper');
885
886					$scope.addClass('swiper');
887					sliderInner.addClass('swiper-wrapper');
888					var sliderItems = sliderInner.children('.elementor-element.e-con');
889					if ( ! sliderItems.length ) {
890						sliderItems = sliderInner.children('.e-child');
891					}
892					if ( ! sliderItems.length ) {
893						sliderItems = sliderInner.children('.elementor-column');
894					}
895					if ( ! sliderItems.length ) {
896						sliderItems = sliderInner.children();
897					}
898					sliderItems.addClass('swiper-slide');
899					sliderInner.css({
900						display: 'flex',
901						flexWrap: 'nowrap'
902					});
903					sliderItems.css({
904						flex: '0 0 auto',
905						flexBasis: 'auto',
906						minWidth: '0',
907						maxWidth: 'none'
908					});
909					$scope.css('overflow', 'hidden');
910					sliderInner.css('margin', '0');
911					var swiperSlider = $scope[0] ? $scope[0] : $scope;
912					var prevButtonEl = null;
913					var nextButtonEl = null;
914					var paginationEl = null;
915
916					if ( 'yes' === sliderSettings.wpr_cs_navigation ) {
917
918						$scope.append('<div class="swiper-button-prev"></div><div class="swiper-button-next"></div>');
919						prevButtonEl = $scope.find('.swiper-button-prev').last()[0];
920						nextButtonEl = $scope.find('.swiper-button-next').last()[0];
921
922						if ( !WprElements.editorCheck() ) {
923							var csNavigation = $scope.prev('.wpr-column-slider-navigation');
924							if ( !csNavigation.length ) {
925								csNavigation = $scope.prevAll('.wpr-column-slider-navigation').first();
926							}
927							var csNavigationPrev = csNavigation.find('i:first-child')[0] || csNavigation.find('svg:first-child')[0];
928							var csNavigationNext = csNavigation.find('i:last-child')[0] || csNavigation.find('svg:last-child')[0];
929
930							csNavigation.remove();
931							if ( csNavigationPrev ) {
932								$(prevButtonEl).append(csNavigationPrev);
933							}
934							if ( csNavigationNext ) {
935								$(nextButtonEl).append(csNavigationNext);
936							}
937						} else {
938							var csNavigation = $scope.find('.wpr-column-slider-navigation-editor');
939							var csNavigationPrev = csNavigation.find('i:first-child')[0] || csNavigation.find('svg:first-child')[0];
940							var csNavigationNext = csNavigation.find('i:last-child')[0] || csNavigation.find('svg:last-child')[0];
941
942							csNavigation.remove();
943							if ( csNavigationPrev ) {
944								$(prevButtonEl).append(csNavigationPrev);
945							}
946							if ( csNavigationNext ) {
947								$(nextButtonEl).append(csNavigationNext);
948							}
949						}
950					}
951					if ( 'yes' === sliderSettings.wpr_cs_pagination ) {
952						$scope.append('<div class="swiper-pagination"></div>');
953						paginationEl = $scope.find('.swiper-pagination').last()[0];
954					}
955
956					var breakpointsConfig = elementorFrontend && elementorFrontend.config && elementorFrontend.config.responsive ? elementorFrontend.config.responsive.breakpoints : {};
957					var getBp = function( key, fallback ) {
958						return breakpointsConfig && breakpointsConfig[ key ] && 'undefined' !== typeof breakpointsConfig[ key ].value ? +breakpointsConfig[ key ].value : fallback;
959					};
960					var bpMobile = getBp( 'mobile', 767 );
961					var bpMobileExtra = getBp( 'mobile_extra', bpMobile );
962					var bpTablet = getBp( 'tablet', 1024 );
963					var bpTabletExtra = getBp( 'tablet_extra', bpTablet );
964					var bpLaptop = getBp( 'laptop', 1366 );
965					var bpWidescreen = getBp( 'widescreen', 2400 );
966
967					var aboveMobileResp = bpMobile + 1;
968					var aboveMobileExtraResp = bpMobileExtra + 1;
969					var aboveTabletResp = bpTablet + 1;
970					var aboveTabletExtraResp = bpTabletExtra + 1;
971					var aboveLaptopResp = bpLaptop + 1;
972					var wideScreenResp = bpWidescreen;
973
974					swiperLoader(swiperSlider, {
975						hashNavigation: sliderSettings.wpr_cs_navigation === 'yes' ? true : false,
976						autoplay: sliderSettings.wpr_cs_autoplay === 'yes' ? {
977							delay: +sliderSettings.wpr_cs_delay,
978						} : false,
979						loop: sliderSettings.wpr_cs_loop === 'yes' ? true : false,
980						slidesPerView: +sliderSettings.wpr_cs_slides_to_show,
981						slidesPerGroup: +sliderSettings.wpr_cs_slides_to_scroll || 1,
982						spaceBetween: +sliderSettings.wpr_cs_space_between,
983						speed: +sliderSettings.wpr_cs_speed,
984						autoHeight: true,
985						watchOverflow: false,
986						pagination: sliderSettings.wpr_cs_pagination === 'yes' ? {
987							el: paginationEl,
988							type: sliderSettings.wpr_cs_pagination_type,
989							clickable: true,
990						} : false,
991						navigation: sliderSettings.wpr_cs_navigation === 'yes' ? {
992							prevEl: prevButtonEl,
993							nextEl: nextButtonEl,
994						} : false,
995						breakpoints: {
996							320: {
997								slidesPerView: +sliderSettings.wpr_cs_slides_to_show_mobile,
998								spaceBetween: +sliderSettings.wpr_cs_space_between_mobile,
999							},
1000							[aboveMobileResp]: {
1001								slidesPerView: +sliderSettings.wpr_cs_slides_to_show_mobile_extra,
1002								spaceBetween: +sliderSettings.wpr_cs_space_between_mobile_extra,
1003							},
1004							[aboveMobileExtraResp]: {
1005								slidesPerView: +sliderSettings.wpr_cs_slides_to_show_tablet,
1006								spaceBetween: +sliderSettings.wpr_cs_space_between_tablet,
1007							},
1008							[aboveTabletResp]: {
1009								slidesPerView: +sliderSettings.wpr_cs_slides_to_show_tablet_extra,
1010								spaceBetween: +sliderSettings.wpr_cs_space_between_tablet_extra,
1011							},
1012							[aboveTabletExtraResp]: {
1013								slidesPerView: +sliderSettings.wpr_cs_slides_to_show_laptop,
1014								spaceBetween: +sliderSettings.wpr_cs_space_between_laptop,
1015							},
1016							[aboveLaptopResp]: {
1017								slidesPerView: +sliderSettings.wpr_cs_slides_to_show,
1018								spaceBetween: +sliderSettings.wpr_cs_space_between,
1019							},
1020							[wideScreenResp]: {
1021								slidesPerView: +sliderSettings.wpr_cs_slides_to_show_widescreen,
1022								spaceBetween: +sliderSettings.wpr_cs_space_between_widescreen,
1023							}
1024						},
1025
1026					}).then(function () {
1027						$scope.addClass('wpr-column-slider-ready');
1028					}).catch(function () {
1029						$scope.addClass('wpr-column-slider-ready');
1030					});
1031
1032					return;
1033				}
1034			}
1035			$scope.addClass('wpr-column-slider-ready');
1036		},
1037
1038		equalHeight: function( $scope ) {
1039
1040			if ( ! $scope.hasClass('wpr-equal-height-yes') ) {
1041				return;
1042			}
1043			$scope.removeClass('wpr-equal-height-ready');
1044
1045			var section = $scope,
1046				editMode = elementorFrontend.isEditMode(),
1047				dataContainer = (editMode) ? section.find('#wpr-equal-height-' + section.data('id')) : section,
1048				equalHeightSettings = dataContainer.data('wpr-equal-height'),
1049				rawEh = dataContainer.attr && dataContainer.attr('data-wpr-equal-height');
1050
1051			if (!equalHeightSettings && editMode) {
1052				dataContainer = section.find('[data-wpr-equal-height]').first();
1053				equalHeightSettings = dataContainer.data('wpr-equal-height');
1054				rawEh = dataContainer.attr && dataContainer.attr('data-wpr-equal-height');
1055			}
1056
1057			if (rawEh && 'string' === typeof rawEh) {
1058				try {
1059					equalHeightSettings = JSON.parse(rawEh);
1060				} catch (err) {}
1061			} else if (!equalHeightSettings && rawEh) {
1062				try {
1063					equalHeightSettings = JSON.parse(rawEh);
1064				} catch (err2) {}
1065			}
1066
1067			if (!equalHeightSettings) {
1068				$scope.addClass('wpr-equal-height-ready');
1069				return;
1070			}
1071
1072			var normalizeList = function (val) {
1073				if (!val) {
1074					return [];
1075				}
1076				if (Array.isArray(val)) {
1077					return val;
1078				}
1079				if ('object' === typeof val) {
1080					return Object.keys(val).length ? Object.values(val) : [];
1081				}
1082				return [ val ];
1083			};
1084
1085			var rawEhTargets = equalHeightSettings.wpr_eh_target || equalHeightSettings.wprEhTarget || equalHeightSettings['wpr_eh_target'];
1086			var looksLikeSelector = function (str) {
1087				return 'string' === typeof str && /[.#\[]/.test(str);
1088			};
1089			var normalizeEhTargets = function (val) {
1090				if (!val) {
1091					return [];
1092				}
1093				if (Array.isArray(val)) {
1094					return val;
1095				}
1096				if ('object' === typeof val) {
1097					var keys = Object.keys(val),
1098						values = Object.values(val);
1099					var valueSelectors = values.filter(looksLikeSelector);
1100					if (valueSelectors.length) {
1101						return valueSelectors;
1102					}
1103					var keySelectors = keys.filter(looksLikeSelector);
1104					if (keySelectors.length) {
1105						return keySelectors;
1106					}
1107					return values;
1108				}
1109				return [ val ];
1110			};
1111			var ehTargets = normalizeEhTargets(rawEhTargets);
1112			var enableOn = normalizeList(equalHeightSettings.enable_on);
1113			var targetType = equalHeightSettings['wpr_eh_target-type'] || equalHeightSettings.wpr_eh_target_type || equalHeightSettings.wprEhTargetType || 'widget';
1114
1115			if (elementorFrontend && elementorFrontend.breakpoints && 'function' === typeof elementorFrontend.breakpoints.getActiveBreakpointsList && 0 === enableO
1115n.length) {
1116				enableOn = elementorFrontend.breakpoints.getActiveBreakpointsList({ withDesktop: true });
1117			}
1118
1119			var scopeId = section.data('id') ? section.data('id') : 'global';
1120
1121			if (0 === Object.keys(equalHeightSettings).length) {
1122				$scope.addClass('wpr-equal-height-ready');
1123				return;
1124			}
1125
1126			function collectUniqueTargets(selectors) {
1127				var seenNodes = [],
1128					$all = $();
1129				selectors.forEach(function (sel) {
1130					if (!sel) {
1131						return;
1132					}
1133					var selector = ('string' === typeof sel) ? sel.trim() : String(sel).trim();
1134					if (!selector) {
1135						return;
1136					}
1137					var $matches = section.find(selector);
1138					if (!$matches.length && -1 !== selector.indexOf('.elementor-widget-container')) {
1139						var fallbackSelector = selector.replace(/\s*\.elementor-widget-container\b/g, '').trim();
1140						if (fallbackSelector) {
1141							$matches = section.find(fallbackSelector);
1142						}
1143					}
1144					$matches.each(function () {
1145						if (-1 === seenNodes.indexOf(this)) {
1146							seenNodes.push(this);
1147							$all = $all.add(this);
1148						}
1149					});
1150				});
1151				return $all;
1152			}
1153
1154			function matchHeightAcrossSelectors(selectors) {
1155				var filtered = selectors.filter(function (s) {
1156					return s;
1157				});
1158				if (!filtered.length) {
1159					return;
1160				}
1161				var $targets = collectUniqueTargets(filtered);
1162				$targets.css('minHeight', 'unset');
1163				var heights = [];
1164				$targets.each(function () {
1165					heights.push($(this).outerHeight(true));
1166				});
1167				if (heights.length) {
1168					$targets.css('minHeight', Math.max.apply(null, heights));
1169				}
1170			}
1171
1172			function triggerEqualHeight() {
1173				var mode = (elementorFrontend.getCurrentDeviceMode() || '').replace(/^["']|["']$/g, '').trim();
1174				if (!mode && elementorFrontend.breakpoints && 'function' === typeof elementorFrontend.breakpoints.getActiveBreakpointsList) {
1175					var bpList = elementorFrontend.breakpoints.getActiveBreakpointsList({ withDesktop: true });
1176					mode = bpList[0] || 'desktop';
1177				}
1178				var deviceActive = (0 === enableOn.length) || enableOn.includes(mode);
1179
1180				if (deviceActive && ehTargets.length) {
1181					// One max height for every element matching any listed selector (not per-selector groups).
1182					matchHeightAcrossSelectors(ehTargets);
1183				} else {
1184					collectUniqueTargets(ehTargets).css('minHeight', 'unset');
1185				}
1186			}
1187
1188			triggerEqualHeight();
1189			$scope.addClass('wpr-equal-height-ready');
1190
1191			$(window).off('resize.wprEqualHeight-' + scopeId).on('resize.wprEqualHeight-' + scopeId, triggerEqualHeight);
1192			setTimeout(function () {
1193				triggerEqualHeight();
1194				$scope.addClass('wpr-equal-height-ready');
1195			}, 0);
1196		},
1197
1198		widgetNavMenu: function( $scope ) {
1199
1200			var $navMenu = $scope.find( '.wpr-nav-menu-container' ),
1201				$mobileNavMenu = $scope.find( '.wpr-mobile-nav-menu-container' );
1202
1203			// Menu
1204			var subMenuFirst = $navMenu.find( '.wpr-nav-menu > li.menu-item-has-children' ),
1205				subMenuDeep = $navMenu.find( '.wpr-sub-menu li.menu-item-has-children' );
1206
1207			if ( $scope.find('.wpr-mobile-toggle').length ) {
1208				$scope.find('a').on('click', function() {
1209					if (this.pathname == window.location.pathname && !($(this).parent('li').children().length > 1)) {
1210						$scope.find('.wpr-mobile-toggle').trigger('click');
1211					}
1212				});
1213			}
1214
1215			if ( $navMenu.attr('data-trigger') === 'click' ) {
1216				// First Sub
1217				subMenuFirst.children('a').on( 'click', function(e) {
1218					var currentItem = $(this).parent(),
1219						childrenSub = currentItem.children('.wpr-sub-menu');
1220
1221					// Reset
1222					subMenuFirst.not(currentItem).removeClass('wpr-sub-open');
1223					if ( $navMenu.hasClass('wpr-nav-menu-horizontal') || ( $navMenu.hasClass('wpr-nav-menu-vertical') && $scope.hasClass('wpr-sub-menu-position-absolute') ) ) {
1224						subMenuAnimation( subMenuFirst.children('.wpr-sub-menu'), false );
1225					}
1226
1227					if ( ! currentItem.hasClass( 'wpr-sub-open' ) ) {
1228						e.preventDefault();
1229						currentItem.addClass('wpr-sub-open');
1230						subMenuAnimation( childrenSub, true );
1231					} else {
1232						currentItem.removeClass('wpr-sub-open');
1233						subMenuAnimation( childrenSub, false );
1234					}
1235				});
1236
1237				// Deep Subs
1238				subMenuDeep.on( 'click', function(e) {
1239					var currentItem = $(this),
1240						childrenSub = currentItem.children('.wpr-sub-menu');
1241
1242					// Reset
1243					if ( $navMenu.hasClass('wpr-nav-menu-horizontal') ) {
1244						subMenuAnimation( subMenuDeep.find('.wpr-sub-menu'), false );
1245					}
1246
1247					if ( ! currentItem.hasClass( 'wpr-sub-open' ) ) {
1248						e.preventDefault();
1249						currentItem.addClass('wpr-sub-open');
1250						subMenuAnimation( childrenSub, true );
1251
1252					} else {
1253						currentItem.removeClass('wpr-sub-open');
1254						subMenuAnimation( childrenSub, false );
1255					}
1256				});
1257
1258				// Reset Subs on Document click
1259				$( document ).mouseup(function (e) {
1260					if ( ! subMenuFirst.is(e.target) && subMenuFirst.has(e.target).length === 0 ) {
1261						subMenuFirst.not().removeClass('wpr-sub-open');
1262						subMenuAnimation( subMenuFirst.children('.wpr-sub-menu'), false );
1263					}
1264					if ( ! subMenuDeep.is(e.target) && subMenuDeep.has(e.target).length === 0 ) {
1265						subMenuDeep.removeClass('wpr-sub-open');
1266						subMenuAnimation( subMenuDeep.children('.wpr-sub-menu'), false );
1267					}
1268				});
1269			} else {
1270				// Mouse Over
1271				subMenuFirst.on( 'mouseenter', function() {
1272					if ( $navMenu.hasClass('wpr-nav-menu-vertical') && $scope.hasClass('wpr-sub-menu-position-absolute') ) {
1273						$navMenu.find('li').not(this).children('.wpr-sub-menu').hide();
1274						// BUGFIX: when menu is vertical and absolute positioned, lvl2 depth sub menus wont show properly on hover
1275					}
1276
1277					subMenuAnimation( $(this).children('.wpr-sub-menu'), true );
1278				});
1279
1280				// Deep Subs
1281				subMenuDeep.on( 'mouseenter', function() {
1282					subMenuAnimation( $(this).children('.wpr-sub-menu'), true );
1283				});
1284
1285
1286				// Mouse Leave
1287				if ( $navMenu.hasClass('wpr-nav-menu-horizontal') ) {
1288					subMenuFirst.on( 'mouseleave', function() {
1289						subMenuAnimation( $(this).children('.wpr-sub-menu'), false );
1290					});
1291
1292					subMenuDeep.on( 'mouseleave', function() {
1293						subMenuAnimation( $(this).children('.wpr-sub-menu'), false );
1294					});	
1295				} else {
1296
1297					$navMenu.on( 'mouseleave', function() {
1298						subMenuAnimation( $(this).find('.wpr-sub-menu'), false );
1299					});
1300				}
1301			}
1302
1303
1304			// Mobile Menu
1305			var mobileMenu = $mobileNavMenu.find( '.wpr-mobile-nav-menu' );
1306
1307			// Toggle Button
1308			$mobileNavMenu.find( '.wpr-mobile-toggle' ).on( 'click', function() {
1309				$(this).toggleClass('wpr-mobile-toggle-fx');
1310
1311				if ( ! $(this).hasClass('wpr-mobile-toggle-open') ) {
1312					$(this).addClass('wpr-mobile-toggle-open');
1313
1314					if ( $(this).find('.wpr-mobile-toggle-text').length ) {
1315						$(this).children().eq(0).hide();
1316						$(this).children().eq(1).show();
1317					}
1318				} else {
1319					$(this).removeClass('wpr-mobile-toggle-open');
1320					$(this).trigger('focusout');
1321
1322					if ( $(this).find('.wpr-mobile-toggle-text').length ) {
1323						$(this).children().eq(1).hide();
1324						$(this).children().eq(0).show();
1325					}
1326				}
1327
1328				// Show Menu
1329				$(this).parent().next().stop().slideToggle();
1330
1331				// Fix Width
1332				fullWidthMobileDropdown();
1333			});
1334
1335			// Sub Menu Class
1336			mobileMenu.find('.sub-menu').removeClass('wpr-sub-menu').addClass('wpr-mobile-sub-menu');
1337
1338			// Sub Menu Dropdown
1339			mobileMenu.find('.menu-item-has-children').children('a').on( 'click', function(e) {
1340				var parentItem = $(this).closest('li');
1341
1342				// Toggle
1343				if ( ! parentItem.hasClass('wpr-mobile-sub-open') ) {
1344					e.preventDefault();
1345					parentItem.addClass('wpr-mobile-sub-open');
1346					parentItem.children('.wpr-mobile-sub-menu').first().stop().slideDown();
1347				} else {
1348					parentItem.removeClass('wpr-mobile-sub-open');
1349					parentItem.children('.wpr-mobile-sub-menu').first().stop().slideUp();
1350				}
1351			});
1352
1353			// Run Functions
1354			fullWidthMobileDropdown();
1355
1356			// Run Functions on Resize
1357			$(window).smartresize(function() {
1358				fullWidthMobileDropdown();
1359			});
1360
1361			// Full Width Dropdown
1362			function fullWidthMobileDropdown() {
1363				if ( ! $scope.hasClass( 'wpr-mobile-menu-full-width' ) || (! $scope.closest('.elementor-column').length && ! $scope.closest('.e-con').length) ) {
1364					return;
1365				}
1366
1367                // GOGA: maybe in some cases elementor-element instead of e-con
1368                var topSection = $scope.closest('.elementor-top-section');
1369
1370				var eColumn   = $scope.closest('.elementor-column').length ? $scope.closest('.elementor-column') : $scope.closest('.elementor-element'),
1371					mWidth 	  = topSection.length ? (topSection.outerWidth() - 2 * mobileMenu.offset().left) : ($(window).outerWidth() - 2 * mobileMenu.offset().left),
1372					mPosition = eColumn.offset().left + parseInt(eColumn.css('padding-left'), 10);
1373
1374                // GOGA: don't need to calculate mWidth since it has tu be full
1375				mobileMenu.css({
1376					'width' : mWidth +'px',
1377					'left' : - mPosition +'px'
1378				});
1379			}
1380
1381			// Sub Menu Animation
1382			function subMenuAnimation( selector, show ) {
1383				if ( show === true ) {
1384					selector.prev().attr('aria-expanded', 'true');
1385					if ( $scope.hasClass('wpr-sub-menu-fx-slide') ) {
1386						selector.stop().slideDown();
1387					} else {
1388						selector.stop().fadeIn();
1389					}
1390				} else {
1391					selector.prev().attr('aria-expanded', 'false');
1392					if ( $scope.hasClass('wpr-sub-menu-fx-slide') ) {
1393						selector.stop().slideUp();
1394					} else {
1395						selector.stop().fadeOut();
1396					}
1397				}
1398			}
1399
1400			// Same-page anchor scroll (like onepage nav) – only when Consider Sticky Header setting is enabled
1401			if ( $navMenu.attr( 'data-consider-header' ) === 'yes' ) {
1402				var scrollSpeed = parseInt( $navMenu.attr( 'data-scroll-speed' ), 10 ) || 500;
1403
1404				function getScrollTopForSection( sectionPos ) {
1405					if ( $( '[data-wpr-sticky-section="yes"]' ).first().length ) {
1406						return sectionPos - $( '[data-wpr-sticky-section="yes"]' ).first().height();
1407					}
1408					return sectionPos;
1409				}
1410
1411				$scope.find( '.wpr-nav-menu a, .wpr-mobile-nav-menu a' ).on( 'click', function( e ) {
1412					var href = $( this ).attr( 'href' );
1413					if ( ! href || href === '#' ) { return; }
1414					var hashIndex = href.indexOf( '#' );
1415					if ( hashIndex === -1 ) { return; }
1416					var hash = href.slice( hashIndex );
1417					if ( hash === '#' ) { return; }
1418					var isSamePage = ( href.charAt( 0 ) === '#' ) || ( this.pathname === window.location.pathname && this.hostname === window.location.hostname );
1419					if ( ! isSamePage ) { return; }
1420					var $section = $( hash );
1421					if ( ! $section.length ) { return; }
1422					e.preventDefault();
1423					e.stopImmediatePropagation();
1424					var sectionPos = $section.offset().top;
1425					$( 'html, body' ).animate( {
1426						scrollTop: getScrollTopForSection( sectionPos )
1427					}, scrollSpeed );
1428				} );
1429
1430				$( document ).ready( function() {
1431					var hash = window.location.hash;
1432					if ( ! hash || hash === '#' ) { return; }
1433					var $section = $( hash );
1434					if ( ! $section.length ) { return; }
1435					if ( ! $scope.find( 'a[href*="' + hash + '"]' ).length ) { return; }
1436					var sectionPos = $section.offset().top;
1437					$( 'html, body' ).animate( {
1438						scrollTop: getScrollTopForSection( sectionPos )
1439					}, scrollSpeed );
1440				} );
1441			}
1442
1443		}
1443, // End widgetNavMenu
1444
1445		widgetMegaMenu: function( $scope ) {
1446
1447			var $navMenu = $scope.find( '.wpr-nav-menu-container' ),
1448				$mobileNavMenu = $scope.find( '.wpr-mobile-nav-menu-container' );
1449
1450			// Menu
1451			var subMenuFirst = $navMenu.find( '.wpr-nav-menu > li.menu-item-has-children' ),
1452				subMenuDeep = $navMenu.find( '.wpr-sub-menu li.menu-item-has-children' );
1453
1454			if ( $scope.find('.wpr-mobile-toggle').length ) {
1455				$scope.find('a').on('click', function() { // GOGA - sub mega menu condition needs testing
1456                    if ( this.pathname == window.location.pathname && !($(this).parent('li').children().length > 1)  && !($(this).closest('.wpr-sub-mega-menu').length > 0) ) {
1457						$scope.find('.wpr-mobile-toggle').trigger('click');
1458					}
1459				});
1460			}
1461
1462			// Click
1463			if ( $navMenu.attr('data-trigger') === 'click' ) {
1464
1465				// First Sub
1466				subMenuFirst.children('a').on( 'click', function(e) {
1467					var currentItem = $(this).parent(),
1468						childrenSub = currentItem.children('.wpr-sub-menu, .wpr-sub-mega-menu');
1469
1470					// Reset
1471					subMenuFirst.not(currentItem).removeClass('wpr-sub-open');
1472					if ( $navMenu.hasClass('wpr-nav-menu-horizontal') || ( $navMenu.hasClass('wpr-nav-menu-vertical') ) ) {
1473						subMenuAnimation( subMenuFirst.children('.wpr-sub-menu, .wpr-sub-mega-menu'), false );
1474					}
1475
1476					if ( ! currentItem.hasClass( 'wpr-sub-open' ) ) {
1477						e.preventDefault();
1478						currentItem.addClass('wpr-sub-open');
1479						subMenuAnimation( childrenSub, true );
1480					} else {
1481						currentItem.removeClass('wpr-sub-open');
1482						subMenuAnimation( childrenSub, false );
1483					}
1484				});
1485
1486				// Deep Subs
1487				subMenuDeep.on( 'click', function(e) {
1488					var currentItem = $(this),
1489						childrenSub = currentItem.children('.wpr-sub-menu');
1490
1491					// Reset
1492					if ( $navMenu.hasClass('wpr-nav-menu-horizontal') ) {
1493						subMenuAnimation( subMenuDeep.find('.wpr-sub-menu'), false );
1494					}
1495
1496					if ( ! currentItem.hasClass( 'wpr-sub-open' ) ) {
1497						e.preventDefault();
1498						currentItem.addClass('wpr-sub-open');
1499						subMenuAnimation( childrenSub, true );
1500
1501					} else {
1502						currentItem.removeClass('wpr-sub-open');
1503						subMenuAnimation( childrenSub, false );
1504					}
1505				});
1506
1507				// Reset Subs on Document click
1508				$( document ).mouseup(function (e) {
1509					if ( ! subMenuFirst.is(e.target) && subMenuFirst.has(e.target).length === 0 ) {
1510						subMenuFirst.not().removeClass('wpr-sub-open');
1511						subMenuAnimation( subMenuFirst.children('.wpr-sub-menu, .wpr-sub-mega-menu'), false );
1512					}
1513					if ( ! subMenuDeep.is(e.target) && subMenuDeep.has(e.target).length === 0 ) {
1514						subMenuDeep.removeClass('wpr-sub-open');
1515						subMenuAnimation( subMenuDeep.children('.wpr-sub-menu'), false );
1516					}
1517				});
1518			
1519			// Hover
1520			} else {
1521				// Mouse Over
1522				subMenuFirst.on( 'mouseenter', function() {
1523					if ( $(this).hasClass('wpr-mega-menu-width-stretch') ) {
1524						megaMenuStretchWidth( $(this) );
1525					}
1526					subMenuAnimation( $(this).children('.wpr-sub-menu, .wpr-sub-mega-menu'), true );
1527				});
1528
1529				subMenuDeep.on( 'mouseenter', function() {
1530					subMenuAnimation( $(this).children('.wpr-sub-menu'), true );
1531				});
1532
1533				// Mouse Leave
1534				subMenuFirst.on( 'mouseleave', function() {
1535					subMenuAnimation( $(this).children('.wpr-sub-menu, .wpr-sub-mega-menu'), false );
1536				});
1537
1538				subMenuDeep.on( 'mouseleave', function() {
1539					subMenuAnimation( $(this).children('.wpr-sub-menu'), false );
1540				});	
1541			}
1542
1543			// Mobile Menu
1544			var mobileMenu = $mobileNavMenu.find( '.wpr-mobile-nav-menu' );
1545
1546			// Toggle Button
1547			$mobileNavMenu.find( '.wpr-mobile-toggle' ).on( 'click', function(e) {
1548
1549				if ( window.getComputedStyle($mobileNavMenu[0])['pointer-events'] === 'none' ) {
1550					return;
1551				}
1552
1553				// Change Toggle Text
1554				if ( ! $(this).hasClass('wpr-mobile-toggle-open') ) {
1555					$(this).addClass('wpr-mobile-toggle-open');
1556
1557					if ( $(this).find('.wpr-mobile-toggle-text').length ) {
1558						$(this).children().eq(0).hide();
1559						$(this).children().eq(1).show();
1560					}
1561				} else {
1562					$(this).removeClass('wpr-mobile-toggle-open');
1563					$(this).trigger('focusout');
1564
1565					if ( $(this).find('.wpr-mobile-toggle-text').length ) {
1566						$(this).children().eq(1).hide();
1567						$(this).children().eq(0).show();
1568					}
1569				}
1570
1571				// Show Menu
1572				if ( $scope.hasClass('wpr-mobile-menu-display-offcanvas') ) {
1573					$(this).closest('.elementor-top-section').addClass('wpr-section-full-height');
1574					$('body').css('overflow', 'hidden');
1575					$(this).parent().siblings('.wpr-mobile-mega-menu-wrap').toggleClass('wpr-mobile-mega-menu-open');
1576				} else {
1577					$(this).parent().siblings('.wpr-mobile-mega-menu-wrap').stop().slideToggle();
1578				}
1579
1580				// Hide Off-Canvas Menu
1581				$scope.find('.mobile-mega-menu-close').on('click', function() {
1582					$(this).closest('.wpr-mobile-mega-menu-wrap').removeClass('wpr-mobile-mega-menu-open');
1583					$('body').css('overflow', 'visible');
1584					$(this).closest('.elementor-top-section').removeClass('wpr-section-full-height');
1585				});
1586				$scope.find('.wpr-mobile-mega-menu-overlay').on('click', function() {
1587					$(this).siblings('.wpr-mobile-mega-menu-wrap').removeClass('wpr-mobile-mega-menu-open');
1588					$('body').css('overflow', 'visible');
1589					$(this).closest('.elementor-top-section').removeClass('wpr-section-full-height');
1590				});
1591
1592				// Fix Width
1593				fullWidthMobileDropdown();
1594			});
1595
1596			// Sub Menu Class
1597			mobileMenu.find('.sub-menu').removeClass('wpr-sub-menu').addClass('wpr-mobile-sub-menu');
1598
1599			// Add Submenu Icon
1600			let mobileSubIcon = mobileMenu.find('.wpr-mobile-sub-icon'),
1601				mobileSubIconClass = 'fas ';
1602
1603			if ( $scope.hasClass('wpr-sub-icon-caret-down') ) {
1604				mobileSubIconClass += 'fa-caret-down';
1605			} else if ( $scope.hasClass('wpr-sub-icon-angle-down') ) {
1606				mobileSubIconClass += 'fa-angle-down';
1607			} else if ( $scope.hasClass('wpr-sub-icon-chevron-down') ) {
1608				mobileSubIconClass += 'fa-chevron-down';
1609			} else if ( $scope.hasClass('wpr-sub-icon-plus') ) {
1610				mobileSubIconClass += 'fa-plus';
1611			}
1612
1613			mobileSubIcon.addClass(mobileSubIconClass);
1614
1615			// Sub Menu Dropdown
1616			mobileMenu.find('.menu-item-has-children > a .wpr-mobile-sub-icon, .menu-item-has-children > a[href="#"]').on( 'click', function(e) {
1617				e.preventDefault();
1618				e.stopPropagation();
1619
1620				var parentItem = $(this).closest('li.menu-item');
1621
1622				// Toggle
1623				if ( ! parentItem.hasClass('wpr-mobile-sub-open') ) {
1624					e.preventDefault();
1625					parentItem.addClass('wpr-mobile-sub-open');
1626
1627					if ( ! $scope.hasClass('wpr-mobile-menu-display-offcanvas') ) {
1628						$(window).trigger('resize');
1629						parentItem.children('.wpr-mobile-sub-menu').first().stop().slideDown();
1630					}
1631
1632					// Mega Menu
1633					if ( parentItem.hasClass('wpr-mega-menu-true') ) {
1634						if ( parentItem.hasClass('wpr-mega-menu-ajax') && ! parentItem.find('.wpr-mobile-sub-mega-menu').find('.elementor').length  ) {
1635							let subIcon = parentItem.find('.wpr-mobile-sub-icon');
1636
1637							$.ajax({
1638								type: 'GET',
1639								url: WprConfig.resturl + '/wprmegamenu/',
1640								data: {
1641									item_id: parentItem.data('id')
1642								},
1643								beforeSend:function() {
1644									subIcon.removeClass(mobileSubIconClass).addClass('fas fa-circle-notch fa-spin');
1645								},
1646								success: function( response ) {
1647									subIcon.removeClass('fas fa-circle-notch fa-spin').addClass(mobileSubIconClass);
1648
1649									if ( $scope.hasClass('wpr-mobile-menu-display-offcanvas') ) {
1650										parentItem.find('.wpr-menu-offcanvas-back').after(response);
1651										offCanvasSubMenuAnimation( parentItem );
1652									} else {
1653										parentItem.find('.wpr-mobile-sub-mega-menu').html(response);
1654										parentItem.children('.wpr-mobile-sub-mega-menu').slideDown();
1655									}
1656
1657									parentItem.find('.wpr-mobile-sub-mega-menu').find('.elementor-element').each(function() {
1658										elementorFrontend.elementsHandler.runReadyTrigger($(this));
1659									});
1660								}
1661							});
1662						} else {
1663							if ( $scope.hasClass('wpr-mobile-menu-display-offcanvas') ) {
1664								offCanvasSubMenuAnimation( parentItem );
1665							} else {
1666								parentItem.children('.wpr-mobile-sub-mega-menu').slideDown();
1667							}
1668						}
1669					} else {
1670						if (  $scope.hasClass('wpr-mobile-menu-display-offcanvas') ) {
1671							offCanvasSubMenuAnimation( parentItem );
1672						}	
1673					}
1674				
1675				} else {
1676					// SlideUp
1677					parentItem.removeClass('wpr-mobile-sub-open');
1678
1679					if ( ! $scope.hasClass('wpr-mobile-menu-display-offcanvas') ) {
1680						parentItem.children('.wpr-mobile-sub-menu').slideUp();
1681						parentItem.children('.wpr-mobile-sub-mega-menu').slideUp();
1682					}
1683				}
1684			});
1685
1686			// Off-Canvas Back Button
1687			$scope.find('.wpr-menu-offcanvas-back').on('click', function() {
1688				$(this).closest('.wpr-mobile-mega-menu').removeClass('wpr-mobile-sub-offcanvas-open');
1689				$(this).closest('.menu-item').removeClass('wpr-mobile-sub-open');
1690				$scope.find('.wpr-mobile-mega-menu-wrap').removeAttr('style');
1691                $scope.find('.wpr-mobile-sub-mega-menu').removeAttr('style');
1692			});
1693
1694			// Run Functions
1695			MegaMenuCustomWidth();
1696			fullWidthMobileDropdown();
1697
1698			// Run Functions on Resize
1699			$(window).smartresize(function() {
1700				MegaMenuCustomWidth();
1701				fullWidthMobileDropdown();
1702			});
1703
1704			// Fit to Section (wpr-mega-menu-width-stretch) — recalc for replace-header / fixed positioning
1705			function megaMenuStretchWidth( $megaItem ) {
1706				let megaSubMenu = $megaItem.find('.wpr-sub-mega-menu');
1707
1708				if ( !megaSubMenu.length || !$megaItem.is(':visible') || $scope.closest('.wpr-visibility-hidden').length ) {
1709					return;
1710				}
1711
1712				// Sections (Old)
1713				if ( 0 === $megaItem.closest('.e-con').length ) {
1714					var elContainer = $megaItem.closest('.elementor-section');
1715						elContainer = elContainer.hasClass('elementor-inner-section') ? elContainer : elContainer.children('.elementor-container');
1716
1717					var elWidgetGap = !elContainer.hasClass('elementor-inner-section') ? elContainer.find('.elementor-element-populated').css('padding') : '0';
1718						elWidgetGap = parseInt(elWidgetGap.replace('px', ''), 10);
1719
1720				// Container (New)
1721				} else {
1722					var elContainer = $megaItem.closest('.e-con-inner');
1723
1724					var elWidgetGap = elContainer.find('.elementor-element.e-con').css('padding'),
1725						elWidgetGap = parseInt(elWidgetGap, 10);
1726				}
1727
1728				if ( isNaN( elWidgetGap ) ) {
1729					elWidgetGap = 0;
1730				}
1731
1732				if ( elContainer.length === 0 ) {
1733					return;
1734				}
1735
1736				let menuContainer = $scope.find('.wpr-nav-menu-container'),
1737					menuOffsetEl = menuContainer.length ? menuContainer : $scope,
1738					useViewportRects = $scope.closest('.wpr-hidden-header, .wpr-hidden-header-flex').length,
1739					elContainerWidth, offsetLeft;
1740
1741				if ( useViewportRects ) {
1742					let containerRect = elContainer[0].getBoundingClientRect(),
1743						menuRect = menuOffsetEl[0].getBoundingClientRect();
1744
1745					elContainerWidth = containerRect.width - (elWidgetGap * 2);
1746					offsetLeft = containerRect.left - menuRect.left + elWidgetGap;
1747				} else {
1748					elContainerWidth = elContainer.outerWidth() - (elWidgetGap * 2);
1749					offsetLeft = -($scope.offset().left - elContainer.offset().left) + elWidgetGap;
1750				}
1751
1752				if ( elContainerWidth <= 0 ) {
1753					return;
1754				}
1755
1756				megaSubMenu.css({
1757					'width' : elContainerWidth +'px',
1758					'left' : offsetLeft +'px'
1759				});
1760			}
1761
1762			// Mega Menu Full or Custom Width
1763			function MegaMenuCustomWidth() {
1764				let megaItem = $scope.find('.wpr-mega-menu-true');
1765
1766				megaItem.each(function() {
1767					let megaSubMenu = $(this).find('.wpr-sub-mega-menu')
1768
1769					if ( $(this).hasClass('wpr-mega-menu-width-full') ) {
1770						megaSubMenu.css({
1771							'max-width' : $(window).width() +'px',
1772							'left' : - $scope.find('.wpr-nav-menu-container').offset().left +'px'
1773						});
1774					} else if ( $(this).hasClass('wpr-mega-menu-width-stretch') ) {
1775						megaMenuStretchWidth( $(this) );
1776					} else if ( $(this).hasClass('wpr-mega-menu-width-custom') ) {
1777						megaSubMenu.css({
1778							'width' : $(this).data('custom-width') +'px',
1779						});
1780					} else if ( $(this).hasClass('wpr-mega-menu-width-default') && $(this).hasClass('wpr-mega-menu-pos-relative') ) {
1781						megaSubMenu.css({
1782							'width' : $(this).closest('.elementor-column').outerWidth() +'px',
1783						});
1784					}
1785				});
1786			}
1787
1788			// Full Width Dropdown
1789			function fullWidthMobileDropdown() {
1790				if ( ! $scope.hasClass( 'wpr-mobile-menu-full-width' ) || (! $scope.closest('.elementor-column').length && ! $scope.closest('.e-con').length) ) {
1791					return;
1792				}
1793				
1794				var topSection = $scope.closest('.elementor-top-section').length ? $scope.closest('.elementor-top-section') : $scope.closest('.e-con-inner');
1795
1796				var eColumn   =$scope.closest('.elementor-column').length ? $scope.closest('.elementor-column') : $scope.closest('.elementor-element'),
1797					mWidth 	  = topSection.outerWidth() - 2 * mobileMenu.offset().left,
1798					mPosition = eColumn.offset().left + parseInt(eColumn.css('padding-left'), 10);
1799
1800				if ( topSection.hasClass('e-con-inner') ) {
1801					mPosition = eColumn.offset().left - 2 * parseInt(topSection.parent().css('padding-left'), 10);
1802					mWidth = topSection.outerWidth() - 2 * parseInt(topSection.parent().css('padding-left'), 10);
1803				}
1804
1805				mobileMenu.parent('div').css({
1806					'width' : mWidth +'px',
1807					'left' : - mPosition +'px'
1808				});
1809			}
1810
1811			// Sub Menu Animation
1812			function subMenuAnimation( selector, show ) {
1813				if ( show === true ) {
1814					selector.stop().addClass('wpr-animate-sub');
1815			} else {
1816					selector.stop().removeClass('wpr-animate-sub');
1817				}
1818			}
1819
1820			// Off-Canvas Sub Menu Animation
1821			function offCanvasSubMenuAnimation( selector ) {
1822				let title = selector.children('a').clone().children().remove().end().text();
1823
1824				selector.closest('.wpr-mobile-mega-menu').addClass('wpr-mobile-sub-offcanvas-open');
1825				
1826				if (selector.find('.wpr-menu-offcanvas-back').find('h3').length > 0) {
1827					selector.find('.wpr-menu-offcanvas-back').find('h3').text(title);
1828				} else {
1829					selector.find('.wpr-menu-offcanvas-back').append('<h3></h3>').find('h3').text(title);
1830				}
1831
1832				let parentItem = $scope.find('.wpr-mobile-mega-menu').children('.wpr-mobile-sub-open'),
1833				    subSelector = parentItem.children('ul').length ? parentItem.children('ul') : parentItem.children('.wpr-mobile-sub-mega-menu'),
1834				    subHeight = subSelector.outerHeight();
1835
1836				if ( subHeight > $(window).height() ) {
1837                    $scope.find('.wpr-mobile-sub-mega-menu').not(selector.find('.wpr-mobile-sub-mega-menu')).hide();
1838					$scope.find('.wpr-mobile-mega-menu-wrap').css('overflow-y', 'scroll');
1839				}
1840			}
1841
1842		}, // End widgetMegaMenu
1843
1844		widgetOnepageNav: function( $scope ) {
1845			// GOGA - remove extra code before update
1846			$(document).ready(function(){
1847				// Get all the links with the class "nav-link"
1848				var $navLinks = $scope.find( '.wpr-onepage-nav-item' ),
1849					scrollSpeed = parseInt( $scope.find('.wpr-onepage-nav').attr( 'data-speed' ), 10 ),
1850					considerHeader = $scope.find('.wpr-onepage-nav').attr( 'data-consider-header' ),
1851					// sections = $( '.elementor-section' );
1852					getSections = [];
1853					$navLinks.each(function() {
1854						getSections.push($($(this).find('a').attr('href')));
1855					});
1856
1857					var sections = $(getSections);
1858
1859				var currentUrl = window.location.href;
1860				var sectionId = currentUrl.split("#")[1];
1861				
1862				// Check if the URL contains a section id
1863				if(sectionId) {
1864					// Get the section element
1865					var $section = $("#" + sectionId);
1866				
1867					// Get the offset position of the section
1868					var sectionPos = $section.offset().top;
1869				
1870					// Smoothly scroll to the section
1871					$('html, body').animate({
1872					scrollTop: 'yes' === considerHeader && $('[data-wpr-sticky-section="yes"]').first().length ? sectionPos - $('[data-wpr-sticky-section="yes"]').first().height() : sectionPos
1873					}, scrollSpeed);
1874				}
1875
1876				$navLinks.each(function() {
1877					if(currentUrl.indexOf($(this).find('a').attr('href')) !== -1){
1878						$(this).addClass('wpr-onepage-active-item');
1879					}
1880				});
1881			
1882				// Iterate over each link
1883				$navLinks.each(function() {
1884					// Add a click event to each link
1885					$(this).click(function(event) {
1886						event.preventDefault();
1887						event.stopPropagation();
1888						// Remove the active class from all links
1889						$navLinks.removeClass('wpr-onepage-active-item');
1890						// Add the active class to the clicked link
1891						$(this).addClass('wpr-onepage-active-item');
1892						// Get the id of the section the link points to
1893						var sectionId = $(this).find('a').attr('href');
1894						// Get the section element
1895						var $section = $(sectionId);
1896						// Get the offset position of the section
1897						var sectionPos = $section.offset().top;
1898						// Smoothly scroll to the section
1899						$('html, body').animate({
1900							scrollTop: 'yes' === considerHeader  && $('[data-wpr-sticky-section="yes"]').first().length ? sectionPos - $('[data-wpr-sticky-section="yes"]').first().height() : sectionPos
1901						}, scrollSpeed);
1902					});
1903				});
1904			
1905				$(window).on("scroll", function(event) {
1906					event.preventDefault();
1907					event.stopPropagation();
1908					// Get the current scroll position
1909					var scrollPos = $(this).scrollTop();
1910
1911					if ( !$.isEmptyObject(sections) ) {
1912						// Iterate over each section
1913						sections.each(function() {
1914							if ( $(this).length > 0 ) {
1915								// Get the offset position of the section
1916								var sectionPos = $(this).offset().top;
1917								// Get the height of the section
1918								var sectionHeight = sectionPos + $(this).outerHeight();
1919							
1920								// Check if the section is in view
1921								if (scrollPos >= sectionPos - 50 && scrollPos < sectionPos + sectionHeight - 50) {
1922								// if ( scrollPos >= sectionPos && scrollPos < sectionPos + sectionHeight ) {
1923									// Get the id of the section
1924									var sectionId = $(this).attr("id");
1925									// Remove the active class from all links
1926									$navLinks.removeClass("wpr-onepage-active-item");
1927									// Add the active class to the corresponding link
1928									$navLinks.filter(function(){
1929										return $(this).find('a[href*=' + sectionId + ']').length;
1930									}).addClass("wpr-onepage-active-item");
1931								}
1932							}
1933						});
1934					}
1935				});
1936			});
1937
1938		}, // End OnepageNav
1939
1940		widgetGrid: function( $scope ) {
1941			var iGrid = $scope.find( '.wpr-grid' ),
1942				scopeId = $scope.attr('data-id'),
1943				loadedItems,
1944				experimentActionCount = $scope.hasClass('elementor-widget-wpr-woo-grid') ? 'wpr_get_filtered_count_products' : 
1945									 $scope.hasClass('elementor-widget-wpr-media-grid') ? 'wpr_get_media_filtered_count' : 'wpr_get_filtered_count_posts',
1946				experimentActionContent = $scope.hasClass('elementor-widget-wpr-woo-grid') ? 'wpr_woo_grid_filters_ajax' :
1947									   $scope.hasClass('elementor-widget-wpr-media-grid') ? 'wpr_filter_grid_media' : 'wpr_grid_filters_ajax';
1948
1949			if ( ! iGrid.length ) {
1950				return;
1951			}
1952			
1953			if ( $scope.find(".wpr-grid-orderby form").length ) {
1954				var select = $scope.find(".wpr-grid-orderby form");
1955				$scope.find(".orderby").on("change", function () {
1956					select.trigger("submit");
1957				});
1958			}
1959
1960			// Settings
1961			var settings = iGrid.attr( 'data-settings' );
1962
1963			// Grid
1964			if ( typeof settings !== typeof undefined && settings !== false ) {
1965				settings = JSON.parse( iGrid.attr( 'data-settings' ) );
1966
1967				$(window).on('load', function() {
1968					setTimeout(function() {
1969						if ($scope.find('.woocommerce-result-count').length) {
1970							var resultCountText = $scope.find('.woocommerce-result-count').text();
1971							
1972							var itemsPerPage = settings.query_posts_per_page ? 
1973								+settings.query_posts_per_page : 
1974								+WprConfig.woo_shop_ppp;
1975
1976							if (WprConfig.is_product_category) {
1977								itemsPerPage = +WprConfig.woo_shop_cat_ppp;
1978							} else if (WprConfig.is_product_tag) {
1979								itemsPerPage = +WprConfig.woo_shop_tag_ppp;
1980							}
1981							
1982							if (isNaN(itemsPerPage) || itemsPerPage <= 0) {
1983								return;
1984							}
1985						
1986							var currentPage = 1;
1987							var currentPageElement = $scope.find('.wpr-grid-current-page');
1988							
1989							if (currentPageElement.length) {
1990								currentPage = parseInt(currentPageElement.text().trim()) || 1;
1991							}
1992						
1993							var totalItemsMatch = resultCountText.match(/(\d+)(?!.*\d+)/);
1994							var totalItems = totalItemsMatch ? parseInt(totalItemsMatch[1].trim()) : itemsPerPage;
1995						
1996							if (isNaN(totalItems) || totalItems <= 0) {
1997								return;
1998							}
1999						
2000							var startItem = (currentPage - 1) * itemsPerPage + 1;
2001							var endItem = Math.min(startItem + itemsPerPage - 1, totalItems);
2002						
2003							resultCountText = resultCountText.replace(/\d+\u2013\d+/, startItem + '\u2013' + endItem);
2004							$scope.find('.woocommerce-result-count').text(resultCountText);
2005							setTimeout(function() {
2006								$scope.find('.woocommerce-result-count').text(resultCountText);
2007							}, 800);
2008						}
2009					}, 200);
2010				});
2011
2012				// Init Functions
2013				WprElements.isotopeLayout( settings, '', '', $scope );
2014				setTimeout(function() {
2015					WprElements.isotopeLayout( settings, '', '', $scope );
2016				}, 100 );
2017
2018				if ( WprElements.editorCheck() ) {
2019					setTimeout(function() {
2020						WprElements.isotopeLayout( settings, '', '', $scope );
2021					}, 500 );
2022					setTimeout(function() {
2023						WprElements.isotopeLayout( settings, '', '', $scope );
2024					}, 1000 );
2025				}
2026
2027				$( window ).on( 'load', function() {
2028					setTimeout(function() {
2029						WprElements.isotopeLayout( settings, '', '', $scope );
2030					}, 100 );
2031				});
2032
2033				$(document).ready(function() {
2034					setTimeout(function() {
2035						WprElements.isotopeLayout( settings, '', '', $scope );
2036					}, 100 );
2037				});
2038
2039				$(window).smartresize(function(){
2040					setTimeout(function() {
2041						WprElements.isotopeLayout( settings, '', '', $scope );
2042					}, 200 );
2043				});
2044				
2045				if ( settings.grid_settings ) {
2046					var pagesLoadedExperiment = 0;
2047					if ( $('body').find('.wpr-advanced-filters-wrap').length == 0 ) {
2048						loadMoreExperiment();
2049					}
2050					filtersExperiment();
2051				}
2052
2053				function applyGridFilterTransitions( filteredItems, gridSettings ) {
2054					var reduceMotion = WprElements.prefersReducedMotion(),
2055						deepLinkStager = 0,
2056						filterStager = 0,
2057						initStager = 0,
2058						duration = reduceMotion ? 0 : gridSettings.animation_duration,
2059						filterDuration = reduceMotion ? 0 : gridSettings.filters_animation_duration;
2060
2061					if ( iGrid.hasClass( 'grid-images-loaded' ) ) {
2062						initStager = 0;
2063					} else {
2064						iGrid.css( 'opacity', '1' );
2065
2066						// Default Animation
2067						if ( 'default' === gridSettings.animation && 'default' === gridSettings.filters_animation ) {
2068							return;
2069						}
2070					}
2071
2072					for ( var key in filteredItems ) {
2073						if ( WprElements.getInitialItems(scopeId) == 0 || key > WprElements.getInitialItems(scopeId) - 1 ) {
2074							if ( ! reduceMotion ) {
2075								initStager += gridSettings.animation_delay;
2076							}
2077							$scope.find( filteredItems[key]['element'] ).find( '.wpr-grid-item-inner' ).css({
2078								'opacity' : '1',
2079								'top' : '0',
2080								'transform' : 'scale(1)',
2081								'transition' : reduceMotion ? 'none' : 'all '+ duration +'s ease-in '+ initStager +'s',
2082							});
2083						}
2084
2085						if ( ! reduceMotion ) {
2086							filterStager += gridSettings.filters_animation_delay;
2087						}
2088						if ( iGrid.hasClass( 'grid-images-loaded' ) ) {
2089							$scope.find( filteredItems[key]['element'] ).find( '.wpr-grid-item-inner' ).css({
2090								'transition' : reduceMotion ? 'none' : 'all '+ filterDuration +'s ease-in '+ filterStager +'s',
2091							});
2092						}
2093
2094						// DeepLinking
2095						var deepLink = window.location.hash;
2096
2097						if ( ! reduceMotion && deepLink.indexOf( '#filter:' ) >= 0 && deepLink.indexOf( '#filter:*' ) < 0 ) {
2098							deepLink = deepLink.replace( '#filter:', '' );
2099
2100							$scope.find( filteredItems[key]['element'] ).filter(function() {
2101								if ( $(this).hasClass( deepLink ) ) {
2102									deepLinkStager += gridSettings.filters_animation_delay;
2103									return true;
2104								}
2105							}).find( '.wpr-grid-item-inner' ).css({
2106								'transition-delay' : deepLinkStager +'s'
2107							});
2108						}
2109					}
2110
2111					WprElements.changeInitialItems(filteredItems.length, scopeId);
2112				}
2113
2114				WprElements.changeInitialItems(0, scopeId);
2115
2116				// Filtering Transitions (register before isotopeFilters so deep-link arrangeComplete is not missed)
2117				iGrid.on( 'arrangeComplete', function( event, filteredItems ) {
2118					applyGridFilterTransitions( filteredItems, settings );
2119				});
2120
2121				isotopeFilters( settings );
2122
2123				// iGrid.imagesLoaded().progress( function( instance, image ) {
2124				// });
2125
2126				// Grid Images Loaded
2127				iGrid.imagesLoaded(function() {
2128					if ( '1' !== iGrid.css( 'opacity' ) ) {
2129						iGrid.css( 'opacity', '1' );
2130					}
2131					
2132					setTimeout(function() {
2133						iGrid.addClass( 'grid-images-loaded' );
2134					}, 500 );
2135
2136					// Equal Heights
2137					setEqualHeight(settings);
2138				});
2139
2140				// Infinite Scroll / Load More
2141				if ( 'load-more' === settings.pagination_type || 'infinite-scroll' === settings.pagination_type ) {
2142					if ( $scope.find( '.wpr-grid-pagination' ).length && ! WprElements.editorCheck() ) {
2143						var pagination = $scope.find( '.wpr-grid-pagination' ),
2144							scopeClass = '.elementor-element-'+ $scope.attr( 'data-id' );
2145
2146						var navClass = false,
2147							threshold = false;
2148
2149						if ( 'infinite-scroll' === settings.pagination_type ) {
2150							threshold = 300;
2151							navClass = scopeClass +' .wpr-load-more-btn';
2152						}
2153
2154						// Advanced Filters + load-more/infinite-scroll: AF handles pagination via ajaxFilters (avoid double load)
2155						var skipPathInfiniteScroll = ( ( 'infinite-scroll' === settings.pagination_type || 'load-more' === settings.pagination_type ) && iGrid.attr( 'data-advanced-filters' ) === 'yes' );
2156						if ( ! skipPathInfiniteScroll ) {
2157						iGrid.infiniteScroll({
2158							path: scopeClass +' .wpr-grid-pagination a',
2159							hideNav: navClass,
2160							append: false,
2161							history: false,
2162							scrollThreshold: threshold,
2163							status: scopeClass +' .page-load-status',
2164							onInit: function() {
2165								this.on( 'load', function() {
2166									iGrid.removeClass( 'grid-images-loaded' );
2167								});
2168							}
2169						});
2170	
2171						// Request
2172						iGrid.on( 'request.infiniteScroll', function( event, path ) {
2173							pagination.find( '.wpr-load-more-btn' ).hide();
2174							pagination.find( '.wpr-pagination-loading' ).css( 'display', 'inline-block' );
2175						});
2176
2177						// Load
2178						var pagesLoaded = 0;
2179
2180						iGrid.on( 'load.infiniteScroll', function( event, response ) {
2181							pagesLoaded++;
2182
2183							// get posts from response
2184							var items = $( response ).find( scopeClass ).find( '.wpr-grid-item' );
2185
2186							if ( $scope.find('.woocommerce-result-count').length ) {
2187								var resultCount = $scope.find('.woocommerce-result-count').text();
2188								var updatedResultCount = resultCount.replace( /\d\u2013\d+/, '1\u2013' + ( $scope.find('.wpr-grid-item').length + items.length ) );
2189								$scope.find('.woocommerce-result-count').text(updatedResultCount);
2190							}
2191							
2192							iGrid.infiniteScroll( 'appendItems', items );
2193							iGrid.isotopewpr( 'appended', items );
2194
2195							items.imagesLoaded().progress( function( instance, image ) {
2196								WprElements.isotopeLayout( settings, '', '', $scope );
2197
2198								// Fix Layout
2199								setTimeout(function() {
2200									WprElements.isotopeLayout( settings, '', '', $scope );
2201									isotopeFilters( settings );
2202								}, 10 );
2203					
2204								setTimeout(function() {
2205									iGrid.addClass( 'grid-images-loaded' );
2206								}, 500 );
2207							});
2208
2209							// Loading
2210							pagination.find( '.wpr-pagination-loading' ).hide();
2211
2212							if ( settings.pagination_max_pages - 1 !== pagesLoaded ) {
2213								if ( 'load-more' === settings.pagination_type ) {
2214									pagination.find( '.wpr-load-more-btn' ).fadeIn();
2215
2216									if ( $scope.find('.wpr-grid-filters').length ) {
2217										if ( '*' !== $scope.find('.wpr-active-filter').attr('data-filter') ) {
2218											if ( 0 < $scope.find('.wpr-active-filter').length ) {
2219												let dataFilterClass = $scope.find('.wpr-active-filter').attr('data-filter').substring(1);
2220												items.each(function() {
2221													if ( !$(this).hasClass(dataFilterClass) ) {
2222														loadedItems = false;
2223													} else {
2224														loadedItems = true;
2225														return false;
2226													}
2227												});
2228					
2229												if ( !loadedItems ) {
2230													$scope.find( '.wpr-grid' ).infiniteScroll( 'loadNextPage' );
2231												}
2232											}
2233										}
2234									}
2235								}
2236							} else {
2237								pagination.find( '.wpr-pagination-finish' ).fadeIn( 1000 );
2238								pagination.delay( 2000 ).fadeOut( 1000 );
2239								setTimeout(function() {
2240									pagination.find( '.wpr-pagination-loading' ).hide();
2241								}, 500 );
2242							}
2243							// Init Likes
2244							// No need for this anymore
2245							// setTimeout(function() {
2246							// 	postLikes( settings );
2247							// }, 300 );
2248
2249							// Init Lightbox
2250							WprElements.lightboxPopup( settings, $scope, iGrid );
2251
2252							// Fix Lightbox
2253							iGrid.data( 'lightGallery' ).destroy( true );
2254							iGrid.lightGallery( settings.lightbox );
2255
2256							// Init Media Hover Link
2257							WprElements.mediaHoverLink($scope, iGrid);
2258
2259							// Init Post Sharing
2260							postSharing();
2261
2262							lazyLoadObserver();
2263
2264							// Maybe there is some other way
2265							setTimeout(function() {
2266								setEqualHeight(settings);
2267								window.dispatchEvent(new Event('resize'));
2268							}, 500);
2269						});
2270
2271						pagination.find( '.wpr-load-more-btn' ).on( 'click', function( e ) {
2272							e.preventDefault();
2273							iGrid.infiniteScroll( 'loadNextPage' );
2274							return false;
2275						});
2276						}
2277					} else {
2278						$scope.find( '.wpr-load-more-btn' ).on( 'click', function( e ) {
2279							e.preventDefault();
2280							alert( 'Load More is Disabled in the Editor! Please Preview this Page to see it in action' );
2281						});
2282					}
2283				}
2284
2285			// Slider
2286			} else {
2287				iGrid.animate({ 'opacity': '1' }, 1000);
2288
2289				settings = JSON.parse( iGrid.attr( 'data-slick' ) );
2290
2291				var sliderClass = $scope.attr('class'),
2292					sliderColumnsDesktop = sliderClass.match(/wpr-grid-slider-columns-\d/) ? +sliderClass.match(/wpr-grid-slider-columns-\d/).join().slice(-1) : 2,
2293					sliderColumnsWideScreen = sliderClass.match(/columns--widescreen\d/) ? +sliderClass.match(/columns--widescreen\d/).join().slice(-1) : sliderColumnsDesktop,
2294					sliderColumnsLaptop = sliderClass.match(/columns--laptop\d/) ? +sliderClass.match(/columns--laptop\d/).join().slice(-1) : sliderColumnsDesktop,
2295					sliderColumnsTablet = sliderClass.match(/columns--tablet\d/) ? +sliderClass.match(/columns--tablet\d/).join().slice(-1) : 2,
2296					sliderColumnsTabletExtra = sliderClass.match(/columns--tablet_extra\d/) ? +sliderClass.match(/columns--tablet_extra\d/).join().slice(-1) : sliderColumnsTablet,
2297					sliderColumnsMobileExtra = sliderClass.match(/columns--mobile_extra\d/) ? +sliderClass.match(/columns--mobile_extra\d/).join().slice(-1) : sliderColumnsTablet,
2298					sliderColumnsMobile = sliderClass.match(/columns--mobile\d/) ? +sliderClass.match(/columns--mobile\d/).join().slice(-1) : 1,
2299					sliderRows = settings.sliderRows,
2300					sliderSlidesToScroll = settings.sliderSlidesToScroll;
2301
2302				// GOGA - add rows control and vertical gutter maybe
2303				iGrid.slick({
2304					appendDots : $scope.find( '.wpr-grid-slider-dots' ),
2305					rows: sliderRows,
2306					customPaging : function ( slider, i ) {
2307						var slideNumber = (i + 1),
2308							totalSlides = slider.slideCount;
2309
2310						return '<span class="wpr-grid-slider-dot"></span>';
2311					},
2312					slidesToShow: sliderColumnsDesktop,
2313					responsive: [
2314						{
2315							breakpoint: 10000,
2316							settings: {
2317								slidesToShow: sliderColumnsWideScreen,
2318								slidesToScroll: sliderSlidesToScroll > sliderColumnsWideScreen ? 1 : sliderSlidesToScroll
2319							}
2320						},
2321						{
2322							breakpoint: 2399,
2323							settings: {
2324								slidesToShow: sliderColumnsDesktop,
2325								slidesToScroll: sliderSlidesToScroll > sliderColumnsDesktop ? 1 : sliderSlidesToScroll
2326							}
2327						},
2328						{
2329							breakpoint: 1221,
2330							settings: {
2331								slidesToShow: sliderColumnsLaptop,
2332								slidesToScroll: sliderSlidesToScroll > sliderColumnsLaptop ? 1 : sliderSlidesToScroll
2333							}
2334						},
2335						{
2336							breakpoint: 1200,
2337							settings: {
2338								slidesToShow: sliderColumnsTabletExtra,
2339								slidesToScroll: sliderSlidesToScroll > sliderColumnsTabletExtra ? 1 : sliderSlidesToScroll
2340							}
2341						},
2342						{
2343							breakpoint: 1024,
2344							settings: {
2345								slidesToShow: sliderColumnsTablet,
2346								slidesToScroll: sliderSlidesToScroll > sliderColumnsTablet ? 1 : sliderSlidesToScroll
2347							}
2348						},
2349						{
2350							breakpoint: 880,
2351							settings: {
2352								slidesToShow: sliderColumnsMobileExtra,
2353							 	slidesToScroll: sliderSlidesToScroll > sliderColumnsMobileExtra ? 1 : sliderSlidesToScroll
2354							}
2355						},
2356						{
2357							breakpoint: 768,
2358							settings: {
2359								slidesToShow: sliderColumnsMobile,
2360								slidesToScroll: sliderSlidesToScroll > sliderColumnsMobile ? 1 : sliderSlidesToScroll
2361							}
2362						}
2363					],
2364				});
2365
2366				var gridNavPrevArrow = $scope.find('.wpr-grid-slider-prev-arrow');
2367				var gridNavNextArrow = $scope.find('.wpr-grid-slider-next-arrow');
2368
2369				if ( gridNavPrevArrow.length > 0 && gridNavNextArrow.length > 0 ) {
2370					var positionSum = gridNavPrevArrow.position().left * -2;
2371					if ( positionSum > 0 ) {
2372						$(window).on('load', function() {
2373							if ( $(window).width() <= ($scope.outerWidth() + gridNavPrevArrow.outerWidth() + gridNavNextArrow.outerWidth() + positionSum) ) {
2374								gridNavPrevArrow.addClass('wpr-adjust-slider-prev-arrow');
2375								gridNavNextArrow.addClass('wpr-adjust-slider-next-arrow');
2376							}
2377						});
2378		
2379						$(window).smartresize(function() {
2380							if ( $(window).width() <= ($scope.outerWidth() + gridNavPrevArrow.outerWidth() + gridNavNextArrow.outerWidth() + positionSum) ) {
2381								gridNavPrevArrow.addClass('wpr-adjust-slider-prev-arrow');
2382								gridNavNextArrow.addClass('wpr-adjust-slider-next-arrow');
2383							} else {
2384								gridNavPrevArrow.removeClass('wpr-adjust-slider-prev-arrow');
2385								gridNavNextArrow.removeClass('wpr-adjust-slider-next-arrow');
2386							}
2387						});
2388					}
2389				}
2390
2391				// Adjust Horizontal Pagination
2392				if ( $scope.find( '.slick-dots' ).length && $scope.hasClass( 'wpr-grid-slider-dots-horizontal') ) {
2393					// Calculate Width
2394					var dotsWrapWidth = $scope.find( '.slick-dots li' ).outerWidth() * $scope.find( '.slick-dots li' ).length - parseInt( $scope.find( '.slick-dots li span' ).css( 'margin-right' ), 10 );
2395
2396					// on Load
2397					if ( $scope.find( '.slick-dots' ).length ) {
2398						$scope.find( '.slick-dots' ).css( 'width', dotsWrapWidth );
2399					}
2400
2401
2402					$(window).smartresize(function() {
2403						setTimeout(function() {
2404							// Calculate Width
2405							var dotsWrapWidth = $scope.find( '.slick-dots li' ).outerWidth() * $scope.find( '.slick-dots li' ).length - parseInt( $scope.find( '.slick-dots li span' ).css( 'margin-right' ), 10 );
2406
2407							// Set Width
2408							$scope.find( '.slick-dots' ).css( 'width', dotsWrapWidth );
2409						}, 300 );
2410					});
2411				}
2412			}
2413			
2414			checkWishlistAndCompare();
2415			addRemoveCompare();
2416			addRemoveWishlist();
2417	
2418			var mutationObserver = new MutationObserver(function(mutations) {
2419				// checkWishlistAndCompare();
2420				addRemoveCompare();
2421				addRemoveWishlist();
2422			});
2423
2424			mutationObserver.observe($scope[0], {
2425				childList: true,
2426				subtree: true,
2427			});
2428
2429			// Add To Cart AJAX
2430			if ( iGrid.find( '.wpr-grid-item-add-to-cart' ).length ) {
2431				var addCartIcon = iGrid.find( '.wpr-grid-item-add-to-cart' ).find( 'i' ),
2432					addCartIconClass = addCartIcon.attr( 'class' );
2433
2434				if ( addCartIcon.length ) {
2435					addCartIconClass = addCartIconClass.substring( addCartIconClass.indexOf('fa-'), addCartIconClass.length );
2436				}
2437
2438				$( 'body' ).on( 'adding_to_cart', function( ev, button, data ) {
2439					button.fadeTo( 'slow', 0 );
2440				});
2441
2442				$( 'body' ).on( 'added_to_cart', function(ev, fragments, hash, button) {
2443					var product_id = button.data('product_id');
2444
2445					button.next().fadeTo( 700, 1 );
2446
2447					button.css('display', 'none');
2448
2449					if ( 'sidebar' === button.data('atc-popup') ) {
2450						if ( $('.wpr-mini-cart-toggle-wrap a').length ) {
2451							$('.wpr-mini-cart-toggle-wrap a').each(function() {
2452								if ( 'none' === $(this).closest('.wpr-mini-cart-inner').find('.wpr-mini-cart').css('display') ) {
2453									$(this).trigger('click');
2454								}
2455							});
2456						}
2457					} else if ( 'popup' === button.data('atc-popup') ) {
2458						var popupItem = button.closest('.wpr-grid-item'),
2459							popupText = popupItem.find('.wpr-grid-item-title').text(),
2460							popupLink = button.next().attr('href'),
2461							popupImageSrc = popupItem.find('.wpr-grid-image-wrap').length ? popupItem.find('.wpr-grid-image-wrap').data('src') : '',
2462							popupAnimation = button.data('atc-animation'),
2463							fadeOutIn = button.data('atc-fade-out-in'),
2464							animTime = button.data('atc-animation-time'),
2465							popupImage,
2466							animationClass = 'wpr-added-to-cart-default',
2467							removeAnimationClass;
2468
2469						if ( 'slide-left' === popupAnimation ) {
2470							animationClass = 'wpr-added-to-cart-slide-in-left';
2471							removeAnimationClass = 'wpr-added-to-cart-slide-out-left';
2472						} else if ( 'scale-up' === popupAnimation ) {
2473							animationClass = 'wpr-added-to-cart-scale-up';
2474							removeAnimationClass = 'wpr-added-to-cart-scale-down';
2475						} else if ( 'skew' === popupAnimation ) {
2476							animationClass = 'wpr-added-to-cart-skew';
2477							removeAnimationClass = 'wpr-added-to-cart-skew-off';
2478						} else if ( 'fade' === popupAnimation ) {
2479							animationClass = 'wpr-added-to-cart-fade';
2480							removeAnimationClass = 'wpr-added-to-cart-fade-out';
2481						} else {
2482							removeAnimationClass = 'wpr-added-to-cart-popup-hide';
2483						}
2484
2485						if ( '' !== popupImageSrc ) {
2486							popupImage = '<div class="wpr-added-tc-popup-img"><img src='+popupImageSrc+' alt="" /></div>';
2487						} else {
2488							popupImage = '';
2489						}
2490						
2491						if ( !($scope.find('.wpr-grid').find('#wpr-added-to-cart-'+product_id).length > 0) ) {
2492							$scope.find('.wpr-grid').append('<div id="wpr-added-to-cart-'+product_id+'" class="wpr-added-to-cart-popup ' + animationClass + '">'+ popupImage +'<div class="wpr-added-tc-title"><p>'+ popupText + ' ' + WprConfig.addedToCartText +'</p><p><a href='+popupLink+'>'+ WprConfig.viewCart +'</a></p></div></div>');
2493
2494							setTimeout(() => {
2495								$(this).find('#wpr-added-to-cart-'+product_id).addClass(removeAnimationClass);
2496								setTimeout(() => {
2497									$(this).find('#wpr-added-to-cart-'+product_id).remove();
2498								}, animTime * 1000);
2499							}, fadeOutIn * 1000);
2500						}
2501					}
2502
2503					if ( addCartIcon.length ) {
2504						button.find( 'i' ).removeClass( addCartIconClass ).addClass( 'fa-check' );
2505						setTimeout(function() {
2506							button.find( 'i' ).removeClass( 'fa-check' ).addClass( addCartIconClass );
2507						}, 3500 );
2508					}
2509				});
2510			}
2511
2512			// Init Post Sharing
2513			postSharing();
2514
2515			// Post Sharing
2516			function postSharing() {
2517				if ( $scope.find( '.wpr-sharing-trigger' ).length ) {
2518					var sharingTrigger = $scope.find( '.wpr-sharing-trigger' ),
2519						sharingInner = $scope.find( '.wpr-post-sharing-inner' ),
2520						sharingWidth = 5;
2521
2522					// Calculate Width
2523					sharingInner.first().find( 'a' ).each(function() {
2524						sharingWidth += $(this).outerWidth() + parseInt( $(this).css('margin-right'), 10 );
2525					});
2526
2527					// Calculate Margin
2528					var sharingMargin = parseInt( sharingInner.find( 'a' ).css('margin-right'), 10 );
2529
2530					// Set Positions
2531					if ( 'left' === sharingTrigger.attr( 'data-direction') ) {
2532						// Set Width
2533						sharingInner.css( 'width', sharingWidth +'px' );
2534
2535						// Set Position
2536						sharingInner.css( 'left', - ( sharingMargin + sharingWidth ) +'px' );
2537					} else if ( 'right' === sharingTrigger.attr( 'data-direction') ) {
2538						// Set Width
2539						sharingInner.css( 'width', sharingWidth +'px' );
2540
2541						// Set Position
2542						sharingInner.css( 'right', - ( sharingMargin + sharingWidth ) +'px' );
2543					} else if ( 'top' === sharingTrigger.attr( 'data-direction') ) {
2544						// Set Margins
2545						sharingInner.find( 'a' ).css({
2546							'margin-right' : '0',
2547							'margin-top' : sharingMargin +'px'
2548						});
2549
2550						// Set Position
2551						sharingInner.css({
2552							'top' : -sharingMargin +'px',
2553							'left' : '50%',
2554							'-webkit-transform' : 'translate(-50%, -100%)',
2555							'transform' : 'translate(-50%, -100%)'
2556						});
2557					} else if ( 'right' === sharingTrigger.attr( 'data-direction') ) {
2558						// Set Width
2559						sharingInner.css( 'width', sharingWidth +'px' );
2560
2561						// Set Position
2562						sharingInner.css({
2563							'left' : sharingMargin +'px',
2564							// 'bottom' : - ( sharingInner.outerHeight() + sharingTrigger.outerHeight() ) +'px',
2565						});
2566					} else if ( 'bottom' === sharingTrigger.attr( 'data-direction') ) {
2567						// Set Margins
2568						sharingInner.find( 'a' ).css({
2569							'margin-right' : '0',
2570							'margin-bottom' : sharingMargin +'px'
2571						});
2572
2573						// Set Position
2574						sharingInner.css({
2575							'bottom' : -sharingMargin +'px',
2576							'left' : '50%',
2577							'-webkit-transform' : 'translate(-50%, 100%)',
2578							'transform' : 'translate(-50%, 100%)'
2579						});
2580					}
2581
2582					if ( 'click' === sharingTrigger.attr( 'data-action' ) ) {
2583						sharingTrigger.on( 'click', function() {
2584							var sharingInner = $(this).next();
2585
2586							if ( 'hidden' === sharingInner.css( 'visibility' ) ) {
2587								sharingInner.css( 'visibility', 'visible' );
2588								sharingInner.find( 'a' ).css({
2589									'opacity' : '1',
2590									'top' : '0'
2591								});
2592
2593								setTimeout( function() {
2594									sharingInner.find( 'a' ).addClass( 'wpr-no-transition-delay' );
2595								}, sharingInner.find( 'a' ).length * 100 );
2596							} else {
2597								sharingInner.find( 'a' ).removeClass( 'wpr-no-transition-delay' );
2598
2599								sharingInner.find( 'a' ).css({
2600									'opacity' : '0',
2601									'top' : '-5px'
2602								});
2603								setTimeout( function() {
2604									sharingInner.css( 'visibility', 'hidden' );
2605								}, sharingInner.find( 'a' ).length * 100 );
2606							}
2607						});
2608					} else {
2609						sharingTrigger.on( 'mouseenter', function() {
2610							var sharingInner = $(this).next();
2611
2612							sharingInner.css( 'visibility', 'visible' );
2613							sharingInner.find( 'a' ).css({
2614								'opacity' : '1',
2615								'top' : '0',
2616							});
2617							
2618							setTimeout( function() {
2619								sharingInner.find( 'a' ).addClass( 'wpr-no-transition-delay' );
2620							}, sharingInner.find( 'a' ).length * 100 );
2621						});
2622						$scope.find( '.wpr-grid-item-sharing' ).on( 'mouseleave', function() {
2623							var sharingInner = $(this).find( '.wpr-post-sharing-inner' );
2624
2625							sharingInner.find( 'a' ).removeClass( 'wpr-no-transition-delay' );
2626
2627							sharingInner.find( 'a' ).css({
2628								'opacity' : '0',
2629								'top' : '-5px'
2630							});
2631							setTimeout( function() {
2632								sharingInner.css( 'visibility', 'hidden' );
2633							}, sharingInner.find( 'a' ).length * 100 );
2634						});
2635					}
2636				}				
2637			}
2638
2639			// Init Media Hover Link
2640			WprElements.mediaHoverLink($scope, iGrid);
2641				
2642			function isValidHttpUrl(string) {
2643				let url;
2644				try {
2645				  url = new URL(string);
2646				} catch (_) {
2647				  return false;
2648				}
2649				return url.protocol === "http:" || url.protocol === "https:";
2650			}
2651
2652			// Init Lightbox
2653			if ( !$scope.hasClass('elementor-widget-wpr-woo-category-grid-pro') && !$scope.hasClass('elementor-widget-wpr-category-grid-pro') ) {
2654				WprElements.lightboxPopup( settings, $scope, iGrid );
2655			}
2656
2657			// Init Likes
2658			postLikes( settings );
2659
2660			// Likes
2661			function postLikes( settings ) {
2662				if ( ! $scope.find( '.wpr-post-like-button' ).length ) {
2663					return;
2664				}
2665				
2666				$scope.on('click', '.wpr-post-like-button', function(e) {
2667					e.preventDefault();
2668
2669					var current = $(this);
2670
2671					if ( '' !== current.attr( 'data-post-id' ) ) {
2672
2673					$.ajax({
2674						type: 'POST',
2675						url: $('<div>').text(current.attr('data-ajax')).html(),
2676						data: {
2677							action : 'wpr_likes_init',
2678							post_id : current.attr( 'data-post-id' ),
2679							nonce : current.attr( 'data-nonce' )
2680						},
2681						beforeSend:function() {
2682							current.fadeTo( 500, 0.5 );
2683						},	
2684						success: function( response ) {
2685							// Get Icon
2686							var iconClass = $('<div>').text( current.attr('data-icon') ).html();
2687
2688							// Get Count
2689							var countHTML = response.count;
2690
2691							if ( '' === countHTML.replace(/<\/?[^>]+(>|$)/g, "") ) {
2692								countHTML = '<span class="wpr-post-like-count">' + $('<div>').text( current.attr('data-text') ).html() + '</span>';
2693
2694								if ( ! current.hasClass( 'wpr-likes-zero' ) ) {
2695									current.addClass( 'wpr-likes-zero' );
2696								}
2697							} else {
2698								current.removeClass( 'wpr-likes-zero' );
2699							}
2700
2701							// Update Icon
2702							if ( current.hasClass( 'wpr-already-liked' ) ) {
2703								current.prop( 'title', 'Like' );
2704								current.removeClass( 'wpr-already-liked' );
2705								current.html( '<i class="'+ iconClass.replace( 'fas', 'far' ) +'"></i>' + countHTML );
2706							} else {
2707								current.prop( 'title', 'Unlike' );
2708								current.addClass( 'wpr-already-liked' );
2709								current.html( '<i class="'+ iconClass.replace( 'far', 'fas' ) +'"></i>' + countHTML );
2710							}
2711
2712							current.fadeTo( 500, 1 );
2713						}
2714					});
2715
2716					}
2717
2718					return false;
2719				});
2720			}
2721
2722			// Set equal height to all grid-items
2723			function setEqualHeight( settings ) {
2724				let iGrid = $scope.find( '.wpr-grid' ),
2725					items = iGrid.children('article'),
2726					columns = Math.floor(iGrid.outerWidth() / items.outerWidth());
2727
2728				if ( 'fitRows' === settings.layout && columns > 1 ) {
2729					let maxHeight = Math.max.apply(null, items.map(function(item) {
2730						return $(this).outerHeight();
2731					}));
2732
2733					items.each(function() {
2734						$(this).css('height', maxHeight + 'px');
2735					});
2736                    
2737                    if ( 'yes' === settings.stick_last_element_to_bottom ) {
2738                        $scope.addClass('wpr-grid-last-element-yes');
2739                    }
2740				}
2741			}
2742
2743			function lazyLoadObserver() {
2744				setTimeout(function() {
2745					let lazyLoadObserver = new IntersectionObserver((entries, observer) => {
2746						entries.forEach(entry => {
2747							if(entry.isIntersecting && entry.target.src.includes('icon-256x256')) {
2748								setTimeout(function() {
2749									entry.target.src = entry.target.parentElement.dataset.src;
2750									entry.target.classList.toggle('wpr-hidden-image');
2751									$(window).trigger('resize');
2752								}, 100);
2753							}
2754						});
2755					}, {});
2756					
2757					$scope.find('.wpr-grid-image-wrap img:first-of-type').each(function() {
2758						lazyLoadObserver.observe($(this)[0]);
2759					});
2760				}, 100);
2761			}
2762
2763			lazyLoadObserver();
2764
2765			// Isotope Filters
2766			function isotopeFilters( settings, event = 'load' ) { // GOGA: event listener parameter to determine load or other event
2767
2768				// Count
2769				if ( 'yes' === settings.filters_count ) {
2770					$scope.find( '.wpr-grid-filters a, .wpr-grid-filters span' ).each(function() {
2771						let thisFilterHTML = $(this),
2772							numberOfPosts;
2773
2774						if ( settings.grid_settings && 'load' == event  ) {
2775
2776							var	thisTaxonomy = '*' !== $(this).attr( 'data-filter') ? $(this).data('ajax-filter')[0] : '*',
2777								thisFilter = '*' !== $(this).attr( 'data-filter') ? $(this).data('ajax-filter')[1] : '*';
2778
2779								let data = {
2780									action: experimentActionCount,
2781									nonce: WprConfig.nonce,
2782									wpr_offset: 0,
2783									wpr_filter: thisFilter,
2784									wpr_taxonomy: thisTaxonomy,
2785									grid_settings: settings.grid_settings,
2786								};
2787
2788							$.ajax({
2789								type: 'POST',
2790								url: WprConfig.ajaxurl,
2791								data: data,
2792								success: function(response) {
2793									numberOfPosts = response.data.query_found;
2794									thisFilterHTML.find( 'sup' ).text( response.data.query_found );
2795								},
2796								error: function(error) {
2797									console.log(error);
2798								}
2799							});
2800						} else {
2801							if ( '*' === $(this).attr( 'data-filter') ) {
2802								$(this).find( 'sup' ).text( $scope.find( '.wpr-grid-filters' ).next().find('article').length );
2803							} else {
2804								$(this).find( 'sup' ).text( $scope.find( $(this).attr( 'data-filter' ) ).length );
2805							}
2806						}
2807					});
2808				}
2809
2810				// Return if Disabled
2811				if ( 'yes' === settings.filters_linkable ) {
2812					return;
2813				}
2814
2815				// Deeplinking on Load
2816				if ( 'yes' === settings.deeplinking ) {
2817					var deepLink = window.location.hash.replace( '#filter:', '.' );
2818
2819					if ( window.location.hash.match( '#filter:all' ) ) {
2820						deepLink = '*';
2821					}
2822
2823					var activeFilter = $scope.find( '.wpr-grid-filters span[data-filter="'+ deepLink +'"]:not(.wpr-back-filter)' ),
2824						activeFilterWrap = activeFilter.parent();
2825
2826					// Sub Filters
2827					if ( 'parent' === activeFilter.parent().attr( 'data-role' ) ) {
2828						if ( activeFilterWrap.parent( 'ul' ).find( 'ul[data-parent="'+ deepLink +'"]').length ) {
2829							activeFilterWrap.parent( 'ul' ).children( 'li' ).css( 'display', 'none' );
2830							activeFilterWrap.siblings( 'ul[data-parent="'+ deepLink +'"]' ).css( 'display', 'block' );
2831						}
2832					} else if ( 'sub' === activeFilter.parent().attr( 'data-role' ) ) {
2833						activeFilterWrap.closest( '.wpr-grid-filters' ).children( 'li' ).css( 'display', 'none' );
2834						activeFilterWrap.parent( 'ul' ).css( 'display', 'inline-block' );
2835					}
2836
2837					// Active Filter Class
2838					$scope.find( '.wpr-grid-filters span' ).removeClass( 'wpr-active-filter' );
2839					activeFilter.addClass( 'wpr-active-filter' );
2840
2841					$scope.find( '.wpr-grid' ).isotopewpr({ filter: deepLink });
2842
2843					// Fallback when arrangeComplete never fires (e.g. prefers-reduced-motion / Windows animations off)
2844					if ( WprElements.prefersReducedMotion() ) {
2845						setTimeout( function() {
2846							var isoInstance = $scope.find( '.wpr-grid' ).data( 'isotope' );
2847
2848							if ( isoInstance && isoInstance.filteredItems ) {
2849								applyGridFilterTransitions( isoInstance.filteredItems, settings );
2850							}
2851						}, 0 );
2852					}
2853
2854					// Fix Lightbox
2855					if ( '*' !== deepLink ) {
2856						settings.lightbox.selector = deepLink +' .wpr-grid-image-wrap';
2857					} else {
2858						settings.lightbox.selector = ' .wpr-grid-image-wrap';
2859					}
2860
2861					WprElements.lightboxPopup( settings, $scope, iGrid );
2862				}
2863
2864				// Hide Empty Filters
2865				if ( 'yes' === settings.filters_hide_empty ) {
2866					$scope.find( '.wpr-grid-filters span' ).each(function() {
2867						var searchClass = $(this).attr( 'data-filter' );
2868
2869						if ( '*' !== searchClass ) {
2870							if ( 0 === iGrid.find(searchClass).length ) {
2871								$(this).parent( 'li' ).addClass( 'wpr-hidden-element' );
2872							} else {
2873								$(this).parent( 'li' ).removeClass( 'wpr-hidden-element' );
2874							}
2875						}
2876					});
2877				}
2878
2879				// Set a Default Filter
2880				if ( !$scope.hasClass('elementor-widget-wpr-woo-category-grid-pro') && !$scope.hasClass('elementor-widget-wpr-category-grid-pro') ) {
2881					if ( '' !== settings.filters_default_filter ) {
2882						setTimeout(function() {
2883							var $defaultFilter = $scope.find( '.wpr-grid-filters' ).find('span[data-filter*="-'+ settings.filters_default_filter +'"]');
2884							if ( $defaultFilter.length ) {
2885								$defaultFilter.eq(0).click();
2886							}
2887						}, 100);
2888					}
2889				}
2890
2891				// Click Event
2892				if ( !settings.grid_settings ) {
2893					$scope.find( '.wpr-grid-filters span' ).on( 'click', function() {
2894					WprElements.changeInitialItems(0, scopeId);
2895
2896					// Check why this was removed
2897					var filterClass = $(this).data( 'filter' ),
2898						filterWrap = $(this).parent( 'li' ),
2899						filterRole = filterWrap.attr( 'data-role' );
2900	
2901						// Active Filter Class
2902						$scope.find( '.wpr-grid-filters span' ).removeClass( 'wpr-active-filter' );
2903						$(this).addClass( 'wpr-active-filter' );
2904	
2905						// Sub Filters
2906						if ( 'parent' === filterRole ) {
2907							if ( filterWrap.parent( 'ul' ).find( 'ul[data-parent="'+ filterClass +'"]' ).length ) {
2908								filterWrap.parent( 'ul' ).children( 'li' ).css( 'display', 'none' );
2909								filterWrap.siblings( 'ul[data-parent="'+ filterClass +'"]' ).css( 'display', 'block' );
2910							}
2911						} else if ( 'back' === filterRole ) {
2912							filterWrap.closest( '.wpr-grid-filters' ).children( 'li' ).css( 'display', 'inline-block' );
2913							filterWrap.parent().css( 'display', 'none' );
2914						}
2915	
2916						// Deeplinking
2917						if ( 'yes' === settings.deeplinking ) {
2918							var filterHash = '#filter:'+ filterClass.replace( '.', '' );
2919	
2920							if ( '*' === filterClass ) {
2921								filterHash = '#filter:all';
2922							}
2923	
2924							window.location.href = window.location.pathname + window.location.search + filterHash;
2925						}
2926	
2927						// Infinite Scroll
2928						if ( 'infinite-scroll' === settings.pagination_type ) {
2929							if ( 0 === iGrid.find($(this).attr('data-filter')).length ) {
2930								$scope.find( '.wpr-grid' ).infiniteScroll( 'loadNextPage' );
2931							}
2932						}
2933	
2934						// Load More
2935						if ( 'load-more' === settings.pagination_type ) {
2936							if ( 0 === iGrid.find($(this).attr('data-filter')).length ) {
2937								$scope.find( '.wpr-grid' ).infiniteScroll( 'loadNextPage' );
2938							}
2939						}
2940	
2941						// Filtering Animation
2942						if ( 'default' !== settings.filters_animation ) {
2943							$scope.find( '.wpr-grid-item-inner' ).css({
2944								'opacity' : '0',
2945								'transition' : 'none'
2946							});
2947						}
2948	
2949						if ( 'fade-slide' === settings.filters_animation ) {
2950							$scope.find( '.wpr-grid-item-inner' ).css( 'top', '20px' );
2951						} else if ( 'zoom' === settings.filters_animation ) {
2952							$scope.find( '.wpr-grid-item-inner' ).css( 'transform', 'scale(0.01)' );
2953						} else {
2954							$scope.find( '.wpr-grid-item-inner' ).css({
2955								'top' : '0',
2956								'transform' : 'scale(1)'
2957							});
2958						}
2959	
2960						// Filter Grid Items
2961						$scope.find( '.wpr-grid' ).isotopewpr({ filter: filterClass });
2962	
2963						// Fix Lightbox
2964						if ( '*' !== filterClass ) {
2965							settings.lightbox.selector = filterClass +' .wpr-grid-image-wrap';
2966						} else {
2967							settings.lightbox.selector = ' .wpr-grid-image-wrap';
2968						}
2969	
2970						// Destroy Lightbox
2971						iGrid.data('lightGallery').destroy( true );
2972						// Init Lightbox
2973						iGrid.lightGallery( settings.lightbox );
2974					});
2975				}
2976			}
2977
2978			function checkWishlistAndCompare() {
2979				var wishlistArray;
2980				
2981				if ( iGrid.find('.wpr-wishlist-add').length ) {
2982
2983					$.ajax({
2984							url: WprConfig.ajaxurl,
2985							type: 'POST',
2986							data: {
2987								action: 'check_product_in_wishlist_grid',
2988							},
2989							success: function(response) {
2990									wishlistArray = response;
2991							}
2992					});
2993					
2994					
2995					iGrid.find('.wpr-wishlist-add').each(function() {
2996						var wishlistBtn = $(this);
2997						
2998						if ( $.inArray(wishlistBtn.data('product-id'), wishlistArray) !== -1 ) {
2999							if ( !wishlistBtn.hasClass('wpr-button-hidden') ) {
3000								wishlistBtn.addClass('wpr-button-hidden');
3001							}
3002
3003							if ( wishlistBtn.next().hasClass('wpr-button-hidden') ) {
3004								wishlistBtn.next().removeClass('wpr-button-hidden');
3005							}
3006						}
3007					});
3008				}
3009
3010				if ( iGrid.find('.wpr-compare-add').length > 0 ) {
3011					var compareArray = [];
3012					
3013					$.ajax({
3014							url: WprConfig.ajaxurl,
3015							type: 'POST',
3016							data: {
3017								action: 'check_product_in_compare_grid',
3018							},
3019							success: function(response) {
3020								compareArray = response;
3021							},
3022							error: function(error) {
3023								console.log(error);
3024							}
3025					});
3026				
3027					
3028					iGrid.find('.wpr-compare-add').each(function() {
3029						var compareBtn = $(this);
3030						
3031						if ( $.inArray(compareBtn.data('product-id'), compareArray) !== -1 ) {
3032							if ( !compareBtn.hasClass('wpr-button-hidden') ) {
3033								compareBtn.addClass('wpr-button-hidden');
3034							}
3035
3036							if ( compareBtn.next().hasClass('wpr-button-hidden') ) {
3037								compareBtn.next().removeClass('wpr-button-hidden');
3038							}
3039						}
3040					});
3041					
3042				}
3043			}
3044
3045			function addRemoveCompare() {
3046				if ( iGrid.find('.wpr-compare-add').length ) {
3047					$scope.find('.wpr-compare-add').click(function(e) {
3048						e.preventDefault();
3049						var event_target = $(this);
3050						var product_id = $(this).data('product-id');
3051
3052						event_target.fadeTo(500, 0);
3053
3054						$.ajax({
3055							url: WprConfig.ajaxurl,
3056							type: 'POST',
3057							data: {
3058                                action: 'add_to_compare',
3059                                nonce: WprConfig.nonce,
3060								product_id: product_id
3061							},
3062							success: function() {
3063								$scope.find('.wpr-compare-add[data-product-id="' + product_id + '"]').hide();
3064								$scope.find('.wpr-compare-remove[data-product-id="' + product_id + '"]').show();
3065								$scope.find('.wpr-compare-remove[data-product-id="' + product_id + '"]').fadeTo(500, 1);
3066								WprElements.changeActionTargetProductId(product_id);
3067								$(document).trigger('added_to_compare');
3068	
3069								if ( 'sidebar' === event_target.data('atcompare-popup') ) {
3070									// GOGA - configure after adding compare dropdown functinality
3071									if ( $('.wpr-compare-toggle-btn').length ) {
3072										$('.wpr-compare-toggle-btn').each(function() {
3073											if ( 'none' === $(this).next('.wpr-compare').css('display') ) {
3074												$(this).trigger('click');
3075											}
3076										});
3077									}
3078								} else if ( 'popup' === event_target.data('atcompare-popup') ) {
3079									// Popup Link needs wishlist
3080									var popupItem = event_target.closest('.wpr-grid-item'),
3081										popupText = popupItem.find('.wpr-grid-item-title').text(),
3082										popupLink = WprConfig.comparePageURL,
3083										popupTarget = 'yes' == event_target.data('open-in-new-tab') ? '_blank' : '_self',
3084										popupImageSrc = popupItem.find('.wpr-grid-image-wrap').length ? popupItem.find('.wpr-grid-image-wrap').data('src') : '',
3085										popupAnimation = event_target.data('atcompare-animation'),
3086										fadeOutIn = event_target.data('atcompare-fade-out-in'),
3087										animTime = event_target.data('atcompare-animation-time'),
3088										popupImage,
3089										animationClass = 'wpr-added-to-compare-default',
3090										removeAnimationClass;
3091			
3092									if ( 'slide-left' === popupAnimation ) {
3093										animationClass = 'wpr-added-to-compare-slide-in-left';
3094										removeAnimationClass = 'wpr-added-to-compare-slide-out-left';
3095									} else if ( 'scale-up' === popupAnimation ) {
3096										animationClass = 'wpr-added-to-compare-scale-up';
3097										removeAnimationClass = 'wpr-added-to-compare-scale-down';
3098									} else if ( 'skew' === popupAnimation ) {
3099										animationClass = 'wpr-added-to-compare-skew';
3100										removeAnimationClass = 'wpr-added-to-compare-skew-off';
3101									} else if ( 'fade' === popupAnimation ) {
3102										animationClass = 'wpr-added-to-compare-fade';
3103										removeAnimationClass = 'wpr-added-to-compare-fade-out';
3104									} else {
3105										removeAnimationClass = 'wpr-added-to-compare-popup-hide';
3106									}
3107			
3108									if ( '' !== popupImageSrc ) {
3109										popupImage = '<div class="wpr-added-tcomp-popup-img"><img src='+popupImageSrc+' alt="" /></div>';
3110									} else {
3111										popupImage = '';
3112									}
3113									
3114									if ( !($scope.find('.wpr-grid').find('#wpr-added-to-comp-'+product_id).length > 0) ) {
3115										$scope.find('.wpr-grid').append('<div id="wpr-added-to-comp-'+product_id+'" class="wpr-added-to-compare-popup ' + animationClass + '">'+ popupImage +'<div class="wpr-added-tc-title"><p>'+ popupText +' was added to Compare</p><p><a target='+ popupTarget +' href='+popupLink+'>View Compare</a></p></div></div>');
3116			
3117										setTimeout(() => {
3118											$scope.find('#wpr-added-to-comp-'+product_id).addClass(removeAnimationClass);
3119											setTimeout(() => {
3120												$scope.find('#wpr-added-to-comp-'+product_id).remove();
3121											}, animTime * 1000);
3122										}, fadeOutIn * 1000);
3123									}
3124								}
3125							},
3126							error: function(response) {
3127								var error_message = response.responseJSON.message;
3128								// Display error message
3129								alert(error_message);
3130							}
3131						});
3132					});
3133	
3134					$scope.find('.wpr-compare-remove').click(function(e) {
3135						e.preventDefault();
3136						var product_id = $(this).data('product-id');
3137						$(this).fadeTo(500, 0);
3138
3139						$.ajax({
3140							url: WprConfig.ajaxurl,
3141							type: 'POST',
3142							data: {
3143                                action: 'remove_from_compare',
3144                                nonce: WprConfig.nonce,
3145								product_id: product_id
3146							},
3147							success: function() {
3148								$scope.find('.wpr-compare-remove[data-product-id="' + product_id + '"]').hide();
3149								$scope.find('.wpr-compare-add[data-product-id="' + product_id + '"]').show();
3150								$scope.find('.wpr-compare-add[data-product-id="' + product_id + '"]').fadeTo(500, 1);
3151								WprElements.changeActionTargetProductId(product_id);
3152								$(document).trigger('removed_from_compare');
3153							}
3154						});
3155					});
3156	
3157					$(document).on('removed_from_compare', function() {
3158						$scope.find('.wpr-compare-remove[data-product-id="' + actionTargetProductId + '"]').hide();
3159						$scope.find('.wpr-compare-add[data-product-id="' + actionTargetProductId + '"]').show();
3160						$scope.find('.wpr-compare-add[data-product-id="' + actionTargetProductId + '"]').fadeTo(500, 1);
3161					});
3162	
3163				}
3164			}
3165
3166			function addRemoveWishlist() {
3167				let isPopupActive = false;
3168				if ( iGrid.find('.wpr-wishlist-add').length ) {
3169					$scope.find('.wpr-wishlist-add').click(function(e) {
3170						e.preventDefault();
3171						var event_target = $(this);
3172						var product_id = $(this).data('product-id');
3173
3174						event_target.fadeTo(500, 0);
3175
3176						$.ajax({
3177							url: WprConfig.ajaxurl,
3178							type: 'POST',
3179							data: {
3180                                action: 'add_to_wishlist',
3181                                nonce: WprConfig.nonce,
3182								product_id: product_id
3183							},
3184							success: function() {
3185								$scope.find('.wpr-wishlist-add[data-product-id="' + product_id + '"]').hide();
3186								$scope.find('.wpr-wishlist-remove[data-product-id="' + product_id + '"]').show();
3187								$scope.find('.wpr-wishlist-remove[data-product-id="' + product_id + '"]').fadeTo(500, 1);
3188								WprElements.changeActionTargetProductId(product_id);
3189								$(document).trigger('added_to_wishlist');
3190	
3191								if ( 'sidebar' === event_target.data('atw-popup') ) {
3192									// GOGA - configure after adding wishlist dropdown functinality
3193									if ( $('.wpr-wishlist-toggle-btn').length ) {
3194										$('.wpr-wishlist-toggle-btn').each(function() {
3195											if ( 'none' === $(this).next('.wpr-wishlist').css('display') ) {
3196												$(this).trigger('click');
3197											}
3198										});
3199									}
3200								} else if ( 'popup' === event_target.data('atw-popup') ) {
3201									// Popup Link needs wishlist
3202									var popupItem = event_target.closest('.wpr-grid-item'),
3203										popupText = popupItem.find('.wpr-grid-item-title').text(),
3204										popupLink = WprConfig.wishlistPageURL,
3205										popupTarget = 'yes' == event_target.data('open-in-new-tab') ? '_blank' : '_self',
3206										popupImageSrc = popupItem.find('.wpr-grid-image-wrap').length ? popupItem.find('.wpr-grid-image-wrap').data('src') : '',
3207										popupAnimation = event_target.data('atw-animation'),
3208										fadeOutIn = event_target.data('atw-fade-out-in'),
3209										animTime = event_target.data('atw-animation-time'),
3210										popupImage,
3211										animationClass = 'wpr-added-to-wishlist-default',
3212										removeAnimationClass;
3213			
3214									if ( 'slide-left' === popupAnimation ) {
3215										animationClass = 'wpr-added-to-wishlist-slide-in-left';
3216										removeAnimationClass = 'wpr-added-to-wishlist-slide-out-left';
3217									} else if ( 'scale-up' === popupAnimation ) {
3218										animationClass = 'wpr-added-to-wishlist-scale-up';
3219										removeAnimationClass = 'wpr-added-to-wishlist-scale-down';
3220									} else if ( 'skew' === popupAnimation ) {
3221										animationClass = 'wpr-added-to-wishlist-skew';
3222										removeAnimationClass = 'wpr-added-to-wishlist-skew-off';
3223									} else if ( 'fade' === popupAnimation ) {
3224										animationClass = 'wpr-added-to-wishlist-fade';
3225										removeAnimationClass = 'wpr-added-to-wishlist-fade-out';
3226									} else {
3227										removeAnimationClass = 'wpr-added-to-wishlist-popup-hide';
3228									}
3229			
3230									if ( '' !== popupImageSrc ) {
3231										popupImage = '<div class="wpr-added-tw-popup-img"><img src='+popupImageSrc+' alt="" /></div>';
3232									} else {
3233										popupImage = '';
3234									}
3235									if (!isPopupActive) {
3236										isPopupActive = true;
3237										
3238										if ( !($scope.find('.wpr-grid').find('#wpr-added-to-wish-'+product_id).length > 0) ) {
3239											$scope.find('.wpr-grid').append('<div id="wpr-added-to-wish-'+product_id+'" class="wpr-added-to-wishlist-popup ' + animationClass + '">'+ popupImage +'<div class="wpr-added-tw-title"><p>'+ popupText +' was added to Wishlist</p><p><a target="'+ popupTarget +'" href='+popupLink+'>View Wishlist</a></p></div></div>');
3240				
3241											setTimeout(() => {
3242												$scope.find('#wpr-added-to-wish-'+product_id).addClass(removeAnimationClass);
3243												setTimeout(() => {
3244													$scope.find('#wpr-added-to-wish-'+product_id).remove();
3245												}, animTime * 1000);
3246											}, fadeOutIn * 1000);
3247										}
3248									}
3249								}
3250							},
3251							error: function(response) {
3252								var error_message = response.responseJSON.message;
3253								// Display error message
3254								alert(error_message);
3255							}
3256						});
3257					});
3258	
3259					$scope.find('.wpr-wishlist-remove').on('click', function(e) {
3260						e.preventDefault();
3261						var product_id = $(this).data('product-id');
3262
3263						$(this).fadeTo(500, 0);
3264
3265						$.ajax({
3266							url: WprConfig.ajaxurl,
3267							type: 'POST',
3268							data: {
3269                                action: 'remove_from_wishlist',
3270                                nonce: WprConfig.nonce,
3271								product_id: product_id
3272							},
3273							success: function() {
3274								$scope.find('.wpr-wishlist-remove[data-product-id="' + product_id + '"]').hide();
3275								$scope.find('.wpr-wishlist-add[data-product-id="' + product_id + '"]').show();
3276								$scope.find('.wpr-wishlist-add[data-product-id="' + product_id + '"]').fadeTo(500, 1);
3277								WprElements.changeActionTargetProductId(product_id);
3278								$(document).trigger('removed_from_wishlist');
3279							}
3280						});
3281					});
3282	
3283					$(document).on('removed_from_wishlist', function() {
3284						$scope.find('.wpr-wishlist-remove[data-product-id="' + actionTargetProductId + '"]').hide();
3285						$scope.find('.wpr-wishlist-add[data-product-id="' + actionTargetProductId + '"]').show();
3286						$scope.find('.wpr-wishlist-add[data-product-id="' + actionTargetProductId + '"]').fadeTo(500, 1);
3287					});
3288	
3289				}	
3290			}
3291
3292			function filtersExperiment() {
3293				let currentRequest = null;
3294				$scope.find('.wpr-grid-filters').on('click', 'span', function(event) {
3295					if (currentRequest) {
3296						currentRequest.abort(); // Abort the previous request
3297					}
3298
3299					pagesLoadedExperiment = 0;
3300					var thisTaxonomy,
3301						thisFilter,
3302                        loader = '<div class="wpr-grid-loader-wrap"><div class="wpr-ring"><div></div><div></div><div></div><div></div></div></div>';
3303						
3304					var filterClass = $(this).data( 'filter' ),
3305						filterWrap = $(this).parent( 'li' ),
3306						filterRole = filterWrap.attr( 'data-role' );
3307					
3308					if ( $(this).data('filter') !== '*' ) {
3309						thisTaxonomy = $(this).data('ajax-filter')[0];
3310						thisFilter = $(this).data('ajax-filter')[1];
3311					} else {
3312						thisTaxonomy = '*';
3313						thisFilter = '*';
3314					}
3315	
3316					// Sub Filters
3317					if ( 'parent' === filterRole ) {
3318						if ( filterWrap.parent( 'ul' ).find( 'ul[data-parent="'+ filterClass +'"]').length ) {
3319							filterWrap.parent( 'ul' ).children( 'li' ).css( 'display', 'none' );
3320							filterWrap.siblings( 'ul[data-parent="'+ filterClass +'"]' ).css( 'display', 'block' );
3321						}
3322					} else if ( 'back' === filterRole ) {
3323						filterWrap.closest( '.wpr-grid-filters' ).children( 'li' ).css( 'display', 'inline-block' );
3324						filterWrap.parent().css( 'display', 'none' );
3325					}
3326
3327					$scope.find('.wpr-grid-filters span').removeClass('wpr-active-filter');
3328					$(this).addClass('wpr-active-filter');
3329
3330					event.preventDefault();
3331					event.stopPropagation();
3332					event.stopImmediatePropagation();
3333
3334					iGrid.isotopewpr('remove', iGrid.children('.wpr-grid-item'));
3335					if ( iGrid.find('.wpr-grid-loader-wrap').length < 1 ) {
3336						iGrid.append(loader);
3337					}
3338					const start = performance.now();
3339					$.ajax({
3340						type: 'POST',
3341						url: WprConfig.ajaxurl,
3342						data: {
3343							action: experimentActionCount,
3344							nonce: WprConfig.nonce,
3345							// wpr_offset: +settings.grid_settings.query_offset + $scope.find('.wpr-grid-item').length,
3346							wpr_offset: +settings.grid_settings.query_offset,
3347							wpr_filter: thisFilter,
3348							wpr_taxonomy: thisTaxonomy,
3349							grid_settings: settings.grid_settings,
3350						},
3351						success: function(response) {
3352							var pageCount = response.data.page_count;
3353							var foundPosts = response.data.query_found;
3354							const end = performance.now();
3355							// console.log(`AJAX call took ${end - start} ms`);
3356
3357							const start2 = performance.now();
3358							currentRequest = $.ajax({
3359								type: 'POST',
3360								url: WprConfig.ajaxurl,
3361								data: {
3362									action: experimentActionContent,
3363									nonce: WprConfig.nonce,
3364									wpr_item_length: +settings.grid_settings.query_offset + $scope.find('.wpr-grid-item').length,
3365									wpr_filter: thisFilter,
3366									wpr_taxonomy: thisTaxonomy,
3367									grid_settings: settings.grid_settings,
3368								},
3369								success: function( response ) {
3370									setTimeout(function() {
3371										// iGrid.addClass('wpr-zero-opacity');
3372										// $scope.find('.wpr-grid').html($(response));
3373										// WprElements.isotopeLayout( settings, '', '', $scope );
3374										const end2 = performance.now();
3375										// console.log(`AJAX call took ${end2 - start2} ms`);
3376
3377										var newItems;
3378
3379										if ( response.data && response.data.output ) {
3380											newItems = $(response.data.output);
3381										} else {
3382											newItems = $(response);
3383										}
3384										
3385										iGrid.find('.wpr-grid-loader-wrap').remove();
3386										iGrid.addClass('wpr-fix-grid-height');
3387										iGrid.append(newItems).isotopewpr('appended', newItems).isotopewpr('layout');
3388										setTimeout(function() {
3389											iGrid.removeClass('wpr-fix-grid-height');
3390										}, 500);
3391
3392										if ( settings.pagination_type == 'load-more' && pagination ) { // needs check if more posts in tax
3393											pagination.find( '.wpr-pagination-finish' ).fadeOut( 100 );
3394											pagination.delay( 2000 ).fadeIn( 100 );
3395											
3396											if ( pageCount <= 1 && foundPosts <= newItems.length ) {
3397												// if ( items.length !== 0 ) {}
3398												if ( 'load-more' === settings.pagination_type ) {
3399													pagination.find( '.wpr-load-more-btn' ).fadeOut();
3400												}
3401											}
3402											
3403											if ( pageCount > 1 ) {
3404												// if ( items.length !== 0 ) {}
3405												if ( 'load-more' === settings.pagination_type ) {
3406													pagination.find( '.wpr-load-more-btn' ).fadeIn();
3407												}
3408											}
3409										}
3410
3411										WprElements.isotopeLayout( settings, '', '', $scope );
3412										WprElements.lightboxPopup( settings, $scope, iGrid );
3413			
3414										// Fix Lightbox
3415										iGrid.data( 'lightGallery' ).destroy( true );
3416										iGrid.lightGallery( settings.lightbox );
3417
3418                                        setTimeout(function() {
3419                                            WprElements.isotopeLayout( settings, '', '', $scope );
3420
3421											window.dispatchEvent(new Event('resize'));
3422											window.dispatchEvent(new Event('scroll'));
3423                                        }, 500);
3424										
3425										WprElements.mediaHoverLink($scope, iGrid);
3426										lazyLoadObserver();
3427										// iGrid.removeClass('wpr-zero-opacity');
3428										WprElements.changeInitialItems(0, scopeId);
3429									}, 800);
3430								},
3431								error: function(error) {
3432									console.log(error);
3433								}
3434							});
3435						},
3436						error: function(error) {
3437							console.log(error);
3438						}
3439					});
3440				});
3441			}
3442
3443			function loadMoreExperiment() {
3444				$scope.find('.wpr-load-more-btn').on('click', function(event) {
3445					event.preventDefault();
3446					event.stopPropagation();
3447
3448					var thisTaxonomy,
3449						thisFilter;
3450						
3451					if ( $scope.find('.wpr-active-filter').length && $scope.find('.wpr-active-filter').data('filter') !== '*' ) {
3452						thisTaxonomy = $scope.find('.wpr-active-filter').data('ajax-filter')[0];
3453						thisFilter = $scope.find('.wpr-active-filter').data('ajax-filter')[1];
3454					} else {
3455						thisTaxonomy = '*';
3456						thisFilter = '*';
3457					}
3458
3459					event.preventDefault();
3460					event.stopPropagation();
3461					event.stopImmediatePropagation();
3462
3463					// Store the current scroll position
3464					var scrollTop = $(window).scrollTop();
3465					
3466					pagination.find( '.wpr-load-more-btn' ).hide();
3467					pagination.find( '.wpr-pagination-loading' ).css( 'display', 'inline-block' );
3468
3469					$.ajax({
3470						type: 'POST',
3471						url: WprConfig.ajaxurl,
3472						data: {
3473							action: experimentActionCount,
3474							nonce: WprConfig.nonce,
3475							wpr_offset: +settings.grid_settings.query_offset + $scope.find('.wpr-grid-item').length,
3476							wpr_filter: thisFilter,
3477							wpr_taxonomy: thisTaxonomy,
3478							grid_settings: settings.grid_settings,
3479						},
3480						success: function(response) {
3481							var pageCount = response.data.page_count;
3482
3483							$.ajax({
3484								type: 'POST',
3485								url: WprConfig.ajaxurl,
3486								data: {
3487									action: experimentActionContent,
3488									nonce: WprConfig.nonce,
3489									wpr_offset: +settings.grid_settings.query_offset + $scope.find('.wpr-grid-item').length,
3490									wpr_filter: thisFilter,
3491									wpr_taxonomy: thisTaxonomy,
3492									grid_settings: settings.grid_settings,
3493								},
3494								success: function( response ) {
3495									pagesLoadedExperiment++;
3496									var items;
3497									// iGrid.css('opacity', 0);
3498									if ( response.data && response.data.output ) {
3499										items = $(response.data.output);
3500									} else {
3501										items = $(response);
3502									}
3503		
3504									// $data.each(function() {
3505									// 	$(this).addClass('wpr-grid-hidden-item');
3506									// });
3507
3508									iGrid.infiniteScroll( 'appendItems', items );
3509									iGrid.isotopewpr( 'appended', items );
3510									// isotopeFilters( settings ); // GOGA - if not images loaded
3511		
3512									items.imagesLoaded().progress( function( instance, image ) {
3513										WprElements.isotopeLayout( settings, '', '', $scope );
3514			
3515										// Fix Layout
3516										setTimeout(function() {
3517											WprElements.isotopeLayout( settings, '', '', $scope );
3518											// isotopeFilters( settings );
3519										}, 100 );
3520							
3521										setTimeout(function() {
3522											iGrid.addClass( 'grid-images-loaded' );
3523										}, 500 );
3524									});
3525			
3526									// Loading
3527									pagination.find( '.wpr-pagination-loading' ).hide();
3528									if ( pageCount > 1 ) {
3529									// if ( items.length !== 0 ) {
3530										if ( 'load-more' === settings.pagination_type ) {
3531											pagination.find( '.wpr-load-more-btn' ).fadeIn();
3532										}
3533									} else {
3534										pagination.find( '.wpr-pagination-finish' ).fadeIn( 1000 );
3535										pagination.delay( 2000 ).fadeOut( 1000 );
3536										setTimeout(function() {
3537											pagination.find( '.wpr-pagination-loading' ).hide();
3538										}, 500 );
3539									}
3540			
3541									// Init Likes
3542									// No need for this anymore
3543									// setTimeout(function() {
3544									// 	postLikes( settings );
3545									// }, 300 );
3546			
3547									// Init Lightbox
3548									WprElements.lightboxPopup( settings, $scope, iGrid );
3549			
3550									// Fix Lightbox
3551									iGrid.data( 'lightGallery' ).destroy( true );
3552									iGrid.lightGallery( settings.lightbox );
3553			
3554									// Init Media Hover Link
3555									WprElements.mediaHoverLink($scope, iGrid);
3556			
3557									// Init Post Sharing
3558									postSharing();
3559			
3560									lazyLoadObserver();
3561
3562									// Maybe there is some other way
3563									window.dispatchEvent(new Event('resize'));
3564									window.dispatchEvent(new Event('scroll'));
3565									$(window).trigger('scroll');
3566								},
3567								error: function(error) {
3568									console.log(error);
3569								}
3570							});
3571						}
3572					});
3573				});
3574			}
3575		}, // End widgetGrid
3576
3577		widgetMagazineGrid: function( $scope ) {
3578			// Settings
3579			var iGrid = $scope.find( '.wpr-magazine-grid-wrap' ),
3580				settings = iGrid.attr( 'data-slick' ),
3581				dataSlideEffect = iGrid.attr('data-slide-effect');
3582
3583			// Slider
3584			if ( typeof settings !== typeof undefined && settings !== false ) {
3585				iGrid.slick({
3586					fade: 'fade' === dataSlideEffect ? true : false
3587				});
3588			}
3589
3590			$(document).ready(function() {
3591				iGrid.css('opacity', 1);
3592			});
3593
3594			var iGridLength = iGrid.find('.wpr-mgzn-grid-item').length;
3595
3596			// $(window).smartresize(function() {
3597			// 	if (window.matchMedia("(max-width: 767px)").matches) { // If media query matches
3598			// 		iGrid.find('.wpr-magazine-grid.wpr-mgzn-grid-3-h')[0].style.gridTemplateRows = 'repeat('+ iGridLength +', 1fr)';
3599			// 	} else {
3600			// 		iGrid.find('.wpr-magazine-grid.wpr-mgzn-grid-3-h').removeAttr('style');
3601			// 	}
3602			// });
3603
3604			// Media Hover Link
3605			if ( 'yes' === iGrid.find( '.wpr-grid-media-wrap' ).attr( 'data-overlay-link' ) && ! WprElements.editorCheck() ) {
3606				iGrid.find( '.wpr-grid-media-wrap' ).css('cursor', 'pointer');
3607				
3608				iGrid.find( '.wpr-grid-media-wrap' ).on( 'click', function( event ) {
3609					var targetClass = event.target.className;
3610
3611					if ( -1 !== targetClass.indexOf( 'inner-block' ) || -1 !== targetClass.indexOf( 'wpr-cv-inner' ) || 
3612						 -1 !== targetClass.indexOf( 'wpr-grid-media-hover' ) ) {
3613						event.preventDefault();
3614
3615						var itemUrl = $(this).find( '.wpr-grid-media-hover-bg' ).attr( 'data-url' );
3616						
3617						// GOGA - leave if necessary
3618						if (iGrid.find('.wpr-grid-item-title a').length) {
3619							// Extract the itemUrl
3620							if (itemUrl) {
3621								try {
3622									// Create a URL object to validate the URL
3623									var url = new URL(itemUrl);
3624
3625									// Define a list of allowed protocols
3626									var allowedProtocols = ['http:', 'https:'];
3627
3628									// Check if the URL's protocol is allowed
3629									if (allowedProtocols.includes(url.protocol)) {
3630										// Safe to use the URL
3631										var safeUrl = url.href;
3632
3633										if ('_blank' === iGrid.find('.wpr-grid-item-title a').attr('target')) {
3634											window.open(safeUrl, '_blank').focus();
3635										} else {
3636											window.location.href = safeUrl;
3637										}
3638									} else {
3639										console.error('Invalid URL scheme:', url.protocol);
3640									}
3641								} catch (e) {
3642									console.error('Invalid URL:', itemUrl);
3643								}
3644							}
3645						}
3646					}
3647				});
3648			}
3649
3650			// Sharing
3651			if ( $scope.find( '.wpr-sharing-trigger' ).length ) {
3652				var sharingTrigger = $scope.find( '.wpr-sharing-trigger' ),
3653					sharingInner = $scope.find( '.wpr-post-sharing-inner' ),
3654					sharingWidth = 5;
3655
3656				// Calculate Width
3657				sharingInner.first().find( 'a' ).each(function() {
3658					sharingWidth += $(this).outerWidth() + parseInt( $(this).css('margin-right'), 10 );
3659				});
3660
3661				// Calculate Margin
3662				var sharingMargin = parseInt( sharingInner.find( 'a' ).css('margin-right'), 10 );
3663
3664				// Set Positions
3665				if ( 'left' === sharingTrigger.attr( 'data-direction') ) {
3666					// Set Width
3667					sharingInner.css( 'width', sharingWidth +'px' );
3668
3669					// Set Position
3670					sharingInner.css( 'left', - ( sharingMargin + sharingWidth ) +'px' );
3671				} else if ( 'right' === sharingTrigger.attr( 'data-direction') ) {
3672					// Set Width
3673					sharingInner.css( 'width', sharingWidth +'px' );
3674
3675					// Set Position
3676					sharingInner.css( 'right', - ( sharingMargin + sharingWidth ) +'px' );
3677				} else if ( 'top' === sharingTrigger.attr( 'data-direction') ) {
3678					// Set Margins
3679					sharingInner.find( 'a' ).css({
3680						'margin-right' : '0',
3681						'margin-top' : sharingMargin +'px'
3682					});
3683
3684					// Set Position
3685					sharingInner.css({
3686						'top' : -sharingMargin +'px',
3687						'left' : '50%',
3688						'-webkit-transform' : 'translate(-50%, -100%)',
3689						'transform' : 'translate(-50%, -100%)'
3690					});
3691				} else if ( 'right' === sharingTrigger.attr( 'data-direction') ) {
3692					// Set Width
3693					sharingInner.css( 'width', sharingWidth +'px' );
3694
3695					// Set Position
3696					sharingInner.css({
3697						'left' : sharingMargin +'px',
3698						// 'bottom' : - ( sharingInner.outerHeight() + sharingTrigger.outerHeight() ) +'px',
3699					});
3700				} else if ( 'bottom' === sharingTrigger.attr( 'data-direction') ) {
3701					// Set Margins
3702					sharingInner.find( 'a' ).css({
3703						'margin-right' : '0',
3704						'margin-bottom' : sharingMargin +'px'
3705					});
3706
3707					// Set Position
3708					sharingInner.css({
3709						'bottom' : -sharingMargin +'px',
3710						'left' : '50%',
3711						'-webkit-transform' : 'translate(-50%, 100%)',
3712						'transform' : 'translate(-50%, 100%)'
3713					});
3714				}
3715
3716				if ( 'click' === sharingTrigger.attr( 'data-action' ) ) {
3717					sharingTrigger.on( 'click', function() {
3718						var sharingInner = $(this).next();
3719
3720						if ( 'hidden' === sharingInner.css( 'visibility' ) ) {
3721							sharingInner.css( 'visibility', 'visible' );
3722							sharingInner.find( 'a' ).css({
3723								'opacity' : '1',
3724								'top' : '0'
3725							});
3726
3727							setTimeout( function() {
3728								sharingInner.find( 'a' ).addClass( 'wpr-no-transition-delay' );
3729							}, sharingInner.find( 'a' ).length * 100 );
3730						} else {
3731							sharingInner.find( 'a' ).removeClass( 'wpr-no-transition-delay' );
3732
3733							sharingInner.find( 'a' ).css({
3734								'opacity' : '0',
3735								'top' : '-5px'
3736							});
3737							setTimeout( function() {
3738								sharingInner.css( 'visibility', 'hidden' );
3739							}, sharingInner.find( 'a' ).length * 100 );
3740						}
3741					});
3742				} else {
3743					sharingTrigger.on( 'mouseenter', function() {
3744						var sharingInner = $(this).next();
3745
3746						sharingInner.css( 'visibility', 'visible' );
3747						sharingInner.find( 'a' ).css({
3748							'opacity' : '1',
3749							'top' : '0',
3750						});
3751						
3752						setTimeout( function() {
3753							sharingInner.find( 'a' ).addClass( 'wpr-no-transition-delay' );
3754						}, sharingInner.find( 'a' ).length * 100 );
3755					});
3756					$scope.find( '.wpr-grid-item-sharing' ).on( 'mouseleave', function() {
3757						var sharingInner = $(this).find( '.wpr-post-sharing-inner' );
3758
3759						sharingInner.find( 'a' ).removeClass( 'wpr-no-transition-delay' );
3760
3761						sharingInner.find( 'a' ).css({
3762							'opacity' : '0',
3763							'top' : '-5px'
3764						});
3765						setTimeout( function() {
3766							sharingInner.css( 'visibility', 'hidden' );
3767						}, sharingInner.find( 'a' ).length * 100 );
3768					});
3769				}
3770			}
3771
3772			// Likes
3773			if ( $scope.find( '.wpr-post-like-button' ).length ) {
3774
3775				$scope.find( '.wpr-post-like-button' ).on( 'click', function() {
3776					var current = $(this);
3777
3778					if ( '' !== current.attr( 'data-post-id' ) ) {
3779
3780					$.ajax({
3781						type: 'POST',
3782						url: $('<div>').text(current.attr('data-ajax')).html(),
3783						data: {
3784							action : 'wpr_likes_init',
3785							post_id : current.attr( 'data-post-id' ),
3786							nonce : current.attr( 'data-nonce' )
3787						},
3788						beforeSend:function() {
3789							current.fadeTo( 500, 0.5 );
3790						},	
3791						success: function( response ) {
3792							// Get Icon
3793							var iconClass = $('<div>').text( current.attr('data-icon') ).html();
3794
3795							// Get Count
3796							var countHTML = response.count;
3797
3798							if ( '' === countHTML.replace(/<\/?[^>]+(>|$)/g, "") ) {
3799								countHTML = '<span class="wpr-post-like-count">' + $('<div>').text( current.attr('data-text') ).html() + '</span>';
3800
3801								if ( ! current.hasClass( 'wpr-likes-zero' ) ) {
3802									current.addClass( 'wpr-likes-zero' );
3803								}
3804							} else {
3805								current.removeClass( 'wpr-likes-zero' );
3806							}
3807
3808							// Update Icon
3809							if ( current.hasClass( 'wpr-already-liked' ) ) {
3810								current.prop( 'title', 'Like' );
3811								current.removeClass( 'wpr-already-liked' );
3812								current.html( '<i class="'+ iconClass.replace( 'fas', 'far' ) +'"></i>' + countHTML );
3813							} else {
3814								current.prop( 'title', 'Unlike' );
3815								current.addClass( 'wpr-already-liked' );
3816								current.html( '<i class="'+ iconClass.replace( 'far', 'fas' ) +'"></i>' + countHTML );
3817							}
3818
3819							current.fadeTo( 500, 1 );
3820						}
3821					});
3822
3823					}
3824
3825					return false;
3826				});
3827
3828			}
3829
3830		}, // End widgetMagazineGrid
3831
3832		widgetFeaturedMedia: function( $scope ) {
3833			var gallery = $scope.find( '.wpr-gallery-slider' ),
3834				gallerySettings = gallery.attr( 'data-slick' );
3835			
3836			gallery.animate({ 'opacity' : '1' }, 1000 );
3837
3838			if ( '[]' !== gallerySettings ) {
3839				gallery.slick({
3840					appendDots : $scope.find( '.wpr-gallery-slider-dots' ),
3841					customPaging : function ( slider, i ) {
3842						var slideNumber = (i + 1),
3843							totalSlides = slider.slideCount;
3844
3845						return '<span class="wpr-gallery-slider-dot"></span>';
3846					}
3847				});
3848			}
3849
3850			// Lightbox
3851			var lightboxSettings = $( '.wpr-featured-media-image' ).attr( 'data-lightbox' );
3852
3853			if ( typeof lightboxSettings !== typeof undefined && lightboxSettings !== false && ! WprElements.editorCheck() ) {
3854				var MediaWrap = $scope.find( '.wpr-featured-media-wrap' );
3855					lightboxSettings = JSON.parse( lightboxSettings );
3856
3857				// Init Lightbox
3858				MediaWrap.lightGallery( lightboxSettings );
3859
3860				// Show/Hide Controls
3861				MediaWrap.on( 'onAferAppendSlide.lg, onAfterSlide.lg', function( event, prevIndex, index ) {
3862					var lightboxControls = $( '#lg-actual-size, #lg-zoom-in, #lg-zoom-out, #lg-download' ),
3863						lightboxDownload = $( '#lg-download' ).attr( 'href' );
3864
3865					if ( $( '#lg-download' ).length ) {
3866						if ( -1 === lightboxDownload.indexOf( 'wp-content' ) ) {
3867							lightboxControls.addClass( 'wpr-hidden-element' );
3868						} else {
3869							lightboxControls.removeClass( 'wpr-hidden-element' );
3870						}
3871					}
3872
3873					// Autoplay Button
3874					if ( '' === lightboxSettings.autoplay ) {
3875						$( '.lg-autoplay-button' ).css({
3876							 'width' : '0',
3877							 'height' : '0',
3878							 'overflow' : 'hidden'
3879						});
3880					}
3881				});
3882			}
3883		}, // End widgetFeaturedMedia
3884        
3885        widgetProductMedia: function( $scope ) {
3886			// Fix Main Slider Distortion
3887			$(document).ready(function($) {
3888				$(window).trigger('resize');
3889				setTimeout(function() {
3890					$(window).trigger('resize');
3891					$scope.find('.wpr-product-media-wrap').removeClass('wpr-zero-opacity');
3892				}, 1000);
3893			});
3894
3895			var sliderIcons = $scope.find('.wpr-gallery-slider-arrows-wrap');
3896
3897			sliderIcons.remove();
3898
3899			if ( $scope.find('.woocommerce-product-gallery__trigger').length ) {
3900				$scope.find('.woocommerce-product-gallery__trigger').remove();
3901			}
3902
3903			$scope.find('.flex-viewport').append(sliderIcons);
3904			
3905			$scope.find('.wpr-gallery-slider-arrow').on('click', function() {
3906				if ($(this).hasClass('wpr-gallery-slider-prev-arrow')) {
3907					$scope.find('a.flex-prev').trigger('click');
3908				} else if ($(this).hasClass('wpr-gallery-slider-next-arrow')) {
3909					$scope.find('a.flex-next').trigger('click');
3910				}
3911			});
3912		
3913			// Lightbox
3914			var lightboxSettings = $( '.wpr-product-media-wrap' ).attr( 'data-lightbox' );
3915		
3916			if ( typeof lightboxSettings !== typeof undefined && lightboxSettings !== false && ! WprElements.editorCheck() ) {
3917				
3918				$scope.find('.woocommerce-product-gallery__image').each(function() {
3919					$(this).attr('data-lightbox', lightboxSettings);
3920					$(this).attr('data-src', $(this).find('a').attr('href'));
3921				});
3922
3923
3924				$scope.find('.woocommerce-product-gallery__image').on('click', function(e) {
3925					e.stopPropagation();
3926				});
3927
3928				$scope.find('.wpr-product-media-lightbox').on('click', function() {
3929					$scope.find('.woocommerce-product-gallery__image').trigger('click');
3930				});
3931
3932				var MediaWrap = $scope.find( '.woocommerce-product-gallery__wrapper' );
3933					lightboxSettings = JSON.parse( lightboxSettings );
3934		
3935				// Init Lightbox
3936				MediaWrap.lightGallery( lightboxSettings );
3937		
3938				// Show/Hide Controls
3939				MediaWrap.on( 'onAferAppendSlide.lg, onAfterSlide.lg', function( event, prevIndex, index ) {
3940					var lightboxControls = $( '#lg-actual-size, #lg-zoom-in, #lg-zoom-out, #lg-download' ),
3941						lightboxDownload = $( '#lg-download' ).attr( 'href' );
3942		
3943					if ( $( '#lg-download' ).length ) {
3944						if ( -1 === lightboxDownload.indexOf( 'wp-content' ) ) {
3945							lightboxControls.addClass( 'wpr-hidden-element' );
3946						} else {
3947							lightboxControls.removeClass( 'wpr-hidden-element' );
3948						}
3949					}
3950		
3951					// Autoplay Button
3952					if ( '' === lightboxSettings.autoplay ) {
3953						$( '.lg-autoplay-button' ).css({
3954							 'width' : '0',
3955							 'height' : '0',
3956							 'overflow' : 'hidden'
3957						});
3958					}
3959				});
3960			}
3961
3962			if ( $scope.hasClass('wpr-product-media-thumbs-slider') && $scope.hasClass('wpr-product-media-thumbs-vertical') ) {
3963
3964				var thumbsToShow = $scope.find('.wpr-product-media-wrap').data('slidestoshow');
3965				var thumbsToScroll = +$scope.find('.wpr-product-media-wrap').data('slidestoscroll');
3966	
3967				$scope.find('.flex-control-nav').css('height', ((100/thumbsToShow) * $scope.find('.flex-control-nav li').length) + '%');
3968
3969				$scope.find('.flex-control-nav').wrap('<div class="wpr-fcn-wrap"></div>');
3970
3971				var thumbIcon1 = $scope.find('.wpr-thumbnail-slider-prev-arrow');
3972				var thumbIcon2 = $scope.find('.wpr-thumbnail-slider-next-arrow');
3973	
3974				thumbIcon1.remove();
3975				thumbIcon2.remove();
3976
3977				if ( $scope.find('.wpr-product-media-wrap').data('slidestoshow') < $scope.find('.flex-control-nav li').length ) {
3978					$scope.find('.wpr-fcn-wrap').prepend(thumbIcon1);
3979					$scope.find('.wpr-fcn-wrap').append(thumbIcon2);
3980				}
3981
3982				var posy = 0;
3983				var slideCount = 0;
3984	
3985				$scope.find('.wpr-thumbnail-slider-next-arrow').on('click', function() {
3986						// var currTrans =  $scope.find('.flex-control-nav').css('transform') != 'none' ? $scope.find('.flex-control-nav').css('transform').split(/[()]/
3986)[1] : 0;
3987						// posx = currTrans ? currTrans.split(',')[4] : 0;
3988						if ( (slideCount + thumbsToScroll) < $scope.find('.flex-control-nav li').length - 1 ) {
3989							posy++;
3990							slideCount = slideCount + thumbsToScroll;
3991							$scope.find('.flex-control-nav').css('transform', 'translateY('+ (parseInt(-posy) * (parseInt($scope.find('.flex-control-nav li:last-child').css('height').slice(0, -2)) + parseInt($scope.find('.flex-control-nav li').css('margin-bottom'))) * thumbsToScroll) +'px)');
3992							if ( posy >= 1 ) {
3993								$scope.find('.wpr-thumbnail-slider-prev-arrow').attr('disabled', false);
3994							} else {
3995								$scope.find('.wpr-thumbnail-slider-prev-arrow').attr('disabled', true);
3996							}
3997						} else {
3998							posy = 0;
3999							slideCount = 0;
4000							$scope.find('.flex-control-nav').css('transform', `translateY(0)`);
4001							$scope.find('.wpr-thumbnail-slider-prev-arrow').attr('disabled', true);
4002						}
4003				});
4004	
4005				$scope.find('.wpr-thumbnail-slider-prev-arrow').on('click', function() {
4006						if ( posy >= 1 ) {
4007							posy--;
4008							if ( posy == 0 ) {
4009								$(this).attr('disabled', true);
4010							}
4011							slideCount = slideCount - thumbsToScroll;
4012							$scope.find('.flex-control-nav').css('transform', 'translateY('+ parseInt(-posy) * (parseInt($scope.find('.flex-control-nav li').css('height').slice(0, -2)) + parseInt($scope.find('.flex-control-nav li:last-child').css('margin-top'))) * thumbsToScroll +'px)');
4013							if ( slideCount < $scope.find('.flex-control-nav li').length - 1 ) {
4014								$scope.find('.wpr-thumbnail-slider-next-arrow').attr('disabled', false);
4015							} else {
4016								$scope.find('.wpr-thumbnail-slider-next-arrow').attr('disabled', true);
4017							}
4018						} else {
4019							// slideCount = $scope.find('.flex-control-nav li').length - 1;
4020							// $scope.find('.flex-control-nav').css('transform', `translateX(0)`);
4021							$(this).attr('disabled', true);
4022						}
4023				});
4024			}
4025
4026			if ( $scope.hasClass('wpr-product-media-thumbs-slider') && $scope.find('.wpr-product-media-wrap').hasClass('wpr-product-media-thumbs-horizontal') ) {
4027
4028				var thumbsToShow = $scope.find('.wpr-product-media-wrap').data('slidestoshow');
4029				var thumbsToScroll = +$scope.find('.wpr-product-media-wrap').data('slidestoscroll');
4030	
4031				$scope.find('.flex-control-nav').css('width', ((100/thumbsToShow) * $scope.find('.flex-control-nav li').length) +'%');
4032
4033				$scope.find('.flex-control-nav').wrap('<div class="wpr-fcn-wrap"></div>');
4034
4035				var thumbIcon1 = $scope.find('.wpr-thumbnail-slider-prev-arrow');
4036				var thumbIcon2 = $scope.find('.wpr-thumbnail-slider-next-arrow');
4037	
4038				thumbIcon1.remove();
4039				thumbIcon2.remove();
4040
4041				if ( $scope.find('.wpr-product-media-wrap').data('slidestoshow') < $scope.find('.flex-control-nav li').length ) {
4042					$scope.find('.wpr-fcn-wrap').prepend(thumbIcon1);
4043					$scope.find('.wpr-fcn-wrap').append(thumbIcon2);
4044					$scope.find('.wpr-thumbnail-slider-arrow').removeClass('wpr-tsa-hidden');
4045				}
4046
4047				var posx = 0;
4048				var slideCount = 0;
4049				$scope.find('.wpr-thumbnail-slider-prev-arrow').attr('disabled', true);
4050	
4051				$scope.find('.wpr-thumbnail-slider-next-arrow').on('click', function() {
4052						// var currTrans =  $scope.find('.flex-control-nav').css('transform') != 'none' ? $scope.find('.flex-control-nav').css('transform').split(/[()]/)[1] : 0;
4053						// posx = currTrans ? currTrans.split(',')[4] : 0;
4054						if ( (slideCount + thumbsToScroll) < $scope.find('.flex-control-nav li').length - 1 ) {
4055							posx++;
4056							slideCount = slideCount + thumbsToScroll;
4057							$scope.find('.flex-control-nav').css('transform', 'translateX('+ (parseInt(-posx) * (parseInt($scope.find('.flex-control-nav li:last-child').css('width').slice(0, -2)) + parseInt($scope.find('.flex-control-nav li').css('margin-right'))) * thumbsToScroll) +'px)');
4058							if ( posx >= 1 ) {
4059								$scope.find('.wpr-thumbnail-slider-prev-arrow').attr('disabled', false);
4060							} else {
4061								$scope.find('.wpr-thumbnail-slider-prev-arrow').attr('disabled', true);
4062							}
4063						} else {
4064							posx = 0;
4065							slideCount = 0;
4066							$scope.find('.flex-control-nav').css('transform', `translateX(0)`);
4067							$scope.find('.wpr-thumbnail-slider-prev-arrow').attr('disabled', true);
4068						}
4069				});
4070	
4071				$scope.find('.wpr-thumbnail-slider-prev-arrow').on('click', function() {
4072						if ( posx >= 1 ) {
4073							posx--;
4074							if ( posx == 0 ) {
4075								$(this).attr('disabled', true);
4076							}
4077							slideCount = slideCount - thumbsToScroll;
4078							$scope.find('.flex-control-nav').css('transform', 'translateX('+ parseInt(-posx) * (parseInt($scope.find('.flex-control-nav li').css('width').slice(0, -2)) + parseInt($scope.find('.flex-control-nav li').css('margin-right'))) * thumbsToScroll +'px)');
4079							if ( slideCount < $scope.find('.flex-control-nav li').length - 1 ) {
4080								$scope.find('.wpr-thumbnail-slider-next-arrow').attr('disabled', false);
4081							} else {
4082								$scope.find('.wpr-thumbnail-slider-next-arrow').attr('disabled', true);
4083							}
4084						} else {
4085							// slideCount = $scope.find('.flex-control-nav li').length - 1;
4086							// $scope.find('.flex-control-nav').css('transform', `translateX(0)`);
4087							$(this).attr('disabled', true);
4088						}
4089				});
4090
4091			}
4092		}, // End widgetProductMedia
4093
4094		widgetCountDown: function( $scope ) {
4095			var countDownWrap = $scope.children( '.elementor-widget-container' ).children( '.wpr-countdown-wrap' ).length > 0 ? $scope.children( '.elementor-widget-container' ).children( '.wpr-countdown-wrap' ) : $scope.children( '.wpr-countdown-wrap' ),
4096				countDownInterval = null,
4097				dataInterval = countDownWrap.data( 'interval' ),
4098				dataShowAgain = countDownWrap.data( 'show-again' ),
4099				endTime = new Date( dataInterval * 1000);
4100
4101			// Evergreen End Time
4102			if ( 'evergreen' === countDownWrap.data( 'type' ) ) {
4103				var evergreenDate = new Date(),
4104					widgetID = $scope.attr( 'data-id' ),
4105					settings = JSON.parse( localStorage.getItem( 'WprCountDownSettings') ) || {};
4106
4107				// End Time
4108				if ( settings.hasOwnProperty( widgetID ) ) {
4109					if ( Object.keys(settings).length === 0 || dataInterval !== settings[widgetID].interval ) {
4110						endTime = evergreenDate.setSeconds( evergreenDate.getSeconds() + dataInterval );
4111					} else {
4112						endTime = settings[widgetID].endTime;
4113					}
4114				} else {
4115					endTime = evergreenDate.setSeconds( evergreenDate.getSeconds() + dataInterval );
4116				}
4117
4118				if ( endTime + dataShowAgain < evergreenDate.setSeconds( evergreenDate.getSeconds() ) ) {
4119					endTime = evergreenDate.setSeconds( evergreenDate.getSeconds() + dataInterval );
4120				}
4121
4122				// Settings
4123				settings[widgetID] = {
4124					interval: dataInterval,
4125					endTime: endTime
4126				};
4127
4128				// Save Settings in Browser
4129				localStorage.setItem( 'WprCountDownSettings', JSON.stringify( settings ) );
4130			}
4131
4132			// Start CountDown
4133			if ( ! WprElements.editorCheck() ) { //tmp
4134			}
4135			// Init on Load
4136			initCountDown();
4137
4138			// Start CountDown
4139			countDownInterval = setInterval( initCountDown, 1000 );
4140
4141			function initCountDown() {
4142				var timeLeft = endTime - new Date();
4143
4144				var numbers = {
4145					days: Math.floor(timeLeft / (1000 * 60 * 60 * 24)),
4146					hours: Math.floor(timeLeft / (1000 * 60 * 60) % 24),
4147					minutes: Math.floor(timeLeft / 1000 / 60 % 60),
4148					seconds: Math.floor(timeLeft / 1000 % 60)
4149				};
4150
4151				if ( numbers.days < 0 || numbers.hours < 0 || numbers.minutes < 0 ) {
4152					numbers = {
4153						days: 0,
4154						hours: 0,
4155						minutes: 0,
4156						seconds: 0
4157					};
4158				}
4159
4160				$scope.find( '.wpr-countdown-number' ).each(function() {
4161					var number = numbers[ $(this).attr( 'data-item' ) ];
4162
4163					if ( 1 === number.toString().length ) {
4164						number = '0' + number;
4165					}
4166
4167					$(this).text( number );
4168
4169					// Labels
4170					var labels = $(this).next();
4171
4172					if ( labels.length ) {
4173						if ( ! $(this).hasClass( 'wpr-countdown-seconds' ) ) {
4174							var labelText = labels.data( 'text' );
4175
4176							if ( '01' == number ) {
4177								labels.text( labelText.singular );
4178							} else {
4179								labels.text( labelText.plural );
4180							}
4181						}
4182					}
4183				});
4184
4185				// Stop Counting
4186				if ( timeLeft < 0 ) {
4187					clearInterval( countDownInterval );
4188
4189					// Actions
4190					expiredActions();
4191				}
4192			}
4193
4194			function expiredActions() {
4195				var dataActions = countDownWrap.data( 'actions' );
4196
4197				if ( ! WprElements.editorCheck() ) {
4198					
4199					if ( dataActions.hasOwnProperty( 'hide-timer' ) ) {
4200						countDownWrap.hide();
4201					}
4202					
4203					if ( dataActions.hasOwnProperty( 'hide-element' ) ) {
4204						$( dataActions['hide-element'] ).hide();
4205					}
4206					
4207					if ( dataActions.hasOwnProperty( 'message' ) ) {
4208						if ( ! $scope.children( '.elementor-widget-container' ).children( '.wpr-countdown-message' ).length && ! $scope.children( '.wpr-countdown-message' ).length ) {
4209							// Sanitize message to prevent XSS
4210							var sanitizedMessage = WprElements.sanitizeHTMLContent(dataActions['message']);
4211							countDownWrap.after( '<div class="wpr-countdown-message">'+ sanitizedMessage +'</div>' );
4212						}
4213					}
4214					
4215					if ( dataActions.hasOwnProperty( 'redirect' ) ) {
4216						var url = new URL(dataActions['redirect']);
4217    
4218						// Define a list of allowed protocols
4219						var allowedProtocols = ['http:', 'https:'];
4220
4221						// Check if the URL's protocol is allowed
4222						if (allowedProtocols.includes(url.protocol)) {
4223							window.location.href = url.href;
4224						}
4225					}
4226
4227					if ( dataActions.hasOwnProperty( 'load-template' ) ) {
4228						// countDownWrap.parent().find( '.elementor-inner' ).parent().show();
4229						countDownWrap.next('.elementor').show();
4230					}
4231
4232				}
4233				
4234			}
4235
4236		}, // End widgetCountDown
4237
4238		widgetGoogleMaps: function( $scope ) {
4239			var googleMap = $scope.find( '.wpr-google-map' );
4240
4241			if ( googleMap.data('integration-type') && 'without_api_key' === googleMap.data('integration-type') ) {
4242				return;
4243			}
4244
4245			var settings = googleMap.data( 'settings' ),
4246				controls = googleMap.data( 'controls' ),
4247				locations = googleMap.data( 'locations' ),
4248				gMarkers = [],
4249				bounds = new google.maps.LatLngBounds();
4250
4251			// Create Map
4252			var map = new google.maps.Map( googleMap[0], {
4253				mapTypeId: settings.type,
4254				styles: get_map_style( settings ),
4255				zoom: settings.zoom_depth,
4256				gestureHandling: settings.zoom_on_scroll,
4257
4258				// UI
4259				mapTypeControl: controls.type,
4260				fullscreenControl: controls.fullscreen,
4261                zoomControl: controls.zoom,
4262                streetViewControl: controls.streetview,
4263			} );
4264
4265			// Set Markers
4266			for ( var i = 0; i < locations.length; i++ ) {
4267				var data = locations[i],
4268					iconOptions = '',
4269					iconSizeW = data.gm_marker_icon_size_width.size,
4270					iconSizeH = data.gm_marker_icon_size_height.size;
4271
4272				// Empty Values
4273				if ( '' == data.gm_latitude || '' == data.gm_longtitude ) {
4274					continue;
4275				}
4276
4277				// Custom Icon
4278				if ( 'yes' === data.gm_custom_marker ) {
4279					iconOptions = {
4280						url: data.gm_marker_icon.url,
4281						scaledSize: new google.maps.Size( iconSizeW, iconSizeH ),
4282					};
4283				}
4284
4285				// Marker
4286				var marker = new google.maps.Marker({
4287					map: map,
4288					position: new google.maps.LatLng( parseFloat( data.gm_latitude ), parseFloat( data.gm_longtitude ) ),
4289					animation: google.maps.Animation[data.gm_marker_animation],
4290					icon: iconOptions
4291				});
4292
4293				// Info Window
4294				if ( 'none' !== data.gm_show_info_window ) {
4295					infoWindow( marker, data );
4296				}
4297
4298				gMarkers.push(marker);
4299				bounds.extend(marker.position);
4300			}
4301
4302			// Center Map
4303			if ( locations.length > 1 ) {
4304				map.fitBounds(bounds);
4305				// Add listener to override zoom with user-defined zoom_depth after bounds are set
4306				google.maps.event.addListenerOnce(map, 'bounds_changed', function() {
4307					if (settings.zoom_depth) {
4308						map.setZoom(parseInt(settings.zoom_depth));
4309					}
4310				});
4311			} else {
4312				map.setCenter( bounds.getCenter() );
4313			}
4314
4315			// Marker Clusters
4316			if ( 'yes' === settings.cluster_markers ) {
4317				var markerCluster = new MarkerClusterer(map, gMarkers, {
4318					imagePath: settings.clusters_url
4319				});
4320			}
4321
4322			// Info Wondow
4323			function infoWindow( marker, data ) {
4324				var content = '<div class="wpr-gm-iwindow"><h3>'+ data.gm_location_title +'</h3><p>'+ data.gm_location_description +'</p></div>',
4325					iWindow = new google.maps.InfoWindow({
4326						content: content,
4327						maxWidth: data.gm_info_window_width.size
4328					});
4329
4330				if ( 'load' === data.gm_show_info_window ) {
4331					iWindow.open( map, marker );
4332				} else {
4333					marker.addListener( 'click', function() {
4334						iWindow.open( map, marker );
4335					});
4336				}
4337			}
4338
4339			// Map Styles
4340			function get_map_style( settings ) {
4341				var style;
4342
4343				switch ( settings.style ) {
4344					case 'simple':
4345						style = JSON.parse('[{"featureType":"road","elementType":"geometry","stylers":[{"visibility":"off"}]},{"featureType":"poi","elementType":"geometry","stylers":[{"visibility":"off"}]},{"featureType":"landscape","elementType":"geometry","stylers":[{"color":"#fffffa"}]},{"featureType":"water","stylers":[{"lightness":50}]},{"featureType":"road","elementType":"labels","stylers":[{"visibility":"off"}]},{"featureType":"transit","stylers":[{"visibility":"off"}]},{"featureType":"administrative","elementType":"geometry","stylers":[{"lightness":40}]}]');
4346						break;
4347					case 'white-black':
4348						style = JSON.parse('[{"featureType":"road","elementType":"labels","stylers":[{"visibility":"on"}]},{"featureType":"poi","stylers":[{"visibility":"off"}]},{"featureType":"administrative","stylers":[{"visibility":"off"}]},{"featureType":"road","elementType":"geometry.fill","stylers":[{"color":"#000000"},{"weight":1}]},{"featureType":"road","elementType":"geometry.stroke","stylers":[{"color":"#000000"},{"weight":0.8}]},{"featureType":"landscape","stylers":[{"color":"#ffffff"}]},{"featureType":"water","stylers":[{"visibility":"off"}]},{"featureType":"transit","stylers":[{"visibility":"off"}]},{"elementType":"labels","stylers":[{"visibility":"off"}]},{"elementType":"labels.text","stylers":[{"visibility":"on"}]},{"elementType":"labels.text.stroke","stylers":[{"color":"#ffffff"}]},{"elementType":"labels.text.fill","stylers":[{"color":"#000000"}]},{"elementType":"labels.icon","stylers":[{"visibility":"on"}]}]');
4349						break;
4350					case 'light-silver':
4351						style = JSON.parse('[{"featureType":"water","elementType":"geometry","stylers":[{"color":"#e9e9e9"},{"lightness":17}]},{"featureType":"landscape","elementType":"geometry","stylers":[{"color":"#f5f5f5"},{"lightness":20}]},{"featureType":"road.highway","elementType":"geometry.fill","stylers":[{"color":"#ffffff"},{"lightness":17}]},{"featureType":"road.highway","elementType":"geometry.stroke","stylers":[{"color":"#ffffff"},{"lightness":29},{"weight":0.2}]},{"featureType":"road.arterial","elementType":"geometry","stylers":[{"color":"#ffffff"},{"lightness":18}]},{"featureType":"road.local","elementType":"geometry","stylers":[{"color":"#ffffff"},{"lightness":16}]},{"featureType":"poi","elementType":"geometry","stylers":[{"color":"#f5f5f5"},{"lightness":21}]},{"featureType":"poi.park","elementType":"geometry","stylers":[{"color":"#dedede"},{"lightness":21}]},{"elementType":"labels.text.stroke","stylers":[{"visibility":"on"},{"color":"#ffffff"},{"lightness":16}]},{"elementType":"labels.text.fill","stylers":[{"saturation":36},{"color":"#333333"},{"lightness":40}]},{"elementType":"labels.icon","stylers":[{"visibility":"off"}]},{"featureType":"transit","elementType":"geometry","stylers":[{"color":"#f2f2f2"},{"lightness":19}]},{"featureType":"administrative","elementType":"geometry.fill","stylers":[{"color":"#fefefe"},{"lightness":20}]},{"featureType":"administrative","elementType":"geometry.stroke","stylers":[{"color":"#fefefe"},{"lightness":17},{"weight":1.2}]}]');
4352						break;
4353					case 'light-grayscale':
4354						style = JSON.parse('[{"featureType":"all","elementType":"geometry.fill","stylers":[{"weight":"2.00"}]},{"featureType":"all","elementType":"geometry.stroke","stylers":[{"color":"#9c9c9c"}]},{"featureType":"all","elementType":"labels.text","stylers":[{"visibility":"on"}]},{"featureType":"landscape","elementType":"all","stylers":[{"color":"#f2f2f2"}]},{"featureType":"landscape","elementType":"geometry.fill","stylers":[{"color":"#ffffff"}]},{"featureType":"landscape.man_made","elementType":"geometry.fill","stylers":[{"color":"#ffffff"}]},{"featureType":"poi","elementType":"all","stylers":[{"visibility":"off"}]},{"featureType":"road","elementType":"all","stylers":[{"saturation":-100},{"lightness":45}]},{"featureType":"road","elementType":"geometry.fill","stylers":[{"color":"#eeeeee"}]},{"featureType":"road","elementType":"labels.text.fill","stylers":[{"color":"#7b7b7b"}]},{"featureType":"road","elementType":"labels.text.stroke","stylers":[{"color":"#ffffff"}]},{"featureType":"road.highway","elementType":"all","stylers":[{"visibility":"simplified"}]},{"featureType":"road.arterial","elementType":"labels.icon","stylers":[{"visibility":"off"}]},{"featureType":"transit","elementType":"all","stylers":[{"visibility":"off"}]},{"featureType":"water","elementType":"all","stylers":[{"color":"#46bcec"},{"visibility":"on"}]},{"featureType":"water","elementType":"geometry.fill","stylers":[{"color":"#c8d7d4"}]},{"featureType":"water","elementType":"labels.text.fill","stylers":[{"color":"#070707"}]},{"featureType":"water","elementType":"labels.text.stroke","stylers":[{"color":"#ffffff"}]}]');
4355						break;
4356					case 'subtle-grayscale':
4357						style = JSON.parse('[{"featureType":"administrative","elementType":"all","stylers":[{"saturation":"-100"}]},{"featureType":"administrative.province","elementType":"all","stylers":[{"visibility":"off"}]},{"featureType":"landscape","elementType":"all","stylers":[{"saturation":-100},{"lightness":65},{"visibility":"on"}]},{"featureType":"poi","elementType":"all","stylers":[{"saturation":-100},{"lightness":"50"},{"visibility":"simplified"}]},{"featureType":"road","elementType":"all","stylers":[{"saturation":"-100"}]},{"featureType":"road.highway","elementType":"all","stylers":[{"visibility":"simplified"}]},{"featureType":"road.arterial","elementType":"all","stylers":[{"lightness":"30"}]},{"featureType":"road.local","elementType":"all","stylers":[{"lightness":"40"}]},{"featureType":"transit","elementType":"all","stylers":[{"saturation":-100},{"visibility":"simplified"}]},{"featureType":"water","elementType":"geometry","stylers":[{"hue":"#ffff00"},{"lightness":-25},{"saturation":-97}]},{"featureType":"water","elementType":"labels","stylers":[{"lightness":-25},{"saturation":-100}]}]');
4358						break;
4359					case 'mostly-white':
4360						style = JSON.parse('[{"featureType":"administrative","elementType":"labels.text.fill","stylers":[{"color":"#6195a0"}]},{"featureType":"landscape","elementType":"all","stylers":[{"color":"#f2f2f2"}]},{"featureType":"landscape","elementType":"geometry.fill","stylers":[{"color":"#ffffff"}]},{"featureType":"poi","elementType":"all","stylers":[{"visibility":"off"}]},{"featureType":"poi.park","elementType":"geometry.fill","stylers":[{"color":"#e6f3d6"},{"visibility":"on"}]},{"featureType":"road","elementType":"all","stylers":[{"saturation":-100},{"lightness":45},{"visibility":"simplified"}]},{"featureType":"road.highway","elementType":"all","stylers":[{"visibility":"simplified"}]},{"featureType":"road.highway","elementType":"geometry.fill","stylers":[{"color":"#f4d2c5"},{"visibility":"simplified"}]},{"featureType":"road.highway","elementType":"labels.text","stylers":[{"color":"#4e4e4e"}]},{"featureType":"road.arterial","elementType":"geometry.fill","stylers":[{"color":"#f4f4f4"}]},{"featureType":"road.arterial","elementType":"labels.text.fill","stylers":[{"color":"#787878"}]},{"featureType":"road.arterial","elementType":"labels.icon","stylers":[{"visibility":"off"}]},{"featureType":"transit","elementType":"all","stylers":[{"visibility":"off"}]},{"featureType":"water","elementType":"all","stylers":[{"color":"#eaf6f8"},{"visibility":"on"}]},{"featureType":"water","elementType":"geometry.fill","stylers":[{"color":"#eaf6f8"}]}]');
4361						break;
4362					case 'mostly-green':
4363						style = JSON.parse('[{"featureType":"landscape.man_made","elementType":"geometry","stylers":[{"color":"#f7f1df"}]},{"featureType":"landscape.natural","elementType":"geometry","stylers":[{"color":"#d0e3b4"}]},{"featureType":"landscape.natural.terrain","elementType":"geometry","stylers":[{"visibility":"off"}]},{"featureType":"poi","elementType":"labels","stylers":[{"visibility":"off"}]},{"featureType":"poi.business","elementType":"all","stylers":[{"visibility":"off"}]},{"featureType":"poi.medical","elementType":"geometry","stylers":[{"color":"#fbd3da"}]},{"featureType":"poi.park","elementType":"geometry","stylers":[{"color":"#bde6ab"}]},{"featureType":"road","elementType":"geometry.stroke","stylers":[{"visibility":"off"}]},{"featureType":"road","elementType":"labels","stylers":[{"visibility":"off"}]},{"featureType":"road.highway","elementType":"geometry.fill","stylers":[{"color":"#ffe15f"}]},{"featureType":"road.highway","elementType":"geometry.stroke","stylers":[{"color":"#efd151"}]},{"featureType":"road.arterial","elementType":"geometry.fill","stylers":[{"color":"#ffffff"}]},{"featureType":"road.local","elementType":"geometry.fill","stylers":[{"color":"black"}]},{"featureType":"transit.station.airport","elementType":"geometry.fill","stylers":[{"color":"#cfb2db"}]},{"featureType":"water","elementType":"geometry","stylers":[{"color":"#a2daf2"}]}]');
4364						break;
4365					case 'neutral-blue':
4366						style = JSON.parse('[{"featureType":"water","elementType":"geometry","stylers":[{"color":"#193341"}]},{"featureType":"landscape","elementType":"geometry","stylers":[{"color":"#2c5a71"}]},{"featureType":"road","elementType":"geometry","stylers":[{"color":"#29768a"},{"lightness":-37}]},{"featureType":"poi","elementType":"geometry","stylers":[{"color":"#406d80"}]},{"featureType":"transit","elementType":"geometry","stylers":[{"color":"#406d80"}]},{"elementType":"labels.text.stroke","stylers":[{"visibility":"on"},{"color":"#3e606f"},{"weight":2},{"gamma":0.84}]},{"elementType":"labels.text.fill","stylers":[{"color":"#ffffff"}]},{"featureType":"administrative","elementType":"geometry","stylers":[{"weight":0.6},{"color":"#1a3541"}]},{"elementType":"labels.icon","stylers":[{"visibility":"off"}]},{"featureType":"poi.park","elementType":"geometry","stylers":[{"color":"#2c5a71"}]}]');
4367						break;
4368					case 'blue-water':
4369						style = JSON.parse('[{"featureType":"administrative","elementType":"labels.text.fill","stylers":[{"color":"#444444"}]},{"featureType":"landscape","elementType":"all","stylers":[{"color":"#f2f2f2"}]},{"featureType":"poi","elementType":"all","stylers":[{"visibility":"off"}]},{"featureType":"road","elementType":"all","stylers":[{"saturation":-100},{"lightness":45}]},{"featureType":"road.highway","elementType":"all","stylers":[{"visibility":"simplified"}]},{"featureType":"road.arterial","elementType":"labels.icon","stylers":[{"visibility":"off"}]},{"featureType":"transit","elementType":"all","stylers":[{"visibility":"off"}]},{"featureType":"water","elementType":"all","stylers":[{"color":"#46bcec"},{"visibility":"on"}]}]');
4370						break;
4371					case 'blue-essense':
4372						style = JSON.parse('[{"featureType":"landscape.natural","elementType":"geometry.fill","stylers":[{"visibility":"on"},{"color":"#e0efef"}]},{"featureType":"poi","elementType":"geometry.fill","stylers":[{"visibility":"on"},{"hue":"#1900ff"},{"color":"#c0e8e8"}]},{"featureType":"road","elementType":"geometry","stylers":[{"lightness":100},{"visibility":"simplified"}]},{"featureType":"road","elementType":"labels","stylers":[{"visibility":"off"}]},{"featureType":"transit.line","elementType":"geometry","stylers":[{"visibility":"on"},{"lightness":700}]},{"featureType":"water","elementType":"all","stylers":[{"color":"#7dcdcd"}]}]');
4373						break;
4374					case 'golden-brown':
4375						style = JSON.parse('[{"featureType":"all","elementType":"all","stylers":[{"color":"#ff7000"},{"lightness":"69"},{"saturation":"100"},{"weight":"1.17"},{"gamma":"2.04"}]},{"featureType":"all","elementType":"geometry","stylers":[{"color":"#cb8536"}]},{"featureType":"all","elementType":"labels","stylers":[{"color":"#ffb471"},{"lightness":"66"},{"saturation":"100"}]},{"featureType":"all","elementType":"labels.text.fill","stylers":[{"gamma":0.01},{"lightness":20}]},{"featureType":"all","elementType":"labels.text.stroke","stylers":[{"saturation":-31},{"lightness":-33},{"weight":2},{"gamma":0.8}]},{"featureType":"all","elementType":"labels.icon","stylers":[{"visibility":"off"}]},{"featureType":"landscape","elementType":"all","stylers":[{"lightness":"-8"},{"gamma":"0.98"},{"weight":"2.45"},{"saturation":"26"}]},{"featureType":"landscape","elementType":"geometry","stylers":[{"lightness":30},{"saturation":30}]},{"featureType":"poi","elementType":"geometry","stylers":[{"saturation":20}]},{"featureType":"poi.park","elementType":"geometry","stylers":[{"lightness":20},{"saturation":-20}]},{"featureType":"road","elementType":"geometry","stylers":[{"lightness":10}
4375,{"saturation":-30}]},{"featureType":"road","elementType":"geometry.stroke","stylers":[{"saturation":25},{"lightness":25}]},{"featureType":"water","elementType":"all","stylers":[{"lightness":-20},{"color":"#ecc080"}]}]');
4376						break;
4377					case 'midnight-commander':
4378						style = JSON.parse('[{"featureType":"all","elementType":"labels.text.fill","stylers":[{"color":"#ffffff"}]},{"featureType":"all","elementType":"labels.text.stroke","stylers":[{"color":"#000000"},{"lightness":13}]},{"featureType":"administrative","elementType":"geometry.fill","stylers":[{"color":"#000000"}]},{"featureType":"administrative","elementType":"geometry.stroke","stylers":[{"color":"#144b53"},{"lightness":14},{"weight":1.4}]},{"featureType":"landscape","elementType":"all","stylers":[{"color":"#08304b"}]},{"featureType":"poi","elementType":"geometry","stylers":[{"color":"#0c4152"},{"lightness":5}]},{"featureType":"road.highway","elementType":"geometry.fill","stylers":[{"color":"#000000"}]},{"featureType":"road.highway","elementType":"geometry.stroke","stylers":[{"color":"#0b434f"},{"lightness":25}]},{"featureType":"road.arterial","elementType":"geometry.fill","stylers":[{"color":"#000000"}]},{"featureType":"road.arterial","elementType":"geometry.stroke","stylers":[{"color":"#0b3d51"},{"lightness":16}]},{"featureType":"road.local","elementType":"geometry","stylers":[{"color":"#000000"}]},{"featureType":"transit","elementType":"all","stylers":[{"color":"#146474"}]},{"featureType":"water","elementType":"all","stylers":[{"color":"#021019"}]}]');
4379						break;
4380					case 'shades-of-grey':
4381						style = JSON.parse('[{"featureType":"all","elementType":"labels.text.fill","stylers":[{"saturation":36},{"color":"#000000"},{"lightness":40}]},{"featureType":"all","elementType":"labels.text.stroke","stylers":[{"visibility":"on"},{"color":"#000000"},{"lightness":16}]},{"featureType":"all","elementType":"labels.icon","stylers":[{"visibility":"off"}]},{"featureType":"administrative","elementType":"geometry.fill","stylers":[{"color":"#000000"},{"lightness":20}]},{"featureType":"administrative","elementType":"geometry.stroke","stylers":[{"color":"#000000"},{"lightness":17},{"weight":1.2}]},{"featureType":"landscape","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":20}]},{"featureType":"poi","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":21}]},{"featureType":"road.highway","elementType":"geometry.fill","stylers":[{"color":"#000000"},{"lightness":17}]},{"featureType":"road.highway","elementType":"geometry.stroke","stylers":[{"color":"#000000"},{"lightness":29},{"weight":0.2}]},{"featureType":"road.arterial","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":18}]},{"featureType":"road.local","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":16}]},{"featureType":"transit","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":19}]},{"featureType":"water","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":17}]}]');
4382						break;
4383					case 'yellow-black':
4384						style = JSON.parse('[{"featureType":"all","elementType":"labels","stylers":[{"visibility":"on"}]},{"featureType":"all","elementType":"labels.text.fill","stylers":[{"saturation":36},{"color":"#000000"},{"lightness":40}]},{"featureType":"all","elementType":"labels.text.stroke","stylers":[{"visibility":"on"},{"color":"#000000"},{"lightness":16}]},{"featureType":"all","elementType":"labels.icon","stylers":[{"visibility":"off"}]},{"featureType":"administrative","elementType":"geometry.fill","stylers":[{"color":"#000000"},{"lightness":20}]},{"featureType":"administrative","elementType":"geometry.stroke","stylers":[{"color":"#000000"},{"lightness":17},{"weight":1.2}]},{"featureType":"administrative.country","elementType":"labels.text.fill","stylers":[{"color":"#e5c163"}]},{"featureType":"administrative.locality","elementType":"labels.text.fill","stylers":[{"color":"#c4c4c4"}]},{"featureType":"administrative.neighborhood","elementType":"labels.text.fill","stylers":[{"color":"#e5c163"}]},{"featureType":"landscape","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":20}]},{"featureType":"poi","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":21},{"visibility":"on"}]},{"featureType":"poi.business","elementType":"geometry","stylers":[{"visibility":"on"}]},{"featureType":"road.highway","elementType":"geometry.fill","stylers":[{"color":"#e5c163"},{"lightness":"0"}]},{"featureType":"road.highway","elementType":"geometry.stroke","stylers":[{"visibility":"off"}]},{"featureType":"road.highway","elementType":"labels.text.fill","stylers":[{"color":"#ffffff"}]},{"featureType":"road.highway","elementType":"labels.text.stroke","stylers":[{"color":"#e5c163"}]},{"featureType":"road.arterial","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":18}]},{"featureType":"road.arterial","elementType":"geometry.fill","stylers":[{"color":"#575757"}]},{"featureType":"road.arterial","elementType":"labels.text.fill","stylers":[{"color":"#ffffff"}]},{"featureType":"road.arterial","elementType":"labels.text.stroke","stylers":[{"color":"#2c2c2c"}]},{"featureType":"road.local","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":16}]},{"featureType":"road.local","elementType":"labels.text.fill","stylers":[{"color":"#999999"}]},{"featureType":"transit","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":19}]},{"featureType":"water","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":17}]}]');
4385						break;
4386					case 'custom':
4387						style = JSON.parse( settings.custom_style );
4388						break;
4389					default:
4390						style = '';
4391				}
4392
4393				return style;
4394			}
4395
4396		}, // End widgetGoogleMaps
4397
4398		widgetBeforeAfter: function( $scope ) {
4399			var imagesWrap = $scope.find( '.wpr-ba-image-container' ),
4400				imageOne = imagesWrap.find( '.wpr-ba-image-1' ),
4401				imageTwo = imagesWrap.find( '.wpr-ba-image-2' ),
4402				divider = imagesWrap.find( '.wpr-ba-divider' ),
4403				startPos = imagesWrap.attr( 'data-position' );
4404
4405			// Horizontal
4406			if ( imagesWrap.hasClass( 'wpr-ba-horizontal' ) ) {
4407				// On Load
4408				divider.css( 'left', startPos +'%' );
4409				imageTwo.css( 'left', startPos +'%' );
4410				imageTwo.find( 'img' ).css( 'right', startPos +'%' );
4411
4412				// On Move
4413				divider.on( 'move', function(e) {
4414					var overlayWidth = e.pageX - imagesWrap.offset().left;
4415
4416					// Reset
4417					divider.css({
4418						'left' : 'auto',
4419						'right' : 'auto'
4420					});
4421					imageTwo.css({
4422						'left' : 'auto',
4423						'right' : 'auto'
4424					});
4425
4426					if ( overlayWidth > 0  && overlayWidth < imagesWrap.outerWidth() ) {
4427						divider.css( 'left', overlayWidth );
4428						imageTwo.css( 'left', overlayWidth );
4429						imageTwo.find( 'img' ).css( 'right', overlayWidth );
4430					} else {
4431						if ( overlayWidth <= 0 ) {
4432							divider.css( 'left', 0 );
4433							imageTwo.css( 'left', 0 );
4434							imageTwo.find( 'img' ).css( 'right', 0 );
4435						} else if ( overlayWidth >= imagesWrap.outerWidth() ) {
4436							divider.css( 'right', - divider.outerWidth() / 2 );
4437							imageTwo.css( 'right', 0 );
4438							imageTwo.find( 'img' ).css( 'right', '100%' );
4439						}
4440					}
4441
4442					hideLabelsOnTouch();
4443				});
4444
4445			// Vertical
4446			} else {
4447				// On Load
4448				divider.css( 'top', startPos +'%' );
4449				imageTwo.css( 'top', startPos +'%' );
4450				imageTwo.find( 'img' ).css( 'bottom', startPos +'%' );
4451
4452				// On Move
4453				divider.on( 'move', function(e) {
4454					var overlayWidth = e.pageY - imagesWrap.offset().top;
4455
4456					// Reset
4457					divider.css({
4458						'top' : 'auto',
4459						'bottom' : 'auto'
4460					});
4461					imageTwo.css({
4462						'top' : 'auto',
4463						'bottom' : 'auto'
4464					});
4465
4466					if ( overlayWidth > 0  && overlayWidth < imagesWrap.outerHeight() ) {
4467						divider.css( 'top', overlayWidth );
4468						imageTwo.css( 'top', overlayWidth );
4469						imageTwo.find( 'img' ).css( 'bottom', overlayWidth );
4470					} else {
4471						if ( overlayWidth <= 0 ) {
4472							divider.css( 'top', 0 );
4473							imageTwo.css( 'top', 0 );
4474							imageTwo.find( 'img' ).css( 'bottom', 0 );
4475						} else if ( overlayWidth >= imagesWrap.outerHeight() ) {
4476							divider.css( 'bottom', - divider.outerHeight() / 2 );
4477							imageTwo.css( 'bottom', 0 );
4478							imageTwo.find( 'img' ).css( 'bottom', '100%' );
4479						}
4480					}
4481
4482					hideLabelsOnTouch();
4483				});
4484			}
4485
4486			// Mouse Hover
4487			if ( 'mouse' === imagesWrap.attr( 'data-trigger' ) ) {
4488
4489				imagesWrap.on( 'mousemove', function( event ) {
4490
4491					// Horizontal
4492					if ( imagesWrap.hasClass( 'wpr-ba-horizontal' ) ) {
4493						var overlayWidth = event.pageX - $(this).offset().left;
4494						divider.css( 'left', overlayWidth );
4495						imageTwo.css( 'left', overlayWidth );
4496						imageTwo.find( 'img' ).css( 'right', overlayWidth );
4497
4498					// Vertical
4499					} else {
4500						var overlayWidth = event.pageY - $(this).offset().top;
4501						divider.css( 'top', overlayWidth );
4502						imageTwo.css( 'top', overlayWidth );
4503						imageTwo.find( 'img' ).css( 'bottom', overlayWidth );
4504					}
4505
4506					hideLabelsOnTouch();
4507				});
4508
4509			}
4510
4511			// Hide Labels
4512			hideLabelsOnTouch();
4513
4514			function hideLabelsOnTouch() {
4515				var labelOne = imagesWrap.find( '.wpr-ba-label-1 div' ),
4516					labelTwo = imagesWrap.find( '.wpr-ba-label-2 div' );
4517
4518				if ( ! labelOne.length && ! labelTwo.length ) {
4519					return;
4520				}
4521
4522				// Horizontal
4523				if ( imagesWrap.hasClass( 'wpr-ba-horizontal' ) ) {
4524					var labelOneOffset = labelOne.position().left + labelOne.outerWidth(),
4525						labelTwoOffset = labelTwo.position().left + labelTwo.outerWidth();
4526
4527					if ( labelOneOffset + 15 >= parseInt( divider.css( 'left' ), 10 ) ) {
4528						labelOne.stop().css( 'opacity', 0 );
4529					} else {
4530						labelOne.stop().css( 'opacity', 1 );
4531					}
4532
4533					if ( (imagesWrap.outerWidth() - (labelTwoOffset + 15)) <= parseInt( divider.css( 'left' ), 10 ) ) {
4534						labelTwo.stop().css( 'opacity', 0 );
4535					} else {
4536						labelTwo.stop().css( 'opacity', 1 );
4537					}
4538
4539				// Vertical
4540				} else {
4541					var labelOneOffset = labelOne.position().top + labelOne.outerHeight(),
4542						labelTwoOffset = labelTwo.position().top + labelTwo.outerHeight();
4543
4544					if ( labelOneOffset + 15 >
4544= parseInt( divider.css( 'top' ), 10 ) ) {
4545						labelOne.stop().css( 'opacity', 0 );
4546					} else {
4547						labelOne.stop().css( 'opacity', 1 );
4548					}
4549
4550					if ( (imagesWrap.outerHeight() - (labelTwoOffset + 15)) <= parseInt( divider.css( 'top' ), 10 ) ) {
4551						labelTwo.stop().css( 'opacity', 0 );
4552					} else {
4553						labelTwo.stop().css( 'opacity', 1 );
4554					}
4555				}
4556			}
4557
4558		}, // End widgetBeforeAfter
4559
4560		widgetMailchimp: function( $scope ) {
4561			var mailchimpForm = $scope.find( 'form' );
4562
4563			mailchimpForm.on( 'submit', function(e) {
4564				e.preventDefault();
4565
4566				var buttonText = $(this).find('button').text();
4567
4568				// Change Text
4569				$(this).find('button').text( $(this).find('button').data('loading') );
4570
4571				$.ajax({
4572					url: WprConfig.ajaxurl,
4573					type: 'POST',
4574					data: {
4575						action: 'mailchimp_subscribe',
4576						fields: $(this).serialize(),
4577						listId: mailchimpForm.data( 'list-id' )
4578					},
4579					success: function(data) {
4580						if ( 'yes' == mailchimpForm.data('clear-fields') ) {
4581							mailchimpForm.find('input').each(function() {
4582								$(this).val('');
4583							});
4584						}
4585
4586						mailchimpForm.find('button').text( buttonText );
4587
4588						if ( 'subscribed' === data.status ) {
4589							$scope.find( '.wpr-mailchimp-success-message' ).show();
4590						} else {
4591							$scope.find( '.wpr-mailchimp-error-message' ).show();
4592						}
4593						
4594						$scope.find( '.wpr-mailchimp-message' ).fadeIn();
4595					}
4596				});
4597
4598			});
4599
4600		}, // End widgetMailchimp
4601
4602		widgetAdvancedSlider: function( $scope ) {
4603			var $advancedSlider = $scope.find( '.wpr-advanced-slider' ),
4604				sliderData = $advancedSlider.data('slick'),
4605				videoBtnSize = $advancedSlider.data('video-btn-size'),
4606				videoPlays = 'false';
4607			
4608			// customPaging: function(slider, i) { 
4609			// 	return '<span class="wpr-slider-dot" style="background-image:url('+ $(slider.$slides[i]).find('.wpr-slider-item-bg').css('background-image').replace('url(','').replace(')','').replace(/\"/gi, "") +')"></span>';
4610			// },
4611
4612			// Slider Columns
4613			var sliderClass = $scope.attr('class'),
4614				sliderColumnsDesktop = sliderClass.match(/wpr-adv-slider-columns-\d/) ? +sliderClass.match(/wpr-adv-slider-columns-\d/).join().slice(-1) : 2,
4615				sliderColumnsWideScreen = sliderClass.match(/columns--widescreen\d/) ? +sliderClass.match(/columns--widescreen\d/).join().slice(-1) : sliderColumnsDesktop,
4616				sliderColumnsLaptop = sliderClass.match(/columns--laptop\d/) ? +sliderClass.match(/columns--laptop\d/).join().slice(-1) : sliderColumnsDesktop,
4617				sliderColumnsTablet = sliderClass.match(/columns--tablet\d/) ? +sliderClass.match(/columns--tablet\d/).join().slice(-1) : 2,
4618				sliderColumnsTabletExtra = sliderClass.match(/columns--tablet_extra\d/) ? +sliderClass.match(/columns--tablet_extra\d/).join().slice(-1) : sliderColumnsTablet,
4619				sliderColumnsMobileExtra = sliderClass.match(/columns--mobile_extra\d/) ? +sliderClass.match(/columns--mobile_extra\d/).join().slice(-1) : sliderColumnsTablet,
4620				sliderColumnsMobile = sliderClass.match(/columns--mobile\d/) ? +sliderClass.match(/columns--mobile\d/).join().slice(-1) : 1,
4621				sliderSlidesToScroll = +(sliderClass.match(/wpr-adv-slides-to-scroll-\d/).join().slice(-1)),
4622				dataSlideEffect = $advancedSlider.attr('data-slide-effect');
4623
4624			$advancedSlider.on( 'init', function() {
4625				$( this ).css( 'opacity', 1 );
4626				$scope.find( '.slick-current' ).addClass( 'wpr-slick-visible' );
4627
4628				if ( $scope.find( '.wpr-slider-img' ).length !== 0 ) {
4629					$scope.find( '.wpr-advanced-slider' ).css( 'height', $scope.find( '.slick-current' ).outerHeight() );
4630				}
4631
4632				autoplayVideo();
4633			} );
4634
4635			$advancedSlider.slick({
4636				appendArrows :  $scope.find('.wpr-slider-controls'),
4637				appendDots :  $scope.find('.wpr-slider-dots'),
4638				customPaging : function (slider, i) {
4639					var slideNumber = (i + 1),
4640						totalSlides = slider.slideCount;
4641					return '<span class="wpr-slider-dot"></span>';
4642				},
4643				slidesToShow: sliderColumnsDesktop,
4644				responsive: [
4645					{
4646						breakpoint: 10000,
4647						settings: {
4648							slidesToShow: sliderColumnsWideScreen,
4649							slidesToScroll: sliderSlidesToScroll > sliderColumnsWideScreen ? 1 : sliderSlidesToScroll,
4650							fade: (1 == sliderColumnsWideScreen && 'fade' === dataSlideEffect) ? true : false
4651						}
4652					},
4653					{
4654						breakpoint: 2399,
4655						settings: {
4656							slidesToShow: sliderColumnsDesktop,
4657							slidesToScroll: sliderSlidesToScroll > sliderColumnsDesktop ? 1 : sliderSlidesToScroll,
4658							fade: (1 == sliderColumnsDesktop && 'fade' === dataSlideEffect) ? true : false
4659						}
4660					},
4661					{
4662						breakpoint: 1221,
4663						settings: {
4664							slidesToShow: sliderColumnsLaptop,
4665							slidesToScroll: sliderSlidesToScroll > sliderColumnsLaptop ? 1 : sliderSlidesToScroll,
4666							fade: (1 == sliderColumnsLaptop && 'fade' === dataSlideEffect) ? true : false
4667						}
4668					},
4669					{
4670						breakpoint: 1200,
4671						settings: {
4672							slidesToShow: sliderColumnsTabletExtra,
4673							slidesToScroll: sliderSlidesToScroll > sliderColumnsTabletExtra ? 1 : sliderSlidesToScroll,
4674							fade: (1 == sliderColumnsTabletExtra && 'fade' === dataSlideEffect) ? true : false
4675						}
4676					},
4677					{
4678						breakpoint: 1024,
4679						settings: {
4680							slidesToShow: sliderColumnsTablet,
4681							slidesToScroll: sliderSlidesToScroll > sliderColumnsTablet ? 1 : sliderSlidesToScroll,
4682							fade: (1 == sliderColumnsTablet && 'fade' === dataSlideEffect) ? true : false
4683						}
4684					},
4685					{
4686						breakpoint: 880,
4687						settings: {
4688							slidesToShow: sliderColumnsMobileExtra,
4689						 	slidesToScroll: sliderSlidesToScroll > sliderColumnsMobileExtra ? 1 : sliderSlidesToScroll,
4690							fade: (1 == sliderColumnsMobileExtra && 'fade' === dataSlideEffect) ? true : false
4691						}
4692					},
4693					{
4694						breakpoint: 768,
4695						settings: {
4696							slidesToShow: sliderColumnsMobile,
4697							slidesToScroll: sliderSlidesToScroll > sliderColumnsMobile ? 1 : sliderSlidesToScroll,
4698							fade: (1 == sliderColumnsMobile && 'fade' === dataSlideEffect) ? true : false
4699						}
4700					}
4701				],
4702			});
4703
4704			if ( $scope.find( '.wpr-slider-img' ).length !== 0 ) {
4705				$scope.find( '.wpr-slider-arrow' ).on( 'click', function() {
4706					$scope.find( '.wpr-advanced-slider' ).css( 'height', $scope.find( '.slick-current' ).outerHeight() );
4707				} );
4708
4709				$( window ).smartresize( function() {
4710					$scope.find( '.wpr-advanced-slider' ).css( 'height', $scope.find( '.slick-current' ).outerHeight() );
4711				} );
4712			}
4713			
4714			function sliderVideoSize(){
4715				  
4716				// var sliderWidth = $advancedSlider.find('.wpr-slider-item').outerWidth(),
4717				// 	sliderHeight = $advancedSlider.find('.wpr-slider-item').outerHeight(),
4718				// 	sliderRatio = sliderWidth / sliderHeight,
4719				// 	iframeRatio = (16/9),
4720				// 	iframeHeight,
4721				// 	iframeWidth,
4722				// 	iframeTopDistance = 0,
4723				// 	iframeLeftDistance = 0;
4724
4725				// if ( sliderRatio > iframeRatio ) {
4726				// 	iframeWidth = sliderWidth;
4727				// 	iframeHeight = iframeWidth / iframeRatio;
4728				// 	iframeTopDistance = '-'+ ( iframeHeight - sliderHeight ) / 2 +'px';
4729				// } else {
4730				// 	iframeHeight = sliderHeight;
4731				// 	iframeWidth = iframeHeight * iframeRatio;
4732				// 	iframeLeftDistance = '-'+ ( iframeWidth - sliderWidth ) / 2 +'px';
4733				// }
4734
4735				// $advancedSlider.find('iframe').css({
4736				// 	'display': 'block',
4737				// 	'width': iframeWidth +'px',
4738				// 	'height': iframeHeight +'px',
4739				// 	'max-width': 'none',
4740				// 	'position': 'absolute',
4741				// 	'left': iframeLeftDistance +'',
4742				// 	'top': iframeTopDistance +'',
4743				// 	'text-align': 'inherit',
4744				// 	'line-height':'0px',
4745				// 	'border-width': '0px',
4746				// 	'margin': '0px',
4747				// 	'padding': '0px',
4748				// });
4749				
4750				$advancedSlider.find('iframe').attr('width', $scope.find('.wpr-slider-item').width());
4751				$advancedSlider.find('iframe').attr('height', $scope.find('.wpr-slider-item').height());
4752
4753				var viewportWidth = $(window).outerWidth();
4754
4755				var MobileResp = +elementorFrontend.config.responsive.breakpoints.mobile.value;
4756				var MobileExtraResp = +elementorFrontend.config.responsive.breakpoints.mobile_extra.value;
4757				var TabletResp = +elementorFrontend.config.responsive.breakpoints.tablet.value;
4758				var TabletExtraResp = +elementorFrontend.config.responsive.breakpoints.tablet_extra.value;
4759				var LaptopResp = +elementorFrontend.config.responsive.breakpoints.laptop.value;
4760				var wideScreenResp = +elementorFrontend.config.responsive.breakpoints.widescreen.value;
4761
4762				var activeBreakpoints = elementorFrontend.config.responsive.activeBreakpoints;
4763
4764				[...$scope[0].classList].forEach(className => {
4765					if (className.startsWith('wpr-slider-video-icon-size-')) {
4766						$scope[0].classList.remove(className);
4767					}
4768				});
4769
4770				// Mobile
4771				if ( MobileResp >= viewportWidth && activeBreakpoints.mobile != null ) {
4772					$scope.addClass('wpr-slider-video-icon-size-'+videoBtnSize.mobile);
4773				// Mobile Extra
4774				} else if ( MobileExtraResp >= viewportWidth && activeBreakpoints.mobile_extra != null ) {
4775					$scope.addClass('wpr-slider-video-icon-size-'+videoBtnSize.mobile_extra);
4776				// Tablet
4777				} else if ( TabletResp >= viewportWidth && activeBreakpoints.tablet != null ) {
4778					$scope.addClass('wpr-slider-video-icon-size-'+videoBtnSize.tablet);
4779				// Tablet Extra
4780				} else if ( TabletExtraResp >= viewportWidth && activeBreakpoints.tablet_extra != null ) {
4781					$scope.addClass('wpr-slider-video-icon-size-'+videoBtnSize.tablet_extra);
4782				// Laptop
4783				} else if ( LaptopResp >= viewportWidth && activeBreakpoints.laptop != null ) {
4784					$scope.addClass('wpr-slider-video-icon-size-'+videoBtnSize.laptop);
4785				// Desktop
4786				} else if ( wideScreenResp > viewportWidth ) {
4787					$scope.addClass('wpr-slider-video-icon-size-'+videoBtnSize.desktop);
4788				}  else {
4789					$scope.addClass('wpr-slider-video-icon-size-'+videoBtnSize.widescreen);
4790				}
4791				// wpr-slider-video-icon-size-
4792			}
4793
4794			$(window).on('load resize', function(){
4795				sliderVideoSize();
4796			});
4797
4798			function autoplayVideo() {
4799				$advancedSlider.find('.slick-current').each(function() {
4800
4801					var videoSrc = WprElements.sanitizeURL($(this).find('.wpr-slider-item').attr('data-video-src')) || '',
4802						videoAutoplay = $(this).find('.wpr-slider-item').attr('data-video-autoplay');
4803					
4804					if ( $(this).find( '.wpr-slider-video' ).length !== 1 && videoAutoplay === 'yes' ) {
4805						if ( videoSrc.includes('vimeo') || videoSrc.includes('youtube') ) {
4806							if ( sliderColumnsDesktop == 1 ) {
4807								// $(this).find('.wpr-cv-inner').prepend('<div class="wpr-slider-video"><iframe src="'+ videoSrc +'" width="100%" height="100%"  frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>');
4808								$(this).find('.wpr-cv-inner').prepend('<div class="wpr-slider-video"><iframe src="'+ videoSrc +'"  frameborder="0" allow="autoplay" allowfullscreen></iframe></div>');
4809							} else {
4810								$(this).find('.wpr-cv-container').prepend('<div class="wpr-slider-video"><iframe src="'+ videoSrc +'" width="100%" height="100%"  frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>'); 
4811							}
4812							sliderVideoSize();
4813						} else {
4814							var videoMute = WprElements.sanitizeDataAttr($(this).find('.wpr-slider-item').attr('data-video-mute'));
4815							var videoControls = WprElements.sanitizeDataAttr($(this).find('.wpr-slider-item').attr('data-video-controls'));
4816							var videoLoop = WprElements.sanitizeDataAttr($(this).find('.wpr-slider-item').attr('data-video-loop'));
4817
4818							$(this).find('.wpr-cv-inner').prepend('<div class="wpr-slider-video wpr-custom-video">
4818<video autoplay '+ videoLoop + ' ' + videoMute + ' ' + videoControls + ' ' +  'src="'+ videoSrc +'" width="100%" height="100%"></video></div>');
4819							
4820							$advancedSlider.find('video').attr('width', $scope.find('.wpr-slider-item').width());
4821							$advancedSlider.find('video').attr('height', $scope.find('.wpr-slider-item').height());
4822						}
4823
4824						// GOGA - remove condition if not necessary
4825						if ( $(this).find('.wpr-slider-content') && $advancedSlider.data('hide-video-content') === 'yes' ) {
4826							$(this).find('.wpr-slider-content').fadeOut(300);
4827						}
4828					}
4829				});
4830			}
4831
4832			function slideAnimationOff() {
4833				if ( sliderColumnsDesktop == 1 ) {
4834					$advancedSlider.find('.wpr-slider-item').not('.slick-active').find('.wpr-slider-animation').removeClass( 'wpr-animation-enter' );
4835				}
4836			}
4837
4838			function slideAnimationOn() {
4839				$advancedSlider.find('.slick-active').find('.wpr-slider-content').fadeIn(0);
4840				$advancedSlider.find('.slick-cloned').find('.wpr-slider-content').fadeIn(0);
4841				$advancedSlider.find('.slick-current').find('.wpr-slider-content').fadeIn(0);
4842				if ( sliderColumnsDesktop == 1 ) {
4843					$advancedSlider.find('.slick-active').find('.wpr-slider-animation').addClass( 'wpr-animation-enter' );
4844				}
4845			}
4846			
4847			slideAnimationOn();
4848
4849			$advancedSlider.on( 'click', '.wpr-slider-video-btn', function() {
4850				var currentSlide = $(this).closest('.slick-slide'),
4851					videoSrc = WprElements.sanitizeURL(currentSlide.find('.wpr-slider-item').attr('data-video-src')) || '',
4852					videoButton = $(this),
4853					allowFullScreen = '';
4854					
4855					if ( videoPlays == 'true' ) {
4856						videoPlays = 'false';
4857					} else {
4858						videoPlays = 'true';
4859					}
4860
4861				if ( videoSrc.includes('youtube') ) {
4862					videoSrc += "&autoplay=1"; // Tell YouTube to autoplay
4863					allowFullScreen = 'allowfullscreen="allowfullscreen"';
4864				} else if ( videoSrc.includes('vimeo') ) {
4865					allowFullScreen = 'allowfullscreen';
4866				} else {
4867					var videoMute = WprElements.sanitizeDataAttr(currentSlide.find('.wpr-slider-item').attr('data-video-mute'));
4868					var videoControls = WprElements.sanitizeDataAttr(currentSlide.find('.wpr-slider-item').attr('data-video-controls'));
4869					var videoLoop = WprElements.sanitizeDataAttr(currentSlide.find('.wpr-slider-item').attr('data-video-loop'));
4870					
4871					if ( currentSlide.find( '.wpr-slider-video' ).length !== 1 ) {
4872						currentSlide.find('.wpr-cv-container').prepend('<div class="wpr-slider-video wpr-custom-video"><video '+ videoLoop + ' ' + videoMute + ' ' + videoControls + ' ' + 'src="'+ videoSrc +'" width="100%" height="100%"></video></div>');
4873
4874						$advancedSlider.find('video').attr('width', $scope.find('.wpr-slider-item').width());
4875						$advancedSlider.find('video').attr('height', $scope.find('.wpr-slider-item').height());
4876
4877						if ( $advancedSlider.data('hide-video-content') === 'yes' ) {
4878							currentSlide.find('.wpr-slider-content').fadeOut(300);
4879						} else {
4880							if ( videoPlays == 'true' ) {
4881								videoButton.find('i').removeClass('fa-play').addClass('fa-pause');
4882							} else {
4883								videoButton.find('i').removeClass('fa-pause').addClass('fa-play');
4884							}
4885						}
4886
4887						currentSlide.find('video')[0].play();
4888					} else {
4889						if ( videoPlays == 'true' ) {
4890							currentSlide.find('video')[0].play();
4891							videoButton.find('i').removeClass('fa-play').addClass('fa-pause');
4892						} else {
4893							currentSlide.find('video')[0].pause();
4894							videoButton.find('i').removeClass('fa-pause').addClass('fa-play');
4895						}
4896					}
4897					return;
4898				}
4899			
4900				if ( currentSlide.find( '.wpr-slider-video' ).length !== 1 ) {
4901					// currentSlide.find('.wpr-cv-container').prepend('<div class="wpr-slider-video"><iframe src="'+ videoSrc +'" width="100%" height="100%"  frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture;"></iframe></div>');
4902					currentSlide.find('.wpr-cv-container').prepend('<div class="wpr-slider-video"><iframe src="'+ videoSrc +'" width="100%" height="100%"  frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture;"'+ allowFullScreen +'></iframe></div>');
4903
4904					sliderVideoSize();
4905
4906					if ( $advancedSlider.data('hide-video-content') === 'yes' ) {
4907						currentSlide.find('.wpr-slider-content').fadeOut(300);
4908					}
4909				}
4910			
4911			});
4912
4913			$advancedSlider.on( {
4914				beforeChange: function() {
4915					$advancedSlider.find('.wpr-slider-item').not('.slick-active').find('.wpr-slider-video').remove();
4916					$advancedSlider.find('.wpr-animation-enter').find('.wpr-slider-content').fadeOut(300);
4917					if ( $advancedSlider.data('hide-video-content') !== 'yes' ) {
4918						$advancedSlider.find('.wpr-slider-video-btn').find('i').removeClass('fa-pause').addClass('fa-play');
4919						videoPlays = 'false';
4920					}
4921					slideAnimationOff();
4922				},
4923				afterChange: function( event, slick, currentSlide ) {
4924					slideAnimationOn();
4925					autoplayVideo();
4926					$scope.find('.slick-slide').removeClass('wpr-slick-visible');
4927					$scope.find('.slick-current').addClass('wpr-slick-visible');
4928					$scope.find('.slick-current').nextAll().slice(0, sliderColumnsDesktop - 1).addClass('wpr-slick-visible');
4929					$scope.find('.wpr-advanced-slider').css('height', $scope.find('.slick-current').outerHeight());
4930				}
4931			});
4932
4933			// Adjust Horizontal Pagination
4934			if ( $scope.find( '.slick-dots' ).length && $scope.hasClass( 'wpr-slider-dots-horizontal') ) {
4935				// Calculate Width
4936				var dotsWrapWidth = $scope.find( '.slick-dots li' ).outerWidth() * $scope.find( '.slick-dots li' ).length - parseInt( $scope.find( '.slick-dots li span' ).css( 'margin-right' ), 10 );
4937
4938				// on Load
4939				if ( $scope.find( '.slick-dots' ).length ) {
4940					$scope.find( '.slick-dots' ).css( 'width', dotsWrapWidth );
4941				}
4942
4943				// on Resize
4944				$(window).smartresize(function() {
4945					setTimeout(function() {
4946						// Calculate Width
4947						var dotsWrapWidth = $scope.find( '.slick-dots li' ).outerWidth() * $scope.find( '.slick-dots li' ).length - parseInt( $scope.find( '.slick-dots li span' ).css( 'margin-right' ), 10 );
4948
4949						// Set Width
4950						$scope.find( '.slick-dots' ).css( 'width', dotsWrapWidth );
4951					}, 300 );
4952				});
4953			}
4954
4955		}, // End widgetAdvancedSlider
4956
4957		widgetTestimonialCarousel: function( $scope ) {
4958			var testimonialCarousel = $scope.find( '.wpr-testimonial-carousel' );
4959			var settings = JSON.parse( testimonialCarousel.attr( 'data-slick' ) );
4960			
4961			// Slider Columns
4962			var sliderClass = $scope.attr('class'),
4963				sliderColumnsDesktop = sliderClass.match(/wpr-testimonial-slider-columns-\d/) ? +sliderClass.match(/wpr-testimonial-slider-columns-\d/).join().slice(-1) : 2,
4964				sliderColumnsWideScreen = sliderClass.match(/columns--widescreen\d/) ? +sliderClass.match(/columns--widescreen\d/).join().slice(-1) : sliderColumnsDesktop,
4965				sliderColumnsLaptop = sliderClass.match(/columns--laptop\d/) ? +sliderClass.match(/columns--laptop\d/).join().slice(-1) : sliderColumnsDesktop,
4966				sliderColumnsTablet = sliderClass.match(/columns--tablet\d/) ? +sliderClass.match(/columns--tablet\d/).join().slice(-1) : 2,
4967				sliderColumnsTabletExtra = sliderClass.match(/columns--tablet_extra\d/) ? +sliderClass.match(/columns--tablet_extra\d/).join().slice(-1) : sliderColumnsTablet,
4968				sliderColumnsMobileExtra = sliderClass.match(/columns--mobile_extra\d/) ? +sliderClass.match(/columns--mobile_extra\d/).join().slice(-1) : sliderColumnsTablet,
4969				sliderColumnsMobile = sliderClass.match(/columns--mobile\d/) ? +sliderClass.match(/columns--mobile\d/).join().slice(-1) : 1,
4970				sliderSlidesToScroll = settings.sliderSlidesToScroll,
4971				dataSlideEffect = testimonialCarousel.attr('data-slide-effect');
4972
4973			testimonialCarousel.slick({
4974				appendArrows: $scope.find('.wpr-testimonial-controls'),
4975				appendDots: $scope.find('.wpr-testimonial-dots'),
4976				customPaging: function (slider, i) {
4977					var slideNumber = (i + 1),
4978						totalSlides = slider.slideCount;
4979
4980					return '<span class="wpr-testimonial-dot"></span>';
4981				},
4982				slidesToShow: sliderColumnsDesktop,
4983				responsive: [
4984					{
4985						breakpoint: 10000,
4986						settings: {
4987							slidesToShow: sliderColumnsWideScreen,
4988							slidesToScroll: sliderSlidesToScroll > sliderColumnsWideScreen ? 1 : sliderSlidesToScroll,
4989							fade: (1 == sliderColumnsWideScreen && 'fade' === dataSlideEffect) ? true : false
4990						}
4991					},
4992					{
4993						breakpoint: 2399,
4994						settings: {
4995							slidesToShow: sliderColumnsDesktop,
4996							slidesToScroll: sliderSlidesToScroll > sliderColumnsDesktop ? 1 : sliderSlidesToScroll,
4997							fade: (1 == sliderColumnsDesktop && 'fade' === dataSlideEffect) ? true : false
4998						}
4999					},
5000					{
5001						breakpoint: 1221,
5002						settings: {
5003							slidesToShow: sliderColumnsLaptop,
5004							slidesToScroll: sliderSlidesToScroll > sliderColumnsLaptop ? 1 : sliderSlidesToScroll,
5005							fade: (1 == sliderColumnsLaptop && 'fade' === dataSlideEffect) ? true : false
5006						}
5007					},
5008					{
5009						breakpoint: 1200,
5010						settings: {
5011							slidesToShow: sliderColumnsTabletExtra,
5012							slidesToScroll: sliderSlidesToScroll > sliderColumnsTabletExtra ? 1 : sliderSlidesToScroll,
5013							fade: (1 == sliderColumnsTabletExtra && 'fade' === dataSlideEffect) ? true : false
5014						}
5015					},
5016					{
5017						breakpoint: 1024,
5018						settings: {
5019							slidesToShow: sliderColumnsTablet,
5020							slidesToScroll: sliderSlidesToScroll > sliderColumnsTablet ? 1 : sliderSlidesToScroll,
5021							fade: (1 == sliderColumnsTablet && 'fade' === dataSlideEffect) ? true : false
5022						}
5023					},
5024					{
5025						breakpoint: 880,
5026						settings: {
5027							slidesToShow: sliderColumnsMobileExtra,
5028						 	slidesToScroll: sliderSlidesToScroll > sliderColumnsMobileExtra ? 1 : sliderSlidesToScroll,
5029							fade: (1 == sliderColumnsMobileExtra && 'fade' === dataSlideEffect) ? true : false
5030						}
5031					},
5032					{
5033						breakpoint: 768,
5034						settings: {
5035							slidesToShow: sliderColumnsMobile,
5036							slidesToScroll: sliderSlidesToScroll > sliderColumnsMobile ? 1 : sliderSlidesToScroll,
5037							fade: (1 == sliderColumnsMobile && 'fade' === dataSlideEffect) ? true : false
5038						}
5039					}
5040				],
5041			});
5042
5043			// Show Arrows On Hover
5044			if ( $scope.hasClass( 'wpr-testimonial-nav-fade' ) ) {
5045				$scope.on( 'mouseover', function() {
5046					$scope.closest( 'section' ).find( '.wpr-testimonial-arrow' ).css({
5047						'opacity' : 1,
5048					});
5049				} );
5050				$scope.closest( 'section' ).on( 'mouseout', function() {
5051					$scope.find( '.wpr-testimonial-arrow' ).css({
5052						'opacity' : 0,
5053					});
5054				} );
5055			}
5056
5057			// on Load
5058			if ( $scope.find( '.slick-dots' ).length ) {
5059				// Calculate Width
5060				var dotsWrapWidth = $scope.find( '.slick-dots li' ).outerWidth() * $scope.find( '.slick-dots li' ).length - parseInt( $scope.find( '.slick-dots li span' ).css( 'margin-right' ), 10 );
5061
5062				// Set Width
5063				$scope.find( '.slick-dots' ).css( 'width', dotsWrapWidth );
5064			}
5065
5066			$(window).smartresize(function() {
5067				setTimeout(function() {
5068					if ( $scope.find( '.slick-dots' ).length ) {
5069						// Calculate Width
5070						var dotsWrapWidth = $scope.find( '.slick-dots li' ).outerWidth() * $scope.find( '.slick-dots li' ).length - parseInt( $scope.find( '.slick-dots li span' ).css( 'margin-right' ), 10 );
5071
5072						// Set Width
5073						$scope.find( '.slick-dots' ).css( 'width', dotsWrapWidth );
5074					}
5075				}, 300 );
5076			});
5077
5078		}, // End widgetTestimonialCarousel
5079
5080		widgetSearch: function( $scope ) {
5081
5082			var isFound = false;
5083
5084			$scope.find('.wpr-search-form-input').on( {
5085				focus: function() {
5086					$scope.addClass( 'wpr-search-form-input-focus' );
5087				},
5088				blur: function() {
5089					$scope.removeClass( 'wpr-search-form-input-focus' );
5090				}
5091			} );
5092            
5093            if ( $scope.find('.wpr-category-select').length > 0 ) {
5094                // Set the selected value on page load
5095                $(document).ready(function() {
5096                    var wprSelectedCategory = localStorage.getItem('wprSelectedCategory');
5097                    if (wprSelectedCategory) {
5098						$scope.find('.wpr-category-select option').each(function() {
5099							if ($(this).val() === wprSelectedCategory) {
5100								isFound = true;
5101								$scope.find('.wpr-category-select').val(wprSelectedCategory);
5102								return false; // Breaks out of the .each() loop
5103							} else {
5104								$scope.find('.wpr-category-select').val(0);
5105							}
5106						});
5107                    }
5108                });
5109
5110                $scope.find('.wpr-category-select').on('change', function(e) {
5111                    
5112                    var selectedValue = $(this).val();
5113                    localStorage.setItem('wprSelectedCategory', selectedValue);
5114
5115			        if ($scope.find('.wpr-search-form-input').attr('ajax-search') === 'yes') {
5116                        postsOffset = 0;
5117                        $scope.find('.wpr-data-fetch').hide();
5118                        $scope.find('.wpr-data-fetch ul').html('');
5119                        ajaxSearchCall($scope.find('.wpr-search-form-input'), postsOffset, e);
5120                    }
5121                });
5122            }
5123
5124			// if ( $scope.find('.wpr-search-input-hidden') ) {
5125			// 	$scope.find('.wpr-search-form-submit').on('click', function(e) {
5126			// 		e.preventDefault();
5127			// 		if ($scope.find('input').hasClass('wpr-search-input-hidden')) {
5128			// 			$scope.find('input').removeClass('wpr-search-input-hidden');
5129			// 		} else {
5130			// 			$scope.find('input').addClass('wpr-search-input-hidden');
5131			// 			$scope.find('.wpr-search-form-input').val('');
5132			// 			$scope.find('.wpr-data-fetch').slideUp(200);
5133			// 			setTimeout(function() {
5134			// 				$scope.find('.wpr-data-fetch ul').html('');
5135			// 				$scope.find('.wpr-no-results').remove();
5136			// 			}, 400);
5137			// 			postsOffset = 0;
5138			// 		}
5139			// 	});
5140			// }
5141
5142			var prevData;
5143			var searchTimeout = null;
5144
5145			function ajaxSearchCall(thisObject, postsOffset, e) {
5146				if ( e.which === 13 ) {
5147					return false;
5148				}
5149
5150				if (searchTimeout != null) {
5151					clearTimeout(searchTimeout);
5152				}
5153				var optionPostType = ($scope.find('.wpr-category-select').length > 0 && $scope.find('.wpr-category-select').find('option:selected').data('post-type'));
5154				var wprTaxonomyType = $scope.find('.wpr-search-form-input').attr('wpr-taxonomy-type');
5155
5156				if ( $scope.find('.wpr-category-select').length > 0) {
5157					if (!wprTaxonomyType) {
5158						if ($scope.find('.wpr-search-form-input').attr('wpr-query-type') == 'product') {
5159							wprTaxonomyType = 'product_cat';
5160						} else {
5161							wprTaxonomyType = 'category';
5162						}
5163					}
5164				}
5165
5166				searchTimeout = setTimeout(() => {
5167					var thisValue = thisObject.val();
5168
5169					$.ajax({
5170						type: 'POST',
5171						url: WprConfig.ajaxurl,
5172						data: { 
5173							action: 'wpr_data_fetch',
5174							nonce: WprConfig.nonce,
5175							wpr_keyword: $scope.find('.wpr-search-form-input').val(),
5176							wpr_meta_query: $scope.find('.wpr-search-form-input').attr('meta-query'),
5177							wpr_meta_keys: $scope.find('.wpr-search-form-input').attr('meta-keys') || '',
5178							wpr_query_type: $scope.find('.wpr-search-form-input').attr('wpr-query-type'),
5179							wpr_option_post_type: optionPostType ? $scope.find('.wpr-category-select').find('option:selected').data('post-type') 
5179: '',
5180							wpr_taxonomy_type: wprTaxonomyType,
5181							wpr_category: $scope.find('.wpr-category-select').length > 0 ? $scope.find('.wpr-category-select').val() : '',
5182							wpr_number_of_results: $scope.find('.wpr-search-form-input').attr('number-of-results'),
5183							wpr_search_results_offset: postsOffset,
5184							wpr_show_description: $scope.find('.wpr-search-form-input').attr('show-description'),
5185							wpr_number_of_words: $scope.find('.wpr-search-form-input').attr('number-of-words'),
5186							wpr_show_ajax_thumbnail: $scope.find('.wpr-search-form-input').attr('show-ajax-thumbnails'),
5187							wpr_show_product_price: $scope.find('.wpr-search-form-input').attr('show-product-price'),
5188							wpr_show_view_result_btn: $scope.find('.wpr-search-form-input').attr('show-view-result-btn'),
5189							wpr_view_result_text: $scope.find('.wpr-search-form-input').attr('view-result-text'),
5190							wpr_no_results: $scope.find('.wpr-search-form-input').attr('no-results'),
5191							wpr_exclude_without_thumb: $scope.find('.wpr-search-form-input').attr('exclude-without-thumb'),
5192							wpr_ajax_search_link_target: $scope.find('.wpr-search-form-input').attr('link-target'),
5193							wpr_show_ps_pt: $scope.find('.wpr-search-form-input').attr('password-protected'),
5194							wpr_show_attachments: $scope.find('.wpr-search-form-input').attr('attachments'),
5195							// wpr_ajax_search_img_size: $scope.find('.wpr-search-form-input').attr('ajax-search-img-size')
5196						},
5197						success: function(data) {
5198							$scope.closest('section').addClass('wpr-section-z-index');
5199							if ( $scope.find('.wpr-data-fetch ul').html() === '' ) {
5200								$scope.find( '.wpr-pagination-loading' ).hide();
5201								$scope.find('.wpr-data-fetch ul').html( data );
5202								$scope.find('.wpr-no-more-results').fadeOut(100);
5203								setTimeout(function() {
5204									if (!data.includes('wpr-no-results')) {
5205										$scope.find('.wpr-ajax-search-pagination').css('display', 'flex');
5206										if ( $scope.find('.wpr-data-fetch ul').find('li').length < $scope.find('.wpr-search-form-input').attr('number-of-results') ||
5207											$scope.find('.wpr-data-fetch ul').find('li').length == $scope.find('.wpr-data-fetch ul').find('li').data('number-of-results')) {
5208											$scope.find('.wpr-ajax-search-pagination').css('display', 'none');
5209											$scope.find('.wpr-load-more-results').fadeOut(100);
5210										} else {
5211											$scope.find('.wpr-ajax-search-pagination').css('display', 'flex');
5212											$scope.find('.wpr-load-more-results').fadeIn(100);
5213										}
5214									} else {
5215										$scope.find('.wpr-ajax-search-pagination').css('display', 'none');
5216									}
5217								}, 100);
5218								prevData = data;
5219							} else {
5220								if ( data != prevData ) {
5221									prevData = data;
5222									if (data.includes('wpr-no-results')) {
5223										$scope.find('.wpr-ajax-search-pagination').css('display', 'none');
5224										$scope.find('.wpr-data-fetch ul').html('');
5225										$scope.closest('section').removeClass('wpr-section-z-index');
5226									} else {
5227										$scope.find('.wpr-ajax-search-pagination').css('display', 'flex');
5228									}
5229
5230									$scope.find('.wpr-data-fetch ul').append( data );
5231
5232									if (data == '') {
5233										$scope.find('.wpr-load-more-results').fadeOut(100);
5234										setTimeout(function() {
5235											$scope.find( '.wpr-pagination-loading' ).hide();
5236											$scope.find('.wpr-no-more-results').fadeIn(100);
5237										}, 100);
5238									} else {
5239										$scope.find( '.wpr-pagination-loading' ).hide();
5240										$scope.find('.wpr-load-more-results').show();
5241									}
5242
5243									if ($scope.find('.wpr-data-fetch ul').find('li').length < $scope.find('.wpr-search-form-input').attr('number-of-results')) {
5244										$scope.find('.wpr-load-more-results').fadeOut(100);
5245										setTimeout(function() {
5246											$scope.find( '.wpr-pagination-loading' ).hide();
5247											$scope.find('.wpr-no-more-results').fadeIn(100);
5248										}, 100);
5249									} else {
5250										$scope.find('.wpr-load-more-results').show();
5251									}
5252
5253									if ( $scope.find('.wpr-data-fetch ul').find('li').length == $scope.find('.wpr-data-fetch ul').find('li').data('number-of-results') ) {
5254										$scope.find('.wpr-load-more-results').fadeOut(100);
5255										setTimeout(function() {
5256											$scope.find( '.wpr-pagination-loading' ).hide();
5257											$scope.find('.wpr-no-more-results').fadeIn(100);
5258										}, 100);
5259									} else {
5260										$scope.find('.wpr-load-more-results').show();
5261									}
5262									// $scope.find( '.wpr-pagination-loading' ).hide();
5263								}
5264							}
5265
5266							if (data.includes('wpr-no-results')) {
5267								$scope.find('.wpr-ajax-search-pagination').css('display', 'none');
5268								$scope.find('.wpr-load-more-results').fadeOut();
5269							} else {
5270								$scope.find('.wpr-ajax-search-pagination').css('display', 'flex');
5271							}
5272							
5273							if (thisValue.length > 2) {
5274								$scope.find('.wpr-data-fetch').slideDown(200);
5275								$scope.find('.wpr-data-fetch ul').fadeTo(200, 1);
5276							} else {
5277								$scope.find('.wpr-data-fetch').slideUp(200);
5278								$scope.find('.wpr-data-fetch ul').fadeTo(200, 0);
5279								setTimeout(function() {
5280									$scope.find('.wpr-data-fetch ul').html('');
5281									$scope.find('.wpr-no-results').remove();
5282									$scope.closest('section').removeClass('wpr-section-z-index');
5283								}, 600);
5284								postsOffset = 0;
5285							}
5286						},
5287						error: function(error) {
5288							console.log(error);
5289						}
5290					});
5291				}, 400);
5292			}
5293
5294			if ($scope.find('.wpr-search-form-input').attr('ajax-search') === 'yes') {
5295
5296				$scope.find('.wpr-search-form').attr('autocomplete', 'off');
5297				
5298				var postsOffset = 0;
5299				// $scope.find('.wpr-data-fetch ul').on('scroll', function(e) { 
5300				// 	if ( $(this).scrollTop() + $(this).innerHeight() >=  $(this)[0].scrollHeight ) {
5301				// 		postsOffset += +$scope.find('.wpr-search-form-input').attr('number-of-results');
5302				// 		ajaxSearchCall($scope.find('.wpr-search-form-input'), postsOffset, e);
5303				// 	}
5304				// });
5305
5306				$scope.find('.wpr-load-more-results').on('click', function(e) {
5307					postsOffset += +$scope.find('.wpr-search-form-input').attr('number-of-results');
5308					$scope.find('.wpr-load-more-results').hide();
5309					$scope.find( '.wpr-pagination-loading' ).css( 'display', 'inline-block' );
5310					ajaxSearchCall($scope.find('.wpr-search-form-input'), postsOffset, e);
5311				});
5312
5313				$scope.find('.wpr-search-form-input').on('keyup', function(e) {
5314					postsOffset = 0;
5315					$scope.find('.wpr-data-fetch').hide();
5316					$scope.find('.wpr-data-fetch ul').html('');
5317					ajaxSearchCall($(this), postsOffset, e);
5318				});
5319	
5320				$scope.find('.wpr-data-fetch').on('click', '.wpr-close-search', function() {
5321					$scope.find('.wpr-search-form-input').val('');
5322					$scope.find('.wpr-data-fetch').slideUp(200);
5323					setTimeout(function() {
5324						$scope.find('.wpr-data-fetch ul').html('');
5325						$scope.find('.wpr-no-results').remove();
5326						$scope.closest('section').removeClass('wpr-section-z-index');
5327					}, 400);
5328					postsOffset = 0;
5329				});
5330
5331				$('body').on('click', function(e) {
5332					if ( !e.target.classList.value.includes('wpr-data-fetch') && !e.target.closest('.wpr-data-fetch') ) {
5333						if ( !e.target.classList.value.includes('wpr-search-form') && !e.target.closest('.wpr-search-form') ) {
5334							$scope.find('.wpr-search-form-input').val('');
5335							$scope.find('.wpr-data-fetch').slideUp(200);
5336							setTimeout(function() {
5337								$scope.find('.wpr-data-fetch ul').html('');
5338								$scope.find('.wpr-no-results').remove();
5339								$scope.closest('section').removeClass('wpr-section-z-index');
5340							}, 400);
5341							postsOffset = 0;
5342						}
5343					}
5344				});
5345
5346				var mutationObserver = new MutationObserver(function(mutations) {
5347					$scope.find('.wpr-data-fetch li').on('click', function() {
5348						var itemUrl = $(this).find('a').attr('href');
5349						var itemUrlTarget = $(this).find('a').attr('target');
5350						window.open(itemUrl, itemUrlTarget).focus();
5351					});
5352				});
5353
5354				// Listen to Mini Cart Changes
5355				mutationObserver.observe($scope[0], {
5356					childList: true,
5357					subtree: true,
5358				});
5359			}
5360
5361		}, // End widgetSearch
5362
5363		widgetAdvancedText: function( $scope ) {
5364
5365			if ( $scope.hasClass('wpr-advanced-text-style-animated') ) {
5366				var animText = $scope.find( '.wpr-anim-text' ),
5367					animLetters = $scope.find( '.wpr-anim-text-letters' ),
5368					animDuration = animText.attr( 'data-anim-duration' ),
5369					animDurationData = animDuration.split( ',' ),
5370					animLoop = animText.attr( 'data-anim-loop' ),
5371					animTextLength = animText.find('b').length,
5372					animTextCount = 0;
5373
5374				animText.find('b').first().addClass('wpr-anim-text-visible');
5375					
5376				// set animation timing
5377				var animDuration = parseInt( animDurationData[0], 10),
5378					animDelay = parseInt( animDurationData[1], 10),
5379					//type effect
5380					selectionDuration = 500,
5381					typeAnimationDelay = selectionDuration + 800;
5382
5383				initHeadline();
5384			}
5385
5386			function loadLongShadow() {
5387
5388				var $clippedText = $scope.find( '.wpr-clipped-text' ),
5389					clippedOption = $clippedText.data('clipped-options'),
5390					currentDeviceMode = elementorFrontend.getCurrentDeviceMode();
5391
5392				if ( clippedOption ) {
5393					var longShadowSize = clippedOption.longShadowSize,
5394						longShadowSizeTablet = clippedOption.longShadowSizeTablet,
5395						longShadowSizeMobile = clippedOption.longShadowSizeMobile;
5396
5397					if ('desktop' === currentDeviceMode ) {
5398					   longShadowSize = clippedOption.longShadowSize;
5399					}
5400
5401					if ('tablet' === currentDeviceMode && longShadowSizeTablet ) {
5402					   longShadowSize = longShadowSizeTablet;
5403					}
5404
5405					if ('mobile' === currentDeviceMode && longShadowSizeMobile ) {
5406					   longShadowSize = longShadowSizeMobile;
5407					}
5408
5409					$clippedText.find('.wpr-clipped-text-long-shadow').attr('style','text-shadow:'+longShadow( clippedOption.longShadowColor, longShadowSize, clippedOption.longShadowDirection ));
5410				}
5411			}
5412
5413			loadLongShadow();
5414
5415			$(window).on('resize', function() {
5416				loadLongShadow();
5417			});
5418
5419			function initHeadline() {
5420				//insert <i> element for each letter of a changing word
5421				singleLetters(animLetters.find('b'));
5422				//initialise headline animation
5423				animateHeadline(animText);
5424			}
5425
5426			function singleLetters($words) {
5427				$words.each(function() {
5428					var word = $(this),
5429						letters = word.text().split(''),
5430						selected = word.hasClass('wpr-anim-text-visible');
5431					for (var i in letters) {
5432						var letter = letters[i].replace(/ /g, '&nbsp;');
5433					
5434						letters[i] = (selected) ? '<i class="wpr-anim-text-in">' + letter + '</i>': '<i>' + letter + '</i>';
5435					}
5436					var newLetters = letters.join('');
5437					word.html(newLetters).css('opacity', 1);
5438				});
5439			}
5440
5441			function animateHeadline($headlines) {
5442				var duration = animDelay;
5443				$headlines.each(function(){
5444					var headline = $(this),
5445						spanWrapper = headline.find('.wpr-anim-text-inner');
5446					
5447					if (headline.hasClass('wpr-anim-text-type-clip')){
5448						var newWidth = spanWrapper.outerWidth();
5449							spanWrapper.css('width', newWidth);
5450					}
5451
5452					//trigger animation
5453					setTimeout(function(){
5454						hideWord( headline.find('.wpr-anim-text-visible').eq(0) );
5455					}, duration);
5456
5457					// Fix Bigger Words Flip
5458					if ( headline.hasClass( 'wpr-anim-text-type-rotate-1' ) ) {
5459						spanWrapper.find( 'b' ).each(function() {
5460							if ( $(this).outerWidth() > spanWrapper.outerWidth() ) {
5461								spanWrapper.css( 'width', $(this).outerWidth() );
5462							}
5463						});
5464					}
5465				});
5466			}
5467
5468			function hideWord($word) {
5469				var nextWord = takeNext($word);
5470				
5471				if ( animLoop !== 'yes' ) {
5472
5473					animTextCount++;
5474					if ( animTextCount === animTextLength ) {
5475						return;
5476					}
5477
5478				}
5479			   
5480				if ( $word.parents('.wpr-anim-text').hasClass('wpr-anim-text-type-typing') ) {
5481					var parentSpan = $word.parent('.wpr-anim-text-inner');
5482					parentSpan.addClass('wpr-anim-text-selected').removeClass('waiting'); 
5483					setTimeout(function(){ 
5484						parentSpan.removeClass('wpr-anim-text-selected'); 
5485						$word.removeClass('wpr-anim-text-visible').addClass('wpr-anim-text-hidden').children('i').removeClass('wpr-anim-text-in').addClass('wpr-anim-text-out');
5486					}, selectionDuration);
5487					setTimeout(function(){ showWord(nextWord, animDuration) }, typeAnimationDelay);
5488				
5489				} else if ( $word.parents('.wpr-anim-text').hasClass('wpr-anim-text-letters') ) {
5490
5491					var bool = ( $word.children( 'i' ).length >= nextWord.children( 'i' ).length ) ? true : false;
5492						hideLetter($word.find('i').eq(0), $word, bool, animDuration);
5493						showLetter(nextWord.find('i').eq(0), nextWord, bool, animDuration);
5494
5495				}  else if ( $word.parents('.wpr-anim-text').hasClass('wpr-anim-text-type-clip') ) {
5496					$word.parents('.wpr-anim-text-inner').animate({ width : '2px' }, animDuration, function(){
5497						switchWord($word, nextWord);
5498						showWord(nextWord);
5499					});
5500
5501				} else {
5502					switchWord($word, nextWord);
5503					setTimeout(function(){ hideWord(nextWord) }, animDelay);
5504				}
5505
5506			}
5507
5508			function showWord($word, $duration) {
5509				if ( $word.parents( '.wpr-anim-text' ).hasClass( 'wpr-anim-text-type-typing' ) ) {
5510					showLetter( $word.find( 'i' ).eq(0), $word, false, $duration );
5511					$word.addClass( 'wpr-anim-text-visible' ).removeClass( 'wpr-anim-text-hidden' );
5512
5513				} else if ( $word.parents( '.wpr-anim-text' ).hasClass( 'wpr-anim-text-type-clip' ) ) {
5514					$word.parents( '.wpr-anim-text-inner' ).animate({ 'width' : $word.outerWidth() }, animDuration, function() { 
5515						setTimeout( function() {
5516							hideWord($word);
5517						}, animDelay ); 
5518					});
5519				}
5520			}
5521
5522			function hideLetter($letter, $word, $bool, $duration) {
5523				$letter.removeClass('wpr-anim-text-in').addClass('wpr-anim-text-out');
5524				
5525				if ( !$letter.is(':last-child') ) {
5526					setTimeout(function(){ hideLetter($letter.next(), $word, $bool, $duration); }, $duration);  
5527				} else if ( $bool ) { 
5528					setTimeout(function(){ hideWord(takeNext($word)) }, animDelay);
5529				}
5530
5531				if ( $letter.is(':last-child') ) {
5532					var nextWord = takeNext($word);
5533					switchWord($word, nextWord);
5534				} 
5535			}
5536
5537			function showLetter($letter, $word, $bool, $duration) {
5538				$letter.addClass('wpr-anim-text-in').removeClass('wpr-anim-text-out');
5539				
5540				if(!$letter.is(':last-child')) { 
5541					setTimeout(function(){ showLetter($letter.next(), $word, $bool, $duration); }, $duration); 
5542				} else { 
5543					if($word.parents('.wpr-anim-text').hasClass('wpr-anim-text-type-typing')) { setTimeout(function(){ $word.parents('.wpr-anim-text-inner').addClass('waiting'); }, 200);}
5544					if(!$bool) { setTimeout(function(){ hideWord($word) }, animDelay) }
5545				}
5546			}
5547
5548			function takeNext($word) {
5549				return (!$word.is(':last-child')) ? $word.next() : $word.parent().children().eq(0);
5550			}
5551
5552			function takePrev($word) {
5553				return (!$word.is(':first-child')) ? $word.prev() : $word.parent().children().last(
5553);
5554			}
5555
5556			function switchWord($oldWord, $newWord) {
5557				$oldWord.removeClass('wpr-anim-text-visible').addClass('wpr-anim-text-hidden');
5558				$newWord.removeClass('wpr-anim-text-hidden').addClass('wpr-anim-text-visible');
5559			}
5560
5561			function longShadow( shadowColor, shadowSize, shadowDirection ) {
5562			 
5563				var textshadow = '';
5564
5565				for ( var i = 0, len = shadowSize; i < len; i++ ) {
5566					switch ( shadowDirection ) {
5567						case 'top':
5568							textshadow += '0 -'+ i +'px 0 '+ shadowColor +',';
5569						break;
5570
5571						case 'right':
5572							textshadow += i +'px 0 0 '+ shadowColor +',';
5573						break;
5574
5575						case 'bottom':
5576							textshadow += '0 '+ i +'px 0 '+ shadowColor +',';
5577						break;
5578
5579						case 'left':
5580							textshadow += '-'+ i +'px 0 0 '+ shadowColor +',';
5581						break;
5582
5583						case 'top-left':
5584							textshadow += '-'+ i +'px -'+ i +'px 0 '+ shadowColor +',';
5585						break;
5586
5587						case 'top-right':
5588							textshadow += i +'px -'+ i +'px 0 '+ shadowColor +',';
5589						break;
5590
5591						case 'bottom-left':
5592							textshadow += '-'+ i +'px '+ i +'px 0 '+ shadowColor +',';
5593						break;
5594
5595						case 'bottom-right':
5596							textshadow += i +'px '+ i +'px 0 '+ shadowColor +',';
5597						break;
5598
5599						default:
5600							textshadow += i +'px '+ i +'px 0 '+ shadowColor +',';
5601						break;
5602					}
5603				}
5604
5605				textshadow = textshadow.slice(0, -1);
5606
5607				return textshadow;
5608			}
5609
5610		}, // End widgetAdvancedText
5611
5612		widgetProgressBar: function( $scope ) {
5613
5614			var $progressBar = $scope.find( '.wpr-progress-bar' ),
5615				prBarCircle = $scope.find( '.wpr-prbar-circle' ),
5616				$prBarCircleSvg = prBarCircle.find('.wpr-prbar-circle-svg'),
5617				$prBarCircleLine =  $prBarCircleSvg.find('.wpr-prbar-circle-line'),
5618				$prBarCirclePrline = $scope.find( '.wpr-prbar-circle-prline' ),
5619				prBarHrLine = $progressBar.find('.wpr-prbar-hr-line-inner'),
5620				prBarVrLine = $progressBar.find('.wpr-prbar-vr-line-inner'),
5621				prBarOptions = $progressBar.data('options'),
5622				prBarCircleOptions = prBarCircle.data('circle-options'),
5623				prBarCounter = $progressBar.find('.wpr-prbar-counter-value'),
5624				prBarCounterValue = prBarOptions.counterValue,
5625				prBarCounterValuePersent = prBarOptions.counterValuePersent,
5626				prBarAnimDuration = prBarOptions.animDuration,
5627				prBarAnimDelay = prBarOptions.animDelay,
5628				prBarLoopDelay = +prBarOptions.loopDelay,
5629				currentDeviceMode = elementorFrontend.getCurrentDeviceMode(),
5630				numeratorData = {
5631					toValue: prBarCounterValue,
5632					duration: prBarAnimDuration,
5633				};
5634
5635			if ( 'yes' === prBarOptions.counterSeparator ) {
5636				numeratorData.delimiter = ',';
5637			}
5638
5639
5640			function isInViewport( $selector ) {
5641				if ( $selector.length ) {
5642					var elementTop = $selector.offset().top,
5643					elementBottom = elementTop + $selector.outerHeight(),
5644					viewportTop = $(window).scrollTop(),
5645					viewportBottom = viewportTop + $(window).height();
5646
5647					if ( elementTop > $(window).height() ) {
5648						elementTop += 50;
5649					}
5650
5651					return elementBottom > viewportTop && elementTop < viewportBottom;
5652				}
5653			};
5654
5655			function progressBar() {
5656
5657				if ( isInViewport( prBarVrLine ) ) {
5658					prBarVrLine.css({
5659						'height': prBarCounterValuePersent + '%'
5660					});
5661				}
5662
5663				if ( isInViewport( prBarHrLine ) ) {
5664					prBarHrLine.css({
5665						'width': prBarCounterValuePersent + '%'
5666					});
5667				}
5668
5669				if ( isInViewport( prBarCircle ) ) {
5670					var circleDashOffset = prBarCircleOptions.circleOffset;
5671					
5672					$prBarCirclePrline.css({
5673						'stroke-dashoffset': circleDashOffset
5674					});
5675				}
5676
5677				// Set Delay
5678				if ( isInViewport( prBarVrLine ) || isInViewport( prBarHrLine ) || isInViewport( prBarCircle ) ) {
5679					setTimeout(function() {
5680						prBarCounter.numerator( numeratorData );
5681					}, prBarAnimDelay );
5682				}
5683			
5684			}
5685
5686			progressBar();
5687
5688			if (prBarOptions.loop === 'yes') {
5689				setInterval(function() {
5690
5691					if ( isInViewport( prBarVrLine ) ) {
5692						prBarVrLine.css({
5693							'height': 0 + '%'
5694						});
5695					}
5696	
5697					if ( isInViewport( prBarHrLine ) ) {
5698						prBarHrLine.css({
5699							'width': 0 + '%'
5700						});
5701					}
5702	
5703					if ( isInViewport( prBarCircle ) ) {
5704						var circleDashOffset = prBarCircleOptions.circleOffset;
5705						
5706						$prBarCirclePrline.css({
5707							'stroke-dashoffset': $prBarCirclePrline.css('stroke-dasharray')
5708						});
5709					}
5710
5711					// Set Delay
5712					if ( isInViewport( prBarVrLine ) || isInViewport( prBarHrLine ) || isInViewport( prBarCircle ) ) {
5713						setTimeout(function() {
5714							prBarCounter.numerator( {
5715								toValue: 0,
5716								duration: prBarAnimDuration,
5717							} );
5718						}, prBarAnimDelay);
5719					}
5720
5721					setTimeout(function() {
5722						progressBar();
5723					}, prBarAnimDuration + prBarAnimDelay);
5724				}, (prBarAnimDuration + prBarAnimDelay) * prBarLoopDelay);
5725			}
5726
5727			 $(window).on('scroll', function() {
5728				progressBar();
5729			});
5730				  
5731		}, // End widgetProgressBar
5732
5733		widgetImageHotspots: function( $scope ) {
5734
5735			var $imgHotspots = $scope.find( '.wpr-image-hotspots' ),
5736				hotspotsOptions = $imgHotspots.data('options'),
5737				$hotspotItem = $imgHotspots.find('.wpr-hotspot-item'),
5738				tooltipTrigger = hotspotsOptions.tooltipTrigger;
5739
5740			if ( 'click' === tooltipTrigger ) {
5741				$hotspotItem.on( 'click', function() {
5742					if ( $(this).hasClass('wpr-tooltip-active') ) {
5743						$(this).removeClass('wpr-tooltip-active');
5744					} else {
5745						$hotspotItem.removeClass('wpr-tooltip-active');
5746						$(this).addClass('wpr-tooltip-active');
5747					}
5748					 event.stopPropagation();
5749				});
5750
5751				$(window).on( 'click', function () {
5752					$hotspotItem.removeClass('wpr-tooltip-active');
5753				});
5754		   
5755			} else if ( 'hover' === tooltipTrigger ) {
5756				$hotspotItem.on( 'mouseenter', function () {
5757					$(this).addClass('wpr-tooltip-active');
5758				});
5759				
5760				$hotspotItem.on( 'mouseleave', function () {
5761					$(this).removeClass('wpr-tooltip-active');
5762				});
5763
5764			} else {
5765				$hotspotItem.addClass('wpr-tooltip-active');
5766			}
5767
5768		}, // End widgetImageHotspots
5769
5770		widgetFlipBox: function( $scope ) {
5771			
5772			var $flipBox = $scope.find('.wpr-flip-box'),
5773				flipBoxTrigger = $flipBox.data('trigger');
5774			
5775			// Listen for the pageshow event to prevent undesired cache
5776			window.addEventListener('pageshow', function(event) {
5777				if (event.persisted) {
5778					if ( $flipBox.hasClass('wpr-flip-box-active') ) {
5779						$flipBox.removeClass('wpr-flip-box-active');
5780					}
5781				}
5782			});
5783
5784			// Listen for the popstate event same purpose
5785			window.addEventListener('popstate', function(event) {
5786				if ( $flipBox.hasClass('wpr-flip-box-active') ) {
5787					$flipBox.removeClass('wpr-flip-box-active');
5788				}
5789			});
5790
5791			if ( 'box' === flipBoxTrigger ) {
5792
5793				$flipBox.find('.wpr-flip-box-front').on( 'click', function() {
5794					$(this).closest('.wpr-flip-box').addClass('wpr-flip-box-active');
5795				});
5796
5797				$(window).on( 'click', function () {
5798					if( $(event.target).closest('.wpr-flip-box').length === 0 ) {
5799						$flipBox.removeClass('wpr-flip-box-active');
5800					}
5801				});
5802		   
5803			} else if ( 'btn' == flipBoxTrigger ) {
5804		  
5805				$flipBox.find('.wpr-flip-box-btn').on( 'click', function() {
5806					$(this).closest('.wpr-flip-box').addClass('wpr-flip-box-active');		   
5807				});
5808
5809				$(window).on( 'click', function (event) {
5810					if( $(event.target).closest('.wpr-flip-box').length === 0 ) {
5811						$flipBox.removeClass('wpr-flip-box-active');
5812					}
5813				});
5814
5815			  
5816			} else if ( 'hover' == flipBoxTrigger ) {
5817		  
5818				$flipBox.hover(function () {
5819					$(this).toggleClass('wpr-flip-box-active');
5820				});
5821
5822			}
5823
5824		}, // End widgetFlipBox
5825
5826		widgetContentTicker: function( $scope ) {
5827			var $contentTickerSlider = $scope.find( '.wpr-ticker-slider' ),
5828				$contentTickerMarquee = $scope.find( '.wpr-ticker-marquee' ),
5829				marqueeData = $contentTickerMarquee.data('options');
5830			// Slider Columns
5831			var sliderClass = $scope.attr('class'),
5832				sliderColumnsDesktop = sliderClass.match(/wpr-ticker-slider-columns-\d/) ? +sliderClass.match(/wpr-ticker-slider-columns-\d/).join().slice(-1) : 2,
5833				sliderColumnsWideScreen = sliderClass.match(/columns--widescreen\d/) ? +sliderClass.match(/columns--widescreen\d/).join().slice(-1) : sliderColumnsDesktop,
5834				sliderColumnsLaptop = sliderClass.match(/columns--laptop\d/) ? +sliderClass.match(/columns--laptop\d/).join().slice(-1) : sliderColumnsDesktop,
5835				sliderColumnsTablet = sliderClass.match(/columns--tablet\d/) ? +sliderClass.match(/columns--tablet\d/).join().slice(-1) : 2,
5836				sliderColumnsTabletExtra = sliderClass.match(/columns--tablet_extra\d/) ? +sliderClass.match(/columns--tablet_extra\d/).join().slice(-1) : sliderColumnsTablet,
5837				sliderColumnsMobileExtra = sliderClass.match(/columns--mobile_extra\d/) ? +sliderClass.match(/columns--mobile_extra\d/).join().slice(-1) : sliderColumnsTablet,
5838				sliderColumnsMobile = sliderClass.match(/columns--mobile\d/) ? +sliderClass.match(/columns--mobile\d/).join().slice(-1) : 1,
5839				dataSlideEffect = $contentTickerSlider.attr('data-slide-effect'),
5840				sliderSlidesToScroll = 'hr-slide' === dataSlideEffect && sliderClass.match(/wpr-ticker-slides-to-scroll-\d/) ? +(sliderClass.match(/wpr-ticker-slides-to-scroll-\d/).join().slice(-1)) : 1;
5841
5842			$contentTickerSlider.slick({
5843				appendArrows : $scope.find('.wpr-ticker-slider-controls'),
5844				slidesToShow: sliderColumnsDesktop,
5845				responsive: [
5846					{
5847						breakpoint: 10000,
5848						settings: {
5849							slidesToShow: ('typing' === dataSlideEffect || 'fade' === dataSlideEffect ) ? 1 : sliderColumnsWideScreen,
5850							slidesToScroll: sliderSlidesToScroll > sliderColumnsWideScreen ? 1 : sliderSlidesToScroll,
5851							fade: ('typing' === dataSlideEffect || 'fade' === dataSlideEffect) ? true : false
5852						}
5853					},
5854					{
5855						breakpoint: 2399,
5856						settings: {
5857							slidesToShow: ('typing' === dataSlideEffect || 'fade' === dataSlideEffect ) ? 1 : sliderColumnsDesktop,
5858							slidesToScroll: sliderSlidesToScroll > sliderColumnsDesktop ? 1 : sliderSlidesToScroll,
5859							fade: ('typing' === dataSlideEffect || 'fade' === dataSlideEffect) ? true : false
5860						}
5861					},
5862					{
5863						breakpoint: 1221,
5864						settings: {
5865							slidesToShow: ('typing' === dataSlideEffect || 'fade' === dataSlideEffect ) ? 1 : sliderColumnsLaptop,
5866							slidesToScroll: sliderSlidesToScroll > sliderColumnsLaptop ? 1 : sliderSlidesToScroll,
5867							fade: ('typing' === dataSlideEffect || 'fade' === dataSlideEffect) ? true : false
5868						}
5869					},
5870					{
5871						breakpoint: 1200,
5872						settings: {
5873							slidesToShow: ('typing' === dataSlideEffect || 'fade' === dataSlideEffect ) ? 1 : sliderColumnsTabletExtra,
5874							slidesToScroll: sliderSlidesToScroll > sliderColumnsTabletExtra ? 1 : sliderSlidesToScroll,
5875							fade: ('typing' === dataSlideEffect || 'fade' === dataSlideEffect) ? true : false
5876						}
5877					},
5878					{
5879						breakpoint: 1024,
5880						settings: {
5881							slidesToShow: ('typing' === dataSlideEffect || 'fade' === dataSlideEffect ) ? 1 : sliderColumnsTablet,
5882							slidesToScroll: sliderSlidesToScroll > sliderColumnsTablet ? 1 : sliderSlidesToScroll,
5883							fade: ('typing' === dataSlideEffect || 'fade' === dataSlideEffect) ? true : false
5884						}
5885					},
5886					{
5887						breakpoint: 880,
5888						settings: {
5889							slidesToShow: ('typing' === dataSlideEffect || 'fade' === dataSlideEffect ) ? 1 : sliderColumnsMobileExtra,
5890						 	slidesToScroll: sliderSlidesToScroll > sliderColumnsMobileExtra ? 1 : sliderSlidesToScroll,
5891							fade: ('typing' === dataSlideEffect || 'fade' === dataSlideEffect) ? true : false
5892						}
5893					},
5894					{
5895						breakpoint: 768,
5896						settings: {
5897							slidesToShow: ('typing' === dataSlideEffect || 'fade' === dataSlideEffect ) ? 1 : sliderColumnsMobile,
5898							slidesToScroll: sliderSlidesToScroll > sliderColumnsMobile ? 1 : sliderSlidesToScroll,
5899							fade: ('typing' === dataSlideEffect || 'fade' === dataSlideEffect) ? true : false
5900						}
5901					}
5902				],
5903			});
5904
5905			$contentTickerMarquee.marquee(marqueeData);
5906			if ( $scope.find('.wpr-marquee-hidden').length > 0 ) {
5907				$scope.find('.wpr-ticker-marquee').removeClass('wpr-marquee-hidden');
5908			}
5909
5910		}, // End widgetContentTicker
5911
5912		widgetTabs: function( $scope ) {
5913
5914			var $tabs = $( '.wpr-tabs', $scope ).first(),
5915				$tabList = $( '.wpr-tabs-wrap', $tabs ).first(),
5916				$contentWrap = $( '.wpr-tabs-content-wrap', $tabs ).first(),
5917				$tabList = $( '> .wpr-tab', $tabList ),
5918				$contentList = $( '> .wpr-tab-content', $contentWrap ),
5919				tabsData = $tabs.data('options');
5920
5921			// Active Tab
5922			var activeTabIndex = tabsData.activeTab - 1;
5923
5924			// ?active_tab=tab-index#your-id
5925			var activeTabIndexFromLocation = window.location.href.indexOf("active_tab=");
5926
5927			if (activeTabIndexFromLocation > -1) {
5928				activeTabIndex = +window.location.href.substring(activeTabIndexFromLocation,  window.location.href.lastIndexOf("#")).replace("active_tab=", '') - 1;
5929			}
5930
5931				$tabList.eq( activeTabIndex ).addClass( 'wpr-tab-active' );
5932				$contentList.eq( activeTabIndex ).addClass( 'wpr-tab-content-active wpr-animation-enter' );
5933
5934			if ( tabsData.autoplay === 'yes' ) {
5935				
5936				var startIndex = activeTabIndex;
5937
5938				var autoplayInterval = setInterval( function() {
5939
5940					if ( startIndex < $tabList.length - 1 ) {
5941						startIndex++;
5942					} else {
5943						startIndex = 0;
5944					}
5945
5946					wprTabsSwitcher( startIndex );
5947
5948				}, tabsData.autoplaySpeed );
5949			}
5950
5951			if ( 'hover' === tabsData.trigger ) {
5952				wprTabsHover();
5953			} else {
5954				wprTabsClick();
5955			}
5956
5957			// Tab Switcher
5958			function wprTabsSwitcher( index ) {
5959
5960				var activeTab = $tabList.eq( index ),
5961					activeContent = $contentList.eq( index ),
5962					activeContentHeight = 'auto';
5963
5964				$contentWrap.css( { 'height': $contentWrap.outerHeight( true ) } );
5965
5966				$tabList.removeClass( 'wpr-tab-active' );
5967				activeTab.addClass( 'wpr-tab-active' );
5968
5969				$contentList.removeClass( 'wpr-tab-content-active wpr-animation-enter' );
5970
5971				activeContentHeight = activeContent.outerHeight( true );
5972				activeContentHeight += parseInt( $contentWrap.css( 'border-top-width' ) ) + parseInt( $contentWrap.css( 'border-bottom-width' ) );
5973
5974
5975				activeContent.addClass( 'wpr-tab-content-active wpr-animation-enter' );
5976
5977				$contentWrap.css({ 'height': activeContentHeight });
5978
5979				setTimeout( function() {  
5980					$contentWrap.css( { 'height': 'auto' } );
5981				}, 500 );
5982
5983			}
5984
5985			// Tab Click Event
5986			function wprTabsClick() {
5987
5988				$tabList.on( 'click', function() {
5989
5990					var tabIndex = $( this ).data( 'tab' ) - 1;
5991					
5992					clearInterval( autoplayInterval );
5993					wprTabsSwitcher( tabIndex );
5994
5995				});
5996
5997			}
5998
5999			// Tab Hover Event
6000			function wprTabsHover() {
6001			   $tabList.hover( function () {
6002
6003					var tabIndex = $( this ).data( 'tab' ) - 1;
6004
6005					clearInterval( autoplayInterval );
6006					wprTabsSwitcher( tabIndex );
6007				  
6008				});
6009			}
6010
6011		}, // End widgetTabs
6012
6013		widgetContentToogle: function( $scope ) {
6014
6015			var $contentToggle = $( '.wpr-content-toggle', $scope ).first(),
6016				$switcherContainer = $( '.wpr-switcher-container', $contentToggle ).first(),
6017				$switcherWrap = $( '.wpr-switcher-wrap', $contentToggle ).first(),
6018				$contentWrap = $( '.wpr-switcher-content-wrap', $contentToggle ).first(),
6019				$switcherBg = $( '> .wpr-switcher-bg', $switcherWrap ),
6020				$switcherList = $( '> .wpr-switcher', $switcherWrap ),
6021				$contentList = $( '> .wpr-switcher-content', $contentWrap );
6022
6023			// Active Tab
6024			var activeSwitcherIndex = parseInt( $switcherContainer.data('active-switcher') ) - 1;
6025			
6026			$switcherList.eq( activeSwitcherIndex ).addClass( 'wpr-switcher-active' );
6027			$contentList.eq( activeSwitcherIndex ).addClass( 'wpr-switcher-content-active wpr-animation-enter' );
6028	  
6029			function wprSwitcherBg( index ) {
6030				
6031				if ( ! $scope.hasClass( 'wpr-switcher-label-style-outer' ) ) {
6032				
6033					var switcherWidth = 100 / $switcherList.length,
6034						switcherBgDistance = index * switcherWidth;
6035
6036					$switcherBg.css({
6037						'width' : switcherWidth + '%',
6038						'left': switcherBgDistance + '%'
6039					});
6040				}
6041			  
6042			}
6043
6044			wprSwitcherBg( activeSwitcherIndex );
6045
6046			// Tab Switcher
6047			function wprTabsSwitcher( index ) {
6048				var activeSwitcher = $switcherList.eq( index ),
6049					activeContent = $contentList.eq( index ),
6050					activeContentHeight = 'auto';
6051
6052				// Switcher
6053				wprSwitcherBg( index );
6054
6055				if ( ! $scope.hasClass( 'wpr-switcher-label-style-outer' ) ) {
6056					$switcherList.removeClass( 'wpr-switcher-active' );
6057					activeSwitcher.addClass( 'wpr-switcher-active' );
6058
6059					if ( $scope.hasClass( 'wpr-switcher-style-dual' ) ) {
6060						$switcherContainer.attr( 'data-active-switcher', index + 1 );
6061					}
6062				}
6063
6064				// Tabs
6065				$contentWrap.css( { 'height': $contentWrap.outerHeight( true ) } );
6066
6067				$contentList.removeClass( 'wpr-switcher-content-active wpr-animation-enter' );
6068
6069				activeContentHeight = activeContent.outerHeight( true );
6070				activeContentHeight += parseInt( $contentWrap.css( 'border-top-width' ) ) + parseInt( $contentWrap.css( 'border-bottom-width' ) );
6071
6072				activeContent.addClass( 'wpr-switcher-content-active wpr-animation-enter' );
6073
6074				$contentWrap.css({ 'height': activeContentHeight });
6075
6076				setTimeout( function() {  
6077					$contentWrap.css( { 'height': 'auto' } );
6078				}, 500 );
6079
6080			}
6081
6082			// Tab Click Event
6083			function wprTabsClick() {
6084
6085				// Outer Labels
6086				if ( $scope.hasClass( 'wpr-switcher-label-style-outer' ) ) {
6087					$switcherWrap.on( 'click', function() {
6088						var activeSwitcher = $switcherWrap.find( '.wpr-switcher-active' );
6089
6090						if ( 1 === parseInt( activeSwitcher.data( 'switcher'), 10 ) ) {
6091							// Reset
6092							$switcherWrap.children( '.wpr-switcher' ).eq(0).removeClass( 'wpr-switcher-active' );
6093
6094							// Set Active
6095							$switcherWrap.children( '.wpr-switcher' ).eq(1).addClass( 'wpr-switcher-active' );
6096							$switcherWrap.closest( '.wpr-switcher-container' ).attr( 'data-active-switcher', 2 );
6097							wprTabsSwitcher( 1 );
6098
6099						} else if ( 2 === parseInt( activeSwitcher.data( 'switcher'), 10 ) ) {
6100							// Reset
6101							$switcherWrap.children( '.wpr-switcher' ).eq(1).removeClass( 'wpr-switcher-active' );
6102
6103							// Set Active
6104							$switcherWrap.children( '.wpr-switcher' ).eq(0).addClass( 'wpr-switcher-active' );
6105							$switcherWrap.closest( '.wpr-switcher-container' ).attr( 'data-active-switcher', 1 );
6106							wprTabsSwitcher( 0 );
6107						}
6108					 
6109						// wprTabsSwitcher( switcherIndex );
6110
6111					});
6112
6113				// Inner Labels / Multi Labels
6114				} else {
6115					$switcherList.on( 'click', function() {
6116
6117						var switcherIndex = $( this ).data( 'switcher' ) - 1;
6118					 
6119						wprTabsSwitcher( switcherIndex );
6120
6121					});
6122				}
6123			}
6124
6125			wprTabsClick();
6126
6127		}, // End widgetContentToogle
6128
6129		widgetBackToTop: function($scope) {
6130			var sttBtn = $scope.find( '.wpr-stt-btn' ),
6131				settings = sttBtn.attr('data-settings');
6132			
6133			// Get Settings	
6134			settings = JSON.parse(settings);
6135
6136			if ( settings.fixed === 'fixed' ) {
6137
6138				if ( 'none' !== settings.animation ) {
6139					sttBtn.css({
6140						'opacity' : '0'
6141					});
6142
6143					if ( settings.animation ==='slide' ) {
6144						sttBtn.css({
6145							'margin-bottom': '-100px',
6146						});
6147					}
6148				}
6149
6150				// Run on Load
6151				scrollToTop($(window).scrollTop(), sttBtn, settings);
6152
6153				// Run on Scroll
6154				$(window).scroll(function() {
6155					scrollToTop($(this).scrollTop(), sttBtn, settings);
6156				});
6157			} // end fixed check
6158			 
6159			// Click to Scroll Top
6160			sttBtn.on('click', function() {
6161				$('html, body').animate({ scrollTop : 0}, settings.scrolAnim );
6162				return false;
6163			});
6164
6165			function scrollToTop( scrollTop, button, settings ) {
6166				// Show
6167				if ( scrollTop > settings.animationOffset ) {
6168					
6169					if ( 'fade' === settings.animation ) {
6170	 					sttBtn.stop().css('visibility', 'visible').animate({
6171	 						'opacity' : '1'
6172	 					}, settings.animationDuration);
6173					} else if ( 'slide' === settings.animation ){
6174						sttBtn.stop().css('visibility', 'visible').animate({
6175							'opacity' : '1',
6176							'margin-bottom' : 0
6177						}, settings.animationDuration);
6178					} else {
6179						sttBtn.css('visibility', 'visible');
6180					}
6181
6182				// Hide
6183				} else {
6184
6185					if ( 'fade' === settings.animation ) {
6186						sttBtn.stop().animate({'opacity': '0'}, settings.animationDuration);
6187					} else if (settings.animation === 'slide') {
6188						sttBtn.stop().animate({
6189							'margin-bottom' : '-100px',
6190							'opacity' : '0'
6191						}, settings.animationDuration);
6192					} else {
6193						sttBtn.css('visibility', 'hidden');
6194					}
6195
6196				}
6197			}
6198
6199		}, // End of Back to Top
6200        
6201        widgetLottieAnimations: function($scope) {
6202			var lottieAnimations = $scope.find('.wpr-lottie-animations'),
6203				lottieAnimationsWrap = $scope.find('.wpr-lottie-animations-wrapper'),
6204				lottieJSON = JSON.parse(lottieAnimations.attr('data-settings'));
6205
6206			var animation = lottie.loadAnimation({
6207			  container: lottieAnimations[0], // Required
6208			  path: lottieAnimations.attr('data-json-url'), // Required
6209			  renderer: lottieJSON.lottie_renderer, // Required
6210			  loop: 'yes' === lottieJSON.loop ? true : false, // Optional
6211			  autoplay: 'yes' === lottieJSON.autoplay ? true : false
6212			});
6213
6214			animation.setSpeed(lottieJSON.speed);
6215
6216			if( lottieJSON.reverse ) {
6217				animation.setDirection(-1);
6218			} 
6219
6220			animation.addEventListener('DOMLoaded', function () {
6221				
6222				if ( 'hover' !== lottieJSON.trigger && 'none' !== lottieJSON.trigger ) {
6223				
6224				// if ( 'viewport' === lottieJSON.trigger ) {
6225					initLottie('load');
6226					$(window).on('scroll', initLottie);
6227				}
6228				
6229                if ( 'hover' === lottieJSON.trigger ) {
6230                    animation.pause();
6231                    lottieAnimations.hover(function () {
6232                        animation.play();
6233                    }, function () {
6234                        animation.pause();
6235                    });
6236                }
6237
6238				function initLottie(event) {
6239					animation.pause();
6240
6241					if (typeof lottieAnimations[0].getBoundingClientRect === "function") {
6242											
6243						var height = document.documentElement.clientHeight;
6244						var scrollTop = (lottieAnimations[0].getBoundingClientRect().top)/height * 100;
6245						var scrollBottom = (lottieAnimations[0].getBoundingClientRect().bottom)/height * 100;
6246						var scrollEnd = scrollTop < lottieJSON.scroll_end;
6247						var scrollStart = scrollBottom > lottieJSON.scroll_start;
6248
6249						if ( 'viewport' === lottieJSON.trigger ) {
6250							scrollStart && scrollEnd ? animation.play() : animation.pause();
6251						}
6252						
6253						if ( 'scroll' === lottieJSON.trigger ) {
6254							if( scrollStart && scrollEnd) {
6255								animation.pause();
6256								
6257								// $(window).scroll(function() {
6258									// calculate the percentage the user has scrolled down the page
6259									var scrollPercent = 100 * $(window).scrollTop() / ($(document).height() - $(window).height());
6260								 
6261									var scrollPercentRounded = Math.round(scrollPercent);
6262							
6263									animation.goToAndStop( (scrollPercentRounded / 100) * 4000); // why 4000
6264								// });
6265							}
6266						};
6267					}
6268				}
6269			});
6270		}, // End of widgetLottieAnimations
6271
6272		widgetCharts: function($scope) {
6273			var chartSettings = JSON.parse($scope.find('.wpr-charts-container').attr('data-settings'));
6274			var labels = chartSettings.chart_labels;
6275			var customDatasets = chartSettings.chart_datasets ? JSON.parse(chartSettings.chart_datasets) : '';
6276			
6277			var newLegendClickHandler = function (e, legendItem, legend) {
6278				if ( (chartTypesArray.includes(chartSettings.chart_type) || chartSettings.chart_type === 'radar') ) {
6279					const index = legendItem.datasetIndex;
6280					const ci = legend.chart;
6281					if (ci.isDatasetVisible(index)) {
6282						ci.hide(index);
6283						legendItem.hidden = true;
6284					} else {
6285						ci.show(index);
6286						legendItem.hidden = false;
6287					}
6288				}
6289			}
6290			
6291			const footer = (tooltipItems) => {
6292				let sum = 0;
6293			  
6294				tooltipItems.forEach(function(tooltipItem) {
6295				  sum += tooltipItem.parsed.y;
6296				});
6297				
6298				if ( 'bar_horizontal' === chartSettings.chart_type ) {
6299					sum = 0;
6300					tooltipItems.forEach(function(tooltipItem) {
6301						sum += tooltipItem.parsed.x;
6302					});
6303				}
6304
6305				if ( "radar" == chartSettings.chart_type || "pie" == chartSettings.chart_type || "doughnut" == chartSettings.chart_type || "polarArea" == chartSettings.chart_type ) {
6306					return false;
6307				}
6308				return 'Sum: ' + sum;
6309			};
6310
6311			var lineDotsWidth = window.innerWidth >= 768 ? chartSettings.line_dots_radius 
6312									: window.innerWidth <= 767 ? chartSettings.line_dots_radius_mobile : 0;
6313			var tooltipCaretSize = window.innerWidth >= 768 ? chartSettings.tooltip_caret_size 
6314									:  window.innerWidth <= 767 ? chartSettings.chart_tooltip_caret_size_mobile : 0;
6315
6316			var myChart = '';
6317			var config = '';
6318			var chartTypesArray = ['bar', 'bar_horizontal', 'line'];
6319			var globalOptions = {
6320				responsive: true,
6321				// layout: { // needs other approach
6322				// 	padding: chartPadding,
6323				// },
6324				showLine: chartSettings.show_lines,
6325				animation: chartSettings.chart_animation === 'yes' ? true : false,
6326				animations: {
6327				  tension: {
6328					duration: chartSettings.chart_animation_duration,
6329					easing: chartSettings.animation_transition_type,
6330					from: 1,
6331					to: 0,
6332					loop: chartSettings.chart_animation_loop == 'yes' ? true : false,
6333				  },
6334				}, // specify exact inserting way
6335				events: [chartSettings.trigger_tooltip_on, chartSettings.exclude_dataset_on_click === 'yes' ? 'click' : '',],
6336				interaction: {
6337					// Overrides the global setting
6338					mode: chartSettings.chart_interaction_mode !== undefined ? chartSettings.chart_interaction_mode : 'nearest',
6339				},
6340				elements: {
6341					point: {
6342						radius: chartSettings.line_dots === 'yes' ? lineDotsWidth : 0 // default to disabled in all datasets
6343					}
6344				},
6345				scales: { // remove if corrupts other chart_types data
6346					x: {
6347						reverse: chartSettings.reverse_x == 'yes' ? true : false,
6348						stacked: chartSettings.stacked_bar_chart == 'yes' ? true : false,
6349						type: 'bar_horizontal' === chartSettings.chart_type ? chartSettings.data_type : 'category',
6350						min: chartSettings.min_value !== undefined ? chartSettings.min_value : null,
6351						max: chartSettings.max_value !== undefined ? chartSettings.max_value : null,
6352						grid: {
6353							display: chartSettings.display_x_axis,
6354							drawBorder: chartSettings.display_x_axis,
6355							drawOnChartArea: chartSettings.display_x_axis,
6356							drawTicks: chartSettings.display_x_axis,
6357							color: chartSettings.axis_grid_line_color_x,
6358							// borderColor: 'green',
6359							// borderWidth: 5,
6360							borderDash: [chartSettings.border_dash_length, chartSettings.border_dash_spacing],
6361							borderDashOffset: chartSettings.border_dash_offset,
6362							lineWidth: chartSettings.grid_line_width_x,
6363						},
6364						title: {
6365							display: chartSettings.display_x_axis_title,
6366							text: chartSettings.x_axis_title,
6367							color: chartSettings.axis_title_color_x,
6368							font: {
6369								size: chartSettings.axis_title_font_size_x,
6370								family: chartSettings.axis_title_font_family_x,
6371								style: chartSettings.axis_title_font_style_x,
6372								weight: chartSettings.axis_title_font_weight_x,
6373							}
6374						},
6375						ticks: {
6376							stepSize: 'bar_horizontal' === chartSettings.chart_type ? chartSettings.x_step_size : '',
6377							display: chartSettings.display_x_ticks,
6378							padding: chartSettings.ticks_padding_x,
6379							autoSkip: false,
6380							maxRotation: chartSettings.rotation_x,
6381							minRotation: chartSettings.rotation_x,
6382							color: chartSettings.ticks_color_x,
6383							// backdropColor: 'rgb(128,0,128)',
6384							font: {
6385								size: chartSettings.ticks_font_size_x,
6386								family: chartSettings.ticks_font_family_x,
6387								style: chartSettings.ticks_font_style_x,
6388								weight: chartSettings.ticks_font_weight_x,
6389							}
6390						},
6391					},
6392					y: {
6393						reverse: chartSettings.reverse_y == 'yes' ? true : false,
6394						stacked: chartSettings.stacked_bar_chart == 'yes' ? true : false,
6395						type: 'bar' === chartSettings.chart_type || 'line' === chartSettings.chart_type ? chartSettings.data_type : 'category',
6396						min: chartSettings.min_value !== undefined ? chartSettings.min_value : null,
6397						max: chartSettings.max_value !== undefined ? chartSettings.max_value : null,
6398						grid: {
6399							display: chartSettings.display_y_axis,
6400							drawBorder: chartSettings.display_y_axis,
6401							drawOnChartArea: chartSettings.display_y_axis,
6402							drawTicks: chartSettings.display_y_axis,
6403							color: chartSettings.axis_grid_line_color_y,
6404							// borderColor: 'green',
6405							// borderWidth: 5,
6406							borderDash: [chartSettings.border_dash_length, chartSettings.border_dash_spacing],
6407							borderDashOffset: chartSettings.border_dash_offset,
6408							lineWidth: chartSettings.grid_line_width_y,
6409						},
6410						title: {
6411							display: chartSettings.display_y_axis_title,
6412							text: chartSettings.y_axis_title,
6413							color: chartSettings.axis_title_color_y,
6414							font: {
6415								size: chartSettings.axis_title_font_size_y,
6416								family: chartSettings.axis_title_font_family_y,
6417								style: chartSettings.axis_title_font_style_y,
6418								weight: chartSettings.axis_title_font_weight_y,
6419							}
6420						},
6421						ticks: {
6422							stepSize: chartSettings.y_step_size,
6423							display: chartSettings.display_y_ticks,
6424							padding: chartSettings.ticks_padding_y,
6425							autoSkip: false,
6426							maxRotation: chartSettings.rotation_y,
6427							minRotation: chartSettings.rotation_y,
6428							color: chartSettings.ticks_color_y,
6429							// backdropColor: 'rgb(128,0,128)',
6430							font: {
6431								size: chartSettings.ticks_font_size_y,
6432								family: chartSettings.ticks_font_family_y,
6433								style: chartSettings.ticks_font_style_y,
6434								weight: chartSettings.ticks_font_weight_y,
6435							}
6436						},
6437					},
6438				},
6439				plugins: {
6440					datalabels: {
6441						color: chartSettings.inner_datalabels_color,
6442						// backgroundColor: chartSettings.inner_datalabels_bg_color,
6443						font: {
6444							// family: chartSettings.inner_datalabels_font_family,
6445							size: chartSettings.inner_datalabels_font_size,
6446							style: chartSettings.inner_datalabels_font_style,
6447							weight: chartSettings.inner_datalabels_font_weight,
6448						},
6449					},
6450					legend: {
6451						onHover: (event, chartElement) => {
6452							event.native.target.style.cursor = 'pointer';
6453						},
6454						onLeave: (event, chartElement) => {
6455							event.native.target.style.cursor = 'default';
6456						},
6457						onClick: newLegendClickHandler,
6458						reverse: chartSettings.reverse_legend === 'yes' ? true : false,
6459						display: chartSettings.show_chart_legend == 'yes' ? true : false,
6460						position: chartSettings.legend_position !== undefined ? chartSettings.legend_position : 'top',
6461						align: chartSettings.legend_align !== undefined ? chartSettings.legend_align : 'center',
6462						labels: {
6463							usePointStyle: chartSettings.legend_shape == 'point' ? true : false,
6464							padding: chartSettings.legend_padding,
6465							boxWidth: chartSettings.legend_box_width,
6466							boxHeight: chartSettings.legend_font_size,
6467							color: chartSettings.legend_text_color,
6468							font: {
6469								family: chartSettings.legend_font_family,
6470								size: chartSettings.legend_font_size,
6471								style: chartSettings.legend_font_style,
6472								weight: chartSettings.legend_font_weight,
6473							},
6474						}
6475					},
6476					title: {
6477						display: 'yes' === chartSettings.show_chart_title ? true : false,
6478						text: chartSettings.chart_title,
6479						align: chartSettings.chart_title_align !== undefined ? chartSettings.chart_title_align : 'center',
6480						position: chartSettings.chart_title_position !== undefined ? chartSettings.chart_title_position : 'top',
6481						color: chartSettings.chart_title_color !== undefined ? chartSettings.chart_title_color : '#000',
6482						padding: chartSettings.title_padding,
6483						font: {
6484							family: chartSettings.title_font_family,
6485							size: chartSettings.title_font_size,
6486							style: chartSettings.title_font_style,
6487							weight: chartSettings.title_font_weight,
6488						},
6489					},
6490					tooltip: {
6491						callbacks: {
6492						  footer: footer,
6493						},
6494						enabled: 'yes' === chartSettings.show_chart_tooltip ? true : false,
6495						position: chartSettings.tooltip_position !== undefined ? chartSettings.tooltip_position : '
6495nearest',
6496						padding: chartSettings.tooltip_padding !== undefined ? chartSettings.tooltip_padding : 10,
6497						caretSize: tooltipCaretSize,
6498						backgroundColor: chartSettings.chart_tooltip_bg_color !== undefined ? chartSettings.chart_tooltip_bg_color : 'rbga(0, 0, 0, 0.2)',
6499						titleColor: chartSettings.chart_tooltip_title_color !== undefined ? chartSettings.chart_tooltip_title_color : '#FFF',
6500						titleFont: {
6501							family: chartSettings.chart_tooltip_title_font,
6502							size: chartSettings.chart_tooltip_title_font_size,
6503						},
6504						titleAlign: chartSettings.chart_tooltip_title_align,
6505						titleMarginBottom: chartSettings.chart_tooltip_title_margin_bottom,
6506						bodyColor: chartSettings.chart_tooltip_item_color !== undefined ? chartSettings.chart_tooltip_item_color : '#FFF',
6507						bodyFont: {
6508							family: chartSettings.chart_tooltip_item_font,
6509							size: chartSettings.chart_tooltip_item_font_size,
6510						},
6511						bodyAlign: chartSettings.chart_tooltip_item_align,
6512						bodySpacing: chartSettings.chart_tooltip_item_spacing,
6513						boxPadding: 3
6514					}
6515				},
6516			};
6517
6518			!chartTypesArray.includes(chartSettings.chart_type) && delete globalOptions.scales;
6519
6520			if ( !chartTypesArray.includes(chartSettings.chart_type) && (chartSettings.chart_type !== 'doughnut' && chartSettings.chart_type !== 'pie') ) {
6521				
6522				globalOptions.scales = {
6523					r: {
6524						angleLines: {
6525						  color: chartSettings.angle_lines_color,
6526						},
6527						pointLabels: {
6528							color: chartSettings.point_labels_color_r,
6529							font: {
6530								size: chartSettings.point_labels_font_size_r,
6531								family: chartSettings.point_labels_font_family_r,
6532								style: chartSettings.point_labels_font_style_r,
6533								weight: chartSettings.point_labels_font_weight_r,
6534							}
6535						},
6536						ticks: {
6537							stepSize: chartSettings.r_step_size,
6538							display: chartSettings.display_r_ticks,
6539							backdropColor: chartSettings.axis_labels_bg_color,
6540							backdropPadding: +chartSettings.axis_labels_padding,
6541							color: chartSettings.axis_labels_color,
6542						},
6543						grid: {
6544							display: chartSettings.display_r_axis,
6545							drawBorder: chartSettings.display_r_axis,
6546							drawOnChartArea: chartSettings.display_r_axis,
6547							drawTicks: chartSettings.display_r_axis,
6548							color: chartSettings.axis_grid_line_color_r,
6549							borderDash: [chartSettings.border_dash_length_r, chartSettings.border_dash_spacing_r],
6550							borderDashOffset: chartSettings.border_dash_offset_r,
6551							lineWidth: chartSettings.grid_line_width_r,
6552						}
6553					},
6554				}
6555			}
6556
6557			if ('custom' === chartSettings.data_source) {
6558				  const data = {
6559					labels: labels,
6560					datasets: JSON.parse(chartSettings.chart_datasets),
6561				  }; // todo apply conditions if not suitable for other chart_types
6562				
6563				  config = {
6564					plugins: [chartSettings.inner_datalabels ? ChartDataLabels : ''],
6565					type: chartSettings.chart_type == 'bar_horizontal' ? 'bar' : chartSettings.chart_type,
6566					data: data,
6567					options: globalOptions
6568				   };
6569
6570				  chartSettings.chart_type == 'bar_horizontal' ? config.options.indexAxis = 'y' : '';
6571
6572				  if (chartSettings.tooltips_percent || "pie" == chartSettings.chart_type || "doughnut" == chartSettings.chart_type || "polarArea" == chartSettings.chart_type) {
6573					config.options.plugins.tooltip.callbacks.label = function (data) {
6574						var prefixString = data.dataset.label + ": ";
6575	  
6576						if ("pie" == chartSettings.chart_type || "doughnut" == chartSettings.chart_type || "polarArea" == chartSettings.chart_type) {
6577							prefixString = data.label + ' ('+data.dataset.label+') ' + ": ";
6578						}
6579		
6580						var dataset = data.dataset;
6581		
6582						var total = dataset.data.reduce(function (previousValue, currentValue) {
6583							return parseFloat(previousValue) + parseFloat(currentValue);
6584						});
6585		
6586						var currentValue = data.formattedValue;
6587		
6588						var percentage = ((currentValue / total) * 100).toPrecision(3);
6589	  
6590						return (
6591							prefixString + (chartSettings.tooltips_percent ? percentage + "%" : data.formattedValue)
6592						);
6593					} 
6594				  }
6595	
6596				  myChart = new Chart(
6597					$scope.find('.wpr-chart'),
6598					config
6599				  );
6600			} else {
6601				if ( chartSettings.url && (chartTypesArray.includes(chartSettings.chart_type) || chartSettings.chart_type === 'radar') ) {
6602					$.ajax({
6603						url: chartSettings.url,
6604						type: "GET",
6605						success: function (res) {
6606							$scope.find(".wpr-rotating-plane").remove();
6607							renderCSVChart(res, chartSettings);
6608						},
6609						error: function (err) {
6610							console.log(err);
6611						}
6612					});
6613				} else if (!chartSettings.url && (chartTypesArray.includes(chartSettings.chart_type) || chartSettings.chart_type === 'radar')) {
6614					$scope.find(".wpr-rotating-plane").remove();
6615					$scope.find('.wpr-charts-container').html('<p class="wpr-charts-error-notice">Provide a csv file or remote URL</p>');
6616				} else {
6617					$scope.find(".wpr-rotating-plane").remove();
6618					$scope.find('.wpr-charts-container').html('<p class="wpr-charts-error-notice">doughnut, pie and polareArea charts only work with custom data source</p>');
6619				}
6620			}
6621
6622			$(window).resize(function() {
6623				lineDotsWidth = window.innerWidth >= 768 ? chartSettings.line_dots_radius 
6624									: window.innerWidth <= 767 ? chartSettings.line_dots_radius_mobile : 0;
6625				config.options.elements.point.radius = lineDotsWidth;
6626				config.options.plugins.tooltip.caretSize = tooltipCaretSize;
6627			});
6628
6629			function renderCSVChart (res, chartSettings) {
6630				var ctx = $scope.find('.wpr-chart'),
6631				rowsData = res.split(/\r?\n|\r/),
6632				labels = (rowsData.shift()).split(chartSettings.separator),
6633				data = {
6634					labels: labels,
6635					datasets: []
6636				};
6637			
6638				config = {
6639					type: chartSettings.chart_type == 'bar_horizontal' ? 'bar' : chartSettings.chart_type,
6640					data: data,
6641					options: globalOptions,
6642					plugins: [chartSettings.inner_datalabels ? ChartDataLabels : '', {
6643						beforeInit: function(chart, options) {
6644						  chart.legend.afterFit = function() {
6645							this.height = this.height + 50;
6646						  };
6647						}
6648					  }],
6649				};
6650
6651				chartSettings.chart_type == 'bar_horizontal' ? config.options.indexAxis = 'y' : '';
6652
6653				if (chartSettings.tooltips_percent) {
6654				  config.options.plugins.tooltip.callbacks.label = function (data) {
6655					  var prefixString = data.dataset.label + ": ";
6656	
6657					  if ("pie" == chartSettings.chart_type || "doughnut" == chartSettings.chart_type || "polarArea" == chartSettings.chart_type) {
6658						  prefixString = data.label + ' ('+data.dataset.label+') ' + ": ";
6659					  }
6660	  
6661					  var dataset = data.dataset;
6662	  
6663					  var total = dataset.data.reduce(function (previousValue, currentValue) {
6664						  return parseFloat(previousValue) + parseFloat(currentValue);
6665					  });
6666	  
6667					  var currentValue = data.formattedValue;
6668	  
6669					  var percentage = ((currentValue / total) * 100).toPrecision(3);
6670	
6671					  return (
6672						  prefixString + (chartSettings.tooltips_percent ? percentage + "%" : data.formattedValue)
6673					  );
6674				  } 
6675				}
6676
6677				myChart = new Chart(ctx,
6678					config
6679				);
6680		
6681				rowsData.forEach(function (row, index) {
6682					if (row.length !== 0) {
6683						var colData = {};
6684
6685						
6686						colData.data = row.split(chartSettings.separator);
6687						//add properties only if repeater element exists
6688						if (customDatasets[index]) {
6689							colData.borderColor = customDatasets[index].borderColor;
6690							colData.borderWidth = customDatasets[index].borderWidth;
6691							colData.backgroundColor = customDatasets[index].backgroundColor;
6692							colData.hoverBackgroundColor = customDatasets[index].hoverBackgroundColor;
6693							colData.label = customDatasets[index].label;
6694							colData.fill = customDatasets[index].fill
6695						}
6696		
6697						data.datasets.push(colData);
6698						myChart.update();
6699		
6700					}
6701				});
6702			}
6703		}, // End of widgetCharts
6704
6705		widgetTaxonomyList: function($scope) {
6706			var taxList = $scope.find('.wpr-taxonomy-list');
6707
6708			if ( taxList.data('show-on-click') == 'yes' ) {
6709
6710				// $scope.find('.wpr-tax-dropdown').css('margin-left', -($scope.find('.wpr-tax-dropdown').width()));
6711
6712				taxList.find('.wpr-taxonomy i.wpr-tax-dropdown').on('click', function(e) {
6713
6714					e.preventDefault();
6715
6716					if ( taxList.find('.wpr-sub-taxonomy[data-term-id="child-'+ $(this).closest('li').data('term-id') +'"]').hasClass('wpr-sub-hidden') ) {
6717						$(this).removeClass('fa-caret-right').addClass('fa-caret-down');
6718						// $scope.find('.fa-caret-down').css('margin-left', -($scope.find('.fa-caret-down').width()));
6719						taxList.find('.wpr-sub-taxonomy[data-term-id="child-'+ $(this).closest('li').data('term-id') +'"]').removeClass('wpr-sub-hidden');
6720					} else {
6721						$(this).removeClass('fa-caret-down').addClass('fa-caret-right');
6722						// $scope.find('.fa-caret-right').css('margin-left', -($scope.find('.fa-caret-right').width()));
6723						taxList.find('.wpr-sub-taxonomy[data-term-id="child-'+ $(this).closest('li').data('term-id') +'"]').addClass('wpr-sub-hidden');
6724
6725						taxList.find('.wpr-inner-sub-taxonomy[data-term-id="grandchild-'+ $(this).closest('li').data('term-id') +'"]').each(function() {
6726							if ( !$(this).hasClass('wpr-sub-hidden') ) {
6727								taxList.find('.wpr-sub-taxonomy[data-id="'+ $(this).data('parent-id') +'"] i.wpr-tax-dropdown').removeClass('fa-caret-down').addClass('fa-caret-right');
6728								// $scope.find('.fa-caret-right').css('margin-left', -($scope.find('.fa-caret-right').width()));
6729								$(this).addClass('wpr-sub-hidden');
6730							}
6731						});
6732
6733						taxList.find('.wpr-inner-sub-taxonomy-2[data-term-id="great-grandchild-'+ $(this).closest('li').data('term-id') +'"]').each(function() {
6734							if ( !$(this).hasClass('wpr-sub-hidden') ) {
6735								taxList.find('.wpr-sub-taxonomy[data-id="'+ $(this).data('parent-id') +'"] i.wpr-tax-dropdown').removeClass('fa-caret-down').addClass('fa-caret-right');
6736								// $scope.find('.fa-caret-right').css('margin-left', -($scope.find('.fa-caret-right').width()));
6737								$(this).addClass('wpr-sub-hidden');
6738							}
6739						});
6740
6741						// if (!taxList.find('.wpr-inner-sub-taxonomy[data-term-id="grandchild-'+ $(this).parent('li').data('term-id') +'"]').hasClass('wpr-sub-hidden')) {
6742						// 	taxList.find('.wpr-sub-taxonomy[data-term-id="child-'+ $(this).parent('li').data('term-id') +'"] i').removeClass('fa-caret-down').addClass('fa-caret-right');
6743						// 	taxList.find('.wpr-inner-sub-taxonomy[data-term-id="grandchild-'+ $(this).parent('li').data('term-id') +'"]').addClass('wpr-sub-hidden');
6744						// }
6745					}
6746
6747					taxList.find('.wpr-inner-sub-taxonomy[data-term-id="grandchild-'+ $(this).closest('li').data('term-id') +'"] i.wpr-tax-dropdown').removeClass('fa-caret-down').addClass('fa-caret-right');
6748
6749					if ( !taxList.find('.wpr-inner-sub-taxonomy-2[data-term-id="great-grandchild-'+ $(this).closest('li').data('term-id') +'"]').hasClass('wpr-sub-hidden') ) {
6750						taxList.find('.wpr-inner-sub-taxonomy-2[data-term-id="great-grandchild-'+ $(this).closest('li').data('term-id') +'"]').addClass('wpr-sub-hidden');
6751					}
6752				});
6753
6754				taxList.find('.wpr-sub-taxonomy i.wpr-tax-dropdown').on('click', function(e) {
6755
6756					e.preventDefault();
6757
6758					if ( taxList.find('.wpr-inner-sub-taxonomy[data-parent-id="'+ $(this).closest('li').data('id') +'"]').hasClass('wpr-sub-hidden') ) {
6759						$(this).removeClass('fa-caret-right').addClass('fa-caret-down');
6760						// $scope.find('.fa-caret-down').css('margin-left', -($scope.find('.fa-caret-down').width()));
6761						taxList.find('.wpr-inner-sub-taxonomy[data-parent-id="'+ $(this).closest('li').data('id') +'"]').removeClass('wpr-sub-hidden');
6762					} else {
6763						$(this).removeClass('fa-caret-down').addClass('fa-caret-right');
6764						// taxList.find('.wpr-sub-taxonomy i').removeClass('fa-caret-down').addClass('fa-caret-right');
6765						// $scope.find('.fa-caret-right').css('margin-left', -($scope.find('.fa-caret-right').width()));
6766						taxList.find('.wpr-inner-sub-taxonomy[data-parent-id="'+ $(this).closest('li').data('id') +'"]').addClass('wpr-sub-hidden');
6767					}
6768
6769					taxList.find('.wpr-inner-sub-taxonomy[data-parent-id="'+ $(this).closest('li').data('id') +'"] i.wpr-tax-dropdown').removeClass('fa-caret-down').addClass('fa-caret-right');
6770
6771					if ( !taxList.find('.wpr-inner-sub-taxonomy-2[data-term-id="great-grandchild-'+ $(this).closest('li').data('term-id').replace('child-', '') +'"]').hasClass('wpr-sub-hidden') ) {
6772						taxList.find('.wpr-inner-sub-taxonomy-2[data-term-id="great-grandchild-'+ $(this).closest('li').data('term-id').replace('child-', '') +'"]').addClass('wpr-sub-hidden');
6773					}
6774				});
6775
6776				taxList.find('.wpr-inner-sub-taxonomy i.wpr-tax-dropdown').on('click', function(e) {
6777
6778					e.preventDefault();
6779
6780					if ( taxList.find('.wpr-inner-sub-taxonomy-2[data-parent-id="'+ $(this).closest('li').data('id') +'"]').hasClass('wpr-sub-hidden') ) {
6781						$(this).removeClass('fa-caret-right').addClass('fa-caret-down');
6782						// $scope.find('.fa-caret-down').css('margin-left', -($scope.find('.fa-caret-down').width()));
6783						taxList.find('.wpr-inner-sub-taxonomy-2[data-parent-id="'+ $(this).closest('li').data('id') +'"]').removeClass('wpr-sub-hidden');
6784					} else {
6785						$(this).removeClass('fa-caret-down').addClass('fa-caret-right');
6786						// taxList.find('.wpr-sub-taxonomy i').removeClass('fa-caret-down').addClass('fa-caret-right');
6787						// $scope.find('.fa-caret-right').css('margin-left', -($scope.find('.fa-caret-right').width()));
6788						taxList.find('.wpr-inner-sub-taxonomy-2[data-parent-id="'+ $(this).closest('li').data('id') +'"]').addClass('wpr-sub-hidden');
6789					}
6790				});
6791			}
6792		}, // End of widgetTaxonomyList
6793
6794		widgetPostsTimeline: function($scope) {
6795			var iScrollTarget = $scope.find( '.wpr-timeline-centered' ).length > 0 ? $scope.find( '.wpr-timeline-centered' ) : '',
6796			    element = $scope.find('.wpr-timeline-centered').length > 0 ? $scope.find('.wpr-timeline-centered') : '',
6797				pagination = $scope.find( '.wpr-grid-pagination' ).length > 0 ? $scope.find( '.wpr-grid-pagination' ) : '',
6798				middleLine = $scope.find('.wpr-middle-line').length > 0 ? $scope.find('.wpr-middle-line') : '',
6799				timelineFill = $scope.find(".wpr-timeline-fill").length > 0 ? $scope.find(".wpr-timeline-fill") : '',
6800				lastIcon = $scope.find('.wpr-main-line-icon.wpr-icon:last').length > 0 ? $scope.find('.wpr-main-line-icon.wpr-icon:last') : '',
6801				firstIcon = $scope.find('.wpr-main-line-icon.wpr-icon').length > 0 ? $scope.find('.wpr-main-line-icon.wpr-icon').first() : '',
6802				scopeClass = '.elementor-element-'+ $scope.attr( 'data-id' ),
6803				aosOffset = $scope.find('.wpr-story-info-vertical').attr('data-animation-offset') ? +$scope.find('.wpr-story-info-vertical').attr('data-animation-offset') : '',
6804				aosDuration = $scope.find('.wpr-story-info-vertical').attr('data-animation-duration') ? +$scope.find('.wpr-story-info-vertical').attr('data-animation-duration') : '';
6805
6806
6807			if ( $scope.find('.wpr-timeline-centered').length > 0 ) {
6808				
6809				$(window).resize(function() {
6810					removeLeftAlignedClass();
6811				});
6812
6813				$(window).smartresize(function() {
6814					removeLeftAlignedClass();
6815				});
6816
6817				setTimeout(function() {
6818					removeLeftAlignedClass();
6819					$(window).trigger('resize');
6820				}, 500);
6821
6822				adjustMiddleLineHeight(middleLine, timelineFill, lastIcon, firstIcon, element);
6823				
6824				setTimeout(function() {
6825					adjustMiddleLineHeight(middleLine, timelineFill, lastIcon, firstIcon, element);
6826					$(window).trigger('resize');
6827				}, 500);
6828
6829				$(window).smartresize(function() {
6830					adjustMiddleLineHeight(middleLine, timelineFill, lastIcon, firstIcon, element);
6831				});
6832
6833				$(window).resize(function() {
6834					adjustMiddleLineHeight(middleLine, timelineFill, lastIcon, firstIcon, element);
6835				});
6836	
6837				var paginationType = iScrollTarget.attr('data-pagination');
6838				if ( 'load-more' !== paginationType && 'infinite-scroll' !== paginationType ) {
6839					$scope.find('.wpr-grid-pagination').css('visibility', 'hidden');
6840				}
6841
6842				if ( 'undefined' !== typeof AOS && 'function' === typeof AOS.init ) {
6843					AOS.init({
6844						offset: parseInt(aosOffset),
6845						duration: aosDuration,
6846						once: true,
6847					});
6848				}
6849
6850				postsTimelineFill(lastIcon, firstIcon);
6851
6852				$(window).on('scroll',  function() {
6853					postsTimelineFill(lastIcon, firstIcon);
6854				});
6855
6856				// init Infinite Scroll
6857				if ( !$scope.find('.elementor-repeater-items').length && !WprElements.editorCheck() && ('load-more' === $scope.find('.wpr-timeline-centered').data('pagination') || 'infinite-scroll' === $scope.find('.wpr-timeline-centered').data('pagination')) ) {
6858					var threshold = iScrollTarget !== undefined && 'load-more' === iScrollTarget.attr('data-pagination') ? false : 10;
6859					// var navClass = scopeClass +' .wpr-load-more-btn';
6860					
6861					iScrollTarget.infiniteScroll({
6862						path: scopeClass +' .wpr-grid-pagination a',
6863						hideNav: false,
6864						append:  scopeClass +'.wpr-timeline-entry',
6865						history: false,
6866						scrollThreshold: threshold,
6867						status: scopeClass + ' .page-load-status',
6868					});
6869					// Request
6870					iScrollTarget.on( 'request.infiniteScroll', function( event, path ) {
6871						$scope.find( '.wpr-load-more-btn' ).hide();
6872						$scope.find( '.wpr-pagination-loading' ).css( 'display', 'inline-block' );
6873					});
6874					
6875					var pagesLoaded = 0;
6876
6877					iScrollTarget.on( 'load.infiniteScroll', function( event, response ) {
6878						pagesLoaded++;
6879						
6880						// get posts from response
6881						var items = $( response ).find(scopeClass).find( '.wpr-timeline-entry' );
6882						var existingItemsCount = $scope.find('.wpr-timeline-entry').length;
6883						iScrollTarget.infiniteScroll( 'appendItems', items );
6884
6885						if ( !$scope.find('.wpr-one-sided-timeline').length && !$scope.find('.wpr-one-sided-timeline-left').length ) {
6886							items.each(function(index, value){
6887								$(this).removeClass('wpr-right-aligned wpr-left-aligned');
6888								var timelineIndex = existingItemsCount + index;
6889
6890								if ( 0 == timelineIndex % 2 ) {
6891									$(this).addClass('wpr-left-aligned');
6892									$(this).find('.wpr-story-info-vertical').attr('data-aos', $(this).find('.wpr-story-info-vertical').attr('data-aos-left'));
6893								} else {
6894									$(this).addClass('wpr-right-aligned');
6895									$(this).find('.wpr-story-info-vertical').attr('data-aos', $(this).find('.wpr-story-info-vertical').attr('data-aos-right'));
6896								}
6897							});
6898						}
6899
6900						if ( 'undefined' !== typeof AOS && 'function' === typeof AOS.init ) {
6901							AOS.init({
6902								offset: parseInt(aosOffset),
6903								duration: aosDuration,
6904								once: true,
6905							});
6906						}
6907
6908						$(window).scroll();
6909
6910						$scope.find( '.wpr-pagination-loading' ).hide();
6911						// $scope.find( '.wpr-load-more-btn' ).fadeIn();
6912						if ( iScrollTarget.data('max-pages') - 1 !== pagesLoaded ) { // $pagination_max_pages
6913							if ( 'load-more' === iScrollTarget.attr('data-pagination') ) {
6914								$scope.find( '.wpr-load-more-btn' ).fadeIn();
6915							}
6916						} else {
6917							$scope.find( '.wpr-pagination-finish' ).fadeIn( 1000 );
6918							pagination.delay( 2000 ).fadeOut( 1000 );
6919						}
6920
6921						middleLine = $scope.find('.wpr-middle-line');
6922						timelineFill = $scope.find(".wpr-timeline-fill");
6923						lastIcon = $scope.find('.wpr-main-line-icon.wpr-icon:last');
6924						firstIcon = $scope.find('.wpr-main-line-icon.wpr-icon').first();
6925						element = $scope.find('.wpr-timeline-centered');
6926
6927						adjustMiddleLineHeight(middleLine, timelineFill, lastIcon, firstIcon, element);
6928						$(window).trigger('resize');
6929						postsTimelineFill(lastIcon, firstIcon);
6930					});
6931
6932					if ( !WprElements.editorCheck() ) {
6933						$scope.find( '.wpr-load-more-btn' ).on( 'click', function( e ) {
6934							e.preventDefault();
6935							iScrollTarget.infiniteScroll( 'loadNextPage' );
6936							return false;
6937						});
6938
6939						if ( 'infinite-scroll' == iScrollTarget.attr('data-pagination') ) {
6940								iScrollTarget.infiniteScroll('loadNextPage');
6941						}
6942					}
6943				}
6944			}
6945
6946			if ( $scope.find('.swiper-wrapper').length ) {
6947
6948				var swiperLoader = function swiperLoader(swiperElement, swiperConfig) {
6949					// if ('undefined' === typeof Swiper) {
6950					// 	var asyncSwiper = elementorFrontend.utils.swiper;     
6951					// 	return new asyncSwiper(swiperElement, swiperConfig).then( function (newSwiperInstance) {
6952					// 		return newSwiperInstance;
6953					// 	});
6954					//  } else {
6955					// 	return swiperPromise(swiperElement, swiperConfig);  
6956					// }
6957
6958					// Check if swiperPromise is necessary
6959					var asyncSwiper = elementorFrontend.utils.swiper;     
6960					return new asyncSwiper(swiperElement, swiperConfig).then( function (newSwiperInstance) {
6961						return newSwiperInstance;
6962					});
6963				};
6964				
6965				var swiperPromise = function swiperPromise(swiperElement, swiperConfig) {    
6966					return new Promise(function (resolve, reject) {  
6967							var swiperInstance = new Swiper(swiperElement, swiperConfig); 
6968							resolve(swiperInstance); 
6969					}); 
6970				};
6971			
6972				var horizontal = $scope.find('.wpr-horizontal-bottom').length ? '.wpr-horizontal-bottom' : '.wpr-horizontal';
6973				var swiperSlider = $scope.find(horizontal +".swiper");
6974							
6975				var slidestoshow = swiperSlider.data("slidestoshow");
6976
6977				swiperLoader(swiperSlider, {
6978					spaceBetween: +swiperSlider.data('swiper-space-between'),
6979					loop: swiperSlider.data('loop') === 'yes' ? true : false,
6980					autoplay: swiperSlider.data("autoplay") !== 'yes' ? false : {
6981						delay: +swiperSlider.attr('data-swiper-delay'),
6982						disableOnInteraction: false,
6983						pauseOnMouseEnter: swiperSlider.data('swiper-poh') === 'yes' ? true : false,
6984					},
6985					on: {
6986						init: function () {
6987							if ( $scope.find('.wpr-timeline-outer-container').length > 0 ) {
6988								$scope.find('.wpr-timeline-outer-container').css('opacity', 1);
6989							}
6990						},
6991					},
6992					speed: +swiperSlider.attr('data-swiper-speed'),
6993					slidesPerView: swiperSlider.data("slidestoshow"),
6994					direction: 'horizontal',
6995					pagination: {
6996					  el: '.wpr-swiper-pagination',
6997					  type: 'progressbar',
6998					},
6999					navigation: {
7000					  nextEl: '.wpr-button-next',
7001					  prevEl: '.wpr-button-prev',
7002					},
7003					// Responsive breakpoints
7004					breakpoints: {
7005					  // when window width is >= 320px
7006					  320: {
7007						slidesPerView: 1,
7008					  },
7009					  // when window width is >= 480px
7010					  480: {
7011						slidesPerView: 2,
7012					  },
7013					  // when window width is >= 640px
7014					  769: { // 640
7015						slidesPerView: slidestoshow,
7016					  }
7017					},
7018				  });
7019
7020				//   swiperSlider.data('pause-on-hover') === 'yes' && swiperSlider.hover(function() {
7021				// 	  (this).swiper.autoplay.stop();
7022				//   }, function() {
7023				// 	  (this).swiper.autoplay.start();
7024				//   });
7025
7026			} else {
7027				$(document).ready(function() {
7028					// Handler when all assets (including images) are loaded
7029					if ( $scope.find('.wpr-timeline-outer-container').length ) {
7030						$scope.find('.wpr-timeline-outer-container').css('opacity', 1);
7031					}
7032				});
7033			}
7034
7035			function removeLeftAlignedClass() {
7036				if ( $scope.find('.wpr-centered').length ) {
7037					if ( window.innerWidth <= 767 ) {
7038						$scope.find('.wpr-wrapper .wpr-timeline-centered').removeClass('wpr-both-sided-timeline').addClass('wpr-one-sided-timeline').addClass('wpr-remove-one-sided-later');
7039						$scope.find('.wpr-wrapper .wpr-left-aligned').removeClass('wpr-left-aligned').addClass('wpr-right-aligned').addClass('wpr-remove-right-aligned-later');
7040					} else {
7041						$scope.find('.wpr-wrapper .wpr-timeline-centered.wpr-remove-one-sided-later').removeClass('wpr-one-sided-timeline').addClass('wpr-both-sided-timeline').removeClass('wpr-remove-one-sided-later');
7042						$scope.find('.wpr-wrapper .wpr-remove-right-aligned-later').removeClass('wpr-right-aligned').addClass('wpr-left-aligned').removeClass('wpr-remove-right-aligned-later');
7043					}
7044				}
7045			}
7046
7047		  function postsTimelineFill(lastIcon, firstIcon) {
7048			if ( !$scope.find('.wpr-timeline-fill').length ) {
7049				return;
7050			}
7051
7052			if ( $scope.find('.wpr-timeline-entry:eq(0)').prev('.wpr-year-wrap').length > 0 ) {
7053				firstIcon = $scope.find('.wpr-year-label').eq(0);
7054			}
7055
7056			  if ( timelineFill.length ) {
7057				var fillHeight = timelineFill.css('height').slice(0, -2),
7058					docScrollTop = document.documentElement.scrollTop,
7059					clientHeight = document.documentElement.clientHeight/2;
7060				  
7061				if ( !((docScrollTop + clientHeight - (firstIcon.offset().top)) > lastIcon.offset().top - firstIcon.offset().top + parseInt(lastIcon.css('height').slice(0, -2))) ) {
7062					timelineFill.css('height', (docScrollTop  + clientHeight - (firstIcon.offset().top)) + 'px');
7063				}
7064
7065				$scope.find('.wpr-main-line-icon.wpr-icon').each(function () {
7066					if ( $(this).offset().top < parseInt( firstIcon.offset().top + parseInt(fillHeight) ) ) {
7067						$(this).addClass('wpr-change-border-color');
7068					} else {
7069						$(this).removeClass('wpr-change-border-color');
7070					}
7071				});
7072			  }
7073		  }
7074
7075		  function adjustMiddleLineHeight(middleLine, timelineFill, lastIcon, firstIcon, element) {
7076			  	element = $scope.find('.wpr-timeline-centered');
7077				if ( !$scope.find('.wpr-both-sided-timeline').length && !$scope.find('.wpr-one-sided-timeline').length && !$scope.find('.wpr-one-sided-timeline-left').length ) {
7078					return;
7079				}
7080
7081				if ( $scope.find('.wpr-timeline-entry:eq(0)').prev('.wpr-year-wrap').length > 0 ) {
7082					firstIcon = $scope.find('.wpr-year-label').eq(0);
7083				}
7084				
7085				var firstIconOffset = firstIcon.offset().top;
7086				var lastIconOffset = lastIcon.offset().top;
7087				var middleLineTop = (firstIconOffset - element.offset().top) + 'px';
7088				// var middleLineHeight = (lastIconOffset - (lastIcon.css('height').slice(0, -2)/2 + (firstIconOffset - firstIcon.css('height').slice(0, -2)))) + 'px';
7089				var middleLineHeight = lastIconOffset - firstIconOffset + parseInt(lastIcon.css('height').slice(0, -2));
7090				var middleLineMaxHeight = firstIconOffset - lastIconOffset + 'px !important';
7091
7092				middleLine.css('top', middleLineTop);
7093				middleLine.css('height', middleLineHeight);
7094				// middleLine.css('maxHeight', middleLineMaxHeight);
7095				timelineFill !== '' ? timelineFill.css('top', middleLineTop) : '';
7096		  }
7097		}, // end widgetPostsTimeline
7098
7099		widgetGoogleReviews: function($scope) {
7100			var $wrap = $scope.find('.wpr-google-reviews-wrap');
7101
7102			if ( !$wrap.length ) {
7103				return;
7104			}
7105
7106			var revealWidget = function revealWidget() {
7107				$wrap.css('opacity', 1);
7108			};
7109
7110			if ( WprElements.editorCheck() ) {
7111				revealWidget();
7112			}
7113
7114			var $sliders = $scope.find('.wpr-google-reviews-slider.swiper');
7115
7116			if ( !$sliders.length ) {
7117				revealWidget();
7118				return;
7119			}
7120
7121			var swiperLoader = function swiperLoader(swiperElement, swiperConfig) {
7122				var asyncSwiper = elementorFrontend.utils.swiper;
7123				return new asyncSwiper(swiperElement, swiperConfig).then( function (newSwiperInstance) {
7124					return newSwiperInstance;
7125				});
7126			};
7127
7128			var swiperPromises = [];
7129
7130			$sliders.each(function() {
7131				var swiperSlider = $(this);
7132				var slidestoshow = +swiperSlider.data('slidestoshow') || 1;
7133				var slidestoscroll = +swiperSlider.data('slidestoscroll') || 1;
7134				var showNavigation = swiperSlider.data('show-navigation') === 'yes';
7135				var prevEl = showNavigation ? swiperSlider.find('.wpr-button-prev')[0] : false;
7136				var nextEl = showNavigation ? swiperSlider.find('.wpr-button-next')[0] : false;
7137
7138				swiperPromises.push(
7139					swiperLoader(swiperSlider, {
7140						spaceBetween: +swiperSlider.data('swiper-space-between') || 0,
7141						loop: swiperSlider.data('loop') === 'yes',
7142						autoplay: swiperSlider.data('autoplay') !== 'yes' ? false : {
7143							delay: +swiperSlider.data('swiper-delay'),
7144							disableOnInteraction: false,
7145							pauseOnMouseEnter: swiperSlider.data('swiper-poh') === 'yes',
7146						},
7147						speed: +swiperSlider.data('swiper-speed') || 500,
7148						slidesPerView: slidestoshow,
7149						slidesPerGroup: Math.min(slidestoscroll, slidestoshow),
7150						direction: 'horizontal',
7151						navigation: showNavigation ? {
7152							nextEl: nextEl,
7153							prevEl: prevEl,
7154						} : false,
7155						breakpoints: {
7156							320: {
7157								slidesPerView: 1,
7158								slidesPerGroup: 1,
7159							},
7160							480: {
7161								slidesPerView: Math.min(2, slidestoshow),
7162								slidesPerGroup: Math.min(slidestoscroll, Math.min(2, slidestoshow)),
7163							},
7164							769: {
7165								slidesPerView: slidestoshow,
7166								slidesPerGroup: Math.min(slidestoscroll, slidestoshow),
7167							}
7168						},
7169					})
7170				);
7171			});
7172
7173			if ( !swiperPromises.length ) {
7174				revealWidget();
7175				return;
7176			}
7177
7178			Promise.all(swiperPromises).then(revealWidget).catch(revealWidget);
7179		}, // end widgetGoogleReviews
7180
7181        widgetSharingButtons: function($scope) {
7182			$scope.find('.wpr-sharing-print').on('click', function(e) {
7183				e.preventDefault();
7184				window.print();
7185			});
7186        }, // end widgetSharingButtons
7187
7188		widgetTwitterFeed: function($scope) {
7189
7190			let twitterFeed = $scope.find('.wpr-twitter-feed');
7191			var twitterFeedSettings = twitterFeed.attr( 'data-settings' );
7192
7193			if ( !twitterFeedSettings ) {
7194				return;
7195			}
7196
7197			var settings = JSON.parse( twitterFeedSettings );
7198			var loadMoreSettings = settings.twitter_load_more_settings;
7199
7200			var nextPostsIndex = loadMoreSettings.number_of_posts;
7201			var pagination = $scope.find( '.wpr-grid-pagination' );
7202			var $window = $(window);
7203			var scopeId = $scope.attr('data-id') || '0';
7204			var twitterLayoutNamespace = '.wprTwitterFeedLayout' + scopeId;
7205			var twitterResizeTimer = null;
7206			var responsiveBreakpoints = elementorFrontend.config.responsive.breakpoints;
7207			var mobileResp = +responsiveBreakpoints.mobile.value;
7208			var mobileExtraResp = +responsiveBreakpoints.mobile_extra.value;
7209			var tabletResp = +responsiveBreakpoints.tablet.value;
7210			var tabletExtraResp = +responsiveBreakpoints.tablet_extra.value;
7211			var laptopResp = +responsiveBreakpoints.laptop.value;
7212			var widescreenResp = +responsiveBreakpoints.widescreen.value;
7213
7214			if ( $scope.hasClass('wpr-twitter-feed-masonry') ) {
7215				// Init Functions
7216				isotopeLayout( settings );
7217				setTimeout(function() {
7218					isotopeLayout( settings );
7219				}, 100 );
7220
7221				if ( WprElements.editorCheck() ) {
7222					setTimeout(function() {
7223						isotopeLayout( settings );
7224					}, 500 );
7225					setTimeout(function() {
7226						isotopeLayout( settings );
7227					}, 1000 );
7228				}
7229
7230				$window.off( 'load' + twitterLayoutNamespace ).on( 'load' + twitterLayoutNamespace, function() {
7231					setTimeout(function() {
7232						isotopeLayout( settings );
7233					}, 100 );
7234				});
7235
7236				$window.off( 'resize' + twitterLayoutNamespace ).on( 'resize' + twitterLayoutNamespace, function(){
7237					clearTimeout( twitterResizeTimer );
7238					twitterResizeTimer = setTimeout(function() {
7239						isotopeLayout( settings );
7240					}, 200 );
7241				});
7242			}
7243
7244			function isotopeLayout( settings ) {
7245				var item = twitterFeed.find( '.wpr-tweet' ),
7246					layout = settings.layout_select,
7247					columns = 3,
7248					gutterHr = settings.gutter_hr,
7249					gutterVr = settings.gutter_vr,
7250					contWidth = twitterFeed.width() + gutterHr - 0.3,
7251					viewportWidth = $window.outerWidth(),
7252					transDuration = 400;
7253
7254				// Mobile
7255				if (mobileResp >= viewportWidth ) {
7256					columns = (settings.columns_mobile) ? (settings.columns_mobile) : 1;
7257				// Mobile Extra
7258				} else if ( mobileExtraResp >= viewportWidth ) {
7259					columns = (settings.columns_mobile_extra) ? settings.columns_mobile_extra : settings.columns_tablet ? settings.columns_tablet : settings.columns;
7260				// Tablet
7261				} else if ( tabletResp >= viewportWidth ) {
7262					columns = (settings.columns_tablet) ? settings.columns_tablet : 2;
7263				// Tablet Extra
7264				} else if ( tabletExtraResp >= viewportWidth ) {
7265					columns = (settings.columns_tablet_extra) ? settings.columns_tablet_extra 
7265: settings.columns_tablet ? settings.columns_tablet : settings.columns;
7266
7267				// Laptop
7268				} else if (  laptopResp >= viewportWidth ) {
7269					columns = (settings.columns_laptop) ? settings.columns_laptop : settings.columns;
7270
7271				// Desktop
7272				} else if ( widescreenResp - 1 >= viewportWidth ) {
7273					columns = settings.columns;
7274
7275				// Larger Screens
7276				} else if ( widescreenResp <= viewportWidth ) {
7277					columns = (settings.columns_widescreen) ? settings.columns_widescreen : settings.columns;
7278				} else {
7279					columns = settings.columns
7280				}
7281
7282				// Limit Columns for Higher Screens
7283				if ( columns > 8 ) {
7284					columns = 8;
7285				}
7286
7287				columns = parseInt(columns);
7288
7289				if ( 'string' == typeof(columns) && -1 !== columns.indexOf('pro') ) {
7290					columns = 3;
7291				}
7292
7293				// Calculate Item Width
7294				item.outerWidth( Math.floor( contWidth / columns - gutterHr ) );
7295
7296				// Set Vertical Gutter
7297				item.css( 'margin-bottom', gutterVr +'px' );
7298
7299				// Reset Vertical Gutter for 1 Column Layout
7300				if ( 1 === columns ) {
7301					item.last().css( 'margin-bottom', '0' );
7302				}
7303
7304				// Run Isotope
7305				var twitterFeedMasonry = twitterFeed.isotopewpr({
7306					layoutMode: layout,
7307					masonry: {
7308						comlumnWidth: contWidth / columns,
7309						gutter: gutterHr
7310					},
7311					transitionDuration: transDuration,
7312  					percentPosition: true
7313				});
7314
7315				if ( '1' !== twitterFeed.css( 'opacity' ) ) {
7316					twitterFeed.css( 'opacity', '1' );
7317				}
7318
7319				// return instagramFeed;//tmp
7320			}
7321
7322			if ( !WprElements.editorCheck() ) {
7323				$scope.find('.wpr-load-more-twitter-posts').off('click' + twitterLayoutNamespace).on('click' + twitterLayoutNamespace, function() {
7324					pagination.find( '.wpr-load-more-btn' ).hide();
7325					pagination.find( '.wpr-pagination-loading' ).css( 'display', 'inline-block' );
7326					// pagination.find( '.wpr-pagination-finish' ).fadeIn(  );
7327					// pagination.delay( 2000 ).fadeOut( 1000 );
7328					// setTimeout(function() {
7329						$.ajax({
7330							type: 'POST',
7331							url: WprConfig.ajaxurl,
7332							data: { 
7333								action: 'wpr_load_more_tweets',
7334								nonce: WprConfig.nonce,
7335								wpr_load_more_settings: loadMoreSettings,
7336								next_post_index: nextPostsIndex,
7337							},
7338							success: function(data) {
7339								var $data = $(data);
7340
7341								$data.each(function() {
7342									$(this).addClass('wpr-twitter-hidden-item');
7343								});
7344
7345								
7346								$scope.find('.wpr-twitter-feed').append( $data );
7347
7348								setTimeout(function() {
7349					
7350									if ( $scope.hasClass('wpr-twitter-feed-masonry') ) {
7351										twitterFeed.isotopewpr( 'appended', $data );
7352								
7353										twitterFeed.isotopewpr( 'reloadItems' ); // https://isotope.metafizzy.co/methods.html#reloaditems
7354										
7355										twitterFeed.isotopewpr('layout'); // https://isotope.metafizzy.co/methods.html#layout
7356						
7357										$(window).trigger('resize');
7358									}
7359
7360									$data.each(function(index) {
7361										var item = $(this);
7362										setTimeout(function() {
7363											item.removeClass('wpr-twitter-hidden-item');
7364										}, 300);
7365									});
7366		
7367									// Loading
7368									pagination.find( '.wpr-pagination-loading' ).hide();
7369	
7370									if (data.includes('wpr-tweet')) { // replaceclassname
7371										pagination.find( '.wpr-load-more-btn' ).fadeIn();
7372									} else {
7373										pagination.find( '.wpr-pagination-finish' ).fadeIn( 1000 );
7374									}
7375								}, 400);
7376
7377								nextPostsIndex =  nextPostsIndex + loadMoreSettings.number_of_posts;
7378							},
7379							error: function(error) {
7380								console.log(error);
7381							}
7382						});
7383
7384					// }, 1000);
7385				});
7386			}
7387
7388			twitterFeedCarousel();
7389				
7390			$scope.find('.wpr-grid').css('opacity', 1);
7391
7392			function twitterFeedCarousel() {
7393				if ( $scope.hasClass('wpr-twitter-feed-carousel') ) {
7394					var swiperLoader = function swiperLoader(swiperElement, swiperConfig) {
7395						// if ('undefined' === typeof Swiper) {
7396						// 	var asyncSwiper = elementorFrontend.utils.swiper;     
7397						// 	return new asyncSwiper(swiperElement, swiperConfig).then( function (newSwiperInstance) {     
7398						// 		return newSwiperInstance;
7399						// 	});  
7400						// } else {     
7401						// 	return swiperPromise(swiperElement, swiperConfig);  
7402						// }
7403
7404						var asyncSwiper = elementorFrontend.utils.swiper;     
7405						return new asyncSwiper(swiperElement, swiperConfig).then( function (newSwiperInstance) {     
7406							return newSwiperInstance;
7407						});
7408					};
7409					
7410					var swiperPromise = function swiperPromise(swiperElement, swiperConfig) {    
7411						return new Promise(function (resolve, reject) {  
7412								var swiperInstance = new Swiper(swiperElement, swiperConfig);     
7413								resolve(swiperInstance); 
7414						}); 
7415					};
7416
7417					$scope.find('.wpr-twitter-feed').css('flexWrap', 'nowrap');
7418
7419					var sliderSettings = settings.carousel;
7420					
7421					$scope.find('.wpr-twitter-feed-cont').addClass('swiper');
7422					$scope.find('.wpr-twitter-feed').addClass('swiper-wrapper');
7423					$scope.find('.wpr-tweet').addClass('swiper-slide');
7424					$scope.find('.wpr-twitter-feed-cont').css('overflow', 'hidden');
7425					// $scope.find('.elementor-container').css('margin', '0');
7426					var swiperSlider = $scope.find('.wpr-twitter-feed-cont');
7427
7428					var aboveMobileResp = +elementorFrontend.config.responsive.breakpoints.mobile.value + 1;
7429					var aboveMobileExtraResp = +elementorFrontend.config.responsive.breakpoints.mobile_extra.value + 1;
7430					var aboveTabletResp = +elementorFrontend.config.responsive.breakpoints.tablet.value + 1;
7431					var aboveTabletExtraResp = +elementorFrontend.config.responsive.breakpoints.tablet_extra.value + 1;
7432					var aboveLaptopResp = +elementorFrontend.config.responsive.breakpoints.laptop.value + 1;
7433					var wideScreenResp = +elementorFrontend.config.responsive.breakpoints.widescreen.value;
7434
7435					swiperLoader(swiperSlider, {
7436						autoplay: sliderSettings.wpr_cs_autoplay === 'yes' ? {
7437							delay: +sliderSettings.wpr_cs_delay,
7438						} : false,
7439						loop: sliderSettings.wpr_cs_loop === 'yes' ? true : false,
7440						slidesPerView: +sliderSettings.wpr_cs_slides_to_show,
7441						spaceBetween: +sliderSettings.wpr_cs_space_between,
7442						speed: +sliderSettings.wpr_cs_speed,
7443						pagination: sliderSettings.wpr_cs_pagination === 'yes' ? {
7444						el: '.swiper-pagination',
7445						type: sliderSettings.wpr_cs_pagination_type,
7446						} : false,
7447						navigation: {
7448						prevEl: '.wpr-swiper-button-prev',
7449						nextEl: '.wpr-swiper-button-next',
7450						},
7451						// Responsive breakpoints - direction min
7452						breakpoints: {
7453						320: {
7454							slidesPerView: +sliderSettings.wpr_cs_slides_to_show_mobile,
7455							// spaceBetween: +sliderSettings.wpr_cs_space_between_mobile,
7456						},
7457						[aboveMobileResp]: {
7458							slidesPerView: +sliderSettings.wpr_cs_slides_to_show_mobile_extra,
7459							// spaceBetween: +sliderSettings.wpr_cs_space_between_mobile_extra,
7460						},
7461						[aboveMobileExtraResp]: {
7462							slidesPerView: +sliderSettings.wpr_cs_slides_to_show_tablet,
7463							spaceBetween: +sliderSettings.wpr_cs_space_between_tablet,
7464						},
7465						[aboveTabletResp]: {
7466							slidesPerView: +sliderSettings.wpr_cs_slides_to_show_tablet_extra,
7467							spaceBetween: +sliderSettings.wpr_cs_space_between_tablet_extra,
7468						},
7469						[aboveTabletExtraResp]: {
7470							slidesPerView: +sliderSettings.wpr_cs_slides_to_show_laptop,
7471							spaceBetween: +sliderSettings.wpr_cs_space_between_laptop,
7472						},
7473						[aboveLaptopResp]: {
7474							slidesPerView: +sliderSettings.wpr_cs_slides_to_show,
7475							spaceBetween: +sliderSettings.wpr_cs_space_between,
7476						},
7477						[wideScreenResp]: {
7478							slidesPerView: +sliderSettings.wpr_cs_slides_to_show_widescreen,
7479							spaceBetween: +sliderSettings.wpr_cs_space_between_widescreen,
7480						}
7481						},
7482					
7483					});
7484
7485					$scope.css('opacity', 1);
7486				}
7487			}
7488
7489		}, // end widgetTwitterFeed
7490
7491        widgetInstagramFeed: function($scope) {
7492
7493			if ( !($scope.find('.wpr-insta-feed-content-wrap').length  > 0) ) {
7494                return;
7495            }
7496
7497            let instaFeed = $scope.find('.wpr-instagram-feed');
7498            var instaFeedSettings = instaFeed.attr( 'data-settings' );
7499
7500            if ( !instaFeedSettings ) {
7501                return;
7502            }
7503
7504            var settings = JSON.parse( instaFeedSettings );
7505            var loadMoreSettings = settings.insta_load_more_settings;
7506            
7507            var widgetID = $scope.attr('data-id');
7508			
7509            var nextPostsIndex = loadMoreSettings.limit;
7510            var pagination = $scope.find('.wpr-grid-pagination'); // Isotope Layout
7511            var $window = $(window);
7512            var instagramLayoutNamespace = '.wprInstagramFeedLayout' + ( widgetID || '0' );
7513            var instagramMasonryResizeTimer = null;
7514            var instagramListResizeTimer = null;
7515            var responsiveBreakpoints = elementorFrontend.config.responsive.breakpoints;
7516            var mobileResp = +responsiveBreakpoints.mobile.value;
7517            var mobileExtraResp = +responsiveBreakpoints.mobile_extra.value;
7518            var tabletResp = +responsiveBreakpoints.tablet.value;
7519            var tabletExtraResp = +responsiveBreakpoints.tablet_extra.value;
7520            var laptopResp = +responsiveBreakpoints.laptop.value;
7521            var widescreenResp = +responsiveBreakpoints.widescreen.value;
7522
7523            if ( $scope.hasClass('wpr-insta-feed-layout-full-width') ) {
7524                if ( loadMoreSettings.limit > $scope.find('.wpr-insta-feed-content-wrap').length ) {
7525                    $scope.find('.wpr-layout-full-width').css('grid-template-columns', "repeat("+ $scope.find('.wpr-insta-feed-content-wrap').length +", minmax(0, 1fr))");
7526                }
7527            }
7528
7529            if ( $scope.hasClass('wpr-insta-feed-masonry') ) {
7530                // Init Functions
7531                isotopeLayout( settings );
7532                setTimeout(function() {
7533                    isotopeLayout( settings );
7534                }, 100 );
7535
7536                if ( WprElements.editorCheck() ) {
7537                    setTimeout(function() {
7538                        isotopeLayout( settings );
7539                    }, 500 );
7540                    setTimeout(function() {
7541                        isotopeLayout( settings );
7542                    }, 1000 );
7543                }
7544
7545                $window.off( 'load' + instagramLayoutNamespace ).on( 'load' + instagramLayoutNamespace, function() {
7546                    setTimeout(function() {
7547                        isotopeLayout( settings );
7548                    }, 100 );
7549                });
7550
7551                $window.off( 'resize' + instagramLayoutNamespace ).on( 'resize' + instagramLayoutNamespace, function(){
7552                    clearTimeout( instagramMasonryResizeTimer );
7553                    instagramMasonryResizeTimer = setTimeout(function() {
7554                        isotopeLayout( settings );
7555                    }, 200 );
7556                });
7557            }
7558
7559            if ( $scope.hasClass('wpr-insta-feed-layout-list') ) {
7560                var mediaAlign = settings.media_align,
7561                mediaWidth = settings.media_width,
7562                mediaDistance = settings.media_distance;
7563                $scope.find( '.wpr-insta-feed-item-below-content' ).css({
7564                    'float' : mediaAlign,
7565                    'width' : 'calc((100% - '+ mediaWidth +'%) - '+ mediaDistance +'px)',
7566                });
7567
7568                $window.off( 'resize' + instagramLayoutNamespace + 'List' ).on( 'resize' + instagramLayoutNamespace + 'List', function() {
7569                    clearTimeout( instagramListResizeTimer );
7570                    instagramListResizeTimer = setTimeout(function() {
7571                    mediaAlign = settings.media_align,
7572                    mediaWidth = settings.media_width,
7573                    mediaDistance = settings.media_distance;
7574                    $scope.find( '.wpr-insta-feed-item-below-content' ).css({
7575                        'float' : mediaAlign,
7576                        'width' : 'calc((100% - '+ mediaWidth +'%) - '+ mediaDistance +'px)',
7577                    });
7578                    }, 200 );
7579                });
7580            }
7581
7582            function isotopeLayout( settings ) {
7583                var item = instaFeed.find( '.wpr-insta-feed-content-wrap' ),
7584                    layout = settings.insta_layout_select,
7585                    columns = 3,
7586                    gutterHr = settings.gutter_hr,
7587                    gutterVr = settings.gutter_vr,
7588                    contWidth = instaFeed.width() + gutterHr - 0.3,
7589                    viewportWidth = $window.outerWidth(),
7590                    transDuration = 400;
7591
7592                // Mobile
7593                if (mobileResp >= viewportWidth ) {
7594                    columns = (settings.columns_mobile) ? (settings.columns_mobile) : 1;
7595                // Mobile Extra
7596                } else if ( mobileExtraResp >= viewportWidth ) {
7597                    columns = (settings.columns_mobile_extra) ? settings.columns_mobile_extra : settings.columns_tablet ? settings.columns_tablet : settings.columns;
7598                // Tablet
7599                } else if ( tabletResp >= viewportWidth ) {
7600                    columns = (settings.columns_tablet) ? settings.columns_tablet : 2;
7601                // Tablet Extra
7602                } else if ( tabletExtraResp >= viewportWidth ) {
7603                    columns = (settings.columns_tablet_extra) ? settings.columns_tablet_extra 
7603: settings.columns_tablet ? settings.columns_tablet : settings.columns;
7604
7605                // Laptop
7606                } else if (  laptopResp >= viewportWidth ) {
7607                    columns = (settings.columns_laptop) ? settings.columns_laptop : settings.columns;
7608
7609                // Desktop
7610                } else if ( widescreenResp - 1 >= viewportWidth ) {
7611                    columns = settings.columns;
7612
7613                // Larger Screens
7614                } else if ( widescreenResp <= viewportWidth ) {
7615                    columns = (settings.columns_widescreen) ? settings.columns_widescreen : settings.columns;
7616                } else {
7617                    columns = settings.columns
7618                }
7619
7620                // Limit Columns for Higher Screens
7621                if ( columns > 8 ) {
7622                    columns = 8;
7623                }
7624
7625                columns = parseInt(columns);
7626                if ( 'string' == typeof(columns) && -1 !== columns.indexOf('pro') ) {
7627                    columns = 3;
7628                }
7629
7630                // Calculate Item Width
7631                item.outerWidth( Math.floor( contWidth / columns - gutterHr ) );
7632
7633                // Set Vertical Gutter
7634                item.css( 'margin-bottom', gutterVr +'px' );
7635
7636                // Reset Vertical Gutter for 1 Column Layout
7637                if ( 1 === columns ) {
7638                    item.last().css( 'margin-bottom', '0' );
7639                }
7640
7641                // Run Isotope
7642                var instagramFeed = instaFeed.isotopewpr({
7643                    layoutMode: layout,
7644                    masonry: {
7645                        comlumnWidth: contWidth / columns,
7646                        gutter: gutterHr
7647                    },
7648                    transitionDuration: transDuration,
7649                        percentPosition: true
7650                });
7651                // return instagramFeed;//tmp
7652            }
7653
7654            if ( !WprElements.editorCheck() ) {
7655                $scope.find('.wpr-load-more-insta-posts').on('click', function() {
7656                    var $loadMoreBtn = pagination.find( '.wpr-load-more-btn' );
7657                    var $paginationLoading = pagination.find( '.wpr-pagination-loading' );
7658
7659                    $loadMoreBtn.stop( true, true ).hide();
7660                    $paginationLoading.stop( true, true ).css( 'display', 'inline-block' );
7661                    // pagination.find( '.wpr-pagination-finish' ).fadeIn(  );
7662                    // pagination.delay( 2000 ).fadeOut( 1000 );
7663                    // setTimeout(function() {
7664                        $.ajax({
7665                            type: 'POST',
7666                            url: WprConfig.ajaxurl,
7667                            data: { 
7668                                action: 'wpr_load_more_instagram_posts',
7669                                nonce: WprConfig.nonce,
7670                                wpr_load_more_settings: loadMoreSettings,
7671                                wpr_insta_feed_widget_id: widgetID,
7672                                next_post_index: nextPostsIndex,
7673                            },
7674                            success: function(data) {
7675                                var $data = $(data);
7676
7677                                $data.each(function() {
7678                                    $(this).addClass('wpr-instagram-hidden-item');
7679                                });
7680
7681                                $scope.find('.wpr-instagram-feed').append( $data );
7682                                    
7683
7684                                if ( $scope.hasClass('wpr-insta-feed-layout-list') ) {
7685                                    mediaAlign = settings.media_align,
7686                                    mediaWidth = settings.media_width,
7687                                    mediaDistance = settings.media_distance;
7688                                    $scope.find( '.wpr-insta-feed-item-below-content' ).css({
7689                                        'float' : mediaAlign,
7690                                        'width' : 'calc((100% - '+ mediaWidth +'%) - '+ mediaDistance +'px)',
7691                                    });
7692                                }
7693
7694                                if ( $scope.hasClass('wpr-insta-feed-masonry') ) {
7695                                    instaFeed.isotopewpr( 'appended', $data );
7696                                
7697                                    instaFeed.isotopewpr( 'reloadItems' ); // https://isotope.metafizzy.co/methods.html#reloaditems
7698                                    
7699                                    instaFeed.isotopewpr('layout'); // https://isotope.metafizzy.co/methods.html#layout
7700    
7701                                    $(window).trigger('resize');
7702                                }
7703
7704                                setTimeout(function() {
7705
7706                                    $data.each(function(index) {
7707                                        var item = $(this);
7708                                        setTimeout(function() {
7709                                            item.removeClass('wpr-instagram-hidden-item');
7710                                        }, 100);
7711                                    });
7712    
7713                                    // Loading
7714                                    $paginationLoading.stop( true, true ).hide();
7715    
7716                                    if (data.includes('wpr-insta-feed-content-wrap')) {
7717                                        setTimeout(function() {
7718                                            pagination.find( '.wpr-load-more-btn' ).show();
7719                                        }, 400);
7720                                    } else {
7721                                        $loadMoreBtn.stop( true, true ).hide();
7722                                        pagination.find( '.wpr-pagination-finish' ).fadeIn( 1000 );
7723                                        pagination.delay( 2000 ).fadeOut( 1000 );
7724                                        setTimeout(function() {
7725                                            $paginationLoading.stop( true, true ).hide();
7726                                        }, 500 );
7727                                    }
7728
7729                                }, 400);
7730                                
7731                                // if ( loadMoreSettings.is_mobile === 'mobile' ) {
7732                                // 	nextPostsIndex =  nextPostsIndex + loadMoreSettings.limit_mobile;
7733                                // } else {
7734                                // 	nextPostsIndex =  nextPostsIndex + loadMoreSettings.limit;
7735                                // }
7736                                nextPostsIndex =  nextPostsIndex + loadMoreSettings.limit;
7737
7738                                if ( instaFeed.data('lightGallery') ) {
7739                                    // Fix Lightbox
7740                                    instaFeed.data( 'lightGallery' ).destroy( true );
7741                                }
7742    
7743                                mediaHoverLink();
7744                                postSharing();
7745                            },
7746                            error: function(error) {
7747                                console.log(error);
7748                            }
7749                        });
7750                    // }, 1000);
7751                });
7752            }
7753
7754            if ( $scope.find('.wpr-layout-carousel').length ) {
7755                instaFeedCarousel();
7756            }
7757
7758            pagination.removeClass('wpr-pagination-hidden');
7759
7760            // Handler when all assets (including images) are loaded
7761            if ( instaFeed.length ) {
7762                instaFeed.css('opacity', 1);
7763            }
7764
7765            if ( WprElements.editorCheck() ) {
7766                // Handler when all assets (including images) are loaded
7767                if ( instaFeed.length ) {
7768                    instaFeed.css('opacity', 1);
7769                }
7770            }
7771
7772            // Init Media Hover Link
7773            mediaHoverLink();
7774
7775            // Init Lightbox
7776            lightboxPopup( settings );
7777
7778            // Init Post Sharing
7779            postSharing();
7780
7781            var mutationObserver = new MutationObserver(function(mutations) {
7782                // Init Media Hover Link
7783                mediaHoverLink();
7784
7785                lightboxPopup( settings );
7786                postSharing();
7787            });
7788
7789            mutationObserver.observe($scope[0], {
7790                childList: true,
7791                subtree: true,
7792            });
7793
7794            // Post Sharing
7795            function postSharing() {
7796                if ( $scope.find( '.wpr-sharing-trigger' ).length ) {
7797                    var sharingTrigger = $scope.find( '.wpr-sharing-trigger' ),
7798                        sharingInner = $scope.find( '.wpr-post-sharing-inner' ),
7799                        sharingWidth = 5,
7800                        sharingAction = sharingTrigger.first().attr( 'data-action' );
7801
7802                    // Calculate Width
7803                    sharingInner.first().find( 'a' ).each(function() {
7804                        sharingWidth += $(this).outerWidth() + parseInt( $(this).css('margin-right'), 10 );
7805                    });
7806
7807                    // Calculate Margin
7808                    var sharingMargin = parseInt( sharingInner.find( 'a' ).css('margin-right'), 10 );
7809
7810                    // Set Positions
7811                    if ( 'left' === sharingTrigger.attr( 'data-direction') ) {
7812                        // Set Width
7813                        sharingInner.css( 'width', sharingWidth +'px' );
7814
7815                        // Set Position
7816                        sharingInner.css( 'left', - ( sharingMargin + sharingWidth ) +'px' );
7817                    } else if ( 'right' === sharingTrigger.attr( 'data-direction') ) {
7818                        // Set Width
7819                        sharingInner.css( 'width', sharingWidth +'px' );
7820
7821                        // Set Position
7822                        sharingInner.css( 'right', - ( sharingMargin + sharingWidth ) +'px' );
7823                    } else if ( 'top' === sharingTrigger.attr( 'data-direction') ) {
7824                        // Set Margins
7825                        sharingInner.find( 'a' ).css({
7826                            'margin-right' : '0',
7827                            'margin-top' : sharingMargin +'px'
7828                        });
7829
7830                        // Set Position
7831                        sharingInner.css({
7832                            'top' : -sharingMargin +'px',
7833                            'left' : '50%',
7834                            '-webkit-transform' : 'translate(-50%, -100%)',
7835                            'transform' : 'translate(-50%, -100%)'
7836                        });
7837                    } else if ( 'right' === sharingTrigger.attr( 'data-direction') ) {
7838                        // Set Width
7839                        sharingInner.css( 'width', sharingWidth +'px' );
7840
7841                        // Set Position
7842                        sharingInner.css({
7843                            'left' : sharingMargin +'px',
7844                            // 'bottom' : - ( sharingInner.outerHeight() + sharingTrigger.outerHeight() ) +'px',
7845                        });
7846                    } else if ( 'bottom' === sharingTrigger.attr( 'data-direction') ) {
7847                        // Set Margins
7848                        sharingInner.find( 'a' ).css({
7849                            'margin-right' : '0',
7850                            'margin-bottom' : sharingMargin +'px'
7851                        });
7852
7853                        // Set Position
7854                        sharingInner.css({
7855                            'bottom' : -sharingMargin +'px',
7856                            'left' : '50%',
7857                            '-webkit-transform' : 'translate(-50%, 100%)',
7858                            'transform' : 'translate(-50%, 100%)'
7859                        });
7860                    }
7861
7862                    $scope.off( 'click.wprInstaShare', '.wpr-sharing-trigger' );
7863                    $scope.off( 'mouseenter.wprInstaShare', '.wpr-sharing-trigger' );
7864                    $scope.off( 'mouseleave.wprInstaShare', '.wpr-insta-feed-item-sharing' );
7865
7866                    if ( 'click' === sharingAction ) {
7867                        $scope.on( 'click.wprInstaShare', '.wpr-sharing-trigger', function() {
7868                            var sharingInner = $(this).next();
7869
7870                            if ( 'hidden' === sharingInner.css( 'visibility' ) ) {
7871                                sharingInner.css( 'visibility', 'visible' );
7872                                sharingInner.find( 'a' ).css({
7873                                    'opacity' : '1',
7874                                    'top' : '0'
7875                                });
7876
7877                                setTimeout( function() {
7878                                    sharingInner.find( 'a' ).addClass( 'wpr-no-transition-delay' );
7879                                }, sharingInner.find( 'a' ).length * 100 );
7880                            } else {
7881                                sharingInner.find( 'a' ).removeClass( 'wpr-no-transition-delay' );
7882
7883                                sharingInner.find( 'a' ).css({
7884                                    'opacity' : '0',
7885                                    'top' : '-5px'
7886                                });
7887                                setTimeout( function() {
7888                                    sharingInner.css( 'visibility', 'hidden' );
7889                                }, sharingInner.find( 'a' ).length * 100 );
7890                            }
7891                        });
7892                    } else {
7893                        $scope.on( 'mouseenter.wprInstaShare', '.wpr-sharing-trigger', function() {
7894                            var sharingInner = $(this).next();
7895
7896                            sharingInner.css( 'visibility', 'visible' );
7897                            sharingInner.find( 'a' ).css({
7898                                'opacity' : '1',
7899                                'top' : '0',
7900                            });
7901                            
7902                            setTimeout( function() {
7903                                sharingInner.find( 'a' ).addClass( 'wpr-no-transition-delay' );
7904                            }, sharingInner.find( 'a' ).length * 100 );
7905                        });
7906                        $scope.on( 'mouseleave.wprInstaShare', '.wpr-insta-feed-item-sharing', function() {
7907                            var sharingInner = $(this).find( '.wpr-post-sharing-inner' );
7908
7909                            sharingInner.find( 'a' ).removeClass( 'wpr-no-transition-delay' );
7910
7911                            sharingInner.find( 'a' ).css({
7912                                'opacity' : '0',
7913                                'top' : '-5px'
7914                            });
7915                            setTimeout( function() {
7916                                sharingInner.css( 'visibility', 'hidden' );
7917                            }, sharingInner.find( 'a' ).length * 100 );
7918                        });
7919                    }
7920                }				
7921            }
7922
7923            // Remove if not necessary - GOGA
7924            $scope.find('.elementor-widget-wrap').removeClass('e-swiper-container');
7925
7926            function instaFeedCarousel() {
7927                if ( $scope.hasClass('wpr-insta-feed-layout-carousel') ) {
7928                    var swiperLoader = function swiperLoader(swiperElement, swiperConfig) {
7929                        // if ('undefined' === typeof Swiper) {     
7930                        // 	var asyncSwiper = elementorFrontend.utils.swiper;     
7931                        // 	return new asyncSwiper(swiperElement, swiperConfig).then( function (newSwiperInstance) {     
7932                        // 		return newSwiperInstance;
7933                        // 	});  
7934                        // } else {     
7935                        // 	return swiperPromise(swiperElement, swiperConfig);  
7936                        // }
7937                                
7938                        var asyncSwiper = elementorFrontend.utils.swiper;     
7939                        return new asyncSwiper(swiperElement, swiperConfig).then( function (newSwiperInstance) {     
7940                            return newSwiperInstance;
7941                        }); 
7942                    };
7943                    
7944                    var swiperPromise = function swiperPromise(swiperElement, swiperConfig) {    
7945                        return new Promise(function (resolve, reject) {  
7946                                var swiperInstance = new Swiper(swiperElement, swiperConfig);     
7947                                resolve(swiperInstance); 
7948                        }); 
7949                    };
7950
7951                    $scope.find('.wpr-instagram-feed').css('flexWrap', 'nowrap');
7952
7953                    var sliderSettings = settings.carousel;
7954                    
7955                    $scope.find('.wpr-instagram-feed-cont').addClass('swiper');
7956                    $scope.find('.wpr-instagram-feed').addClass('swiper-wrapper');
7957                    $scope.find('.wpr-insta-feed-content-wrap').addClass('swiper-slide');
7958                    $scope.find('.wpr-instagram-feed-cont').css('overflow', 'hidden');
7959                    // $scope.find('.elementor-container').css('margin', '0');
7960                    var swiperSlider = $scope.find('.wpr-instagram-feed-cont');
7961
7962                    var aboveMobileResp = +elementorFrontend.config.responsive.breakpoints.mobile.value + 1;
7963                    var aboveMobileExtraResp = +elementorFrontend.config.responsive.breakpoints.mobile_extra.value + 1;
7964                    var aboveTabletResp = +elementorFrontend.config.responsive.breakpoints.tablet.value + 1;
7965                    var aboveTabletExtraResp = +elementorFrontend.config.responsive.breakpoints.tablet_extra.value + 1;
7966                    var aboveLaptopResp = +elementorFrontend.config.responsive.breakpoints.laptop.value + 1;
7967                    var wideScreenResp = +elementorFrontend.config.responsive.breakpoints.widescreen.value;
7968
7969                    swiperLoader(swiperSlider, {
7970                        autoplay: sliderSettings.wpr_cs_autoplay === 'yes' ? {
7971                            delay: +sliderSettings.wpr_cs_delay,
7972                        } : false,
7973                        loop: sliderSettings.wpr_cs_loop === 'yes' ? true : false,
7974                        slidesPerView: +sliderSettings.wpr_cs_slides_to_show,
7975                        spaceBetween: +sliderSettings.wpr_cs_space_between,
7976                        speed: +sliderSettings.wpr_cs_speed,
7977                        pagination: sliderSettings.wpr_cs_pagination === 'yes' ? {
7978                            el: '.swiper-pagination',
7979                            type: sliderSettings.wpr_cs_pagination_type,
7980                            clickable: 'bullets' === sliderSettings.wpr_cs_pagination_type ? true : false,
7981                        } : false,
7982                        navigation: {
7983                            prevEl: '.wpr-swiper-button-prev',
7984                            nextEl: '.wpr-swiper-button-next',
7985                        },
7986                        // Responsive breakpoints - direction min
7987                        breakpoints: {
7988                        320: {
7989                            slidesPerView: +sliderSettings.wpr_cs_slides_to_show_mobile,
7990                            // spaceBetween: +sliderSettings.wpr_cs_space_between_mobile,
7991                        },
7992                        [aboveMobileResp]: {
7993                            slidesPerView: +sliderSettings.wpr_cs_slides_to_show_mobile_extra,
7994                            // spaceBetween: +sliderSettings.wpr_cs_space_between_mobile_extra,
7995                        },
7996                        [aboveMobileExtraResp]: {
7997                            slidesPerView: +sliderSettings.wpr_cs_slides_to_show_tablet,
7998                            spaceBetween: +sliderSettings.wpr_cs_space_between_tablet,
7999                        },
8000                        [aboveTabletResp]: {
8001                            slidesPerView: +sliderSettings.wpr_cs_slides_to_show_tablet_extra,
8002                            spaceBetween: +sliderSettings.wpr_cs_space_between_tablet_extra,
8003                        },
8004                        [aboveTabletExtraResp]: {
8005                            slidesPerView: +sliderSettings.wpr_cs_slides_to_show_laptop,
8006                            spaceBetween: +sliderSettings.wpr_cs_space_between_laptop,
8007                        },
8008                        [aboveLaptopResp]: {
8009                            slidesPerView: +sliderSettings.wpr_cs_slides_to_show,
8010                            spaceBetween: +sliderSettings.wpr_cs_space_between,
8011                        },
8012                        [wideScreenResp]: {
8013                            slidesPerView: +sliderSettings.wpr_cs_slides_to_show_widescreen,
8014                            spaceBetween: +sliderSettings.wpr_cs_space_between_widescreen,
8015                        }
8016                        },
8017                    
8018                    });
8019
8020                    $scope.css('opacity', 1);
8021                    
8022                }
8023            }
8024
8025            function lightboxPopup( settings ) {
8026                if ( -1 === $scope.find( '.wpr-insta-feed-item-lightbox' ).length ) {
8027                    return;
8028                }
8029
8030                var lightbox = $scope.find( '.wpr-insta-feed-item-lightbox' ),
8031                    lightboxOverlay = lightbox.find( '.wpr-insta-feed-lightbox-overlay' );
8032
8033                // Set Src Attributes
8034                lightbox.each(function() {
8035                    var source = $(this).find('.inner-block > span').attr( 'data-src' ),
8036                        instaFeedItem = $(this).closest( '.wpr-insta-feed-content-wrap' );
8037
8038						instaFeedItem.find('img').attr('alt', DOMPurify.sanitize(instaFeedItem.find('img').attr('alt')) );
8039
8040                        instaFeedItem.find( '.wpr-insta-feed-image-wrap' ).attr( 'data-src', source );
8041
8042                    var dataSource = instaFeedItem.find( '.wpr-insta-feed-image-wrap' ).attr( 'data-src' );
8043                });
8044
8045                // Init Lightbox
8046                instaFeed.lightGallery( settings.lightbox );
8047
8048                // Fix LightGallery Thumbnails
8049                instaFeed.on('onAfterOpen.lg', function() {
8050                    if ( $('.lg-outer').find('.lg-thumb-item').length ) {
8051                        $('.lg-outer').find('.lg-thumb-item').each(function() {
8052                            var imgSrc = $(this).find('img').attr('src'),
8053                                newImgSrc = imgSrc,
8054                                extIndex = imgSrc.lastIndexOf('.'),
8055                                imgExt = imgSrc.slice(extIndex),
8056                                cropIndex = imgSrc.lastIndexOf('-'),
8057                                cropSize = /\d{3,}x\d{3,}/.test(imgSrc.substring(extIndex,cropIndex)) ? imgSrc.substring(extIndex,cropIndex) : false;
8058                            
8059                            if ( 42 <= imgSrc.substring(extIndex,cropIndex).length ) {
8060                                cropSize = '';
8061                            }
8062
8063                            if ( cropSize !== '' ) {
8064                                if ( false !== cropSize ) {
8065                                    newImgSrc = imgSrc.replace(cropSize, '-150x150');
8066                                } else {
8067                                    newImgSrc = [imgSrc.slice(0, extIndex), '-150x150', imgSrc.slice(extIndex)].join('');
8068                                }
8069                            }
8070
8071                            // Change SRC
8072                            $(this).find('img').attr('src', newImgSrc);
8073    
8074                            if ( false == cropSize ) {
8075                                $(this).find('img').attr('src', imgSrc);
8076                            }
8077                        });
8078                    }
8079                });
8080
8081                // Show/Hide Controls
8082                $scope.find( '.wpr-insta-feed' ).on( 'onAferAppendSlide.lg, onAfterSlide.lg', function( event, prevIndex, index ) {
8083                    var lightboxControls = $( '#lg-actual-size, #lg-zoom-in, #lg-zoom-out, #lg-download' ),
8084                        lightboxDownload = $( '#lg-download' ).attr( 'href' );
8085
8086                    if ( $( '#lg-download' ).length ) {
8087                        if ( -1 === lightboxDownload.indexOf( 'wp-content' ) ) {
8088                            lightboxControls.addClass( 'wpr-hidden-element' );
8089                        } else {
8090                            lightboxControls.removeClass( 'wpr-hidden-element' );
8091                        }
8092                    }
8093
8094                    // Autoplay Button
8095                    if ( '' === settings.lightbox.autoplay ) {
8096                        $( '.lg-autoplay-button' ).css({
8097                                'width' : '0',
8098                                'height' : '0',
8099                                'overflow' : 'hidden'
8100                        });
8101                    }
8102                });
8103
8104                // Overlay
8105                if ( lightboxOverlay.length ) {
8106                    $scope.find( '.wpr-insta-feed-media-hover-bg' ).after( lightboxOverlay.remove() );
8107
8108                    $scope.find( '.wpr-insta-feed-lightbox-overlay' ).on( 'click', function() {
8109                        if ( ! WprElements.editorCheck() ) {
8110                            $(this).closest( '.wpr-insta-feed-content-wrap' ).find( '.wpr-insta-feed-image-wrap' ).trigger( 'click' );
8111                        } else {
8112                            alert( 'Lightbox is Disabled in the Editor! Please Preview this Page to see it in action.' );
8113                        }
8114                    });
8115                } else {
8116                    lightbox.find( '.inner-block > span' ).on( 'click', function() {
8117                        if ( ! WprElements.editorCheck() ) {
8118                            var imageWrap = $(this).closest( '.wpr-insta-feed-content-wrap' ).find( '.wpr-insta-feed-image-wrap' );
8119                                imageWrap.trigger( 'click' );
8120                        } else {
8121                            alert( 'Lightbox is Disabled in the Editor! Please Preview this Page to see it in action.' );
8122                        }
8123                    });
8124                }
8125            }
8126
8127            // Media Hover Link
8128            function mediaHoverLink() {
8129                if ( 'yes' === instaFeed.find( '.wpr-insta-feed-media-wrap' ).attr( 'data-overlay-link' ) && ! WprElements.editorCheck() ) {
8130                        instaFeed.find( '.wpr-insta-feed-media-wrap' ).css('cursor', 'pointer');
8131
8132                        instaFeed.find( '.wpr-insta-feed-media-wrap' ).on( 'click', function( event ) {
8133
8134                            var targetClass = event.target.className;
8135
8136                            if ( -1 !== targetClass.indexOf( 'inner-block' ) || -1 !== targetClass.indexOf( 'wpr-cv-inner' ) || 
8137                                    -1 !== targetClass.indexOf( 'wpr-insta-feed-media-hover' ) ) {
8138									event.preventDefault();
8139
8140                                var itemUrl = $(this).find( '.wpr-insta-feed-media-hover-bg' ).attr( 'data-url' ),
8141                                    itemUrl = itemUrl.replace('#new_tab', '');
8142
8143                                if (itemUrl) {
8144                                    try {
8145                                        // Create a URL object to validate the URL
8146                                        var url = new URL(itemUrl);
8147    
8148                                        // Define a list of allowed protocols
8149                                        var allowedProtocols = ['http:', 'https:'];
8150    
8151                                        // Check if the URL's protocol is allowed
8152                                        if (allowedProtocols.includes(url.protocol)) {
8153                                            // Safe to use the URL
8154                                            var safeUrl = url.href;
8155    
8156                                            if ('_blank' === iGrid.find('.wpr-grid-item-title a').attr('target')) {
8157                                                window.open(safeUrl, '_blank').focus();
8158                                            } else {
8159                                                window.location.href = safeUrl;
8160                                            }
8161                                        } else {
8162                                            console.error('Invalid URL scheme:', url.protocol);
8163                                        }
8164                                    } catch (e) {
8165                                        console.error('Invalid URL:', itemUrl);
8166                                    }
8167                                }
8168                            }
8169                    });
8170                }				
8171            }
8172        }, // end widgetInstagramFeed
8173
8174        widgetFacebookFeed: function($scope) {
8175			window.fbAsyncInit = function() {
8176				FB.init({
8177				  appId      : '1184287221975469',
8178				  xfbml      : true,
8179				  version    : 'v13.0'
8180				});
8181				FB.AppEvents.logPageView();
8182			  };
8183			
8184			  (function(d, s, id){
8185				 var js, fjs = d.getElementsByTagName(s)[0];
8186				 if (d.getElementById(id)) {return;}
8187				 js = d.createElement(s); js.id = id;
8188				 js.src = "https://connect.facebook.net/en_US/sdk.js";
8189				 fjs.parentNode.insertBefore(js, fjs);
8190			   }(document, 'script', 'facebook-jssdk'));
8191        }, // end widgetFacebookFeed
8192		
8193		widgetFlipCarousel: function($scope) {
8194			var flipsterSettings = JSON.parse($scope.find('.wpr-flip-carousel').attr('data-settings'));
8195
8196			$scope.find('.wpr-flip-carousel').css('opacity', 1);
8197			
8198			$scope.find('.wpr-flip-carousel').flipster({
8199				itemContainer: 'ul',
8200				itemSelector: 'li',
8201				fadeIn: 400,
8202				start: flipsterSettings.starts_from_center === 'yes' ? 'center' : 0,
8203				style: flipsterSettings.carousel_type,
8204				loop: flipsterSettings.loop === 'yes' ? true : false,
8205				autoplay: flipsterSettings.autoplay === 'no' ? false : flipsterSettings.autoplay_milliseconds,
8206				pauseOnHover: flipsterSettings.pause_on_hover === 'yes' ? true : false,
8207				click: flipsterSettings.play_on_click === 'yes' ? true : false,
8208				scrollwheel: flipsterSettings.play_on_scroll === 'yes' ? true : false,
8209				touch: true,
8210				nav: 'true' === flipsterSettings.pagination_position ? true : flipsterSettings.pagination_position ? flipsterSettings.pagination_position : false,
8211				spacing: flipsterSettings.spacing,
8212				buttons: 'custom',
8213				buttonPrev: flipsterSettings.button_prev,
8214				buttonNext: flipsterSettings.button_next
8215			});
8216			
8217			var paginationButtons = $scope.find('.wpr-flip-carousel').find('.flipster__nav__item').find('.flipster__nav__link');
8218			
8219			paginationButtons.each(function() {
8220				$(this).text(parseInt($(this).text()) + 1);
8221			});
8222		}, // end widgetFlipCarousel
8223
8224		widgetFeatureList: function($scope) {
8225            const target = document.querySelector('.e-n-tabs-content>div');
8226            
8227            if (target) {
8228                const observer = new MutationObserver(function(mutationsList) {
8229                    for (let mutation of mutationsList) {
8230                        if (mutation.type === 'attributes' || mutation.type === 'childList') {
8231                            featureList();
8232                        }
8233                    }
8234                });
8235        
8236                observer.observe(target, {
8237                    attributes: true,
8238                    childList: true,
8239                    subtree: true
8240                });
8241            }
8242
8243            featureList();
8244
8245            function featureList() { 
8246                $scope.find('.wpr-feature-list-item:not(:last-of-type)').find('.wpr-feature-list-icon-wrap').each(function(index) {
8247                    var offsetTop = $scope.find('.wpr-feature-list-item').eq(index + 1).find('.wpr-feature-list-icon-wrap').offset().top;
8248                    
8249                    $(this).find('.wpr-feature-list-line').height(offsetTop - $(this).offset().top + 'px');
8250                });
8251
8252                $(window).resize(function() {
8253                    $scope.find('.wpr-feature-list-item:not(:last-of-type)').find('.wpr-feature-list-icon-wrap').each(function(index) {
8254                        var offsetTop = $scope.find('.wpr-feature-list-item').eq(index + 1).find('.wpr-feature-list-icon-wrap').offset().top;
8255                        
8256                        $(this).find('.wpr-feature-list-line').height(offsetTop - $(this).offset().top + 'px');
8257                    });
8258                });
8259            }
8260		}, // end widgetFeatureList
8261		
8262		widgetAdvancedAccordion: function($scope) {
8263            var acc = $scope.find('.wpr-acc-button');
8264			var accPanels = $scope.find('.wpr-acc-panel');
8265            var accItemWrap = $scope.find('.wpr-accordion-item-wrap');
8266			var accordionType = $scope.find('.wpr-advanced-accordion').data('accordion-type');
8267			var activeIndex = +$scope.find('.wpr-advanced-accordion').data('active-index') - 1;
8268			var accordionTrigger = $scope.find('.wpr-advanced-accordion').data('accordion-trigger');
8269			var interactionSpeed = +$scope.find('.wpr-advanced-accordion').data('interaction-speed') * 1000;
8270			var scopeID = $scope.attr('data-id');
8271
8272			// ?active_panel=panel-index#your-id
8273			var activeTabIndexFromLocation = window.location.href.indexOf("active_panel=");
8274
8275			if (activeTabIndexFromLocation > -1) {
8276				activeIndex = +window.location.href.substring(activeTabIndexFromLocation,  window.location.href.lastIndexOf("#")).replace("active_panel=", '') - 1;
8277			}
8278
8279			if ('click' === accordionTrigger) {
8280
8281				if ( accordionType == 'accordion' ) {
8282					acc.off('click').on("click", function(e) {
8283						e.preventDefault();
8284						e.stopPropagation();
8285						var thisIndex = acc.index(this);
8286						acc.each(function(index){
8287							(index != thisIndex && $(this).closest('.elementor-widget-wpr-advanced-accordion').attr('data-id') == scopeID) ? $(this).removeClass('wpr-acc-active') : '';
8288						});
8289						$scope.find('.wpr-acc-panel').each(function(index) {
8290							(index != thisIndex && $(this).closest('.elementor-widget-wpr-advanced-accordion').attr('data-id') == scopeID) ? $(this).removeClass('wpr-acc-panel-active') && $(this).slideUp(interactionSpeed) : '';
8291						});
8292						$(this).toggleClass("wpr-acc-active");
8293						var panel = $(this).next();
8294						if ( !panel.hasClass('wpr-acc-panel-active') ) {
8295							panel.slideDown(interactionSpeed);
8296							panel.addClass('wpr-acc-panel-active');
8297						} else {
8298							panel.slideUp(interactionSpeed);
8299							panel.removeClass('wpr-acc-panel-active');
8300						}
8301					});
8302				} else {
8303					acc.each(function() {
8304						$(this).on("click", function() {
8305							$(this).toggleClass("wpr-acc-active");
8306							var panel = $(this).next();
8307							if ( !panel.hasClass('wpr-acc-panel-active') ) {
8308								panel.slideDown(interactionSpeed);
8309								panel.addClass('wpr-acc-panel-active');
8310							} else {
8311								panel.slideUp(interactionSpeed);
8312								panel.removeClass('wpr-acc-panel-active');
8313							}
8314						});
8315					});
8316				}
8317
8318				acc && (activeIndex > -1 && acc.eq(activeIndex).trigger('click'));
8319			} else if ( accordionTrigger == 'hover' ) {
8320				accItemWrap.on("mouseenter", function() {
8321						var thisIndex = accItemWrap.index(this);
8322
8323						$(this).find('.wpr-acc-button').addClass("wpr-acc-active");
8324
8325						var panel = $(this).find('.wpr-acc-panel');
8326							panel.slideDown(interactionSpeed);
8327							panel.addClass('wpr-acc-panel-active');
8328
8329						accItemWrap.each(function(index) {
8330							if (index != thisIndex) {
8331								$(this).find('.wpr-acc-button').removeClass("wpr-acc-active");
8332								var panel = $(this).find('.wpr-acc-panel');
8333								panel.slideUp(interactionSpeed);
8334								panel.removeClass('wpr-acc-panel-active');
8335							}
8336						});
8337				});
8338				
8339				accItemWrap &&  (activeIndex > -1 && accItemWrap.eq(activeIndex).trigger('mouseenter'));
8340			}
8341
8342			$scope.find('.wpr-acc-search-input').on( {
8343				focus: function() {
8344					$scope.addClass( 'wpr-acc-search-input-focus' );
8345				},
8346				blur: function() {
8347					$scope.removeClass( 'wpr-search-form-input-focus' );
8348				}
8349			} );
8350			
8351			let allInAcc = $scope.find('.wpr-advanced-accordion > *');
8352
8353			$scope.find('i.fa-times').on('click', function() {
8354				$scope.find('.wpr-acc-search-input').val('');
8355				$scope.find('.wpr-acc-search-input').trigger('keyup');
8356			});
8357
8358			var iconBox = $scope.find('.wpr-acc-icon-box');
8359
8360			iconBox.each(function() {
8361				$(this).find('.wpr-acc-icon-box-after').css({
8362					'border-top': $(this).height()/2 + 'px solid transparent', 
8363					'border-bottom': $(this).height()/2 + 'px solid transparent'
8364				});	
8365			});
8366
8367			$(window).resize(function() {
8368				iconBox.each(function() {
8369					$(this).find('.wpr-acc-icon-box-after').css({
8370						'border-top': $(this).height()/2 + 'px solid transparent', 
8371						'border-bottom': $(this).height()/2 + 'px solid transparent'
8372					});	
8373				});
8374			});
8375
8376			$scope.find('.wpr-acc-search-input').on('keyup', function() {
8377				setTimeout( () => {
8378					let thisValue = $(this).val();
8379					if ( thisValue.length > 0 ) {
8380						$scope.find('.wpr-acc-search-input-wrap').find('i.fa-times').css('display', 'inline-block');
8381						allInAcc.each(function() {
8382							if ( $(this).hasClass('wpr-accordion-item-wrap') ) {
8383								var itemWrap = $(this);
8384								if ( itemWrap.text().toUpperCase().indexOf(thisValue.toUpperCase()) == -1 ) {
8385									itemWrap.hide();
8386									if ( itemWrap.find('.wpr-acc-button').hasClass('wpr-acc-active') && itemWrap.find('.wpr-acc-panel').hasClass('wpr-acc-panel-active') ) {
8387										itemWrap.find('.wpr-acc-button').removeClass('wpr-acc-active');
8388										itemWrap.find('.wpr-acc-panel').removeClass('wpr-acc-panel-active');
8389									}
8390								} else {
8391									itemWrap.show();
8392									if ( !itemWrap.find('.wpr-acc-button').hasClass('wpr-acc-active') && !itemWrap.find('.wpr-acc-panel').hasClass('wpr-acc-panel-active') ) {
8393										itemWrap.find('.wpr-acc-button').addClass('wpr-acc-active');
8394										itemWrap.find('.wpr-acc-panel').addClass('wpr-acc-panel-active');
8395										itemWrap.find('.wpr-acc-panel').slideDown(interactionSpeed);
8396									}
8397								}
8398							}
8399						});
8400					} else {
8401						$scope.find('.wpr-acc-search-input-wrap').find('i.fa-times').css('display', 'none');
8402						allInAcc.each(function() {
8403							if ( $(this).hasClass('wpr-accordion-item-wrap') ) {
8404								$(this).show();
8405								if ( $(this).find('.wpr-acc-panel').hasClass('wpr-acc-panel-active') ) {
8406									$(this).find('.wpr-acc-panel').removeClass('wpr-acc-panel-active');
8407								}
8408								if ( $(this).find('.wpr-acc-button').hasClass('wpr-acc-active') ) {
8409									$(this).find('.wpr-acc-button').removeClass('wpr-acc-active')
8410								}
8411								$(this).find('.wpr-acc-panel').slideUp(interactionSpeed);
8412							}
8413						});
8414						// if ('click' === accordionTrigger) {
8415						// 	acc && (activeIndex > -1 && acc.eq(activeIndex).trigger('click'));
8416						// } else if ( 'hover' === accordionTrigger ) {
8417						// 	accItemWrap &&  (activeIndex > -1 && accItemWrap.eq(activeIndex).trigger('mouseenter'));
8418						// }
8419					}
8420				}, 1000);
8421			});
8422			
8423		}, // end widgetAdvancedAccordion
8424
8425        widgetImageAccordion: function($scope) {
8426			var settings = JSON.parse($scope.find( '.wpr-img-accordion-media-hover' ).attr( 'data-settings' ));
8427
8428			// var MediaWrap = $scope.find( '.wpr-img-accordion-media-hover' );
8429			var MediaWrap = $scope.find( '.wpr-image-accordion' );
8430			// var	lightboxSettings = settings.lightbox;
8431			var lightboxSettings = $scope.find('.wpr-image-accordion').attr('lightbox') ? JSON.parse($scope.find('.wpr-image-accordion').attr('lightbox')) : '';
8432
8433			var thisTargetHasClass = false;
8434
8435			if ( $scope.find('.wpr-image-accordion-wrap').hasClass('wpr-acc-no-column') ) {
8436				if ( !$scope.hasClass('wpr-image-accordion-row') );
8437				$scope.removeClass('wpr-image-accordion-column').addClass('wpr-image-accordion-row');
8438				$scope.find('.wpr-image-accordion').css('flex-direction', 'row');
8439			}
8440
8441			if ( '' !== lightboxSettings ) {
8442			
8443				// Init Lightbox
8444				MediaWrap.lightGallery( lightboxSettings );
8445	
8446				// Fix LightGallery Thumbnails
8447				MediaWrap.on('onAfterOpen.lg',function() {
8448					if ( $('.lg-outer').find('.lg-thumb-item').length ) {
8449						$('.lg-outer').find('.lg-thumb-item').each(function() {
8450							var imgSrc = $(this).find('img').attr('src'),
8451								newImgSrc = imgSrc,
8452								extIndex = imgSrc.lastIndexOf('.'),
8453								imgExt = imgSrc.slice(extIndex),
8454								cropIndex = imgSrc.lastIndexOf('-'),
8455								cropSize = /\d{3,}x\d{3,}/.test(imgSrc.substring(extIndex,cropIndex)) ? imgSrc.substring(extIndex,cropIndex) : false;
8456							
8457							if ( 42 <= imgSrc.substring(extIndex,cropIndex).length ) {
8458								cropSize = '';
8459							}
8460	
8461							if ( cropSize !== '' ) {
8462								if ( false !== cropSize ) {
8463									newImgSrc = imgSrc.replace(cropSize, '-150x150');
8464								} else {
8465									newImgSrc = [imgSrc.slice(0, extIndex), '-150x150', imgSrc.slice(extIndex)].join('');
8466								}
8467							}
8468	
8469							// Change SRC
8470							$(this).find('img').attr('src', newImgSrc);
8471	
8472							if ( false == cropSize || '-450x450' === cropSize ) {
8473								$(this).find('img').attr('src', imgSrc);
8474							}
8475						});
8476					}
8477				});
8478	
8479				// Show/Hide Controls
8480				$scope.find( '.wpr-image-accordion' ).on( 'onAferAppendSlide.lg, onAfterSlide.lg', function( event, prevIndex, index ) {
8481					var lightboxControls = $( '#lg-actual-size, #lg-zoom-in, #lg-zoom-out, #lg-download' ),
8482						lightboxDownload = $( '#lg-download' ).attr( 'href' );
8483	
8484					if ( $( '#lg-download' ).length ) {
8485						if ( -1 === lightboxDownload.indexOf( 'wp-content' ) ) {
8486							lightboxControls.addClass( 'wpr-hidden-element' );
8487						} else {
8488							lightboxControls.removeClass( 'wpr-hidden-element' );
8489						}
8490					}
8491	
8492					// Autoplay Button
8493					if ( '' === lightboxSettings.autoplay ) {
8494						$( '.lg-autoplay-button' ).css({
8495							 'width' : '0',
8496							 'height' : '0',
8497							 'overflow' : 'hidden'
8498						});
8499					}
8500				});
8501
8502			}
8503
8504			MediaWrap.css('cursor', 'pointer');
8505
8506			// Init Media Hover Link
8507
8508			var accordionItem = $scope.find('.wpr-image-accordion-item');
8509
8510			// Media Hover Link
8511			function mediaHoverLink() {
8512				if ( ! WprElements.editorCheck() ) {
8513
8514					$scope.find('.wpr-img-accordion-media-hover').on( 'click', function( event ) {
8515						var thisSettings = event.target.className.includes('wpr-img-accordion-media-hover') ? JSON.parse($(this).attr('data-settings')) : JSON.parse($(this).closest('.wpr-img-accordion-media-hover').attr( 'data-settings' ));
8516						
8517						if ( !$(event.target).hasClass('wpr-img-accordion-item-lightbox') && 0 === $(event.target).closest('.wpr-img-accordion-item-lightbox').length ) {
8518							var itemUrl = thisSettings.activeItem.overlayLink;
8519							if (itemUrl != '') {
8520	
8521								if ( '_blank' === thisSettings.activeItem.overlayLinkTarget ) {
8522									window.open(itemUrl, '_blank').focus();
8523								} else {
8524									window.location.href = itemUrl;
8525								}
8526	
8527							}
8528						}
8529					});
8530				}				
8531			}
8532
8533			if ( 'hover' === settings.activeItem.interaction) {
8534
8535				mediaHoverLink();
8536				
8537				accordionItem.on('mouseenter', function() {
8538					accordionItem.removeClass('wpr-image-accordion-item-grow');
8539					accordionItem.find('.wpr-animation-wrap').removeClass('wpr-animation-wrap-active');
8540					$(this).addClass('wpr-image-accordion-item-grow');
8541					$(this).find('.wpr-animation-wrap').addClass('wpr-animation-wrap-active');
8542				});
8543
8544				accordionItem.on('mouseleave', function() {
8545					$(this).removeClass('wpr-image-accordion-item-grow');
8546					$(this).find('.wpr-animation-wrap').removeClass('wpr-animation-wrap-active');
8547				});
8548
8549			} else if ( 'click' === settings.activeItem.interaction ) {
8550				$scope.find('.wpr-img-accordion-media-hover').removeClass('wpr-animation-wrap');
8551				accordionItem.on('click', '.wpr-img-accordion-media-hover', function(event) {
8552					thisTargetHasClass = event.target.className.includes('wpr-img-accordion-media-hover') ? event.target.className.includes('wpr-animation-wrap-active') : $(this).closest('.wpr-img-accordion-media-hover').hasClass('wpr-animation-wrap-active');
8553					if (thisTargetHasClass && !WprElements.editorCheck()) {
8554						var thisSettings = event.target.className.includes('wpr-img-accordion-media-hover') ? JSON.parse($(this).attr('data-settings')) : JSON.parse($(this).closest('.wpr-img-accordion-media-hover').attr( 'data-settings' ));
8555						
8556						if ( !$(event.target).hasClass('wpr-img-accordion-item-lightbox') && 0 === $(event.target).closest('.wpr-img-accordion-item-lightbox').length ) {
8557							var itemUrl = thisSettings.activeItem.overlayLink;
8558							if (itemUrl != '') {
8559								if ( '_blank' === thisSettings.activeItem.overlayLinkTarget ) {
8560									window.open(itemUrl, '_blank').focus();
8561								} else {
8562									window.location.href = itemUrl;
8563								}
8564							}
8565						}
8566					} else {
8567						$scope.find('.wpr-img-accordion-media-hover').removeClass('wpr-animation-wrap').removeClass('wpr-animation-wrap-active');
8568						accordionItem.removeClass('wpr-image-accordion-item-grow');
8569						$(this).closest('.wpr-image-accordion-item').addClass('wpr-image-accordion-item-grow');
8570						$(this).closest('.wpr-img-accordion-media-hover').addClass('wpr-animation-wrap-active');
8571					}
8572				});
8573			} else {
8574				$scope.find('.wpr-img-accordion-media-hover').removeClass('wpr-animation-wrap');
8575			}
8576
8577			accordionItem.each(function() {
8578				if ( $(this).index() === settings.activeItem.defaultActive - 1 ) {
8579					if ( 'click' === settings.activeItem.interaction) {
8580						setTimeout(() => {
8581							$(this).find('.wpr-img-accordion-media-hover').trigger('click');
8582						}, 400);
8583					} else {
8584						setTimeout(() => {
8585							$(this).find('.wpr-img-accordion-media-hover').trigger('mouseenter');
8586						}, 400);
8587					}
8588				}
8589			});
8590			
8591			$scope.find('.wpr-image-accordion-wrap').css('opacity', 1); 
8592        }, // end widgetImageAccordion
8593
8594		widgetOffcanvas: function($scope) {
8595			let animationDuration;
8596
8597			if ( $scope.hasClass('wpr-offcanvas-entrance-animation-pro-sl') ) {
8598				$scope.removeClass('wpr-offcanvas-entrance-animation-pro-sl').addClass('wpr-offcanvas-entrance-animation-fade');
8599			} else if ( $scope.hasClass('wpr-offcanvas-entrance-animation-pro-gr') ) {
8600				$scope.removeClass('wpr-offcanvas-entrance-animation-pro-gr').addClass('wpr-offcanvas-entrance-animation-fade');
8601			}
8602
8603			if ( $scope.hasClass('wpr-offcanvas-entrance-type-pro-ps') ) {
8604				$scope.removeClass('wpr-offcanvas-entrance-type-pro-ps').addClass('wpr-offcanvas-entrance-type-cover');
8605			}
8606
8607			function openOffcanvas(offcanvasSelector) {
8608				if ( !$scope.hasClass('wpr-offcanvas-entrance-type-push') && !$scope.find('.wpr-offcanvas-content').hasClass('wpr-offcanvas-content-relative') ) {
8609					$('body').addClass('wpr-offcanvas-body-overflow');
8610				}
8611				animationDuration = +offcanvasSelector.find('.wpr-offcanvas-content').css('animation-duration').replace('s', '') * 1000;
8612				offcanvasSelector.fadeIn(animationDuration);
8613				offcanvasSelector.addClass('wpr-offcanvas-wrap-active');
8614				if ( $scope.hasClass('wpr-offcanvas-entrance-animation-slide') ) {
8615					if ( offcanvasSelector.find('.wpr-offcanvas-content').hasClass('wpr-offcanvas-slide-in') ) {
8616						offcanvasSelector.find('.wpr-offcanvas-content').removeClass('wpr-offcanvas-slide-in').addClass('wpr-offcanvas-slide-out');
8617					} else {
8618						offcanvasSelector.find('.wpr-offcanvas-content').removeClass('wpr-offcanvas-slide-out').addClass('wpr-offcanvas-slide-in');
8619					}
8620				} else if ( $scope.hasClass('wpr-offcanvas-entrance-animation-grow') ) {
8621					if ( offcanvasSelector.find('.wpr-offcanvas-content').hasClass('wpr-offcanvas-grow-in') ) {
8622						offcanvasSelector.find('.wpr-offcanvas-content').removeClass('wpr-offcanvas-grow-in').addClass('wpr-offcanvas-grow-out');
8623					} else {
8624						offcanvasSelector.find('.wpr-offcanvas-content').removeClass('wpr-offcanvas-grow-out').addClass('wpr-offcanvas-grow-in');
8625					}
8626				} else if ( $scope.hasClass('wpr-offcanvas-entrance-animation-fade') ) {
8627					if ( offcanvasSelector.find('.wpr-offcanvas-content').hasClass('wpr-offcanvas-fade-in') ) {
8628						offcanvasSelector.find('.wpr-offcanvas-content').removeClass('wpr-offcanvas-fade-in').addClass('wpr-offcanvas-fade-out');
8629					} else {
8630						offcanvasSelector.find('.wpr-offcanvas-content').removeClass('wpr-offcanvas-fade-out').addClass('wpr-offcanvas-fade-in');
8631					}
8632				}
8633
8634				$(window).trigger('resize');
8635			}
8636
8637			function closeOffcanvas(offcanvasSelector) {
8638				if ( !$scope.hasClass('wpr-offcanvas-entrance-type-push') && !$scope.find('.wpr-offcanvas-content').hasClass('wpr-offcanvas-content-relative') ) {
8639					$('body').removeClass('wpr-offcanvas-body-overflow');
8640				}
8641				if ( $scope.hasClass('wpr-offcanvas-entrance-animation-slide') ) {
8642					offcanvasSelector.find('.wpr-offcanvas-content').removeClass('wpr-offcanvas-slide-in').addClass('wpr-offcanvas-slide-out');
8643				} else if ( $scope.hasClass('wpr-offcanvas-entrance-animation-grow') ) {
8644					offcanvasSelector.find('.wpr-offcanvas-content').removeClass('wpr-offcanvas-grow-in').addClass('wpr-offcanvas-grow-out');
8645				} else if ( $scope.hasClass('wpr-offcanvas-entrance-animation-fade') ) {
8646					offcanvasSelector.find('.wpr-offcanvas-content').removeClass('wpr-offcanvas-fade-in').addClass('wpr-offcanvas-fade-out');
8647				}
8648
8649				offcanvasSelector.fadeOut(animationDuration);
8650				offcanvasSelector.removeClass('wpr-offcanvas-wrap-active');
8651				// setTimeout(function() {
8652				// }, 600);
8653			}
8654
8655			if ( $scope.hasClass('wpr-offcanvas-entrance-type-push') ) {	
8656
8657				function growBodyWidth() {
8658
8659					if ($('.wpr-offcanvas-body-inner-wrap-'+ $scope.data('id')).length < 1 ) {
8660						var offcanvasWrap = $('.wpr-offcanvas-wrap-'+ $scope.data('id')).clone();
8661						$('.wpr-offcanvas-wrap-'+ $scope.data('id')).remove();
8662	
8663						if ( !($('.wpr-offcanvas-body-inner-wrap-' + $scope.data('id')).length > 0) ) {
8664							$("body").wrapInner('<div class="wpr-offcanvas-body-inner-wrap-' + $scope.data('id') + '" />');
8665						}
8666	
8667						bodyInnerWrap = $('.wpr-offcanvas-body-inner-wrap-' + $scope.data('id'));
8668		
8669						bodyInnerWrap.css('position', 'relative');
8670		
8671						if ( !(bodyInnerWrap.prev('.wpr-offcanvas-wrap').length > 0) ) {
8672							document.querySelector('body').insertBefore(offcanvasWrap[0], document.querySelector('.wpr-offcanvas-body-inner-wrap-' + $scope.data('id')));
8673						}
8674
8675						offcanvasSelector = $('.wpr-offcanvas-wrap-'+ $scope.data('id'));
8676					}
8677
8678					openOffcanvas(offcanvasSelector);
8679
8680					$('body').addClass('wpr-offcanvas-body-overflow');
8681	
8682					if ( offcanvasSelector.find('.wpr-offcanvas-content').hasClass('wpr-offcanvas-content-left') ) {
8683						// bodyInnerWrap.animate({'margin-left': offcanvasSelector.find('.wpr-offcanvas-content').width() + 'px'}, 'slow');
8684						bodyInnerWrap.css({
8685							'transition-duration': offcanvasSelector.find('.wpr-offcanvas-content').css('animation-duration'),
8686							'transform': 'translateX('+ offcanvasSelector.find('.wpr-offcanvas-content').outerWidth() +'px)',
8687						});
8688					} else if ( offcanvasSelector.find('.wpr-offcanvas-content').hasClass('wpr-offcanvas-content-right') ) {
8689						// bodyInnerWrap.animate({'margin-right': offcanvasSelector.find('.wpr-offcanvas-content').width() + 'px'}, 'slow');
8690						bodyInnerWrap.css({
8691							'transition-duration': offcanvasSelector.find('.wpr-offcanvas-content').css('animation-duration'),
8692							'transform': 'translateX(-'+ offcanvasSelector.find('.wpr-offcanvas-content').outerWidth() +'px)',
8693						});
8694					} else if ( offcanvasSelector.find('.wpr-offcanvas-content').hasClass('wpr-offcanvas-content-top') ) {
8695						// bodyInnerWrap.animate({'margin-top': offcanvasSelector.find('.wpr-offcanvas-content').outerHeight() + 'px'}, 'slow');
8696						bodyInnerWrap.css({
8697							'transition-duration': offcanvasSelector.find('.wpr-offcanvas-content').css('animation-duration'),
8698							'margin-top': offcanvasSelector.find('.wpr-offcanvas-content').outerHeight() + 'px',
8699						});
8700					}
8701				}
8702	
8703				function reduceBodyWidth() {
8704					
8705					if ( !bodyInnerWrap && !offcanvasSelector )  {
8706						bodyInnerWrap = $('.wpr-offcanvas-body-inner-wrap-' + $scope.data('id'));
8707						offcanvasSelector = $('.wpr-offcanvas-wrap-'+ $scope.data('id'));
8708					}
8709
8710					closeOffcanvas(offcanvasSelector);
8711
8712					if ( offcanvasSelector.find('.wpr-offcanvas-content').hasClass('wpr-offcanvas-content-left') ) {
8713						// bodyInnerWrap.animate({'margin-left': 0}, 'slow');
8714						bodyInnerWrap.css({'transform': 'translateX(0px)'});
8715					} else if ( offcanvasSelector.find('.wpr-offcanvas-content').hasClass('wpr-offcanvas-content-right') ) {
8716						// bodyInnerWrap.animate({'margin-right': 0}, 'slow');
8717						bodyInnerWrap.css({'transform': 'translateX(0px)'});
8718					} else if ( offcanvasSelector.find('.wpr-offcanvas-content').hasClass('wpr-offcanvas-content-top') ) {
8719						// bodyInnerWrap.animate({'margin-top': 0}, 'slow');
8720						bodyInnerWrap.css({'margin-top': 0});
8721					}
8722
8723					$('body').removeClass('wpr-offcanvas-body-overflow');
8724					setTimeout(function() {
8725						var cnt = $('.wpr-offcanvas-body-inner-wrap-' + $scope.data('id')).contents();
8726						$('.wpr-offcanvas-body-inner-wrap-' + $scope.data('id')).replaceWith(cnt);
8727					}, 1000);
8728				}
8729	
8730				function closeTriggers() {
8731					offcanvasSelector.on('click', function(e){
8732						if ( !e.target.classList.value.includes('wpr-offcanvas-content') && !e.target.closest('.wpr-offcanvas-content') ) {
8733							reduceBodyWidth();
8734						}
8735					});
8736					
8737					$(document).on('keyup', function(event) {
8738						if (event.key == "Escape") {
8739							reduceBodyWidth();
8740						}
8741					});
8742		
8743					offcanvasSelector.find('.wpr-close-offcanvas').on('click', function() {
8744						reduceBodyWidth();
8745					});
8746				}
8747
8748				if ( !($('.wpr-offcanvas-body-inner-wrap-' + $scope.data('id')).length > 0) ) {
8749					$("body").wrapInner('<div class="wpr-offcanvas-body-inner-wrap-' + $scope.data('id') + '" />');
8750				}
8751
8752				var bodyInnerWrap = $('.wpr-offcanvas-body-inner-wrap-' + $scope.data('id'));
8753
8754				bodyInnerWrap.css('position', 'relative');
8755
8756				if ( !(bodyInnerWrap.prev('.wpr-offcanvas-wrap').length > 0) ) {
8757					$scope.find('.wpr-offcanvas-wrap').addClass('wpr-offcanvas-wrap-'+ $scope.data('id'));
8758
8759					document.querySelector('body').insertBefore($scope.find('.wpr-offcanvas-wrap')[0], document.querySelector('.wpr-offcanvas-body-inner-wrap-' + $scope.data('id')));
8760				}
8761
8762				var offcanvasSelector = $('.wpr-offcanvas-wrap-'+ $scope.data('id'));
8763
8764				$scope.find('.wpr-offcanvas-trigger').on('click', function() {
8765					if ( $('.wpr-offcanvas-wrap-'+ $scope.data('id')).length > 0 && $scope.find('.wpr-offcanvas-wrap').length > 0 ) {
8766						$('.wpr-offcanvas-wrap-'+ $scope.data('id')).remove();
8767						$scope.find('.wpr-offcanvas-wrap').addClass('wpr-offcanvas-wrap-'+ $scope.data('id'));
8768						document.querySelector('body').insertBefore($scope.find('.wpr-offcanvas-wrap')[0], document.querySelector('.wpr-offcanvas-body-inner-wrap-' + $scope.data('id')));
8769						offcanvasSelector = $('.wpr-offcanvas-wrap-'+ $scope.data('id'));
8770					}
8771
8772					if (offcanvasSelector.hasClass('wpr-offcanvas-wrap-active')) {
8773						reduceBodyWidth();
8774					} else {
8775						growBodyWidth();
8776					}
8777				});
8778	
8779				if ( 'yes' === $scope.find('.wpr-offcanvas-container').data('offcanvas-open') ) {
8780					$scope.find('.wpr-offcanvas-trigger').trigger('click');
8781				}
8782
8783				closeTriggers();
8784				
8785				$('body').on('click', function() {
8786					closeTriggers();
8787				});
8788
8789				var mutationObserver = new MutationObserver(function(mutations) {
8790					closeTriggers();
8791				});
8792
8793				mutationObserver.observe($scope[0], {
8794					childList: true,
8795					subtree: true,
8796				});
8797			} else {
8798
8799				$scope.find('.wpr-offcanvas-trigger').on('click', function() {
8800					if ( !$scope.find('.wpr-offcanvas-wrap').hasClass('wpr-offcanvas-wrap-active') ) {
8801						openOffcanvas($scope.find('.wpr-offcanvas-wrap'));
8802					} else if ( $scope.find('.wpr-offcanvas-wrap').hasClass('wpr-offcanvas-wrap-active') && $scope.find('.wpr-offcanvas-wrap').hasClass('wpr-offcanvas-wrap-relative') ) {
8803						closeOffcanvas($scope.find('.wpr-offcanvas-wrap'));
8804					}
8805				});
8806	
8807				$scope.find('.wpr-offcanvas-wrap').on('click', function(e){
8808					if ( !e.target.classList.value.includes('wpr-offcanvas-content') && !e.target.closest('.wpr-offcanvas-content') ) {
8809						closeOffcanvas($scope.find('.wpr-offcanvas-wrap'));
8810					}
8811				});
8812	
8813				if ( 'yes' === $scope.find('.wpr-offcanvas-container').data('offcanvas-open') ) {
8814					$scope.find('.wpr-offcanvas-trigger').trigger('click');
8815				}
8816				
8817				$(document).on('keyup', function(event) {
8818					if (event.key == "Escape") {
8819						closeOffcanvas($scope.find('.wpr-offcanvas-wrap'));
8820					}
8821				});
8822	
8823				$scope.find('.wpr-close-offcanvas').on('click', function() {
8824					closeOffcanvas($scope.find('.wpr-offcanvas-wrap'));
8825				});
8826				
8827			}
8828
8829		}, // end widgetOffcanvas
8830
8831		widgetWishlist: function($scope) {
8832
8833			$.ajax({
8834				url: WprConfig.ajaxurl,
8835				type: 'POST',
8836				data: {
8837					action: 'count_wishlist_items',
8838					nonce: WprConfig.nonce,
8839					element_addcart_simple_txt: $scope.find('.wpr-wishlist-products').attr('element_addcart_simple_txt'),
8840					element_addcart_grouped_txt: $scope.find('.wpr-wishlist-products').attr('element_addcart_grouped_txt'),
8841					element_addcart_variable_txt: $scope.find('.wpr-wishlist-products').attr('element_addcart_variable_txt')
8842				},
8843				success: function(response) { 
8844					// Get all elements with the class 'wpr-wishlist-product' and their product IDs
8845					var productElements = $scope.find('.wpr-wishlist-product');
8846					var productIds = productElements.map(function() {
8847						return $(this).data('product-id');
8848					}).get();
8849					
8850					// Filter out the items in the response that match the product IDs
8851					var newWishlistItems = response.wishlist_items.filter(function(item) {
8852						return !productIds.includes(item.product_id);
8853					});
8854
8855					// Convert the wishlist_items to an array of product_ids for easier searching
8856					var wishlistProductIds = response.wishlist_items.map(function(item) {
8857						return item.product_id;
8858					});
8859
8860					productElements.each(function() {
8861						var productId = $(this).data('product-id');
8862					
8863						// If the product ID is not in the wishlistProductIds array, remove the element
8864						if (!wishlistProductIds.includes(productId)) {
8865							$(this).remove();
8866						}
8867					});
8868
8869					newWishlistItems.forEach(function(item) {
8870						var html = '<tr class="wpr-wishlist-product" data-product-id="' + item.product_id + '">';
8871							html += '<td><span class="wpr-wishlist-remove" data-product-id="' + item.product_id + '"></span></td>';
8872							html += '<td><a class="wpr-wishlist-img-wrap" href="' + item.product_url + '">' + item.product_image + '</a></td>';
8873							html += '<td><a class="wpr-wishlist-product-name" href="' + item.product_url + '">' + item.product_title + '</a></td>';
8874							html += '<td><div class="wpr-wishlist-product-price">' + item.product_price + '</div></td>';
8875							html += '<td><div class="wpr-wishlist-product-status">' + item.product_stock + '</div></td>';
8876							html += '<td><div class="wpr-wishlist-product-atc">' + item.product_atc + '</div></td>';
8877						html += '</tr>';
8878						$scope.find('.wpr-wishlist-products tbody').append(html);
8879					});
8880
8881					if ( 0 < +response.wishlist_count ) {
8882						if ( $scope.find('.wpr-wishlist-products').hasClass('wpr-wishlist-empty-hidden') ) {
8883							$scope.find('.wpr-wishlist-products').removeClass('wpr-wishlist-empty-hidden');
8884						}
8885
8886						if ( !$scope.find('.wpr-wishlist-empty, .wpr-wishlist-empty-shop-link').hasClass('wpr-wishlist-empty-hidden') ) {
8887							$scope.find('.wpr-wishlist-empty, .wpr-wishlist-empty-shop-link').addClass('wpr-wishlist-empty-hidden');
8888						}
8889					} else {
8890						if ( !$scope.find('.wpr-wishlist-products').hasClass('wpr-wishlist-empty-hidden') ) {
8891							$scope.find('.wpr-wishlist-products').addClass('wpr-wishlist-empty-hidden');
8892						}
8893
8894						if ( $scope.find('.wpr-wishlist-empty, .wpr-wishlist-empty-shop-link').hasClass('wpr-wishlist-empty-hidden') ) {
8895							$scope.find('.wpr-wishlist-empty, .wpr-wishlist-empty-shop-link').removeClass('wpr-wishlist-empty-hidden');
8896						}
8897					}
8898				},
8899				error: function(error) {
8900					console.log(error);
8901				}
8902			});
8903
8904			$scope.on('click', '.wpr-wishlist-remove', function(e) {
8905				e.preventDefault();
8906				var product_id = $(this).data('product-id');
8907
8908				$.ajax({
8909					url: WprConfig.ajaxurl,
8910					type: 'POST',
8911					data: {
8912                        action: 'remove_from_wishlist',
8913                        nonce: WprConfig.nonce,
8914						product_id: product_id
8915					},
8916					success: function(response) {
8917						if ( 1 === $scope.find('.wpr-wishlist-product').length ) {	
8918							if ( !$scope.find('.wpr-wishlist-products').hasClass('wpr-wishlist-empty-hidden') ) {
8919								$scope.find('.wpr-wishlist-products').addClass('wpr-wishlist-empty-hidden');
8920							}
8921
8922							if ( $scope.find('.wpr-wishlist-empty, .wpr-wishlist-empty-shop-link').hasClass('wpr-wishlist-empty-hidden') ) {
8923								$scope.find('.wpr-wishlist-empty, .wpr-wishlist-empty-shop-link').removeClass('wpr-wishlist-empty-hidden');
8924							}
8925						}
8926
8927           				$scope.find('.wpr-wishlist-product[data-product-id="' + product_id + '"]').remove();
8928						WprElements.changeActionTargetProductId(product_id);
8929						$(document).trigger('removed_from_wishlist');	
8930					},
8931					error: function(error) {
8932						console.log(error);
8933					}
8934				});
8935			});
8936
8937			$( 'body' ).on( 'added_to_cart', function(ev, fragments, hash, button) {
8938				button.next().fadeTo( 700, 1 );
8939
8940				button.css('display', 'none');
8941			});
8942
8943		}, // end widgetWishlistTest
8944
8945		//GOGA - widget wishlist count place here
8946
8947		widgetWishlistButton: function($scope) {
8948
8949				$.ajax({
8950					url: WprConfig.ajaxurl,
8951					type: 'POST',
8952					data: {
8953						action: 'check_product_in_wishlist',
8954						product_id: $scope.find('.wpr-wishlist-add').data('product-id')
8955					},
8956					success: function(response) {
8957						if ( true == response ) {
8958							if ( !$scope.find('.wpr-wishlist-add').hasClass('wpr-button-hidden') ) {
8959								$scope.find('.wpr-wishlist-add').addClass('wpr-button-hidden');
8960							}
8961
8962							if ( $scope.find('.wpr-wishlist-remove').hasClass('wpr-button-hidden') ) {
8963								$scope.find('.wpr-wishlist-remove').removeClass('wpr-button-hidden');
8964							}
8965						}
8966					}
8967				});
8968
8969				$scope.find('.wpr-wishlist-add').click(function(e) {
8970					e.preventDefault();
8971					var product_id = $(this).data('product-id');
8972
8973					$(this).fadeTo(500, 0);
8974	
8975					$.ajax({
8976						url: WprConfig.ajaxurl,
8977						type: 'POST',
8978						data: {
8979                            action: 'add_to_wishlist',
8980                            nonce: WprConfig.nonce,
8981							product_id: product_id
8982						},
8983						success: function() {
8984							$scope.find('.wpr-wishlist-add[data-product-id="' + product_id + '"]').hide();
8985							$scope.find('.wpr-wishlist-remove[data-product-id="' + product_id + '"]').show();
8986							$scope.find('.wpr-wishlist-remove[data-product-id="' + product_id + '"]').fadeTo(500, 1);
8987							WprElements.changeActionTargetProductId(product_id);
8988							$(document).trigger('added_to_wishlist');
8989						},
8990						error: function(response) {
8991							var error_message = response.responseJSON.message;
8992							// Display error message
8993							alert(error_message);
8994						}
8995					});
8996				});
8997				$scope.find('.wpr-wishlist-remove').on('click', function(e) {
8998					e.preventDefault();
8999					var product_id = $(this).data('product-id');
9000
9001					$(this).fadeTo(500, 0);
9002
9003					$.ajax({
9004						url: WprConfig.ajaxurl,
9005						type: 'POST',
9006						data: {
9007                            action: 'remove_from_wishlist',
9008                            nonce: WprConfig.nonce,
9009							product_id: product_id
9010						},
9011						success: function() {
9012							$scope.find('.wpr-wishlist-remove[data-product-id="' + product_id + '"]').hide();
9013							$scope.find('.wpr-wishlist-add[data-product-id="' + product_id + '"]').show();
9014							$scope.find('.wpr-wishlist-add[data-product-id="' + product_id + '"]').fadeTo(500, 1);
9015							WprElements.changeActionTargetProductId(product_id);
9016							$(document).trigger('removed_from_wishlist');
9017						}
9018					});
9019				});
9020
9021				$(document).on('removed_from_wishlist', function() {
9022					$scope.find('.wpr-wishlist-remove[data-product-id="' + actionTargetProductId + '"]').hide();
9023					$scope.find('.wpr-wishlist-add[data-product-id="' + actionTargetProductId + '"]').show();
9024					$scope.find('.wpr-wishlist-add[data-product-id="' + actionTargetProductId + '"]').fadeTo(500, 1);
9025				});
9026		
9027		}, // end widgetWishlistButton
9028
9029		widgetCompareButton: function($scope) {
9030
9031			$.ajax({
9032				url: WprConfig.ajaxurl,
9033				type: 'POST',
9034				data: {
9035					action: 'check_product_in_compare',
9036					product_id: $scope.find('.wpr-compare-add').data('product-id')
9037				},
9038				success: function(response) {
9039					if ( true == response ) {
9040						if ( !$scope.find('.wpr-compare-add').hasClass('wpr-button-hidden') ) {
9041							$scope.find('.wpr-compare-add').addClass('wpr-button-hidden');
9042						}
9043
9044						if ( $scope.find('.wpr-compare-remove').hasClass('wpr-button-hidden') ) {
9045							$scope.find('.wpr-compare-remove').removeClass('wpr-button-hidden');
9046						}
9047					}
9048				}
9049			});
9050
9051			// $(document).ready(function() {
9052				$scope.find('.wpr-compare-add').click(function(e) {
9053					e.preventDefault();
9054					var product_id = $(this).data('product-id');
9055
9056					$(this).fadeTo(500, 0);
9057
9058					$.ajax({
9059						url: WprConfig.ajaxurl,
9060						type: 'POST',
9061						data: {
9062                            action: 'add_to_compare',
9063                            nonce: WprConfig.nonce,
9064							product_id: product_id
9065						},
9066						success: function() {
9067							$scope.find('.wpr-compare-add[data-product-id="' + product_id + '"]').hide();
9068							$scope.find('.wpr-compare-remove[data-product-id="' + product_id + '"]').show();
9069							$scope.find('.wpr-compare-remove[data-product-id="' + product_id + '"]').fadeTo(500, 1);
9070							WprElements.changeActionTargetProductId(product_id);
9071							$(document).trigger('added_to_compare');
9072						},
9073						error: function(response) {
9074							var error_message = response.responseJSON.message;
9075							// Display error message
9076							alert(error_message);
9077						}
9078					});
9079				});
9080				$scope.find('.wpr-compare-remove').click(function(e) {
9081					e.preventDefault();
9082					var product_id = $(this).data('product-id');
9083					
9084					$(this).fadeTo(500, 0);
9085
9086					$.ajax({
9087						url: WprConfig.ajaxurl,
9088						type: 'POST',
9089						data: {
9090                            action: 'remove_from_compare',
9091                            nonce: WprConfig.nonce,
9092							product_id: product_id
9093						},
9094						success: function() {
9095							$scope.find('.wpr-compare-remove[data-product-id="' + product_id + '"]').hide();
9096							$scope.find('.wpr-compare-add[data-product-id="' + product_id + '"]').show();
9097							$scope.find('.wpr-compare-add[data-product-id="' + product_id + '"]').fadeTo(500, 1);
9098							WprElements.changeActionTargetProductId(product_id);
9099							$(document).trigger('removed_from_compare');
9100						}
9101					});
9102				});
9103
9104				$(document).on('removed_from_compare', function() {
9105					$scope.find('.wpr-compare-remove[data-product-id="' + actionTargetProductId + '"]').hide();
9106					$scope.find('.wpr-compare-add[data-product-id="' + actionTargetProductId + '"]').show();
9107					$scope.find('.wpr-compare-add[data-product-id="' + actionTargetProductId + '"]').fadeTo(500, 1);
9108				});
9109
9110			// });
9111
9112		}, // end widgetCompareButton
9113
9114		widgetMiniCompare: function($scope) {
9115			// $scope.find('.wpr-compare-text').click(function(e) {
9116			// 	e.preventDefault();
9117			// 	alert(WprConfig.comparePageID);
9118			// 	$scope.find('.wpr-compare-popup').removeClass('wpr-compare-popup-hidden');
9119			// 	$.ajax({
9120			// 		// url: WprConfig.ajaxurl,
9121			// 		url: '/royal-wp/wp-json/wpraddons/v1/page-content/' + WprConfig.comparePageID,
9122			// 		type: 'GET',
9123			// 		// data: {
9124			// 		// 	action: 'wpr_get_page_content',
9125			// 		// 	wpr_compare_page_id: WprConfig.comparePageID // Replace with the ID of the page you want to retrieve
9126			// 		// },
9127			// 		// success: function(response) {
9128			// 		// 	// $scope.find('.wpr-compare-popup').append(response.data.content);
9129			// 		// 	$scope.find('.wpr-compare-popup').append(response);
9130			// 		// },
9131			// 		dataType: 'json',
9132			// 		success: function(response) {
9133			// 				$scope.find('.wpr-compare-popup').append(response);
9134			// 				elementorFrontend.init();
9135			// 		},
9136			// 		error: function(xhr, status, error) {
9137			// 		}
9138			// 	});
9139			// });
9140			
9141			if ( !($scope.find('.wpr-compare-count').length > 0 && 0 == $scope.find('.wpr-compare-count').text()) ) {
9142				$scope.find('.wpr-compare-count').css('display', 'inline-flex');
9143			}
9144
9145			// WITH AJAX
9146			if ( $scope.hasClass('wpr-compare-style-popup') ) {
9147				$scope.find('.wpr-compare-toggle-btn').on('click', function(e) {
9148					e.preventDefault();
9149
9150					$('body').addClass('wpr-body-overflow-hidden');
9151
9152					$scope.find('.wpr-compare-bg').removeClass('wpr-compare-popup-hidden');
9153					$scope.find('.wpr-compare-popup').removeClass('wpr-compare-fade-out').addClass('wpr-compare-fade-in');
9154					$scope.find('.wpr-compare-bg').removeClass('wpr-compare-fade-out').addClass('wpr-compare-fade-in');
9155
9156					$scope.find('.wpr-compare-popup-inner-wrap').html('<div class="wpr-compare-loader-wrap"><div class="wpr-double-bounce"><div class="wpr-child wpr-double-bounce1"></div><div class="wpr-child wpr-double-bounce2"></div></div></div>');
9157					$.ajax({
9158						url: WprConfig.ajaxurl,
9159						type: 'POST',
9160						data: {
9161                            action: 'wpr_get_page_content',
9162							nonce: WprConfig.nonce,
9163							wpr_compare_page_id: WprConfig.comparePageID
9164						},
9165						success: function(response) {
9166							$scope.find('.wpr-compare-popup-inner-wrap').html(response.data.content);
9167							WprElements.widgetCompare($scope);
9168							
9169							$scope.find('.wpr-compare-remove').click(function(e) {
9170								e.preventDefault();
9171								var productID = $(this).data('product-id');
9172							
9173								$.ajax({
9174									url: WprConfig.ajaxurl,
9175									type: 'POST',
9176									data: {
9177                                        action: 'remove_from_compare',
9178                                        nonce: WprConfig.nonce,
9179										product_id: productID
9180									},
9181									success: function() {
9182										WprElements.changeActionTargetProductId(productID);
9183										$scope.find('[data-product-id="' + productID + '"]').remove();
9184										if ( !($scope.find('.wpr-compare-popup-inner-wrap').find('.wpr-compare-remove').length > 0) ) {
9185											$scope.find('.wpr-compare-products').addClass('wpr-hidden-element');
9186											$scope.find('.wpr-compare-empty').removeClass('wpr-hidden-element');
9187										} else {
9188											$scope.find('.wpr-compare-empty').addClass('wpr-hidden-element');
9189											$scope.find('.wpr-compare-products').removeClass('wpr-hidden-element');
9190										}
9191										$(document).trigger('removed_from_compare');
9192									}
9193								});
9194							});
9195						},
9196						error: function(xhr, status, error) {
9197							console.log(xhr.responseText);
9198						}
9199					});
9200				});
9201	
9202				$scope.find('.wpr-close-compare').click(function(e) {
9203					$scope.find('.wpr-compare-popup').removeClass('wpr-compare-fade-in').addClass('wpr-compare-fade-out');
9204					$scope.find('.wpr-compare-bg').removeClass('wpr-compare-fade-in').addClass('wpr-compare-fade-out');
9205					setTimeout(function() {
9206						$scope.find('.wpr-compare-bg').addClass('wpr-compare-popup-hidden');
9207						$('body').removeClass('wpr-body-overflow-hidden');
9208					}, 600)
9209				});
9210	
9211				$scope.find('.wpr-compare-bg').click(function(e) {
9212					if ( !e.target.classList.value.includes('wpr-compare-popup') && !e.target.closest('.wpr-compare-popup') ) {
9213						var thisTarget = $(this);
9214						$scope.find('.wpr-compare-popup').removeClass('wpr-compare-fade-in').addClass('wpr-compare-fade-out');
9215						$scope.find('.wpr-compare-bg').removeClass('wpr-compare-fade-in').addClass('wpr-compare-fade-out');
9216						setTimeout(function() {
9217							thisTarget.addClass('wpr-compare-popup-hidden');
9218							$('body').removeClass('wpr-body-overflow-hidden');
9219						}, 600);
9220					}
9221				});
9222
9223			}
9224
9225			$.ajax({
9226				url: WprConfig.ajaxurl,
9227				type: 'POST',
9228				data: {
9229					action: 'count_compare_items',
9230					nonce: WprConfig.nonce,
9231				},
9232				success: function(response) {
9233					let compare_count = response.compare_count;
9234					if ( $scope.find('.wpr-compare-count').css('display') == 'none' && 0 < compare_count ) {
9235						$scope.find('.wpr-compare-count').text(compare_count);
9236						$scope.find('.wpr-compare-count').css('display', 'inline-flex');
9237					} else if ( 0 == compare_count ) {
9238						$scope.find('.wpr-compare-count').css('display', 'none');
9239						$scope.find('.wpr-compare-count').text(compare_count);
9240					} else {
9241						$scope.find('.wpr-compare-count').text(compare_count);
9242					}
9243				},
9244				error: function(error) {
9245					console.log(error);
9246				}
9247			});
9248
9249			$(document).on('removed_from_compare', function() {
9250				$.ajax({
9251					url: WprConfig.ajaxurl,
9252					type: 'POST',
9253					data: {
9254						action: 'update_mini_compare',
9255						product_id: actionTargetProductId,
9256					},
9257					success: function(response) {
9258						$scope.find('.wpr-compare-count').text(response.compare_count);
9259						
9260						if ( response.compare_count == 0 ) {
9261							$scope.find('.wpr-compare-count').css('display', 'none');
9262						} else {
9263							$scope.find('.wpr-compare-count').css('display', 'inline-flex');
9264						}
9265					}
9266				});
9267			});
9268
9269			$(document).on('added_to_compare', function() {
9270				$.ajax({
9271					url: WprConfig.ajaxurl,
9272					type: 'POST',
9273					data: {
9274						action: 'update_mini_compare',
9275						product_id: actionTargetProductId,
9276					},
9277					success: function(response) {
9278						$scope.find('.wpr-compare-count').text(response.compare_count);
9279						$scope.find('.wpr-compare-count').css('display', 'inline-flex');
9280					}
9281				});
9282			});
9283		}, // end widgetMiniCompare
9284
9285		widgetCompare: function($scope) {
9286			$.ajax({
9287				url: WprConfig.ajaxurl,
9288				type: 'POST',
9289				data: {
9290					action: 'count_compare_items',
9291					nonce: WprConfig.nonce,
9292					remove_text: $scope.find('.wpr-compare-table-wrap').attr('remove_from_compare_text'),
9293					compare_empty_text: $scope.find('.wpr-compare-table-wrap').attr('compare_empty_text'),
9294					element_addcart_simple_txt: $scope.find('.wpr-compare-table-wrap').attr('element_addcart_simple_txt'),
9295					element_addcart_grouped_txt: $scope.find('.wpr-compare-table-wrap').attr('element_addcart_grouped_txt'),
9296					element_addcart_variable_txt: $scope.find('.wpr-compare-table-wrap').attr('element_addcart_variable_txt')
9297				},
9298				success: function(response) {
9299					if ( true ) {
9300						$scope.find('.wpr-compare-table-wrap').html(response.compare_table);
9301					}
9302				},
9303				error: function(error) {
9304					console.log(error);
9305				}
9306			});
9307
9308			$scope.on('click', '.wpr-compare-remove', function(e) {
9309				e.preventDefault();
9310				var productID = $(this).data('product-id');
9311			
9312				$.ajax({
9313					url: WprConfig.ajaxurl,
9314					type: 'POST',
9315					data: {
9316                        action: 'remove_from_compare',
9317                        nonce: WprConfig.nonce,
9318						product_id: productID
9319					},
9320					success: function() {
9321						WprElements.changeActionTargetProductId(productID);
9322						$scope.find('[data-product-id="' + productID + '"]').remove();
9323						if ( !($scope.find('.wpr-compare-remove').length > 0) ) {
9324							$scope.find('.wpr-compare-products').addClass('wpr-hidden-element');
9325							$scope.find('.wpr-compare-empty').removeClass('wpr-hidden-element');
9326						} else {
9327							$scope.find('.wpr-compare-empty').addClass('wpr-hidden-element');
9328							$scope.find('.wpr-compare-products').removeClass('wpr-hidden-element');
9329						}
9330						$(document).trigger('removed_from_compare');
9331					}
9332				});
9333			});
9334			
9335			$( 'body' ).on( 'added_to_cart', function(ev, fragments, hash, button) {
9336				button.next().fadeTo( 700, 1 );
9337
9338				button.css('display', 'none');
9339			});
9340		}, // end widgetCompare
9341		
9342		widgetFormBuilder: function($scope) {
9343
9344			var formContent = {};
9345
9346			var fileUrl = {};
9347
9348			// reCAPTCHA v3 script
9349			if ( $('body').find('.wpr-form-field-type-recaptcha-v3').length > 0 ) {
9350					var script = document.createElement('script');
9351					script.src = 'https://www.google.com/recaptcha/api.js?render='+ $scope.find('#g-recaptcha-response').data('site-key') +'';
9352					document.body.appendChild(script);
9353			}
9354
9355			// reCAPTCHA v2 (checkbox) script and render
9356			if ( $('body').find('.wpr-form-field-type-recaptcha-v2').length > 0 ) {
9357				var renderV2Containers = function() {
9358					var $containers = (typeof $scope !== 'undefined') ? $scope.find('.wpr-rec
9358aptcha-v2-container') : $('.wpr-recaptcha-v2-container');
9359					$containers.each(function() {
9360						var $container = $(this);
9361						if ( $container.attr('id') && !$container.data('recaptcha-rendered') ) {
9362							var widgetId = grecaptcha.render( $container.attr('id'), {
9363								'sitekey': $container.data('sitekey'),
9364								'size': $container.data('size') || 'normal',
9365								'theme': $container.data('theme') || 'light'
9366							});
9367							$container.data('widget-id', widgetId);
9368							$container.data('recaptcha-rendered', true);
9369						}
9370					});
9371				};
9372				if ( typeof grecaptcha !== 'undefined' ) {
9373					renderV2Containers();
9374				} else {
9375					if ( !window.wprRecaptchaV2Onload ) {
9376						window.wprRecaptchaV2Onload = function() {
9377							$( '.wpr-recaptcha-v2-container' ).each(function() {
9378								var $c = $(this);
9379								if ( $c.attr('id') && !$c.data('recaptcha-rendered') ) {
9380									var w = grecaptcha.render( $c.attr('id'), {
9381										'sitekey': $c.data('sitekey'),
9382										'size': $c.data('size') || 'normal',
9383										'theme': $c.data('theme') || 'light'
9384									});
9385									$c.data('widget-id', w);
9386									$c.data('recaptcha-rendered', true);
9387								}
9388							});
9389						};
9390						var scriptV2 = document.createElement('script');
9391						scriptV2.src = 'https://www.google.com/recaptcha/api.js?onload=wprRecaptchaV2Onload&render=explicit';
9392						document.body.appendChild(scriptV2);
9393					}
9394				}
9395			}
9396
9397			var currentTab = 0; // Current tab is set to be the first tab (0)
9398			if ( 0 < $scope.find('.wpr-step-tab').length ) {
9399				showTab(currentTab); // Display the current tab
9400
9401				$scope.find('.wpr-step-prev').each(function() {
9402					$(this).on('click', function() {
9403						nextPrev(-1);	
9404					});
9405				});
9406	
9407				$scope.find(".wpr-step-next").each(function() {
9408					$(this).on('click', function() {
9409						nextPrev(1);
9410					});
9411				});
9412			}
9413
9414			var actions = $scope.find('.wpr-form-field-type-submit').data('actions');
9415			
9416			$scope.find('input[type="file"]').on('change', function(e) {
9417				var files = this.files;
9418				var thisInput = $(this);
9419				var eventType = e.type;
9420				handleFileValidityAndUpload(thisInput, files, eventType);
9421			});
9422
9423			$scope.find('input, select, textarea').each(function() {
9424				$(this).on('change', function() {
9425					var $this = $(this);
9426					if ('checkbox' == $this.attr('type')) {
9427						var $option = $this.closest('.wpr-form-field-option');
9428						if ($option.hasClass('wpr-checked')) {
9429							$option.removeClass('wpr-checked');
9430						} else {
9431							$option.addClass('wpr-checked');
9432						}
9433					} else if ('radio' == $this.attr('type')) {
9434						// Find all radio buttons in the same group
9435						var name = $this.attr('name');
9436						var $group = $('input[type="radio"][name="' + name + '"]');
9437				
9438						// Remove 'wpr-checked' from all options in the group
9439						$group.closest('.wpr-form-field-option').removeClass('wpr-checked');
9440				
9441						// Add 'wpr-checked' to the selected option
9442						if ($this.is(':checked')) {
9443							$this.closest('.wpr-form-field-option').addClass('wpr-checked');
9444						}
9445					}
9446				});
9447
9448				$(this).on('input change keyup', function(e) {
9449					if ( $(this).closest('.wpr-select-wrap').length > 0 ) {
9450						$(this).closest('.wpr-select-wrap').removeClass('wpr-form-error-wrap');
9451					}
9452					$(this).removeClass('wpr-form-error');
9453					$(this).closest('.wpr-field-group').find('.wpr-submit-error').remove();
9454				});
9455			});
9456
9457			$scope.find('.wpr-button').on('click', function(e) {
9458				e.preventDefault();
9459
9460				var eventType = e.type;
9461
9462				formContent = {};
9463				
9464				// Create an array to store the promises of the file uploads
9465				let fileUploadPromises = [];
9466
9467				if ( 0 < $scope.find('input[type="file"]').length ) {
9468					$scope.find('input[type="file"]').each(function() {
9469						var files = this.files;
9470						var thisInput = $(this);
9471					
9472						fileUploadPromises.push(handleFileValidityAndUpload(thisInput, files, eventType));
9473					});
9474	
9475					// Wait for all file uploads to complete
9476					Promise.all(fileUploadPromises)
9477						.then(() => {
9478							createFormContent();
9479
9480							// Check if the form is valid and submit the form
9481							if (validateForm()) {
9482								$(this).closest('form').trigger('submit');
9483							}
9484						})
9485						.catch((error) => {
9486							// Handle errors
9487							console.error(error);
9488						});
9489				} else {
9490					createFormContent();
9491
9492					if ( validateForm() ) {
9493						$(this).closest('form').trigger('submit');
9494					}
9495				}
9496			});
9497			
9498
9499			$scope.find('form').on('submit', function(e) {
9500				
9501				e.preventDefault();
9502				
9503				let responsesArray = [];
9504
9505				$scope.find('.wpr-button>span').addClass('wpr-loader-hidden');
9506				$scope.find('.wpr-button').find('.wpr-double-bounce').removeClass('wpr-loader-hidden');
9507
9508				if ( $scope.find('.wpr-submit-error') ) {
9509					$scope.find('.wpr-submit-error').remove();
9510				}
9511
9512				if ( $scope.find('.wpr-submit-success') ) {
9513					$scope.find('.wpr-submit-success').remove();
9514				} 
9515				
9516				function processRecaptcha(callback) {
9517					var $v2Container = $scope.find('.wpr-form-field-type-recaptcha-v2 .wpr-recaptcha-v2-container');
9518					var hasV2 = $v2Container.length > 0;
9519					var hasV3 = $scope.find('#g-recaptcha-response').length > 0 && $scope.find('#g-recaptcha-response').attr('data-site-key');
9520
9521					if ( hasV2 ) {
9522						var widgetId = $v2Container.data('widget-id');
9523						var token = ( typeof grecaptcha !== 'undefined' && widgetId !== undefined ) ? grecaptcha.getResponse(widgetId) : '';
9524						if ( !token || token === '' ) {
9525							setTimeout(function() {
9526								$scope.find('.wpr-button').find('.wpr-double-bounce').addClass('wpr-loader-hidden');
9527								$scope.find('.wpr-button>span').removeClass('wpr-loader-hidden');
9528								$scope.find('form').append('<p class="wpr-submit-notice wpr-submit-error">'+ (WprConfig.recaptcha_error || 'Please complete the captcha.') +'</p>');
9529							}, 100);
9530							callback(false);
9531							return;
9532						}
9533						$.ajax({
9534							type: 'POST',
9535							url: WprConfig.ajaxurl,
9536							data: {
9537								action: 'wpr_verify_recaptcha',
9538								'g-recaptcha-response': token,
9539								recaptcha_version: 'v2'
9540							},
9541							success: function(response) {
9542								if ( !response.success ) {
9543									setTimeout(function() {
9544										$scope.find('.wpr-button').find('.wpr-double-bounce').addClass('wpr-loader-hidden');
9545										$scope.find('.wpr-button>span').removeClass('wpr-loader-hidden');
9546										$scope.find('form').append('<p class="wpr-submit-notice wpr-submit-error">'+ WprConfig.recaptcha_error +'</p>');
9547									}, 500);
9548									callback(false);
9549								} else {
9550									callback(true);
9551								}
9552							},
9553							error: function() {
9554								setTimeout(function() {
9555									$scope.find('.wpr-button').find('.wpr-double-bounce').addClass('wpr-loader-hidden');
9556									$scope.find('.wpr-button>span').removeClass('wpr-loader-hidden');
9557									$scope.find('form').append('<p class="wpr-submit-notice wpr-submit-error">'+ WprConfig.recaptcha_error +'</p>');
9558								}, 500);
9559								callback(false);
9560							}
9561						});
9562						return;
9563					}
9564
9565					if ( hasV3 ) {
9566						grecaptcha.ready(function() {
9567							grecaptcha.execute(WprConfig.site_key, {action: 'submit'}).then(function(token) {
9568								$scope.find('#g-recaptcha-response').val(token);
9569								$.ajax({
9570									type: 'POST',
9571									url: WprConfig.ajaxurl,
9572									data: {
9573										action: 'wpr_verify_recaptcha',
9574										'g-recaptcha-response': token,
9575										recaptcha_version: 'v3'
9576									},
9577									success: function(response) {
9578										if( !response.success ) {
9579											setTimeout(function() {
9580												$scope.find('.wpr-button').find('.wpr-double-bounce').addClass('wpr-loader-hidden');
9581												$scope.find('.wpr-button>span').removeClass('wpr-loader-hidden');
9582												$scope.find('form').append('<p class="wpr-submit-notice wpr-submit-error">'+ WprConfig.recaptcha_error +'</p>');
9583											}, 500);
9584											callback(false);
9585										} else {
9586											callback(true);
9587										}
9588									},
9589									error: function(error) {
9590										console.log(error);
9591										setTimeout(function() {
9592											$scope.find('.wpr-button').find('.wpr-double-bounce').addClass('wpr-loader-hidden');
9593											$scope.find('.wpr-button>span').removeClass('wpr-loader-hidden');
9594											$scope.find('form').append('<p class="wpr-submit-notice wpr-submit-error">'+ WprConfig.recaptcha_error +'</p>');
9595										}, 500);
9596										callback(false);
9597									}
9598								});
9599							});
9600						});
9601						return;
9602					}
9603
9604					callback(true);
9605				}
9606
9607				// Call the processRecaptcha function and pass a callback that submits the form on success
9608				processRecaptcha(function(isRecaptchaSuccessful) {
9609					if (isRecaptchaSuccessful) {
9610
9611						// Perform the form submission here
9612						var actionsObject = {
9613							emailPromise: sendEmail,
9614							submissionsPromise: createPost,
9615							mailchimpPromise: subscribeMailchimp,
9616							webhookPromise: sendWebhook
9617						}
9618
9619						// Wait for all Promises to resolve
9620						Promise.all(
9621							actions.map((action) => {
9622								try {
9623									if (actionsObject[action + 'Promise']) {
9624										return actionsObject[action + 'Promise']();
9625									}
9626								} catch (error) {
9627									console.error(error);
9628									return Promise.reject(error);
9629								}
9630							})
9631						)
9632						.then((responses) => {
9633							// Find the post ID from the createPost() response
9634							const createPostResponse = responses.find((response) => response && response.data.action === 'wpr_form_builder_submissions');
9635
9636							const postId = createPostResponse ? createPostResponse.data.post_id : null;
9637							const submissionSecret = createPostResponse && createPostResponse.data.submission_secret ? createPostResponse.data.submission_secret : null;
9638							
9639								// Update post meta for each action
9640								var updateMetaPromises = actions.map((action) => {
9641									if ( action !== 'redirect' ) {
9642										action = 'wpr_form_builder_' + action;
9643										
9644										// Find the response object for the current action
9645										const response = responses.find((response) => response && response.data.action === action);
9646										
9647										// Store the message from the response object in a variable
9648										const message = response ? response.data.message : '';
9649										
9650										if (response && response.data.status === 'success') {
9651											responsesArray.push('success');
9652
9653											if (postId && submissionSecret) {
9654												return updateFormActionMeta(postId, action, 'success', message, submissionSecret);
9655											}
9656										} else {
9657											responsesArray.push('error');
9658											
9659											if (postId && submissionSecret) {
9660												return updateFormActionMeta(postId, action, 'error', message, submissionSecret);
9661											}
9662										}
9663									}
9664								});
9665							
9666								return Promise.all(updateMetaPromises).then(() => {
9667									if (responsesArray.includes('error')) {
9668										var sanitizedErrorMessage = $('<div>').text($scope.data('settings').error_message).html();
9669										$scope.find('form').append('<p class="wpr-submit-notice wpr-submit-error">' + sanitizedErrorMessage + '</p>');
9670									} else {
9671										$scope.find('form').append(
9672											$('<p class="wpr-submit-notice wpr-submit-success"></p>').text($scope.data('settings').success_message)
9673										);										
9674										// $scope.find('form').append('<p class="wpr-submit-success">'+ $scope.data('settings').success_message +'</p>');
9675										$scope.find('button').attr('disabled', true);
9676										$scope.find('button').css('opacity', 0.6);
9677									}
9678								});
9679							// }
9680						})
9681						.catch((error) => {
9682							// Handle errors
9683							console.error(error);
9684						})
9685						.then(() => {
9686							// All AJAX actions have completed
9687							setTimeout(function() {
9688								// Switch submit button from loader back to submit
9689								$scope.find('.wpr-button').find('.wpr-double-bounce').addClass('wpr-loader-hidden');
9690								$scope.find('.wpr-button>span').removeClass('wpr-loader-hidden');
9691								setTimeout(function() {
9692									if (actions.includes('redirect') && responsesArray.includes('success')) {
9693										// window.location.replace($scope.find('.wpr-form-field-type-submit').data('redirect-url'));
9694										$(location).prop('href', $scope.find('.wpr-form-field-type-submit').data('redirect-url'))
9695									}
9696								}, 500);
9697							}, 500);
9698						})
9699						.catch((error) => {
9700							// Handle errors
9701							console.error(error);
9702						});
9703					} else {
9704						// Handle the case when reCAPTCHA fails
9705						return false;
9706					}
9707				});
9708
9709				function updateFormActionMeta(postId, actionName, status, message, submissionSecret) {
9710					return $.ajax({
9711						type: 'POST',
9712						url: WprConfig.ajaxurl,
9713						data: {
9714                            action: 'wpr_update_form_action_meta',
9715                            nonce: WprConfig.nonce,
9716							post_id: postId,
9717							action_name: actionName,
9718							status: status,
9719							message: message,
9720							submission_secret: submissionSecret
9721						},
9722					});
9723				}
9724
9725				function deepCopy(obj) {
9726					return JSON.parse(JSON.stringify(obj));
9727				}
9728				
9729				function sendEmail() {
9730					var data = deepCopy(formContent);
9731					
9732					for (let key in data) {
9733						if (data[key][0] == 'radio' || data[key][0] == 'checkbox' ) {
9734							if (Array.isArray(data[key][1])) {
9735								let trueValues = data[key][1].filter(innerArray => innerArray[1] === true).map(innerArray => innerArray[0]);
9736								let trueValuesString = trueValues.join(', ');
9737								data[key][1] = trueValuesString;
9738							}
9739						}
9740					}
9741
9742					return $.ajax({
9743						type: 'POST',
9744						url: WprConfig.ajaxurl,
9745						data: { 
9746							action: 'wpr_form_builder_email',
9747							nonce: WprConfig.nonce,
9748							form_content: data,
9749							wpr_form_id: $scope.find('input[name="form_id"]').val(),
9750						},
9751						success: function(response) {
9752							if ( !response.success ) {
9753								// if (WprConfig.is_admin) {
9754								// 	$scope.find('form').append('<p class="wpr-submit-error">'+ response.data.message +'</p>');
9755								// }
9756							} else {
9757								// if (WprConfig.is_admin) {
9758								// 	$scope.find('form').append('<p class="wpr-submit-success">'+ response.data.message +'</p>');
9759								// }
9760							}
9761						},
9762						error: function(error) {
9763							// if (WprConfig.is_admin) {
9764							// 	$scope.find('form').append('<p class="wpr-submit-error">'+ error.data.message +'</p>');
9765							// }
9766						}
9767					});
9768				}
9769
9770				function sendWebhook() {
9771					var data = deepCopy(formContent);
9772					
9773					for (let key in data) {
9774						if (data[key][0] == 'radio' || data[key][0] == 'checkbox' ) {
9775							if (Array.isArray(data[key][1])) {
9776								let trueValues = data[key][1].filter(innerArray => innerArray[1] === true).map(innerArray => innerArray[0]);
9777								let trueValuesString = trueValues.join(', ');
9778								data[key][1] = trueValuesString;
9779							}
9780						}
9781					}
9782
9783					return $.ajax({
9784						type: 'POST',
9785						url: WprConfig.ajaxurl,
9786						data: { 
9787							action: 'wpr_form_builder_webhook',
9788							nonce: WprConfig.nonce,
9789							form_content: data,
9790							wpr_form_id: $scope.find('input[name="form_id"]').val(),
9791							form_name: $scope.find('form').attr('name')
9792						},
9793						success: function(response) {
9794							if ( !response.success ) {
9795								// if (WprConfig.is_admin) {
9796								// 	$scope.find('form').append('<p class="wpr-submit-error">'+ response.data.message +'</p>');
9797								// }
9798							} else {
9799								// if (WprConfig.is_admin) {
9800								// 	$scope.find('form').append('<p class="wpr-submit-success">'+ response.data.message +'</p>');
9801								// }
9802							}
9803						},
9804						error: function(error) {
9805							console.log(error);
9806							// if (WprConfig.is_admin) {
9807							// 	$scope.find('form').append('<p class="wpr-submit-error">'+ error.data.message +'</p>');
9808							// }
9809						}
9810					});
9811				}
9812
9813				function createPost() {
9814					var data = {
9815						action: 'wpr_form_builder_submissions',
9816						nonce: WprConfig.nonce,
9817						form_content: formContent,
9818						status: 'publish',
9819						form_name: $scope.find('form').attr('name'),
9820						form_id: $scope.find('input[name="form_id"]').val(),
9821						form_page: $scope.find('form').attr('page'),
9822						form_page_id: $scope.find('form').attr('page_id')
9823					};
9824					
9825					return $.ajax({
9826						type: 'POST',
9827						url: WprConfig.ajaxurl,
9828						data: data,
9829						success: function(response) {
9830							// if (WprConfig.is_admin) {
9831							// 	$scope.find('form').append('<p class="wpr-submit-success">'+ response.data.message +'</p>');
9832							// }
9833						},
9834						error: function(error) {
9835							console.log(error)
9836							// if (WprConfig.is_admin) {
9837							// 	$scope.find('form').append('<p class="wpr-submit-error">'+ response.data.message +'</p>');
9838							// }
9839						}
9840					});
9841				}
9842
9843				function subscribeMailchimp() {
9844
9845					const submitButton = $scope.find('.wpr-form-field-type-submit');
9846					const mailchimpFields = JSON.parse(submitButton.attr('data-mailchimp-fields'));
9847
9848					let formData = {};
9849		
9850					Object.keys(mailchimpFields).forEach(function (fieldId) {
9851						if ( fieldId == 'group_id' ) {
9852
9853							var fieldValue = Array.isArray(mailchimpFields[fieldId]) ? mailchimpFields[fieldId].join(',') : mailchimpFields[fieldId];
9854						} else {
9855							var fieldValue = $scope.find('#form-field-' + mailchimpFields[fieldId]).val();
9856						}
9857						if ( fieldValue ) {
9858							if ( fieldId == 'birthday_field') {
9859								formData[fieldId] = convertToMailchimpBirthdayFormat(fieldValue);
9860							} else {
9861								formData[fieldId] = fieldValue;
9862							}
9863						}
9864					});
9865
9866					return $.ajax({
9867						url: WprConfig.ajaxurl,
9868						method: 'POST',
9869						data: {
9870							action: 'wpr_form_builder_mailchimp',
9871							nonce: WprConfig.nonce,
9872							form_data: formData,
9873							listId: submitButton.data( 'list-id' )
9874							// security: mailchimpSubscription.security
9875						},
9876						beforeSend: function () {
9877							submitButton.prop('disabled', true);
9878						},
9879						success: function (response) {
9880							if (!response.success) {
9881								// if (WprConfig.is_admin) {
9882								// 	$scope.find('form').append('<p class="wpr-submit-error">'+ response.data.message +'</p>');
9883								// }
9884							} else {
9885								// if (WprConfig.is_admin) {
9886								// 	$scope.find('form').append('<p class="wpr-submit-success">'+ response.data.message +'</p>');
9887								// }
9888							}
9889							// Handle success response, e.g., show a success message.
9890						},
9891						error: function (jqXHR, textStatus, errorThrown) {
9892							console.log(errorThrown);
9893							// if (WprConfig.is_admin) {
9894							// 	$scope.find('form').append('<p class="wpr-submit-error">'+ errorThrown.message +'</p>');
9895							// }
9896						},
9897						complete: function () {
9898							submitButton.prop('disabled', false);
9899						}
9900					});
9901				}
9902			});
9903
9904			function createFormContent() {
9905				$scope.find('.wpr-form-field, .wpr-form-field-type-radio, .wpr-form-field-type-checkbox, .wpr-step-input').each(function() {
9906
9907					var label = '';
9908					if ( $(this).prev('label') ) {
9909						if ( $(this).prev('label').data('alt-label') ) {
9910							label = $(this).prev('label').data('alt-label').trim();
9911						} else {
9912							label = $(this).prev('label').text().trim();
9913						}
9914					} else {
9915						label = '';
9916					}
9917								
9918					if ( 'textarea' !== $(this).prop('tagName').toLowerCase() ) {
9919						if ( $(this).hasClass('wpr-select-wrap') ) {
9920							var selectValue = $(this).find('select').val();
9921							if ( Array.isArray($(this).find('select').val()) ) {
9922								selectValue = $(this).find('select').val().join(', ');
9923							} else {
9924								selectValue = $(this).find('select').val();
9925							}
9926							formContent[$(this).find('select').attr('id').replace('-', '_')] = ['select', selectValue, label];
9927						} else if ( $(this).hasClass('wpr-form-field-type-radio' ) || $(this).hasClass('wpr-form-field-type-checkbox') ) {
9928							var valuesArray = [];
9929							var checkedField = $(this).find('input');
9930							var type;
9931							checkedField.each(function() {
9932								valuesArray.push([$(this).val(), $(this).is(':checked'), $(this).attr('name'), $(this).attr('id')]);
9933							});
9934
9935							if ( $(this).hasClass('wpr-form-field-type-radio') ) {
9936								type = 'radio'
9937							} else {
9938								type = 'checkbox';
9939							}
9940
9941							var inputLabel = $(this).find('.wpr-form-field-label').text().trim();
9942
9943							if ( $(this).find('.wpr-form-field-label').data('alt-label') ) {
9944								inputLabel = $(this).find('.wpr-form-field-label').data('alt-label').trim();
9945							}
9946
9947							if (checkedField.length > 0) {
9948								formContent[$(this).find('.wpr-form-field-option').data('key').replace('-', '_')] = [type, valuesArray, inputLabel];
9949							}
9950						} else if ( $(this).hasClass('wpr-step-input') ) {
9951							formContent[$(this).attr('id').replace('-', '_')] = [$(this).attr('type'), '', $(this).val(), label];
9952						} else {
9953							if ( $(this).attr('type') == 'file' ) {
9954								formContent[$(this).attr('id').replace('-', '_')] = [$(this).attr('type'), fileUrl[$(this).attr('id')], label];
9955							} else {
9956								formContent[$(this).attr('id').replace('-', '_')] = [$(this).attr('type'), $(this).val(), label];
9957							}
9958						}
9959					} else {
9960						formContent[$(this).attr('id').replace('-', '_')] = [$(this).prop('tagName').toLowerCase(), $(this).val(), label];
9961					}
9962	
9963				});
9964			}
9965
9966			function handleFileValidityAndUpload(thisInput, files, eventType) {
9967				var thisId = thisInput.attr('id');
9968			  
9969				if (0 < thisInput.closest('.wpr-field-group').find('.wpr-submit-error').length) {
9970				  thisInput.closest('.wpr-field-group').find('.wpr-submit-error').remove();
9971				}
9972			  
9973				// Get the data-maxfs value from the input.
9974				var maxFileSize = thisInput.data('maxfs') ? thisInput.data('maxfs') : 0;
9975				var allowedFileTypes = thisInput.data('allft') ? thisInput.data('allft') : 0;
9976			  
9977				// Create an array to store the upload promises
9978				let uploadPromises = [];
9979			  
9980				for (let i = 0; i < files.length; i++) {
9981				  var fileInput = files[i];
9982			  
9983				  // Create a new FormData object.
9984				  var formDataForFile = new FormData();
9985				  formDataForFile.append('action', 'wpr_addons_upload_file');
9986				  formDataForFile.append('uploaded_file', fileInput);
9987				  formDataForFile.append('max_file_size', maxFileSize);
9988				  formDataForFile.append('allowed_file_types', allowedFileTypes);
9989				  formDataForFile.append('triggering_event', eventType);
9990				  formDataForFile.append('wpr_addons_nonce', WprConfig.nonce);
9991				  formDataForFile.append('form_field_id', thisId);
9992				  formDataForFile.append('upload_token', thisInput.attr('data-wpr-upload-token') || '');
9993			  
9994				  if ('click' == eventType) {
9995					if (!fileUrl[thisId]) {
9996					  fileUrl[thisId] = [];
9997					}
9998				  }
9999			  
10000				  // Wrap the AJAX call in a Promise and push it to the uploadPromises array
10001				  uploadPromises.push(
10002					new Promise((resolve, reject) => {
10003					  $.ajax({
10004						url: WprConfig.ajaxurl,
10005						type: 'POST',
10006						data: formDataForFile,
10007						processData: false,
10008						contentType: false,
10009						success: function(response) {
10010						  if (response.success) {
10011							// Do something with the uploaded file's URL (e.g., store it in a hidden input)
10012							if (eventType == 'click') {
10013							  fileUrl[thisId][i] = response.data.url;
10014							}
10015							resolve(response);
10016						  } else {
10017							console.error('Error:', response);
10018							if (response.data ) {
10019								if ( 'filesize' === response.data.cause ) {
10020									let maxFileNotice = thisInput.data('maxfs-notice') ? thisInput.data('maxfs-notice') : response.data.message;
10021									thisInput.closest('.wpr-field-group').append('<p class="wpr-submit-notice wpr-submit-error">' + maxFileNotice + '</p>');
10022								}
10023
10024								if ( 'filetype' == response.data.cause ) {
10025									thisInput.closest('.wpr-field-group').append('<p class="wpr-submit-notice wpr-submit-error">' + response.data.message + '</p>');
10026								}
10027							}
10028
10029							reject(response);
10030						  }
10031						},
10032						error: function(error) {
10033							if ( 'filesize' === error.cause ) {
10034								let maxFileNotice = thisInput.data('maxfs-notice') ? thisInput.data('maxfs-notice') : error.message;
10035								thisInput.closest('.wpr-field-group').append('<p class="wpr-submit-notice wpr-submit-error">' + maxFileNotice + '</p>');
10036							}
10037
10038							if ( 'filetype' == error.cause ) {
10039								thisInput.closest('.wpr-field-group').append('<p class="wpr-submit-notice wpr-submit-error">' + error.message + '</p>');
10040							}
10041						  console.log(error);
10042						  reject(error);
10043						},
10044					  });
10045					}),
10046				  );
10047				}
10048			  
10049				// Return a Promise that resolves when all uploadPromises are resolved
10050				return Promise.all(uploadPromises);
10051			}			  
10052			
10053			function convertToMailchimpBirthdayFormat(dateString) {
10054				const date = new Date(dateString);
10055				const month = (date.getMonth() + 1).toString().padStart(2, '0');
10056				const day = date.getDate().toString().padStart(2, '0');
10057				return `${month}/${day}`;
10058			}
10059
10060			function showTab(n) {
10061				// This function will display the specified tab of the form...
10062				var $stepTab = $scope.find(".wpr-step-tab");
10063				$stepTab.eq(n).removeClass('wpr-step-tab-hidden');
10064				//... and fix the Previous/Next buttons:
10065				if (n === 0) {
10066					$scope.find(".wpr-step-prev").hide();
10067				} else {
10068					$scope.find(".wpr-step-prev").show();
10069				}
10070				//... and run a function that will display the correct step indicator:
10071				fixStepIndicator(n);
10072			}
10073
10074			function nextPrev(n) {
10075				// This function will figure out which tab to display
10076				var $stepTab = $scope.find(".wpr-step-tab");
10077
10078				// Exit the function if any field in the current tab is invalid:
10079				if (n === 1 && !validateForm()) {
10080					return false;
10081				}
10082				// Hide the current tab:
10083				$stepTab.eq(currentTab).addClass('wpr-step-tab-hidden');
10084				// Increase or decrease the current tab by 1:
10085				currentTab = currentTab + n;
10086				// if you have reached the end of the form...
10087				if (currentTab >= $stepTab.length) {
10088					// ... the form gets submitted:
10089					$scope.find("form").submit();
10090					return false;
10091				}
10092				// Otherwise, display the correct tab:
10093				showTab(currentTab);
10094			}
10095
10096			function validateForm() {
10097				var valid = true;
10098				var $stepTab = $scope.find(".wpr-step-tab");
10099				if ( !($stepTab.length > 0) ) {
10100					$stepTab = $scope.find('.wpr-form-fields-wrap');
10101					currentTab = 0;
10102				}
10103				var $types = ['text', 'email', 'password', 'file', 'url', 'tel', 'number', 'date', 'datetime-local', 'time', 'week', 'month', 'color']; // radio checkbox ?
10104
10105				$stepTab.eq(currentTab).find('input, select, textarea').each(function() {
10106				  const type = $(this).attr('type');
10107
10108				  var requiredField = $(this).closest('.wpr-field-group').find('.wpr-form-field').attr('required') === 'required' || $(this).closest('.wpr-field-group').find('.wpr-form-field-textual').attr('required') === 'required';
10109
10110				//   if ( this.tagName === 'SELECT' ) {
10111				// 	requiredField = $(this).attr('required') === 'required';
10112				//   }
10113
10114				  if ( type !== undefined && $.inArray(type, $types) !== -1 && $(this).val() === '' && requiredField ) {
10115					// add an "invalid" class to the field:
10116					$(this).addClass("wpr-form-error");
10117					// and set the current valid status to false
10118					valid = false;
10119				  } else if ( type === 'radio' || type === 'checkbox' ) {
10120					let requiredOption = $(this).closest('.wpr-field-group').find('.wpr-form-field-option input').attr('required') === 'required';
10121
10122					if ( requiredOption && $stepTab.eq(currentTab).find('input[type="'+ type +'"]:checked').length === 0 ) {
10123						// add an "invalid" class to the field:
10124						$(this).addClass("wpr-form-error");
10125						// and set the current valid status to false
10126						valid = false;
10127					}
10128				  } else if ( requiredField && this.tagName === 'SELECT' && $(this).val().trim() === '' ) {
10129					// select error wrap
10130					$(this).closest('.wpr-select-wrap').addClass('wpr-form-error-wrap');
10131					// add an "invalid" class to the field:
10132					$(this).addClass("wpr-form-error");
10133					// and set the current valid status to false
10134					valid = false;
10135				  } else if ( requiredField && this.tagName === 'TEXTAREA' && $(this).val().trim() === '' ) {
10136					// add an "invalid" class to the field:
10137					$(this).addClass("wpr-form-error");
10138					// and set the current valid status to false
10139					valid = false;
10140				  }
10141				});
10142
10143				if (!valid) {
10144					$stepTab.eq(currentTab).find('.wpr-form-error, .wpr-form-error-wrap').each(function() {
10145						if ( !($(this).closest('.wpr-field-group').find('.wpr-submit-error').length > 0) ) {
10146							if ( $(this).attr('type') == 'file' ) {
10147								$(this).closest('.wpr-field-group').append('<p class="wpr-submit-notice wpr-submit-error">'+ WprConfig.file_empty +'</p>');
10148							} else if ( $(this).is('select') || $(this).attr('type') === 'radio' || $(this).attr('type') === 'checkbox' ) {
10149								$(this).closest('.wpr-field-group').append('<p class="wpr-submit-notice wpr-submit-error">'+ WprConfig.select_empty +'</p>');
10150							} else {
10151								$(this).closest('.wpr-field-group').append('<p class="wpr-submit-notice wpr-submit-error">'+ WprConfig.input_empty +'</p>');
10152							}
10153						}
10154					});
10155				}
10156
10157				if (valid) {
10158					$scope.find(".wpr-step").eq(currentTab).addClass("wpr-step-finish");
10159				} else {
10160                    if ( $scope.find(".wpr-step").eq(currentTab).hasClass('wpr-step-finish') ) {
10161                        $scope.find(".wpr-step").eq(currentTab).removeClass('wpr-step-finish');
10162                    }
10163                }
10164
10165				return valid;
10166			}
10167
10168			function fixStepIndicator(n) {
10169				// This function removes the "active" class of all steps...
10170				var $step = $scope.find(".wpr-step");
10171				$step.removeClass("wpr-step-active");
10172				//... and adds the "active" class on the current step:
10173				$step.eq(n).addClass("wpr-step-active");
10174
10175                if ( $scope.find('.wpr-step-active').hasClass('wpr-step-finish') ) {
10176                    $scope.find('.wpr-step-active').removeClass('wpr-step-finish');
10177                }
10178
10179				const stepTabs = $scope.find('.wpr-step-tab');
10180				const progressBarFill = $scope.find('.wpr-step-progress-fill');
10181		
10182				let currentStep = n + 1;
10183
10184				updateProgressBar()
10185		
10186				function updateProgressBar() {
10187					const totalSteps = stepTabs.length;
10188					const progressPercentage = (currentStep / totalSteps) * 100;
10189		
10190					progressBarFill.css('width', progressPercentage + '%');
10191					setTimeout(function() {
10192						progressBarFill.text(Math.round(progressPercentage) + '%');
10193					}, 500);
10194				}
10195			}
10196		}, // end widgetFormBuilder
10197
10198		widgetImageScroll: function($scope) {
10199			var $container = $scope.find('.wpr-image-scroll-wrap');
10200			var $img = $container.find('img');
10201			var settings = $container.data();
10202			var scrollSpeed = settings.speed || 1;
10203			var containerHeight = $container.height();
10204			var containerWidth = $container.width();
10205			var imgHeight = $img.height();
10206			var imgWidth = $img.width();
10207			var isVertical = $container.hasClass('wpr-scroll-vertical');
10208			var isReverse = $container.hasClass('wpr-direction-reverse');
10209			var maxScroll = isVertical ? imgHeight - containerHeight : imgWidth - containerWidth;
10210			var $link = $scope.find('.wpr-image-scroll-link');
10211
10212			$img.on('load', function() {
10213                imgHeight = $img.height();
10214                imgWidth = $img.width();
10215                maxScroll = isVertical ? imgHeight - containerHeight : imgWidth - containerWidth;
10216				updateTransitionSpeed();
10217                init();
10218            });
10219
10220			init();	
10221			
10222			// Add transition style with dynamic speed
10223			function updateTransitionSpeed() {
10224				var transitionSpeed = scrollSpeed; // Adjust this ratio as needed
10225				$img.css('transition', `transform ${transitionSpeed}s ease-out`);
10226			}
10227
10228			function init() {
10229				updateTransitionSpeed();
10230				// Set initial position if reverse is enabled
10231				if (isReverse) {
10232					if (isVertical) {
10233						$img.css('transform', `translateY(-${maxScroll}px)`);
10234					} else {
10235						$img.css('transform', `translateX(-${maxScroll}px)`);
10236					}
10237				}
10238
10239				$container.on('mouseenter', function() {
10240					$scope.find('.wpr-image-scroll-icon').addClass('wpr-image-scroll-icon-hidden');
10241				});
10242
10243				$container.on('mouseleave', function() {
10244					$scope.find('.wpr-image-scroll-icon').removeClass('wpr-image-scroll-icon-hidden');
10245				});
10246
10247				if ($container.hasClass('wpr-trigger-hover')) {
10248					initHoverScroll();
10249				} else if ($container.hasClass('wpr-trigger-scroll')) {
10250					initMouseScroll();
10251				}
10252			}
10253
10254			// Hover Scroll
10255			function initHoverScroll() {
10256				var $hoverElement = $link.length ? $link : $container;
10257
10258				$hoverElement.on('mouseenter', function() {
10259					if (isReverse) {
10260						// If reverse, go from bottom/right to top/left
10261						if (isVertical) {
10262							$img.css('transform', 'translateY(0)');
10263						} else {
10264							$img.css('transform', 'translateX(0)');
10265						}
10266					} else {
10267						// If not reverse, go from top/left to bottom/right
10268						if (isVertical) {
10269							$img.css('transform', `translateY(-${maxScroll}px)`);
10270						} else {
10271							$img.css('transform', `translateX(-${maxScroll}px)`);
10272						}
10273					}
10274				});
10275
10276				$container.on('mouseleave', function() {
10277					if (isReverse) {
10278						// If reverse, return to bottom/right
10279						if (isVertical) {
10280							$img.css('transform', `translateY(-${maxScroll}px)`);
10281						} else {
10282							$img.css('transform', `translateX(-${maxScroll}px)`);
10283						}
10284					} else {
10285						// If not reverse, return to top/left
10286						$img.css('transform', 'translate(0, 0)');
10287					}
10288				});
10289			}
10290
10291			// Mouse Scroll
10292			function initMouseScroll() {
10293				var scrollPosition = isReverse ? maxScroll : 0;
10294				var isScrolling = false;
10295
10296				$container.on('wheel', function(e) {
10297					e.preventDefault();
10298					if (!isScrolling) {
10299						requestAnimationFrame(updateScroll);
10300					}
10301					isScrolling = true;
10302
10303					var delta = e.originalEvent.deltaY;
10304					if (isReverse) {
10305						delta = -delta;
10306					}
10307					scrollPosition = Math.max(Math.min(scrollPosition + delta * scrollSpeed, maxScroll), 0);
10308				});
10309
10310				function updateScroll() {
10311					if (isVertical) {
10312						$img.css('transform', 'translateY(-' + scrollPosition + 'px)');
10313					} else {
10314						$img.css('transform', 'translateX(-' + scrollPosition + 'px)');
10315					}
10316					isScrolling = false;
10317				}
10318			}
10319		}, // end widgetImageScroll
10320
10321		widgetVideoPlaylist: function($scope) {
10322			const globalPlaylistState = window.wprVideoPlaylistGlobal = window.wprVideoPlaylistGlobal || {
10323				isAPIReady: (typeof YT !== 'undefined' && typeof YT.Player !== 'undefined'),
10324				pendingPlayers: [],
10325				apiLoaded: false
10326			};
10327
10328			const wprVideoPlaylist = {
10329				players: {},
10330		
10331				init: function($widget) {
10332					if (!$widget || !$widget.length) return;
10333
10334					if (typeof YT !== 'undefined' && typeof YT.Player !== 'undefined') {
10335						globalPlaylistState.isAPIReady = true;
10336						globalPlaylistState.apiLoaded = true;
10337					}
10338
10339					// Load YouTube IFrame API only once
10340					if (!globalPlaylistState.apiLoaded && typeof YT === 'undefined') {
10341						const tag = document.createElement('script');
10342						tag.src = "//www.youtube.com/iframe_api";
10343						const firstScriptTag = document.getElementsByTagName('script')[0];
10344						firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
10345						globalPlaylistState.apiLoaded = true;
10346		
10347						const previousOnReady = window.onYouTubeIframeAPIReady;
10348						window.onYouTubeIframeAPIReady = () => {
10349							if (typeof previousOnReady === 'function') {
10350								previousOnReady();
10351							}
10352
10353							globalPlaylistState.isAPIReady = true;
10354							globalPlaylistState.pendingPlayers.forEach(playerData => {
10355								wprVideoPlaylist.createPlayer(playerData.$container, playerData.videoId, playerData.$widget);
10356							});
10357							globalPlaylistState.pendingPlayers = [];
10358						};
10359					}
10360		
10361					const urls = $widget.find('.wpr-vplaylist-thumbs').data('urls');
10362					const customTitles = $widget.find('.wpr-vplaylist-thumbs').data('titles');
10363					if (urls && Array.isArray(urls)) {
10364						this.processVideos($widget, urls, customTitles);
10365					}
10366				},
10367		
10368				processVideos: function($widget, urls, customTitles) {
10369					const $playlistUl = $widget.find('.wpr-vplaylist-thumbs ul');
10370					const title_tag = $widget.find('.wpr-vplaylist-current-title').prop('tagName').toLowerCase();
10371					const titles = Array.isArray(customTitles) ? customTitles : [];
10372		
10373					const videoPromises = urls.map((url, index) => {
10374						return new Promise(resolve => {
10375							const videoId = wprVideoPlaylist.extractVideoId(url);
10376							if (!videoId) {
10377								resolve(null);
10378								return;
10379							}
10380		
10381							$.get('https://www.youtube.com/oembed', {
10382								url: url,
10383								format: 'json'
10384							})
10385							.done(response => {
10386								const customTitle = titles[index] && String(titles[index]).trim().length ? String(titles[index]).trim() : '';
10387								const defaultTitle = response && response.title ? response.title : ('Video ' + (index + 1));
10388								resolve({
10389									videoId: videoId,
10390									title: customTitle || defaultTitle,
10391									index: index
10392								});
10393							})
10394							.fail(() => {
10395								const customTitle = titles[index] && String(titles[index]).trim().length ? String(titles[index]).trim() : '';
10396								resolve({
10397									videoId: videoId,
10398									title: customTitle || ('Video ' + (index + 1)),
10399									index: index
10400								});
10401							});
10402						});
10403					});
10404		
10405					Promise.all(videoPromises).then(results => {
10406						const validResults = results.filter(r => r !== null).sort((a, b) => a.index - b.index);
10407		
10408						validResults.forEach((video, index) => {
10409							const $li = $('<li>').attr('data-video', video.videoId);
10410							const thumbnailUrl = 'https://i.ytimg.com/vi/' + video.videoId + '/maxresdefault.jpg';
10411		
10412							$li.append($('<img>').attr({
10413								'src': thumbnailUrl,
10414								'alt': video.title
10415							}));
10416		
10417							const $info = $('<div>').addClass('wpr-vplaylist-info');
10418							$info.append($('<' + title_tag + '>').addClass('wpr-vplaylist-info-title').text(video.title));
10419							$li.append($info);
10420							$playlistUl.append($li);
10421		
10422							if (index === 0) {
10423								$widget.find('.wpr-vplaylist-current-title').text(video.title);
10424								$widget.find('.wpr-vplaylist-highlight').attr('data-video', video.videoId);
10425		
10426								const $player = $widget.find('.wpr-vplaylist-main');
10427								if (globalPlaylistState.isAPIReady) {
10428									wprVideoPlaylist.createPlayer($player, video.videoId, $widget);
10429								} else {
10430									globalPlaylistState.pendingPlayers.push({
10431										$container: $player,
10432										videoId: video.videoId,
10433										$widget: $widget
10434									});
10435								}
10436							}
10437						});
10438		
10439						$widget.find('.wpr-vplaylist-thumbs li').on('click', function() {
10440							const videoId = $(this).data('video');
10441							const playerId = $widget.find('.wpr-vplaylist-main').attr('id');
10442							const videoTitle = $(this).find('.wpr-vplaylist-info-title').text();
10443		
10444							if (wprVideoPlaylist.players[playerId]) {
10445								wprVideoPlaylist.players[playerId].loadVideoById(videoId);
10446								$widget.find('.wpr-vplaylist-highlight').attr('data-video', videoId);
10447								$widget.find('.wpr-vplaylist-current-title').text(videoTitle);
10448								$widget.find('.wpr-play').hide();
10449								$widget.find('.wpr-pause').show();
10450							}
10451						});
10452					});
10453				},
10454		
10455				createPlayer: function($container, videoId, $widget) {
10456					const playerId = 'wpr-player-' + Math.random().toString(36).substr(2, 9);
10457					$container.attr('id', playerId);
10458		
10459					this.players[playerId] = new YT.Player(playerId, {
10460						height: '360',
10461						width: '640',
10462						videoId: videoId,
10463						playerVars: {
10464							'autoplay': 0,
10465							'controls': 1,
10466							'rel': 0,
10467							'showinfo': 0
10468						},
10469						events: {
10470							'onReady': function() {
10471								$widget.find('.wpr-vplaylist-controller').on('click', function() {
10472									const player = wprVideoPlaylist.players[playerId];
10473		
10474									if (player.getPlayerState() === YT.PlayerState.PLAYING) {
10475										player.pauseVideo();
10476										$(this).find('.wpr-play').show();
10477										$(this).find('.wpr-pause').hide();
10478									} else {
10479										player.playVideo();
10480										$(this).find('.wpr-play').hide();
10481										$(this).find('.wpr-pause').show();
10482									}
10483								});
10484							},
10485							'onStateChange': function(event) {
10486								const $controller = $widget.find('.wpr-vplaylist-controller');
10487		
10488								if (event.data === YT.PlayerState.PLAYING) {
10489									$controller.find('.wpr-play').hide();
10490									$controller.find('.wpr-pause').show();
10491								} else if (event.data === YT.PlayerState.PAUSED || event.data === YT.PlayerState.ENDED) {
10492									$controller.find('.wpr-play').show();
10493									$controller.find('.wpr-pause').hide();
10494								}
10495							}
10496						}
10497					});
10498		
10499					return playerId;
10500				},
10501		
10502				extractVideoId: function(url) {
10503					const pattern = /(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/\s]{11})/i;
10504					const match = url.match(pattern);
10505					return match ? match[1] : null;
10506				}
10507			};
10508		
10509			wprVideoPlaylist.init($scope);		
10510		}, // end widgetVideoPlaylist
10511
10512		widgetProductAddToCart: function($scope) {
10513			var qtyInput = jQuery('.woocommerce .wpr-quantity-wrapper'),
10514				qtyInputInStock = qtyInput.find('input.qty').attr('max') ? qtyInput.find('input.qty').attr('max') : 99999999,
10515				qtyLayout = $scope.find('.wpr-product-add-to-cart').attr('layout-settings'),
10516				qtyWrapper = $scope.find('.wpr-add-to-cart-icons-wrap'),
10517				plusIconChild = !$scope.find('.wpr-add-to-cart-icons-wrap').length ? 'last-child' : 'first-child',
10518				minusIconChild = !$scope.find('.wpr-add-to-cart-icons-wrap').length ? 'first-child' : 'last-child';
10519
10520                if ( qtyWrapper.length === 0 ) {
10521                    plusIconChild = 'last-child';
10522                    minusIconChild = 'first-child';
10523                }
10524
10525			if ( WprElements.editorCheck() && $scope.find('select').length > 0 ) {
10526				$scope.find('select').on('change', function() {
10527					$scope.find('.reset_variations').css('visibility', 'visible');
10528				});
10529
10530				$scope.find('.reset_variations').on('click', function() {
10531					alert('Reset is Disabled in Editor. Please Preview this Page to see it in action.');
10532				});
10533			}
10534
10535			$scope.find('input.qty').each(function() {
10536				if (!$(this).val()) {
10537					$(this).val(0);
10538				}
10539			});
10540			
10541			$scope.find('.variations').find('select').on('change', function () {
10542				var resetButtonDisplay = false;
10543				$scope.find('.variations').find('select').each(function () {
10544					if ( 'choose an option' !== $(this).find('option:selected').text().toLowerCase() ) {
10545						resetButtonDisplay = true;
10546					}
10547				});
10548
10549				if ( resetButtonDisplay == false ) {
10550					$scope.find('.reset_variations').css('display', 'none');
10551				} else {
10552					$scope.find('.reset_variations').css('display', 'inline-block');
10553				}
10554			});
10555
10556			// convert to text input
10557			if (qtyLayout !== 'default' ) {
10558				qtyInput.find('input.qty').attr('type', 'text').removeAttr('step').removeAttr('min').removeAttr('max');
10559			}
10560		
10561			// plus
10562			// Ensure event handlers are not attached multiple times
10563			$scope.off('click', 'i:' + plusIconChild).on('click', 'i:' + plusIconChild, function() {
10564				var $qtyInput = jQuery(this).prev('.quantity').find('input.qty');
10565                if ($qtyInput.length === 0) {
10566                    $qtyInput = jQuery(this).closest('.wpr-quantity-wrapper').find('.quantity').find('input.qty');
10567                }
10568                
10569				var currentVal = parseInt($qtyInput.val(), 10);
10570
10571				if (currentVal < qtyInputInStock && qtyLayout == 'both') {
10572					$qtyInput.val(currentVal + 1);
10573					$scope.find('input[name="update_cart"]').removeAttr('disabled');
10574				} else if (currentVal < qtyInputInStock && qtyLayout !== 'both' && qtyLayout !== 'default') {
10575					$qtyInput.val(currentVal + 1);
10576					$scope.find('input[name="update_cart"]').removeAttr('disabled');
10577				}
10578			});
10579			
10580			$scope.off('click', 'i:' + minusIconChild).on('click', 'i:' + minusIconChild, function() {
10581				var $qtyInput = jQuery(this).next('.quantity').find('input.qty');
10582                if ($qtyInput.length === 0) {
10583                    $qtyInput = jQuery(this).closest('.wpr-quantity-wrapper').find('.quantity').find('input.qty');
10584                }
10585                
10586				var currentVal = parseInt($qtyInput.val(), 10);
10587
10588				if (currentVal > 0 && qtyLayout == 'both') {
10589					$qtyInput.val(currentVal - 1);
10590					$scope.find('input[name="update_cart"]').removeAttr('disabled');
10591				} else if (currentVal > 0 && qtyLayout !== 'both' && qtyLayout !== 'default') {
10592					$qtyInput.val(currentVal - 1);
10593					$scope.find('input[name="update_cart"]').removeAttr('disabled');
10594				}
10595			});
10596		
10597			// in stock range check
10598			qtyInput.find('input.qty').keyup(function() {
10599				if ( jQuery(this).val() > qtyInputInStock ) {
10600					jQuery(this).val( qtyInputInStock );
10601				}
10602			});
10603			
10604			var addToCartTimeout; 
10605			// var isAddingToCart = false;
10606			$(document).ready(function () {
10607				if ( 'yes' === $scope.find('.wpr-product-add-to-cart').data('ajax-add-to-cart') ) {
10608					if ( !$('div[data-elementor-type="wpr-theme-builder"]').hasClass('product-type-external') ) {
10609						$scope.find('.single_add_to_cart_button').on('click', ajaxAddToCart);
10610					}
10611				}
10612			});
10613
10614			function ajaxAddToCart(e) {
10615				e.preventDefault();  
10616				
10617				// If an AJAX request is already in progress, prevent another one
10618				// if (isAddingToCart) {
10619				// 	return;
10620				// }
10621
10622				// Set the flag to indicate that an AJAX request is in progress
10623				// isAddingToCart = true;
10624
10625				let $form = $( this ).closest('form');
10626
10627				var $variationForm = $form.closest('.variations_form');
10628
10629				let isGrouped = $form.hasClass('grouped_form');
10630			
10631				if ( ! $form[0].checkValidity() ) {
10632					$form[0].reportValidity();
10633			
10634					return false;
10635				}
10636			
10637				let $thisBtn = $( this ),
10638					product_id = $thisBtn.val() || '',
10639					cartFormData = $form.serialize();
10640					
10641					// // Get the ID of the selected variation
10642					// let variation_id = $scope.find('input[name="variation_id"]').val();
10643					// // Get the data of the selected variation
10644					// let variation_data = window['wc_variation_form'].variation_data[variation_id];
10645					
10646					// // Get the availability HTML of the selected variation
10647					// let availability_html = variation_data.availability_html;
10648					
10649					// // Check if the variation is in stock
10650					// if (availability_html.indexOf('In stock') !== -1) {
10651					// } else {
10652					// }
10653				
10654				if (isGrouped) {
10655					let nonZero = false;
10656					$scope.find('.woocommerce-grouped-product-list-item__quantity').find('input').each(function() {
10657						if ($(this).val() > 0 ) {
10658							nonZero = true;
10659						}
10660					});
10661
10662					if ( !nonZero ) {
10663						// The grouped product does not have the required number of items selected
10664						alert(WprConfig.chooseQuantityText);
10665						return;
10666					}
10667				}
10668			
10669				$.ajax( {
10670					type: 'POST',
10671					url: WprConfig.ajaxurl,
10672					data: 'action=wpr_addons_add_cart_single_product&add-to-cart=' + product_id + '&' + cartFormData,
10673					beforeSend: function () {
10674						if ( $variationForm.length > 0 && ! $variationForm.find('.variations select').val() ) {
10675							// Do not trigger added_to_cart event if options are not selected for variable product
10676							return;
10677						} 
10678						if ( $thisBtn.hasClass('disabled') ) {
10679							return
10680						}
10681
10682						$thisBtn.removeClass( 'added' ).addClass( 'loading' );
10683					},
10684					complete: function () {
10685						if ( $variationForm.length > 0 && ! $variationForm.find('.variations select').val() ) {
10686							// Do not trigger added_to_cart event if options are not selected for variable product
10687							return;
10688						} 
10689
10690						if ( $thisBtn.hasClass('disabled') ) {
10691							return
10692						}
10693
10694						$thisBtn.addClass( 'added' ).removeClass( 'loading' );
10695					},
10696					success: function ( response ) {
10697
10698						// GOGA - remove later
10699						if (response.notices && response.notices.length > 0) {
10700
10701							// The selected variation is low in stock, display a warning message
10702							if (response.notices[0].type === 'wc_low_stock') {
10703								alert('Only ' + response.notices[0].message + ' left in stock!');
10704							} else {
10705								alert(response.notices[0].message);
10706							}
10707						}
10708
10709						if ( response.error && response.product_url ) {
10710							window.location = response.product_url;
10711							return;
10712						}
10713			
10714						if ( typeof wc_add_to_cart_params === 'undefined' ) {
10715							return false;
10716						}
10717			
10718						if ( $variationForm.length > 0 && ! $variationForm.find('.variations select').val() ) {
10719							// Do not trigger added_to_cart event if options are not selected for variable product
10720							return;
10721						}
10722						
10723						if ( $thisBtn.hasClass('disabled') ) {
10724							return;
10725						}
10726
10727						$( document.body ).trigger( 'wc_fragment_refresh' );
10728						$( document.body ).trigger( 'added_to_cart', [ response.fragments, response.cart_hash, $thisBtn ] );
10729
10730						// setTimeout( function () {
10731						// 	$thisBtn.removeClass( 'added' );
10732						// 	var currentCartCount = parseInt($('.wpr-mini-cart-icon-count').text());
10733						// 	var updatedCartCount = parseInt($scope.find('.wpr-quantity-wrapper .qty').val());
10734                        //     console.log(currentCartCount, updatedCartCount);
10735						// 	$('.wpr-mini-cart-icon-count').text(currentCartCount + updatedCartCount);
10736						// }, 1000 );
10737					},
10738				} );
10739
10740				$( 'body' ).on( 'added_to_cart', function(ev, fragments, hash, button) {
10741					button.next().fadeTo( 700, 1 );
10742
10743					button.css('display', 'none');
10744				});
10745			}
10746		}, // End of widgetProductAddToCart
10747
10748		widgetMiniWishlist: function($scope) {
10749			
10750			if ( !($scope.find('.wpr-wishlist-count').length > 0 && 0 == $scope.find('.wpr-wishlist-count').text()) ) {
10751				$scope.find('.wpr-wishlist-count').css('display', 'inline-flex');
10752			} else {
10753
10754			}
10755			
10756			function wishlistRemoveHandler() {
10757				$scope.find('.wpr-wishlist-remove').on('click', function(e) {
10758					e.preventDefault();
10759					var product_id = $(this).data('product-id');
10760					$.ajax({
10761						url: WprConfig.ajaxurl,
10762						type: 'POST',
10763						data: {
10764                            action: 'remove_from_wishlist',
10765                            nonce: WprConfig.nonce,
10766							product_id: product_id
10767						},
10768						success: function() {
10769							   $scope.find('.wpr-wishlist-product[data-product-id="' + product_id + '"]').remove();
10770							WprElements.changeActionTargetProductId(product_id);
10771							$(document).trigger('removed_from_wishlist');
10772						}
10773					});
10774				});
10775			}
10776
10777			wishlistRemoveHandler();
10778	
10779			var mutationObserver = new MutationObserver(function(mutations) {
10780				wishlistRemoveHandler();
10781			});
10782
10783			mutationObserver.observe($scope[0], {
10784				childList: true,
10785				subtree: true,
10786			});
10787
10788			$.ajax({
10789				url: WprConfig.ajaxurl,
10790				type: 'POST',
10791				data: {
10792					action: 'count_wishlist_items',
10793					nonce: WprConfig.nonce,
10794				},
10795				success: function(response) {
10796					if ( $scope.find('.wpr-wishlist-count').css('display') == 'none' && 0 < response.wishlist_count ) {
10797						$scope.find('.wpr-wishlist-count').text(response.wishlist_count);
10798						$scope.find('.wpr-wishlist-count').css('display', 'inline-flex');
10799					} else if ( 0 == response.wishlist_count ) {
10800						$scope.find('.wpr-wishlist-count').css('display', 'none');
10801						$scope.find('.wpr-wishlist-count').text(response.wishlist_count);
10802					} else {
10803						$scope.find('.wpr-wishlist-count').text(response.wishlist_count);
10804					}
10805
10806					if ( true ) {
10807						// Get all elements with the class 'wpr-wishlist-product' and their product IDs
10808						var productElements = $scope.find('.wpr-wishlist-product');
10809						var productIds = productElements.map(function() {
10810						  return $(this).data('product-id');
10811						}).get();
10812						
10813						// Filter out the items in the response that match the product IDs
10814						var newWishlistItems = response.wishlist_items.filter(function(item) {
10815						  return !productIds.includes(item.product_id);
10816						});
10817
10818						// Convert the wishlist_items to an array of product_ids for easier searching
10819						var wishlistProductIds = response.wishlist_items.map(function(item) {
10820							return item.product_id;
10821						});
10822
10823						productElements.each(function() {
10824						  var productId = $(this).data('product-id');
10825						
10826						  // If the product ID is not in the wishlistProductIds array, remove the element
10827						  if (!wishlistProductIds.includes(productId)) {
10828							$(this).remove();
10829						  }
10830						});
10831
10832						newWishlistItems.forEach(function(item) {
10833							$scope.find('.wpr-wishlist-products').append('<li class="wpr-wishlist-product" data-product-id="'+ item.product_id +'"><a class="wpr-wishlist-product-img" href="'+ item.product_url +'">'+ item.product_image +'</a><div><a href="'+ item.product_url +'">'+ item.product_title +'</a><div class="wpr-wishlist-product-price">'+ item.product_price +'</div></div><span class="wpr-wishlist-remove" data-product-id="'+ item.product_id +'"></span></li>');
10834						});
10835					}
10836				}
10837			});
10838
10839			$(document).on('added_to_wishlist', function() {
10840				$.ajax({
10841					url: WprConfig.ajaxurl,
10842					type: 'POST',
10843					data: {
10844						action: 'update_mini_wishlist',
10845						nonce: WprConfig.nonce,
10846						product_id: actionTargetProductId,
10847					},
10848					success: function(response) {
10849						if ( $scope.find('.wpr-wishlist-products').find('li[data-product-id='+ response.product_id +']').length == 0 ) {
10850							$scope.find('.wpr-wishlist-products').append('<li class="wpr-wishlist-product" data-product-id="'+ response.product_id +'"><a class="wpr-wishlist-product-img" href="'+ response.product_url +'">'+ response.product_image +'</a><div><a href="'+ response.product_url +'">'+ response.product_title +'</a><div class="wpr-wishlist-product-price">'+ response.product_price +'</div></div><span class="wpr-wishlist-remove" data-product-id="'+ response.product_id +'"></span></li>');
10851						}
10852
10853						$scope.find('.wpr-wishlist-count').text(response.wishlist_count);
10854						$scope.find('.wpr-wishlist-count').css('display', 'inline-flex');
10855					}
10856				});
10857			});
10858
10859			$(document).on('removed_from_wishlist', function() {
10860				$scope.find('.wpr-wishlist-product[data-product-id="' + actionTargetProductId + '"]').remove();
10861				$.ajax({
10862					url: WprConfig.ajaxurl,
10863					type: 'POST',
10864					data: {
10865						action: 'update_mini_wishlist',
10866						nonce: WprConfig.nonce,
10867						product_id: actionTargetProductId,
10868					},
10869					success: function(response) {
10870						$scope.find('.wpr-wishlist-count').text(response.wishlist_count);
10871						
10872						if ( response.wishlist_count == 0 ) {
10873							$scope.find('.wpr-wishlist-count').css('display', 'none');
10874						} else {
10875							$scope.find('.wpr-wishlist-count').css('display', 'inline-flex');
10876						}
10877					}
10878				});
10879			});
10880			$scope.find('.wpr-wishlist').css({"display": "none"});
10881
10882			var animationSpeed = $scope.find('.wpr-wishlist-wrap').data('animation');
10883
10884			$('body').on('click', function(e) {
10885				if ( !e.target.classList.value.includes('wpr-wishlist-wrap') && !e.target.closest('.wpr-wishlist-wrap') ) {
10886					if ( $scope.hasClass('wpr-wishlist-slide') ) {
10887						$scope.find('.wpr-wishlist').slideUp(animationSpeed);
10888					} else {
10889						$scope.find('.wpr-wishlist').fadeOut(animationSpeed);
10890					}
10891				}
10892			});
10893
10894			if ( 0 !== $scope.hasClass('wpr-wishlist-sidebar').length ) {
10895				if ( $('#wpadminbar').length ) {
10896					$scope.find('.wpr-wishlist').css({
10897						// 'top': $('#wpadminbar').css('height'),
10898						// 'height': $scope.find('.wpr-shopping-cart-wrap').css('height') -  $('#wpadminbar').css('height')
10899						'z-index': 999999
10900					});
10901				}
10902
10903				closeSideBar();
10904
10905				$scope.find('.wpr-wishlist').on('click', function(e) {
10906					// if ( !e.target.classList.value.includes('widget_shopping_cart_content') && !e.target.closest('.widget_shopping_cart_content') ) {
10907					if ( !e.target.classList.value.includes('wpr-wishlist-inner-wrap') && !e.target.closest('.wpr-wishlist-inner-wrap') ) {
10908						// $scope.find('.widget_shopping_cart_content').addClass('wpr-mini-cart-slide-out');
10909						$scope.find('.wpr-wishlist-inner-wrap').addClass('wpr-wishlist-slide-out');
10910						$scope.find('.wpr-wishlist-slide-out').css('animation-speed', animationSpeed);
10911						$scope.find('.wpr-wishlist').fadeOut(animationSpeed);
10912						$('body').removeClass('wpr-wishlist-sidebar-body');
10913						setTimeout(function() {
10914							// $scope.find('.widget_shopping_cart_content').removeClass('wpr-mini-cart-slide-out');
10915							$scope.find('.wpr-wishlist-inner-wrap').removeClass('wpr-wishlist-slide-out');
10916							$scope.find('.wpr-wishlist').css({"display": "none"});
10917						}, animationSpeed + 100);
10918					}
10919				});
10920			}
10921
10922			if ( $scope.find('.wpr-wishlist').length ) {
10923				if ( $scope.hasClass('wpr-wishlist-sidebar') || $scope.hasClass('wpr-wishlist-dropdown') ) {
10924					$scope.find('.wpr-wishlist-toggle-btn').on('click', function(e) {
10925						e.stopPropagation();
10926						e.preventDefault();
10927						if ( 'none' === $scope.find('.wpr-wishlist').css("display") ) {
10928							if ( $scope.hasClass('wpr-wishlist-slide') ) {
10929								$scope.find('.wpr-wishlist').slideDown(animationSpeed);
10930							} else {
10931								$scope.find('.wpr-wishlist').fadeIn(animationSpeed);
10932							}
10933							if ( $scope.hasClass('wpr-wishlist-sidebar') ) {
10934								$scope.find('.wpr-wishlist').fadeIn(animationSpeed);
10935								$scope.find('.wpr-wishlist-inner-wrap').addClass('wpr-wishlist-slide-in');
10936								$scope.find('.wpr-wishlist-slide-in').css('animation-speed', animationSpeed);
10937								$('body').addClass('wpr-wishlist-sidebar-body');
10938							}
10939							setTimeout(function() {
10940								// $scope.find('.widget_shopping_cart_content').removeClass('wpr-mini-cart-slide-in');
10941								$scope.find('.wpr-wishlist').removeClass('wpr-wishlist-slide-in');
10942								if ( $scope.hasClass('wpr-wishlist-sidebar') ) {
10943									$scope.find('.wpr-wishlist').trigger('resize');
10944								}
10945							}, animationSpeed + 100);
10946						} else {
10947							if ( $scope.hasClass('wpr-wishlist-slide') ) {
10948								$scope.find('.wpr-wishlist').slideUp(animationSpeed);
10949							} else {
10950								$scope.find('.wpr-wishlist').fadeOut(animationSpeed);
10951							}
10952						}
10953					});
10954				}
10955			}
10956
10957			var mutationObserver = new MutationObserver(function(mutations) {
10958				if (  0 !== $scope.hasClass('wpr-wishlist-sidebar').length ) {
10959					closeSideBar();
10960				}
10961				
10962				$scope.find('.wpr-wishlist-product').on('click', '.wpr-wishlist-remove', function() {
10963					$(this).closest('li').addClass('wpr-before-remove-from-wishlist');
10964				});
10965
10966				if ( $scope.find('.wpr-wishlist-product').length !== 0 ) {
10967					$scope.find('.wpr-wishlist-empty, .wpr-wishlist-empty-shop-link').addClass('wpr-wishlist-empty-hidden');
10968					$scope.find('.wpr-view-wishlist').removeClass('wpr-hidden-element');
10969				} else {
10970					$scope.find('.wpr-wishlist-empty, .wpr-wishlist-empty-shop-link').removeClass('wpr-wishlist-empty-hidden');
10971					$scope.find('.wpr-view-wishlist').addClass('wpr-hidden-element');
10972				}
10973			});
10974
10975			// Listen to Mini Cart Changes
10976			mutationObserver.observe($scope[0], {
10977				childList: true,
10978				subtree: true,
10979			});
10980
10981			function closeSideBar() {
10982				$scope.find('.wpr-close-wishlist span').on('click', function(e) {
10983					// $scope.find('.widget_shopping_cart_content').addClass('wpr-mini-cart-slide-out');
10984					$scope.find('.wpr-wishlist-inner-wrap').addClass('wpr-wishlist-slide-out');
10985					$scope.find('.wpr-wishlist-slide-out').css('animation-speed', animationSpeed);
10986					$scope.find('.wpr-wishlist').fadeOut(animationSpeed);
10987					$('body').removeClass('wpr-wishlist-sidebar-body');
10988					setTimeout(function() {
10989						// $scope.find('.widget_shopping_cart_content').removeClass('wpr-mini-cart-slide-out');
10990						$scope.find('.wpr-wishlist-inner-wrap').removeClass('wpr-wishlist-slide-out');
10991						$scope.find('.wpr-wishlist').css({"display": "none"});
10992					}, animationSpeed + 100);
10993				});
10994			}
10995		}, // end widgetMiniWishlist
10996
10997		widgetProductMiniCart: function($scope) {
10998            
10999            window.addEventListener('pageshow', function(event) {
11000                if (event.persisted || (window.performance && window.performance.navigation.type === 2)) {
11001                    updateMiniCart();
11002                }
11003            });
11004
11005			$( document.body ).on( 'updated_wc_div', function() {
11006				updateMiniCart();
11007			});
11008			
11009			// function updateVH() {
11010			// 	let vh = window.innerHeight * 0.01;
11011			// 	document.documentElement.style.setProperty('--vh', `${vh}px`);
11012			// }
11013			
11014			// // Run the function initially
11015			// updateVH();
11016			
11017			// // Recalculate on window resize (for when the user rotates the device or resizes the viewport)
11018			// window.addEventListener('resize', updateVH);
11019			
11020            
11021            function updateMiniCart() {
11022                $.ajax({
11023                    url: wc_add_to_cart_params.ajax_url,
11024                    type: 'POST',
11025                    data: {
11026                        action: 'woocommerce_get_refreshed_fragments'
11027                    },
11028                    success: function(response) {
11029                        if (response && response.fragments) {
11030                            $.each(response.fragments, function(key, value) {
11031                                $(key).replaceWith(value);
11032                            });
11033            
11034                            $(document.body).trigger('wc_fragments_refreshed');
11035                        }
11036                    }
11037                });
11038            }        
11039
11040            $scope.find('.wpr-mini-cart').css({"display": "none"});
11041
11042            var animationSpeed = $scope.find('.wpr-mini-cart-wrap').data('animation');
11043
11044            $('body').on('click', function(e) {
11045                if ( !e.target.classList.value.includes('wpr-mini-cart') && !e.target.closest('.wpr-mini-cart') ) {	
11046                    $scope.find('.wpr-mini-cart-toggle-btn').closest('.elementor>.elementor-element').removeClass('wpr-z-index');
11047                    if ( $scope.hasClass('wpr-mini-cart-slide') ) {
11048                        $scope.find('.wpr-mini-cart').slideUp(animationSpeed);
11049                    } else {
11050                        $scope.find('.wpr-mini-cart').fadeOut(animationSpeed);
11051                    }
11052                }
11053
11054				if ( e.target.classList.value.includes('wpr-shopping-cart-wrap') ) {
11055					$scope.find('.wpr-mini-cart-toggle-btn').closest('.elementor>.elementor-element').removeClass('wpr-z-index');
11056				}
11057            });
11058
11059            if ( $scope.hasClass('wpr-mini-cart-sidebar') ) {
11060                if ( $('#wpadminbar').length ) {
11061                    $scope.find('.wpr-mini-cart').css({
11062                        // 'top': $('#wpadminbar').css('height'),
11063                        // 'height': $scope.find('.wpr-shopping-cart-wrap').css('height') -  $('#wpadminbar').css('height')
11064                        'z-index': 999999
11065                    });
11066                }
11067
11068                closeSideBar();
11069
11070                $scope.find('.wpr-shopping-cart-wrap').on('click', function(e) {
11071                    // if ( !e.target.classList.value.includes('widget_shopping_cart_content') && !e.target.closest('.widget_shopping_cart_content') ) {
11072                    if ( !e.target.classList.value.includes('wpr-shopping-cart-inner-wrap') && !e.target.closest('.wpr-shopping-cart-inner-wrap') ) {
11073                        // $scope.find('.widget_shopping_cart_content').addClass('wpr-mini-cart-slide-out');
11074                        $scope.find('.wpr-shopping-cart-inner-wrap').addClass('wpr-mini-cart-slide-out');
11075                        $scope.find('.wpr-mini-cart-slide-out').css('animation-speed', animationSpeed);
11076                        $scope.find('.wpr-shopping-cart-wrap').fadeOut(animationSpeed);
11077                        $('body').removeClass('wpr-mini-cart-sidebar-body');
11078                        setTimeout(function() {
11079                            // $scope.find('.widget_shopping_cart_content').removeClass('wpr-mini-cart-slide-out');
11080                            $scope.find('.wpr-shopping-cart-inner-wrap').removeClass('wpr-mini-cart-slide-out');
11081                            $scope.find('.wpr-mini-cart').css({"display": "none"});
11082                        }, animationSpeed + 100);
11083                    }
11084                });
11085            }
11086
11087            if ( $scope.find('.wpr-mini-cart').length ) {
11088                if ( $scope.hasClass('wpr-mini-cart-sidebar') || $scope.hasClass('wpr-mini-cart-dropdown') ) {
11089                    $scope.find('.wpr-mini-cart-toggle-btn').on('click', function(e) {
11090                        e.stopPropagation();
11091                        e.preventDefault();
11092                        if ( 'none' === $scope.find('.wpr-mini-cart').css("display") ) {
11093                            $(this).closest('.elementor>.elementor-element').addClass('wpr-z-index');
11094                            if ( $scope.hasClass('wpr-mini-cart-slide') ) {
11095                                $scope.find('.wpr-mini-cart').slideDown(animationSpeed);
11096                            } else {
11097                                $scope.find('.wpr-mini-cart').fadeIn(animationSpeed);
11098                            }
11099                            if ( $scope.hasClass('wpr-mini-cart-sidebar') ) {
11100                                $scope.find('.wpr-shopping-cart-wrap').fadeIn(animationSpeed);
11101                                // $scope.find('.widget_shopping_cart_content').addClass('wpr-mini-cart-slide-in');
11102                                $scope.find('.wpr-shopping-cart-inner-wrap').addClass('wpr-mini-cart-slide-in');
11103                                $scope.find('.wpr-mini-cart-slide-in').css('animation-speed', animationSpeed);
11104                                $('body').addClass('wpr-mini-cart-sidebar-body');
11105                            } else if ( $scope.hasClass('wpr-mini-cart-dropdown') ) {
11106								$scope.find('.wpr-shopping-cart-wrap').css('display', 'block');
11107							}
11108                            setTimeout(function() {
11109                                // $scope.find('.widget_shopping_cart_content').removeClass('wpr-mini-cart-slide-in');
11110                                $scope.find('.wpr-shopping-cart-inner-wrap').removeClass('wpr-mini-cart-slide-in');
11111                                if ( $scope.hasClass('wpr-mini-cart-sidebar') ) {
11112                                    $scope.find('.wpr-woo-mini-cart').trigger('resize');
11113                                }
11114                            }, animationSpeed + 100);
11115                        } else {
11116                            $(this).closest('.elementor>.elementor-element').removeClass('wpr-z-index');
11117                            if ( $scope.hasClass('wpr-mini-cart-slide') ) {
11118                                $scope.find('.wpr-mini-cart').slideUp(animationSpeed);
11119                            } else {
11120                                $scope.find('.wpr-mini-cart').fadeOut(animationSpeed);
11121                            }
11122                        }
11123                    });
11124                }
11125            }
11126
11127            var mutationObserver = new MutationObserver(function(mutations) {
11128                if (  $scope.hasClass('wpr-mini-cart-sidebar') ) {
11129                    closeSideBar();
11130
11131                    // if ( $scope.find('.wpr-mini-cart').data('close-cart-heading') ) {
11132                    // 	$scope.find('.wpr-close-cart h2').text($scope.find('.wpr-mini-cart').data('close-cart-heading').replace(/-/g, ' '));
11133                    // }
11134                }
11135                
11136                $scope.find('.woocommerce-mini-cart-item').on('click', '.wpr-remove-item-from-mini-cart', function() {
11137                    $(this).closest('li').addClass('wpr-before-remove-from-mini-cart');
11138                });
11139            });
11140
11141            // Listen to Mini Cart Changes
11142            mutationObserver.observe($scope[0], {
11143                childList: true,
11144                subtree: true,
11145            });
11146
11147            function closeSideBar() {
11148                $scope.find('.wpr-close-cart span').on('click', function(e) {
11149                    // $scope.find('.widget_shopping_cart_content').addClass('wpr-mini-cart-slide-out');
11150                    $scope.find('.wpr-shopping-cart-inner-wrap').addClass('wpr-mini-cart-slide-out');
11151                    $scope.find('.wpr-mini-cart-slide-out').css('animation-speed', animationSpeed);
11152                    $scope.find('.wpr-shopping-cart-wrap').fadeOut(animationSpeed);
11153                    $('body').removeClass('wpr-mini-cart-sidebar-body');
11154                    setTimeout(function() {
11155                        // $scope.find('.widget_shopping_cart_content').removeClass('wpr-mini-cart-slide-out');
11156                        $scope.find('.wpr-shopping-cart-inner-wrap').removeClass('wpr-mini-cart-slide-out');
11157                        $scope.find('.wpr-mini-cart').css({"display": "none"});
11158                    }, animationSpeed + 100);
11159					$scope.find('.wpr-mini-cart-toggle-btn').closest('.elementor>.elementor-element').removeClass('wpr-z-index');
11160                });
11161            }
11162
11163		}, // End of widgetProductMiniCart
11164
11165		widgetProductFilters: function($scope) {
11166			if ( 0 !== $scope.find('.wpr-search-form-input').length ) {
11167				$scope.find('.wpr-search-form-input').on( {
11168					focus: function() {
11169						$scope.addClass( 'wpr-search-form-input-focus' );
11170					},
11171					blur: function() {
11172						$scope.removeClass( 'wpr-search-form-input-focus' );
11173					}
11174				} );
11175			}
11176		}, // End of widgetProductFilters
11177
11178		widgetAdvancedFilters: function($scope) {
11179			var visualFilters = $scope.find('.wpr-af-visual-wrap'),
11180				viewMoreLess = $scope.find('.wpr-view-more-less'),
11181				actionSelector = $('body').find('.wpr-grid[data-advanced-filters="yes"]').first(),
11182				widgetSelector = $('body').find('.wpr-grid[data-advanced-filters="yes"]').first().closest('[class*="elementor-widget-wpr-"]'),
11183				gridScopeId = widgetSelector.attr('data-id'),
11184				isWooGrid = actionSelector.length && actionSelector.closest('.elementor-widget-wpr-woo-grid').length > 0,
11185				experimentActionCount = isWooGrid ? 'wpr_get_filtered_count_products' : 'wpr_get_filtered_count_posts',
11186				experimentActionContent = isWooGrid ? 'wpr_woo_grid_filters_ajax' : 'wpr_grid_filters_ajax',
11187				settings,
11188				datePickers = [],
11189				isDebounceAjaxCallRunning = false,
11190				pagesLoadedExperiment = 0,
11191				pageCount = 0;
11192
11193			if ( widgetSelector.length > 0 ) {
11194				if ( widgetSelector.find('.wpr-grid-pagination').data('pages') <= 1 ) {
11195					widgetSelector.find('.wpr-load-more-btn').hide();
11196				}
11197			}
11198
11199			// Infinite scroll with Advanced Filters: same AJAX as load more (offset + wpr_url_params from URL)
11200			if ( actionSelector.length > 0 ) {
11201				var gridDataSettings = actionSelector.attr( 'data-settings' );
11202				if ( gridDataSettings ) {
11203					try {
11204						var gridSettings = JSON.parse( gridDataSettings );
11205						if ( gridSettings.pagination_type === 'infinite-scroll' ) {
11206							widgetSelector.find( '.wpr-load-more-btn' ).hide();
11207							widgetSelector.find( '.wpr-grid-pagination' ).css( { 'display': 'flex', 'justify-content': 'center' } );
11208							var afInfiniteScrollLoading = false,
11209								afInfiniteScrollFoundPosts = null,
11210								afScrollThresholdPx = 400;
11211							$( window ).off( 'scroll.afInfiniteScroll' ).on( 'scroll.afInfiniteScroll', function() {
11212								if ( WprElements.editorCheck() || ! widgetSelector.length ) return;
11213								var currentCount = widgetSelector.find( '.wpr-grid-item' ).length;
11214								var perPage = ( gridSettings.grid_settings && gridSettings.grid_settings.query_posts_per_page ) || gridSettings.query_posts_per_page || 9;
11215								if ( currentCount <= perPage ) {
11216									afInfiniteScrollFoundPosts = null;
11217								}
11218								if ( afInfiniteScrollFoundPosts !== null && currentCount >= afInfiniteScrollFoundPosts ) return;
11219								if ( afInfiniteScrollLoading ) return;
11220								var paginationEl = widgetSelector.find( '.wpr-grid-pagination' )[ 0 ];
11221								if ( ! paginationEl ) return;
11222								var rect = paginationEl.getBoundingClientRect();
11223								if ( rect.top > $( window ).height() + afScrollThresholdPx ) return;
11224								afInfiniteScrollLoading = true;
11225								settings = typeof gridSettings !== 'undefined' ? gridSettings : ( actionSelector.attr( 'data-settings' ) ? JSON.parse( actionSelector.attr( 'data-settings' ) ) : {} );
11226								finalURL = window.location.href;
11227								$('.wpr-advanced-filters-wrap').each(function() {
11228									var wrap = $(this);
11229									if ( wrap.find('input[type="checkbox"], input[type="radio"], input.wpr-rating-filter').length > 0 ) {
11230										wrap.find('input[type="checkbox"], input[type="radio"], input.wpr-rating-filter').each(function() {
11231											if ( $(this).is(':checked') || $(this).hasClass('wpr-rating-filter') ) {
11232												updateURL( $(this).attr('name'), $(this).val(), $(this), finalURL );
11233											}
11234										});
11235									}
11236									wrap.find('input[type="text"], input[type="date"]').each(function() {
11237										updateURL( $(this).attr('name'), $(this).val(), $(this), finalURL );
11238									});
11239									if ( wrap.find('select').length === 1 ) {
11240										var sel = wrap.find('select');
11241										updateURL( sel.attr('name'), sel.val(), sel, finalURL );
11242									} else if ( wrap.find('select').length > 1 ) {
11243										wrap.find('select').each(function() {
11244											updateURL( $(this).attr('name'), $(this).val(), $(this), finalURL );
11245										});
11246									}
11247									if ( wrap.find('.wpr-af-range-apply-btn').length > 0 && wrap.data('wpr-applied') == 'yes' ) {
11248										var minInp = wrap.find('.wpr-af-rf-control-min-input'), maxInp = wrap.find('.wpr-af-rf-control-max-input'), sn = minInp.attr('name'), sv = [];
11249										if ( minInp.length && maxInp.length && sn ) {
11250											var mn = parseRangeInputVal(minInp.val()), mx = parseRangeInputVal(maxInp.val());
11251											sv.push(isNaN(mn) ? (minInp.attr('min') || minInp.data('min')) : mn);
11252											sv.push(isNaN(mx) ? (maxInp.attr('max') || maxInp.data('max')) : mx);
11253											updateURL( sn, sv, wrap.find('.wpr-af-range-apply-btn'), finalURL );
11254										}
11255									} else if ( wrap.find('.wpr-af-range-container').length > 0 && wrap.data('wpr-applied') == 'yes' ) {
11256										var minInp = wrap.find('.wpr-af-rf-control-min-input'), maxInp = wrap.find('.wpr-af-rf-control-max-input'), sn = minInp.attr('name'), sv = [];
11257										if ( minInp.length && maxInp.length && sn ) {
11258											var mn = parseRangeInputVal(minInp.val()), mx = parseRangeInputVal(maxInp.val());
11259											sv.push(isNaN(mn) ? (minInp.attr('min') || minInp.data('min')) : mn);
11260											sv.push(isNaN(mx) ? (maxInp.attr('max') || maxInp.data('max')) : mx);
11261											updateURL( sn, sv, wrap.find('.wpr-af-range-container'), finalURL );
11262										}
11263									}
11264								});
11265								var paramsObj = {};
11266								(new URL(finalURL)).searchParams.forEach( function( value, key ) { paramsObj[key] = value; } );
11267								settings.grid_settings = settings.grid_settings || {};
11268
11269								if ( typeof settings.grid_settings._base_query_offset === 'undefined' ) {
11270									settings.grid_settings._base_query_offset = +settings.grid_settings.query_offset || 0;
11271								}
11272								settings.grid_settings.query_offset = +settings.grid_settings._base_query_offset + currentCount;
11273
11274								widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-pagination-loading' ).show();
11275								var orderby = widgetSelector.find( 'select.orderby' ).length > 0 ? widgetSelector.find( 'select.orderby' ).val() : '';
11276
11277								var excludeIds = [];
11278								actionSelector.find('.wpr-grid-item').each(function() {
11279									var m = ( this.className || '' ).match( /(?:^|\s)post-(\d+)(?:\s|$)/ );
11280									if ( m && m[1] ) {
11281										excludeIds.push( parseInt( m[1], 10 ) );
11282									}
11283								});
11284								
11285								$.ajax( {
11286									type: 'POST',
11287									url: WprConfig.ajaxurl,
11288									data: {
11289										action: experimentActionContent,
11290										nonce: WprConfig.nonce,
11291										wpr_offset: +settings.grid_settings._base_query_offset,
11292										wpr_item_length: currentCount,
11293										wpr_exclude_ids: excludeIds,
11294										grid_settings: settings.grid_settings,
11295										wpr_url_params: paramsObj,
11296										orderby: orderby,
11297									},
11298									success: function( response ) {
11299										var rawItems = response.data && response.data.output ? $( response.data.output ) : $();
11300										var items = rawItems.filter ? rawItems.filter( '.wpr-grid-item' ) : rawItems;
11301										var returnedCount = ( response.data && response.data.post_count != null )
11302											? +response.data.post_count
11303											: items.length;
11304										// found_posts is REMAINING (post__not_in excludes already shown) — convert to absolute total
11305										if ( response.data && response.data.found_posts != null ) {
11306											afInfiniteScrollFoundPosts = currentCount + ( +response.data.found_posts );
11307										} else if ( items.length === 0 ) {
11308											afInfiniteScrollFoundPosts = currentCount;
11309										} else if ( items.length < perPage ) {
11310											afInfiniteScrollFoundPosts = currentCount + items.length;
11311										}
11312										if ( items.length ) {
11313											actionSelector.append( items );
11314											actionSelector.isotopewpr( 'appended', items );
11315											items.imagesLoaded().progress( function() {
11316												WprElements.isotopeLayout( settings, '', widgetSelector, true, $scope );
11317												setTimeout( function() {
11318													WprElements.isotopeLayout( settings, '', widgetSelector, true, $scope );
11319												}, 100 );
11320												setTimeout( function() { actionSelector.addClass( 'grid-images-loaded' ); }, 500 );
11321											} );
11322											WprElements.lightboxPopup( settings, widgetSelector, actionSelector );
11323											if ( actionSelector.data( 'lightGallery' ) ) {
11324												actionSelector.data( 'lightGallery' ).destroy( true );
11325												actionSelector.lightGallery( settings.lightbox );
11326											}
11327											WprElements.mediaHoverLink( widgetSelector, actionSelector );
11328										}
11329										widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-pagination-loading' ).hide();
11330										// Stop when this page exhausted remaining matches (not when remaining <= DOM count)
11331										var remaining = response.data && response.data.found_posts != null ? +response.data.found_posts : 0;
11332										if ( ! response.data || remaining <= returnedCount ) {
11333											widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-pagination-finish' ).fadeIn( 1000 );
11334											widgetSelector.find( '.wpr-grid-pagination' ).delay( 1000 ).fadeOut( 500 );
11335										}
11336										window.dispatchEvent( new Event( 'resize' ) );
11337										afInfiniteScrollLoading = false;
11338									},
11339									error: function() {
11340										widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-pagination-loading' ).hide();
11341										afInfiniteScrollLoading = false;
11342									},
11343								} );
11344							} );
11345						}
11346					} catch ( e ) {}
11347				}
11348			}
11349
11350			if ( $scope.find('.wpr-af-from-slider').length > 0 ) {
11351				// Range filter slider
11352				const fromSlider = $scope.find('#wpr-af-from-slider-' + $scope.data('id'));
11353				const toSlider = $scope.find('#wpr-af-to-slider-' + $scope.data('id'));
11354				const fromInput = $scope.find('#wpr-from-input-' + $scope.data('id'));
11355				const toInput = $scope.find('#wpr-to-input-' + $scope.data('id'));
11356	
11357				// Controls slider handlers z-index
11358				setToggleAccessible(toSlider, 'to');
11359				fillSlider(fromInput, toInput);
11360				
11361				fromSlider.on('input', () => controlFromSlider(fromSlider, toSlider, fromInput));
11362				toSlider.on('input', () => controlToSlider(fromSlider, toSlider, toInput));
11363				fromInput.on('change', () => controlFromInput(fromSlider, fromInput, toInput));
11364				toInput.on('change', () => controlToInput(toSlider, fromInput, toInput));
11365				// Format displayed value on blur when using delimiters (e.g. user types "1234" -> "1,234.00")
11366				fromInput.on('blur', function() {
11367					var rangeContainer = $(this).closest('.wpr-af-range-container');
11368					if (rangeContainer.data('format-numbers') === 'yes') {
11369						var n = parseRangeInputVal($(this).val());
11370						if (!isNaN(n)) setRangeInputVal($(this), n, rangeContainer);
11371					}
11372				});
11373				toInput.on('blur', function() {
11374					var rangeContainer = $(this).closest('.wpr-af-range-container');
11375					if (rangeContainer.data('format-numbers') === 'yes') {
11376						var n = parseRangeInputVal($(this).val());
11377						if (!isNaN(n)) setRangeInputVal($(this), n, rangeContainer);
11378					}
11379				});
11380			}
11381
11382            if ( $scope.find('input[name="wpr_af_date"]').length > 0 ) {
11383                const elem = $scope.find('input[name="wpr_af_date"]')[0];
11384				datePickers.push(elem);
11385            }
11386
11387			if ( $scope.find('input[name="wpr_af_date_range"').length > 0 ) {
11388                const elem1 = $scope.find('#wpr-datepicker-1[name="wpr_af_date_range"]')[0];
11389                const elem2 = $scope.find('#wpr-datepicker-2[name="wpr_af_date_range"]')[0];
11390				
11391				datePickers.push(elem1);
11392				datePickers.push(elem2);
11393			}
11394
11395			// Loop through the datePickers array and initialize AirDatepicker for each
11396			$.each(datePickers, function(index, elem) {
11397				new AirDatepicker(elem, {  // elem[0] since `elem` is a jQuery object, but AirDatepicker needs a DOM element
11398					dateFormat: 'yyyy-MM-dd', // Specify the desired date format,
11399					multipleDates: false,
11400					onShow: function() {
11401						var scopeId = 'air-datepicker-' + $scope.attr('data-id');
11402
11403						// Access the AirDatepicker's container
11404						var datepickerContainer = document.querySelector('#air-datepicker-global-container .air-datepicker'); // Adjust if different
11405
11406						// Add the class to the AirDatepicker container
11407						if (datepickerContainer) {
11408							datepickerContainer.classList.add(scopeId);
11409						}
11410					},
11411					onSelect: function({date, formattedDate, datepicker}) {
11412						var selectedName = $(elem).attr('name'),
11413							selectedValue = formattedDate;
11414
11415						$(elem).attr('data-date-val', formattedDate);
11416
11417						// Check if AJAX filters are enabled and trigger accordingly
11418						if ('yes' == $(elem).closest('.wpr-advanced-filters-wrap').data('enable-ajax')) {
11419							ajaxFilters($(elem));
11420						} else {
11421							updateURL(selectedName, selectedValue, $(elem));
11422						}
11423					}
11424				});
11425
11426				// Handle the resetDate event to clear the AirDatepicker
11427				$(elem).on('resetDate', function() {
11428					// Use the AirDatepicker API to clear the date
11429					if (elem.airdatepicker) {
11430						elem.airdatepicker.clear();
11431					}
11432				});
11433			});
11434
11435			visualFiltersFunc($scope);
11436
11437			onFilterChange();
11438
11439			renderActiveFilters();
11440
11441			updateActiveFilters();
11442
11443			resetFilters();
11444
11445			applyAllFilters();
11446
11447			viewMoreLessFunc();
11448
11449			initDependentSelect($scope);
11450
11451			function initDependentSelect($scope) {
11452				var mainSelect = $scope.find('.wpr-af-main-select'),
11453					dependentSelects = $scope.find('.wpr-af-dependent-select'),
11454					noneLabel = $scope.find('.wpr-advanced-filters-wrap').data('none-label') || 'None';
11455
11456				$(document).ready(function(){
11457					var selectedValue = mainSelect.val();
11458					var taxonomy = mainSelect.closest('.wpr-advanced-filters-wrap').find('.wpr-af-dependent-select').first().data('taxonomy');
11459					var relatedTax = mainSelect.data('taxonomy');
11460					noneLabel = $(this).find('option:first').text();
11461
11462					if ( selectedValue && dependentSelects.first().val() == 0 ) {
11463						loadDependentOptions(selectedValue, taxonomy, dependentSelects.first(), relatedTax);
11464					}
11465				});
11466
11467				// Handle main select change
11468				mainSelect.on('change', function() {
11469					var selectedValue = $(this).val();
11470					var taxonomy = $(this).closest('.wpr-advanced-filters-wrap').find('.wpr-af-dependent-select').first().data('taxonomy');
11471					var relatedTax = $(this).data('taxonomy');
11472					noneLabel = $(this).find('option:first').text();
11473
11474					// Reset and disable all dependent selects
11475					dependentSelects.each(function() {
11476						noneLabel = $(this).find('option:first').text();
11477						$(this).prop('disabled', true).empty().append('<option value="0">' + noneLabel + '</option>');
11478					});
11479
11480					if (selectedValue) {
11481						loadDependentOptions(selectedValue, taxonomy, dependentSelects.first(), relatedTax);
11482					}
11483				});
11484
11485				// Handle dependent select changes
11486				dependentSelects.on('change', function() {
11487					var selectedValue = $(this).val();
11488					var nextSelect = $(this).closest('.wpr-af-select-wrap').nextAll('.wpr-af-select-wrap').first().find('.wpr-af-dependent-select');
11489					var relatedTax = $(this).data('taxonomy');
11490
11491					// Log data-taxonomy from all previous selects (not just the first)
11492					const prevSelects = $(this)
11493						.closest('.wpr-af-select-wrap')
11494						.prevAll('.wpr-af-select-wrap')
11495						.find('select');
11496
11497					const taxonomies = prevSelects
11498						.map(function() { return $(this).data('taxonomy'); })
11499						.get();
11500
11501					const parentTerms = prevSelects
11502						.map(function() { return $(this).val(); })
11503						.get();
11504
11505					// Add current relatedTax before logging
11506					taxonomies.unshift(relatedTax);
11507					parentTerms.unshift(selectedValue);
11508
11509					// Reset and disable all following selects
11510					$(this).nextAll('.wpr-af-dependent-select').each(function() {
11511						$(this).prop('disabled', true).empty().append('<option value="0">' + noneLabel + '</option>');
11512					});
11513
11514					if (selectedValue && nextSelect.length) {
11515						loadDependentOptions(selectedValue, nextSelect.data('taxonomy'), nextSelect, relatedTax, taxonomies, parentTerms);
11516					}
11517				});
11518
11519				function loadDependentOptions(parentTerm, taxonomy, targetSelect, relatedTax, taxArray = [], parentTerms = []) {
11520
11521					let dependentData = {
11522							action: 'wpr_get_dependent_terms',
11523							nonce: WprConfig.nonce,
11524							taxonomy: taxonomy,
11525							parent_term: parentTerm,
11526							related_taxonomy: relatedTax,
11527					}
11528
11529					if ( taxArray.length > 1) {
11530						// dependentData['tax_array'] = JSON.stringify(taxArray);
11531						// dependentData['parent_terms'] = JSON.stringify(parentTerms);
11532						dependentData['tax_array'] = taxArray;
11533						dependentData['parent_terms'] = parentTerms;
11534					}
11535
11536					$.ajax({
11537						url: WprConfig.ajaxurl,
11538						type: 'POST',
11539						data: dependentData,
11540						success: function(response) {
11541							console.log(response);
11542							if (response.success && response.data.length) {
11543								var options = '<option value="">' + targetSelect.find('option:first').text() + '</option>';
11544								response.data.forEach(function(term) {
11545									options += '<option value="' + term.id + '">' + term.name + '</option>';
11546								});
11547								targetSelect.html(options).prop('disabled', false);
11548							}
11549						}
11550					});
11551
11552					renderActiveFilters('ajax');
11553				}
11554			}
11555
11556			function viewMoreLessFunc() {
11557				if ( viewMoreLess.length > 0 ) { // DOESN'T WORK IN EDITOR FOR SOME REASON - maybe localstorage ?
11558					// localstorage to keep the state of the view more/less button
11559					var itemsToShow = $scope.find('.wpr-view-ml-wrap').data('item-count'),
11560						moreLess = $scope.find('.wpr-view-more-less'),
11561						visualFiltersEnabled = $scope.find('.wpr-af-visual-wrap').length > 0,
11562						elementsToShow = visualFiltersEnabled ? $scope.find('.wpr-af-visual-wrap') : $scope.find('.wpr-af-input-wrap'),
11563						elementsToHide = visualFiltersEnabled ? $scope.find('.wpr-af-visual-wrap:gt(' + (itemsToShow - 1) + ')') : $scope.find('.wpr-af-input-wrap:gt(' + (itemsToShow - 1) + ')'),
11564						isItemSelected = visualFiltersEnabled ? $scope.find('.wpr-af-visual-active').length > 0 : $scope.find('.wpr-af-input-wrap input:checked').length > 0;
11565					
11566					// Hide items exceeding the initial limit, only if no item is selected
11567					if (!isItemSelected) {
11568						elementsToHide.addClass('wpr-hidden-item');
11569					} else {
11570						moreLess.addClass('expanded');
11571						moreLess.text(moreLess.data('less-text'));
11572					}
11573	
11574					if ( $scope.find('.wpr-af-input-wrap').length <= itemsToShow ) {
11575						moreLess.hide();
11576					}
11577			
11578					// Toggle visibility on "View More" click
11579					moreLess.on('click', function (e) {
11580						e.preventDefault();
11581						$(this).toggleClass('expanded');
11582
11583						if ($(this).hasClass('expanded')) {
11584							// Show all items
11585							elementsToShow.removeAttr('style').removeClass('wpr-hidden-item');
11586							$(this).text($(this).data('less-text'));
11587						} else {
11588							// Hide items exceeding the limit
11589							elementsToHide.removeAttr('style').addClass('wpr-hidden-item');
11590							$(this).text($(this).data('more-text'));
11591						}
11592					});
11593				}
11594			}
11595			
11596			function applyAllFilters() {
11597				if ( $('.wpr-af-apply-btn').length > 0 ) {
11598					$('.wpr-af-apply-btn').on('click', function() {
11599                        ajaxFilters($(this));
11600					});
11601				}
11602
11603				if ( widgetSelector.find('.wpr-load-more-btn').length > 0 ) {
11604					widgetSelector.find('.wpr-load-more-btn').on('click', function(e) {
11605						e.preventDefault();
11606						e.stopImmediatePropagation();
11607						ajaxFilters($(this));
11608					});
11609				}
11610
11611				if ( widgetSelector.find('.wpr-grid-orderby').length > 0 ) {
11612					widgetSelector.find('.wpr-grid-orderby').find('select').on('change', function(e) {
11613						e.preventDefault();
11614						e.stopImmediatePropagation();
11615						ajaxFilters($(this));
11616					});
11617				}
11618			}
11619
11620			function visualFiltersFunc($scope) {
11621				if (visualFilters.length > 0) {
11622					visualFilters.each(function(index) {
11623						$(this).on('click', function(e) {
11624                            e.preventDefault();
11625							let $this = $(this);
11626
11627							if ( $this.find('input').prop('disabled') ) {
11628								return true;
11629							}
11630
11631							// Remove all active classes
11632							// if ( 'or' === $scope.find('.wpr-advanced-filters-wrap').attr('data-wpr-relation') ) {
11633								// visualFilters.removeClass('wpr-af-visual-active');
11634							// }
11635
11636							// Find the corresponding input element by index
11637							var correspondingInput = $this.find('.wpr-af-input-wrap').find('input'); // TODO: choose approach for colors
11638							
11639							if ( 'img' == $this.prop('tagName') ) {
11640								correspondingInput = $scope.find('input[value="'+ $this.data('replace-value') +'"]');
11641							}
11642				
11643							// Set the checked property to true
11644							if ( correspondingInput.prop('checked') == true ) {
11645                                $this.removeClass('wpr-af-visual-active');
11646								correspondingInput.prop('checked', false);
11647							} else {
11648                                if  ( 'radio' == $scope.find('input').attr('type') )  {
11649                                    $scope.find('.wpr-af-visual').removeClass('wpr-af-visual-active');
11650                                }
11651
11652                                setTimeout(function() {
11653									$this.addClass('wpr-af-visual-active');
11654                                    correspondingInput.prop('checked', true);
11655                                }, 100);
11656							}
11657                            
11658                            setTimeout(function() {
11659                                // Trigger the change event on the corresponding input
11660                                correspondingInput.trigger('change');
11661                            }, 500);
11662						});
11663					});
11664				}
11665			}
11666
11667			function updateActiveFilters() {
11668				if ( WprElements.editorCheck() ) {
11669					return;
11670				}
11671
11672				$scope.on('click', '.wpr-af-active-filters span.wpr-remove-filter', function () {
11673					var thisEl = $(this),
11674						dataValue = thisEl.data('value').toString(),
11675						dataType = thisEl.parent().data('wpr-af-type'),
11676						currentUrl = window.location.href,
11677						urlParts = currentUrl.split('?'),
11678						baseUrl = urlParts[0],
11679						queryString = urlParts[1] || '',
11680						params = queryString.split('&');
11681			
11682					// Update parameters based on dataValue
11683					var updatedParams = params.map(function (param) {
11684						var parts = param.split('=');
11685						var key = parts[0];
11686						var value = decodeURIComponent(parts[1] || '').replace(/\+/g, ' ');
11687			
11688						if (value.includes(',')) {
11689
11690                            if ( dataValue == value ) {
11691                                return;
11692                            }
11693
11694							// Convert comma-separated values to an array
11695							var valuesArray = value.split(',');
11696			
11697							// Remove the clicked dataValue from the array
11698							valuesArray = valuesArray.filter(function (val) {
11699								return val != dataValue;
11700							});
11701			
11702							return valuesArray.length > 0 ? key + '=' + valuesArray.join(',') : null;
11703						} else {
11704							return value != dataValue ? param : null;
11705						}
11706					});
11707			
11708					// Remove null or undefined values from updatedParams
11709					updatedParams = updatedParams.filter(function (param) {
11710						return param != null;
11711					});
11712			
11713					// Find keys to remove with _gfr_ if their _gf_ counterparts are removed
11714					var removedKeys = updatedParams
11715						.filter(param => param === null)
11716						.map(param => params[params.indexOf(param)].split('=')[0].replace('_gf_', '_gfr_'));
11717			
11718					// Remove those _gfr_ keys
11719					updatedParams = updatedParams.filter(function (param) {
11720						var key = param.split('=')[0];
11721						return !removedKeys.includes(key);
11722					});
11723			
11724					// Join the base URL and updated parameters
11725					var updatedUrl = baseUrl + (updatedParams.length > 0 ? '?' + updatedParams.join('&') : '');
11726			
11727					if ( $('.wpr-af-active-filters').closest('.wpr-advanced-filters-wrap').data('enable-ajax') == 'yes' ) {
11728
11729						let matchingVisualFilter = $('body').find('*[data-replace-value="'+ thisEl.data('value') +'"]');
11730
11731						matchingVisualFilter.parent('.wpr-af-visual-wrap').removeClass('wpr-af-visual-active');
11732
11733						if ( $('body').find('*[data-date-val="'+ thisEl.data('value') +'"]').length > 0 ) {
11734
11735							$('body').find('*[data-date-val="'+ thisEl.data('value') +'"]').val('').trigger('resetDate');
11736
11737							ajaxFilters($('body').find('*[data-date-val="'+ thisEl.data('value') +'"]'));
11738
11739						} else {
11740							if ( $('body').find('[data-wpr-filter-type='+ dataType +']').find('*[value="'+ thisEl.data('value') +'"]').prop('tagName') == 'OPTION' ) {
11741								$('body').find('*[value="'+ thisEl.data('value') +'"]').closest('select').prop('selectedIndex', 0).trigger('change');
11742							} else {
11743								if (dataType != 'rating') { // Maybe other types as well need proper handling
11744									$('body').find('[data-wpr-filter-type='+ dataType +']').find('*[value="'+ thisEl.data('value') +'"]').prop('checked', false).trigger('change');
11745								}
11746							}
11747
11748							var values = thisEl.data('value').toString(),
11749								rangeCheckMin = $('[data-id="' + $(this).data('rf-id') + '"]').find('.wpr-af-rf-control-min-input'),
11750								rangeCheckMax = $('[data-id="' + $(this).data('rf-id') + '"]').find('.wpr-af-rf-control-max-input');
11751
11752							if (values && values.includes(',') && rangeCheckMin.filter((_, el) => parseRangeInputVal(values.split(',')[0]) === parseRangeInputVal($(el).val())).length > 0) {
11753								let [minValue, maxValue] = values.split(','),
11754									rangeMin = rangeCheckMin.filter((_, el) => parseRangeInputVal(minValue) === parseRangeInputVal($(el).val())),
11755									rangeMax = rangeCheckMax.filter((_, el) => parseRangeInputVal(maxValue) === parseRangeInputVal($(el).val())),
11756									outerContainer = rangeMin.closest('.wpr-advanced-filters-wrap'),
11757									rangeContainer = outerContainer.find('.wpr-af-range-container'),
11758									fromSlider = rangeContainer.find('.wpr-af-from-slider'),
11759									toSlider = rangeContainer.find('.wpr-af-to-slider'),
11760									fromSliderText = rangeContainer.find('.wpr-af-rs-value-min'),
11761									toSliderText = rangeContainer.find('.wpr-af-rs-value-max'),
11762									minVal = rangeMin.attr('min') || rangeMin.data('min'),
11763									maxVal = rangeMax.attr('max') || rangeMax.data('max'),
11764									fmt = (v) => rangeContainer.data('format-numbers') === 'yes' ? formatRangeDisplay(v, rangeContainer) : v;
11765
11766								fromSlider.val(minVal);
11767								toSlider.val(maxVal);
11768								fromSliderText.text(fmt(minVal));
11769								toSliderText.text(fmt(maxVal));
11770		
11771								rangeMin.val(fmt(minVal)).attr('value', rangeMin.val()).trigger('input');
11772								rangeMax.val(fmt(maxVal)).attr('value', rangeMax.val()).trigger('input');
11773
11774								rangeContainer.find('input.wpr-af-from-slider').trigger('change');
11775
11776								if ( outerContainer.find('.wpr-af-range-apply-btn').length > 0 ) {
11777									outerContainer.find('.wpr-af-range-apply-btn').trigger('click');
11778								}
11779
11780								fillSlider(rangeMin, rangeMax);
11781							} else {
11782								if ( dataType == 'rating') {
11783									$('body').find('[data-wpr-filter-type='+ dataType +']').find('.wpr-woo-rating-' + thisEl.data('value')).removeClass('wpr-active-product-filter');	
11784									$('body').find('[data-wpr-filter-type='+ dataType +']').find('.wpr-woo-rating-' + thisEl.data('value')).find('input').trigger('change');
11785								} else if ( dataType != 'select') {
11786									ajaxFilters($('body').find('[data-wpr-filter-type='+ dataType +']').find('*[value="'+ thisEl.data('value') +'"]'));
11787								}
11788							}
11789
11790						}
11791
11792						thisEl.remove();
11793
11794						hideActiveLabelReset();
11795					} else {
11796						// Update the URL
11797						window.location.href = updatedUrl;
11798					}
11799				});
11800			}
11801
11802			function hideActiveLabelReset() {
11803				if ( $('body').find('.wpr-remove-filter').length > 0 ) {
11804					$('body').find('.wpr-af-reset-btn').removeClass('wpr-hidden-element');
11805					$('body').find('.wpr-af-active-filters').prev('.wpr-af-filters-label').removeClass('wpr-hidden-element');
11806					$('body').find('.wpr-af-active-filters').closest('.wpr-advanced-filters-wrap').removeClass('wpr-hidden-element');
11807				} else {
11808					$('body').find('.wpr-af-reset-btn').addClass('wpr-hidden-element');
11809					$('body').find('.wpr-af-active-filters').prev('.wpr-af-filters-label').addClass('wpr-hidden-element');
11810					$('body').find('.wpr-af-active-filters').closest('.wpr-advanced-filters-wrap').addClass('wpr-hidden-element');
11811				}
11812			}
11813			
11814			function renderActiveFilters( $origin = '' ) {
11815				if ( $origin == 'ajax' ) {
11816					var activeFilters = $('.wpr-af-active-filters');
11817				} else {
11818					var activeFilters = $scope.find('.wpr-af-active-filters');
11819				}
11820
11821				if ( activeFilters ) {
11822					if ( WprElements.editorCheck() && $scope.find('.wpr-af-active-filters').length > 0 ) {
11823						let activeExample = '<div class="wpr-af-active-wrap-99999999" data-wpr-af-type="checkbox"><span class="wpr-remove-filter" data-value="99999" class="custom-cursor-on-hover">Tags: Tasty(7)<span><svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
11823<path d="M5.293 6.707l5.293 5.293-5.293 5.293c-0.391 0.391-0.391 1.024 0 1.414s1.024 0.391 1.414 0l5.293-5.293 5.293 5.293c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414l-5.293-5.293 5.293-5.293c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0l-5.293 5.293-5.293-5.293c-0.391-0.391-1.024-0.391-1.414 0s-0.391 1.024 0 1.414z"></path></svg></span></span></div>';
11824						activeFilters.append(activeExample);
11825					}
11826	
11827					$('.wpr-advanced-filters-wrap').each(function () {
11828						var thisWrap = $(this),
11829							label = thisWrap.find('h4').text().trim() || thisWrap.data('term-label'),
11830							ratingActive = '',
11831							ratingInactive = '',
11832							uniqueID = thisWrap.closest('.elementor-element').data('id'),
11833							firstSelectNoValue = !thisWrap.find('select').first().val() || thisWrap.find('select').first().val() == '0',
11834							values = [];
11835					
11836						// Checkboxes and Radios
11837						thisWrap.find('input[type="checkbox"]:checked, input[type="radio"]:checked, .wpr-active-product-filter input.wpr-rating-filter').each(function () {
11838							var checkboxLabel = $(this).parent('label').text().trim();
11839
11840							if ( $(this).hasClass('wpr-rating-filter') ) {
11841								checkboxLabel = $(this).val() + '/5';
11842							}
11843
11844							values.push({ label: label, value: checkboxLabel, realVal: $(this).val() });
11845						});
11846						
11847						//, .wpr-woo-rating:not(.wpr-active-product-filter) input.wpr-rating-filter
11848						thisWrap.find('input[type="checkbox"]:not(:checked), input[type="radio"]:not(:checked), .wpr-woo-rating:not(.wpr-active-product-filter) input.wpr-rating-filter').each(function () {
11849							if ( $('body').find('span[data-value="'+ $(this).val() +'"]').parent().attr('data-wpr-af-type') == thisWrap.data('wpr-filter-type') ) {
11850								if ( thisWrap.closest('[data-element_type="widget"]').data('id') == $('body').find('span[data-value="'+ $(this).val() +'"]').data('rf-id') ) {
11851									$('body').find('span[data-value="'+ $(this).val() +'"]').remove();
11852								}
11853							}
11854						});
11855	
11856						thisWrap.find('input[type="date"]').each(function() {
11857							values.push({ label: label, value: $(this).val(), realVal: $(this).val() });
11858						});
11859	
11860						thisWrap.find('input[type="text"]').each(function() {
11861							values.push({ label: label, value: $(this).val(), realVal: $(this).val() });
11862						});
11863					
11864						// Range Filter
11865						if (thisWrap.find('.wpr-af-rf-control').length > 0) {
11866							var minInp = thisWrap.find('.wpr-af-rf-control-min-input'),
11867								maxInp = thisWrap.find('.wpr-af-rf-control-max-input'),
11868								rangeDisplay = [minInp.val(), maxInp.val()].join(' - '),
11869								rangeRealVal = [parseRangeInputVal(minInp.val()), parseRangeInputVal(maxInp.val())];
11870
11871							values.push({ label: label, value: rangeDisplay, realVal: rangeRealVal});
11872						}
11873	
11874						thisWrap.find('select').each(function () {
11875							var selectLabel = $(this).closest('.wpr-af-select-wrap').find('h4').text().trim() || label,
11876								selectValue = $(this).find('option:selected').text().trim(),
11877								selectRealVal = $(this).find('option:selected').val();
11878
11879							values.push({ label: selectLabel, value: selectValue, realVal: selectRealVal });
11880
11881							if ( selectRealVal == '' || selectRealVal == '0' ) {
11882								$('body').find('span[data-value="'+ selectRealVal +'"]').remove();
11883								$('body').find('.wpr-af-active-wrap-' + uniqueID).remove();
11884							}
11885						});
11886					
11887						// If there are values, render results
11888						if ( values.length > 0 ) {
11889							var container = $('<div class="wpr-af-active-wrap-'+ uniqueID +'" data-wpr-af-type="'+ $(this).data('wpr-filter-type') +'">'),
11890								replaceFilters = ['select', 'radio', 'date', 'range'];
11891	
11892							if ( $('body').find('.wpr-af-active-wrap-'+ uniqueID ).length > 0 ) {
11893								container = $('body').find('.wpr-af-active-wrap-'+ uniqueID);
11894							}
11895
11896							values.forEach(function (item) {
11897								// Append value span
11898								let thisLabel = item.label ? item.label : 'No Label';
11899									item.value = item.value.replace(/\(\d+\)$/, '').trim();
11900	
11901								if ( item.value != 'None' && item.value != '' && item.realVal != '0' && item.realVal != '' ) {
11902									if ( container.find('[data-value="' + item.realVal + '"]').length == 0 ) {
11903										var itemElement = $('<span class="wpr-remove-filter" data-rf-id="'+ uniqueID +'" data-value="' + item.realVal + '">').text(thisLabel + ': ' + item.value);
11904
11905										// Add remove icon in a separate span
11906										var removeIcon = $('<span><svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M5.293 6.707l5.293 5.293-5.293 5.293c-0.391 0.391-0.391 1.024 0 1.414s1.024 0.391 1.414 0l5.293-5.293 5.293 5.293c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414l-5.293-5.293 5.293-5.293c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0l-5.293 5.293-5.293-5.293c-0.391-0.391-1.024-0.391-1.414 0s-0.391 1.024 0 1.414z"></path></svg></span>');
11907
11908										itemElement.append(removeIcon);
11909			
11910										if ( replaceFilters.includes(container.attr('data-wpr-af-type')) ) {
11911											if ( thisWrap.find('select').length <= 1   ) {
11912												container.html(itemElement);
11913											} else {
11914												if (thisWrap.find('select').length > 1) {
11915													if (!thisWrap.find('select').first().val()) {
11916														container.empty();
11917													} else {
11918														// Find the select containing the option with value == item.realVal
11919														const selectWithOption = thisWrap.find('select').filter(function() {
11920															return $(this).find('option[value="' + item.realVal + '"]').length > 0;
11921														});
11922														if (selectWithOption.length > 0) {
11923															itemElement.attr('data-rf-type', selectWithOption.data('taxonomy'));
11924														}
11925
11926														if (selectWithOption.is(thisWrap.find('select').first())) {
11927															container.html(itemElement);
11928														} else {
11929															const existingItem = container.find('[data-rf-type="' + itemElement.attr('data-rf-type') + '"]');
11930															if (existingItem.length > 0) {
11931																existingItem.replaceWith(itemElement);
11932															} else {
11933																container.append(itemElement);
11934															}
11935														}
11936													}
11937												} else {
11938													container.append(itemElement);
11939												}
11940											}
11941										} else if ( 'date_range' == container.attr('data-wpr-af-type') ) {
11942											let dateElementClass = $('*[data-date-val='+ item.realVal +']').attr('class');
11943
11944											if ( 'wpr-date-filter-start' == dateElementClass ) {
11945												itemElement = $('<span class="wpr-remove-filter '+ dateElementClass +'" data-value="' + item.realVal + '">').text(thisLabel + ': ' + item.value);
11946											} else {
11947												itemElement = $('<span class="wpr-remove-filter '+ dateElementClass +'" data-value="' + item.realVal + '">').text(item.value);
11948											}
11949
11950											if ( container.find('.' + dateElementClass) ) {
11951												container.find('.' + dateElementClass).remove();
11952												if ( 'wpr-date-filter-start' == dateElementClass ) {
11953													container.prepend(itemElement);
11954												} else {
11955													container.append(itemElement);
11956												}
11957											} else {
11958												container.append(itemElement);
11959											}
11960										} else {
11961											container.append(itemElement);
11962										}
11963
11964									}
11965								} else {
11966									$('span[data-value="'+ item.realVal +'"]').remove();
11967								}
11968							});
11969
11970							// Prepend container to .wpr-af-active-filters
11971							if ( $('body').find('.wpr-af-active-wrap-'+ uniqueID).length == 0 && container.find('span').length > 0 ) {
11972								activeFilters.append(container);
11973							}
11974						}
11975						
11976						if ( thisWrap.find('select').length > 1 && firstSelectNoValue ) {
11977							container.empty();
11978						}
11979					});
11980
11981					$('body').find('.wpr-af-range-container').each(function() {
11982						var rangeContainer = $(this),
11983							rangeActive = rangeContainer.attr('data-active'),
11984							uniqueID = rangeContainer.closest('.elementor-element').data('id'),
11985							minInput = rangeContainer.find('.wpr-af-rf-control-min-input'),
11986							maxInput = rangeContainer.find('.wpr-af-rf-control-max-input'),
11987							minValue = parseRangeInputVal(minInput.val()),
11988							minAllowed = parseRangeInputVal(minInput.attr('min') || minInput.data('min')),
11989							maxValue = parseRangeInputVal(maxInput.val()),
11990							maxAllowed = parseRangeInputVal(maxInput.attr('max') || maxInput.data('max')),
11991							isMinAtDefault = minValue === minAllowed || (isNaN(minValue) && isNaN(minAllowed)),
11992							isMaxAtDefault = maxValue === maxAllowed || (isNaN(maxValue) && isNaN(maxAllowed));
11993
11994						if ( isMinAtDefault && isMaxAtDefault ) {
11995							$('span[data-rf-id="'+ uniqueID +'"]').remove();
11996						}
11997					});
11998
11999					hideActiveLabelReset();
12000				}
12001			}
12002
12003			function onFilterChange() {
12004                $scope.find('input, select, textarea').on('change', function() {
12005                    var $this = $(this);
12006                    if ('checkbox' == $this.attr('type')) {
12007                        var $option = $this.closest('.wpr-af-input-wrap');
12008                        if ($option.hasClass('wpr-checked')) {
12009							$this.prop('checked', false);
12010                            $option.removeClass('wpr-checked');
12011							$option.closest('.wpr-af-visual-wrap').removeClass('wpr-af-visual-active');
12012                        } else {
12013                            $option.addClass('wpr-checked');
12014                        }
12015                    } else if ('radio' == $this.attr('type')) {
12016                        var name = $this.attr('name'),
12017							$group = $('input[type="radio"][name="' + name + '"]');
12018
12019                        $group.closest('.wpr-af-input-wrap').removeClass('wpr-checked');
12020
12021                        if ($this.is(':checked')) {
12022                            $this.closest('.wpr-af-input-wrap').addClass('wpr-checked');
12023                        }
12024                    }
12025                });
12026
12027				$scope.find('.wpr-woo-rating').on('click', function() {
12028					let rating = +$(this).data('rating');
12029
12030					$(this).toggleClass('wpr-active-product-filter');
12031
12032					if ( $('.wpr-af-apply-btn').length == 0 ) {
12033						$(this).find('input.wpr-rating-filter').val(rating).trigger('change');
12034					} else {
12035						$(this).find('input.wpr-rating-filter').val(rating);
12036					}
12037				});
12038
12039				if ( $('.wpr-af-apply-btn').length == 0 ) {
12040					$scope.find('input[type="checkbox"], input[type="radio"]').on('change', function() {
12041						var selectedName = $(this).attr('name'),
12042                            selectedValue = $(this).val();
12043
12044                        if ( 'yes' == $(this).closest('.wpr-advanced-filters-wrap').data('enable-ajax') ) {
12045                            ajaxFilters($(this));
12046                        } else {
12047						    updateURL(selectedName, selectedValue, $(this));
12048                        }
12049					});
12050                    
12051                    $scope.on('changeDate', 'input[name="wpr_af_date"]', function(e) { // GOGA - does it work at all ?
12052                        const date = e.detail.date;
12053                        
12054                        if ( date ) {
12055
12056                            // Adjust for the timezone offset
12057                            const localDate = new Date(date.getTime() - (date.getTimezoneOffset() * 60000));
12058
12059                            // Format the date as 'YYYY-MM-DD'
12060                            var selectedName = 'wpr_af_date',
12061                                selectedValue = localDate.toISOString().split('T')[0];
12062                        
12063                            // const formattedDate = localDate.toISOString().split('T')[0];
12064                            
12065                            ajaxFilters($scope.find('input[name="wpr_af_date"]'));
12066                        }
12067                    });
12068
12069					$scope.find('input[type="date"]').on('change', function() {
12070						var selectedName = $(this).attr('name'),
12071                            selectedValue = $(this).val();
12072
12073                        if ( 'yes' == $(this).closest('.wpr-advanced-filters-wrap').data('enable-ajax') ) {
12074                            ajaxFilters($(this));
12075                        } else {
12076						    updateURL(selectedName, selectedValue, $(this));
12077                        }
12078					});
12079
12080					$scope.find('input.wpr-rating-filter').on('change', function() {
12081						var selectedName = $(this).attr('name');
12082						var selectedValue = $(this).val();
12083
12084						if ( 'yes' == $(this).closest('.wpr-advanced-filters-wrap').data('enable-ajax') ) {
12085							ajaxFilters($(this));
12086						} else {
12087							updateURL(selectedName, selectedValue, $(this));
12088						}
12089					});
12090		
12091					$scope.find('select').on('change', function() {
12092						var selectedName = $(this).attr('name');
12093						var selectedValue = $(this).val();
12094                        if ( 'yes' == $(this).closest('.wpr-advanced-filters-wrap').data('enable-ajax') ) {
12095                            ajaxFilters($(this));
12096                        } else {
12097						    updateURL(selectedName, selectedValue, $(this));
12098                        }
12099					});
12100					
12101					if ( $scope.find('.wpr-af-range-apply-btn').length > 0 ) {
12102						$scope.on('click', '.wpr-af-range-apply-btn', function() {
12103							var minInput = $scope.find('.wpr-af-rf-control-min-input'),
12104								maxInput = $scope.find('.wpr-af-rf-control-max-input'),
12105								selectedName = minInput.attr('name'),
12106								selectedValue = [];
12107							if (minInput.length && maxInput.length) {
12108								var minVal = parseRangeInputVal(minInput.val());
12109								var maxVal = parseRangeInputVal(maxInput.val());
12110								selectedValue.push(isNaN(minVal) ? minInput.attr('min') || minInput.data('min') : minVal);
12111								selectedValue.push(isNaN(maxVal) ? maxInput.attr('max') || maxInput.data('max') : maxVal);
12112							}
12113							if ( selectedValue.length ) {
12114								if ( 'yes' == $(this).closest('.wpr-advanced-filters-wrap').data('enable-ajax') ) {
12115									$(this).closest('.wpr-advanced-filters-wrap').attr('data-wpr-applied', 'yes');
12116									ajaxFilters($(this));
12117								} else {
12118									updateURL(selectedName, selectedValue, $(this));
12119								}
12120							}
12121						});
12122					} else {
12123						$scope.find('.wpr-af-range-container').find('input[type="range"], .wpr-af-rf-control-min-input, .wpr-af-rf-control-max-input').on('change', function() {
12124							var minInput = $scope.find('.wpr-af-rf-control-min-input'),
12125								maxInput = $scope.find('.wpr-af-rf-control-max-input'),
12126								selectedName = minInput.attr('name'),
12127								selectedValue = [];
12128							if (minInput.length && maxInput.length) {
12129								var minVal = parseRangeInputVal(minInput.val());
12130								var maxVal = parseRangeInputVal(maxInput.val());
12131								selectedValue.push(isNaN(minVal) ? minInput.attr('min') || minInput.data('min') : minVal);
12132								selectedValue.push(isNaN(maxVal) ? maxInput.attr('max') || maxInput.data('max') : maxVal);
12133							}
12134							if ( selectedValue.length ) {
12135								if ( 'yes' == $(this).closest('.wpr-advanced-filters-wrap').data('enable-ajax') ) {
12136									$(this).closest('.wpr-advanced-filters-wrap').attr('data-wpr-applied', 'yes');
12137									ajaxFilters($(this));
12138								} else {
12139									updateURL(selectedName, selectedValue, $(this));
12140								}
12141							}
12142						});
12143					}
12144				}
12145			}
12146
12147			function controlFromInput(fromSlider, fromInput, toInput) {
12148				const rangeContainer = fromInput.closest('.wpr-af-range-container');
12149				const minAllowed = parseRangeInputVal(fromInput.attr('min') || fromInput.data('min'));
12150				const [from, to] = getParsed(fromInput, toInput);
12151				fillSlider(fromInput, toInput);
12152				setToggleAccessible(fromInput, 'from');
12153				if (from > to) {
12154					fromSlider.val(to).attr('value', to);
12155					setRangeInputVal(fromInput, to, rangeContainer);
12156				} else {
12157					fromSlider.val(from).attr('value', from);
12158					setRangeInputVal(fromInput, from, rangeContainer);
12159				}
12160
12161				if (!isNaN(minAllowed) && from < minAllowed) {
12162					fromSlider.val(minAllowed).attr('value', minAllowed);
12163					setRangeInputVal(fromInput, minAllowed, rangeContainer);
12164				}
12165			}
12166			
12167			function controlToInput(toSlider, fromInput, toInput) {
12168				const rangeContainer = toInput.closest('.wpr-af-range-container');
12169				const maxAllowed = parseRangeInputVal(toInput.attr('max') || toInput.data('max'));
12170				const [from, to] = getParsed(fromInput, toInput);
12171				fillSlider(fromInput, toInput);
12172				setToggleAccessible(toInput, 'to');
12173
12174				if (from <= to) {
12175					if (!isNaN(maxAllowed) && to > maxAllowed) {
12176						toSlider.val(maxAllowed).attr('value', maxAllowed);
12177						setRangeInputVal(toInput, maxAllowed, rangeContainer);
12178					} else {
12179						toSlider.val(to).attr('value', to);
12180						setRangeInputVal(toInput, to, rangeContainer);
12181					}
12182				} else {
12183					if (!isNaN(maxAllowed) && to > maxAllowed) {
12184						setRangeInputVal(toInput, maxAllowed, rangeContainer);
12185					} else {
12186						setRangeInputVal(toInput, from, rangeContainer);
12187					}
12188				}
12189			}
12190			
12191			function parseRangeInputVal(val) {
12192				if (val === '' || val == null) return NaN;
12193				const str = String(val).replace(/,/g, '');
12194				return parseFloat(str);
12195			}
12196
12197			function formatRangeDisplay(val, rangeContainer) {
12198				if (rangeContainer && rangeContainer.data('format-numbers') === 'yes') {
12199					const num = parseRangeInputVal(val);
12200					if (!isNaN(num)) {
12201						const decimals = Math.max(0, Math.min(4, parseInt(rangeContainer.data('decimal-places'), 10) || 2));
12202						return num.toLocaleString('en-US', { minimumFractionDigits: decimals, maximumFractionDigits: decimals });
12203					}
12204				}
12205				return val;
12206			}
12207
12208			function setRangeInputVal($input, num, rangeContainer) {
12209				if (rangeContainer && rangeContainer.data('format-numbers') === 'yes') {
12210					$input.val(formatRangeDisplay(num, rangeContainer));
12211				} else {
12212					$input.val(num);
12213				}
12214				$input.attr('value', $input.val());
12215			}
12216
12217			function controlFromSlider(fromSlider, toSlider, fromInput) {
12218				const rangeContainer = fromSlider.closest('.wpr-af-range-container');
12219				const [from, to] = getParsed(fromSlider, toSlider);
12220				fillSlider(fromSlider, toSlider);
12221				setToggleAccessible(fromSlider, 'from');
12222				if (from > to) {
12223					fromSlider.val(to).attr('value', to);
12224					setRangeInputVal(fromInput, to, rangeContainer);
12225					$scope.find('.wpr-af-rs-value-min').text(formatRangeDisplay(to, rangeContainer));
12226				} else {
12227					fromSlider.val(from).attr('value', from);
12228					setRangeInputVal(fromInput, from, rangeContainer);
12229					$scope.find('.wpr-af-rs-value-min').text(formatRangeDisplay(from, rangeContainer));
12230				}
12231			}
12232			
12233			function controlToSlider(fromSlider, toSlider, toInput) {
12234				const rangeContainer = fromSlider.closest('.wpr-af-range-container');
12235				const [from, to] = getParsed(fromSlider, toSlider);
12236				fillSlider(fromSlider, toSlider);
12237				setToggleAccessible(toSlider, 'to');
12238				if (from <= to) {
12239					toSlider.val(to).attr('value', to);
12240					setRangeInputVal(toInput, to, rangeContainer);
12241					$scope.find('.wpr-af-rs-value-max').text(formatRangeDisplay(to, rangeContainer));
12242				} else {
12243					setRangeInputVal(toInput, from, rangeContainer);
12244					toSlider.val(from).attr('value', from);
12245					$scope.find('.wpr-af-rs-value-max').text(formatRangeDisplay(from, rangeContainer));
12246				}
12247			}
12248			
12249			function getParsed(currentFrom, currentTo) {
12250				const from = parseRangeInputVal(currentFrom.val());
12251				const to = parseRangeInputVal(currentTo.val());
12252				return [isNaN(from) ? 0 : from, isNaN(to) ? 0 : to];
12253			}
12254
12255			function fillSlider(fromSlider, toSlider) {
12256				const rangeContainer = fromSlider.closest('.wpr-af-range-container');
12257				const rangeEl = rangeContainer.find('.wpr-af-from-slider')[0] ? rangeContainer.find('.wpr-af-from-slider') : toSlider;
12258				const min = parseFloat(rangeEl.prop('min')) || parseRangeInputVal(rangeEl.attr('min')) || parseRangeInputVal(rangeEl.data('min')) || 0;
12259				const max = parseFloat(rangeEl.prop('max')) || parseRangeInputVal(rangeEl.attr('max')) || parseRangeInputVal(rangeEl.data('max')) || 0;
12260				const fromVal = parseRangeInputVal(fromSlider.val());
12261				const toVal = parseRangeInputVal(toSlider.val());
12262				const from = Math.min(fromVal, toVal);
12263				const to = Math.max(fromVal, toVal);
12264			
12265				const rangeDistance = max - min;
12266				const fromPercent = (((from - min) / rangeDistance) * 100) > 0 ? ((from - min) / rangeDistance) * 100 : 0;
12267				let toPercent = ((to - min) / rangeDistance) * 100;
12268			
12269				const sliderFill = fromSlider.closest('.wpr-advanced-filters-wrap').find('.wpr-af-slider-fill');
12270
12271				if ( toPercent > 100 ) {
12272					toPercent = 100;
12273				}
12274			
12275				sliderFill.css({
12276					left: `${fromPercent}%`,
12277					width: `${toPercent - fromPercent}%`,
12278				});
12279
12280				if ( from <= min && to >= max ) {
12281					fromSlider.closest('.wpr-advanced-filters-wrap').find('.wpr-af-range-container').attr('data-active', 'no');
12282				} else {
12283					fromSlider.closest('.wpr-advanced-filters-wrap').find('.wpr-af-range-container').attr('data-active', 'yes');
12284				}
12285			}
12286			
12287			function setToggleAccessible(currentSlider, direction = 'to') {
12288				if ( direction == 'to' ) {
12289					const toSlider = $scope.find('#wpr-af-to-slider-' + $scope.data('id'));
12290					
12291					if ( Number(currentSlider.val()) <= +currentSlider.attr('min') ) {
12292						toSlider.css('z-index', 2);
12293					} else {
12294						toSlider.css('z-index', 0);
12295					}
12296				} else {
12297					const fromSlider = $scope.find('#wpr-af-from-slider-' + $scope.data('id'));
12298
12299					if ( Number(currentSlider.val()) >= +currentSlider.attr('max') ) {
12300						fromSlider.css('z-index', 2);
12301					} else {
12302						fromSlider.css('z-index', 0);
12303					}
12304				}
12305			}
12306
12307			function resetFilters() {
12308				if ( WprElements.editorCheck() ) {
12309					return;
12310				}
12311				
12312				$scope.on('click', '.wpr-af-reset-btn', function() {
12313					// Create a new URL object from the current URL
12314					var currentUrl = new URL(window.location.href);
12315				
12316					// Get all parameter keys and iterate over them
12317					var keys = Array.from(currentUrl.searchParams.keys());
12318					
12319					keys.forEach(function(key) {
12320						// Check if the parameter key starts with "wpr_"
12321						if (key.indexOf('wpr_') === 0) {
12322							// Remove the parameter
12323							currentUrl.searchParams.delete(key);
12324						}
12325					});
12326					
12327					if ( 'yes' !== $(this).closest('.wpr-advanced-filters-wrap').data('enable-ajax') ) {
12328						// Redirect to the new URL
12329						window.location.href = currentUrl.toString();
12330					} else {
12331						// Reset range inputs to their min/max values
12332						$('body').find('.wpr-advanced-filters-wrap .wpr-af-range-container').each(function() {
12333							let rangeContainer = $(this),
12334								rangeMin = rangeContainer.find('.wpr-af-rf-control-min-input'),
12335								rangeMax = rangeContainer.find('.wpr-af-rf-control-max-input'),
12336								thisFromSlider = rangeContainer.find('input[type="range"].wpr-af-from-slider'),
12337								thisToSlider = rangeContainer.find('input[type="range"].wpr-af-to-sli
12337der'),
12338								thisFromSliderText = rangeContainer.find('.wpr-af-rs-value-min'),
12339								thisToSliderText = rangeContainer.find('.wpr-af-rs-value-max'),
12340								minVal = rangeMin.attr('min') || rangeMin.data('min'),
12341								maxVal = rangeMax.attr('max') || rangeMax.data('max'),
12342								formatRange = rangeContainer.data('format-numbers') === 'yes',
12343								fmt = function(v) { return formatRange && !isNaN(parseRangeInputVal(v)) ? formatRangeDisplay(v, rangeContainer) : v; };
12344								
12345							rangeMin.val(fmt(minVal)).attr('value', rangeMin.val());
12346							rangeMax.val(fmt(maxVal)).attr('value', rangeMax.val());
12347
12348							fillSlider(rangeMin, rangeMax);
12349
12350							thisFromSlider.val(minVal).attr('value', minVal);
12351							thisToSlider.val(maxVal).attr('value', maxVal);
12352							thisFromSliderText.text(fmt(minVal));
12353							thisToSliderText.text(fmt(maxVal));
12354							
12355							rangeContainer.attr('data-active', 'no');
12356						});
12357
12358						// Reset all select elements to their default option (usually the first option)
12359						$('body').find('.wpr-advanced-filters-wrap').find('select').prop('selectedIndex', 0);
12360
12361						// Uncheck only checked checkboxes and radio buttons
12362						$('body').find('.wpr-advanced-filters-wrap').find('input[type="checkbox"]:checked, input[type="radio"]:checked').prop('checked', false);
12363
12364						// Reset all date inputs to empty
12365						$('body').find('input[name="wpr_af_date"]').val('').trigger('resetDate');
12366						$('body').find('input[name="wpr_af_date_range"]').val('').trigger('resetDate');
12367
12368						// Reset text inputs
12369						$('body').find('.wpr-advanced-filters-wrap input[type="text"]').val('');
12370
12371						// Reset rating filters
12372						$('body').find('.wpr-advanced-filters-wrap input.wpr-rating-filter').val('');
12373						$('body').find('.wpr-advanced-filters-wrap .wpr-woo-rating').removeClass('wpr-active-product-filter');
12374
12375						// Remove visual states
12376						$('body').find('.wpr-af-visual-wrap').removeClass('wpr-af-visual-active');
12377						$('body').find('.wpr-af-input-wrap').removeClass('wpr-checked');
12378
12379						$('body').find('.wpr-af-active-filters').find('div').remove();
12380
12381						$('body').find('.wpr-af-main-select').trigger('change');
12382
12383						ajaxFilters($(this));
12384
12385						$(this).addClass('wpr-hidden-element');
12386					}
12387				});													
12388			}
12389
12390			function updateResultsCount(settings) {
12391				if (isDebounceAjaxCallRunning) {
12392					return;
12393				}
12394			
12395				let paramsArray = [];
12396				let elementsToUpdate = [];
12397			
12398				$('.wpr-advanced-filters-wrap').each(function () {
12399					const $wrap = $(this);
12400					const emptyAction = $wrap.attr('data-empty-action') || '';
12401					const shouldUpdateCounts = $wrap.attr('data-show-count') === 'yes' && $wrap.attr('data-change-counter') !== '';
12402					const shouldHandleEmpty = emptyAction === 'hide' || emptyAction === 'disable';
12403					const isSelfFilterWrap = $wrap.attr('data-change-counter') === 'other_filters'
12404						&& $wrap.closest('.elementor-widget-wpr-advanced-filters-pro').is($scope);
12405
12406					if (!shouldUpdateCounts && !shouldHandleEmpty) {
12407						return true;
12408					}
12409
12410					// Self-filter: do not re-run counts or empty actions on the widget that triggered the change.
12411					if (isSelfFilterWrap) {
12412						return true;
12413					}
12414			
12415					const $inputs = $wrap.find('input[type="checkbox"], input[type="radio"], option, li.wpr-woo-rating');
12416			
12417					$inputs.each(function () {
12418						const $input = $(this);
12419						const isOption = $input.prop('tagName') === 'OPTION';
12420						const selectedName = isOption ? $input.closest('select').attr('name') : $input.attr('name');
12421						const selectedValue = $input.val() || $input.data('rating');
12422			
12423						if (!selectedName || selectedValue === '') return;
12424			
12425						let paramsObjTemp = { ...paramsObj };
12426						let existingValues = paramsObjTemp[selectedName] ? paramsObjTemp[selectedName].split(',') : [];
12427
12428						if (shouldHandleEmpty && !shouldUpdateCounts) {
12429							// Empty-only: candidate term + other active filters (not merged with siblings).
12430							paramsObjTemp[selectedName] = selectedValue;
12431						} else {
12432							if (!existingValues.includes(selectedValue)) {
12433								existingValues.push(selectedValue);
12434							}
12435
12436							paramsObjTemp[selectedName] = existingValues.join(',');
12437						}
12438			
12439						elementsToUpdate.push({
12440							element: $input,
12441							name: selectedName,
12442							value: selectedValue,
12443							updateCount: shouldUpdateCounts,
12444							emptyAction: emptyAction
12445						});
12446			
12447						paramsArray.push(paramsObjTemp);
12448					});
12449				});
12450			
12451				if (paramsArray.length === 0) {
12452					console.warn('No filters to analyze.');
12453					return;
12454				}
12455			
12456				$.ajax({
12457					type: 'POST',
12458					url: WprConfig.ajaxurl,
12459					data: {
12460						action: experimentActionCount,
12461						nonce: WprConfig.nonce,
12462						grid_settings: settings.grid_settings,
12463						wpr_url_params: paramsArray
12464					},
12465					success: function (response) {
12466						if (!response || !Array.isArray(response.data)) {
12467							console.warn('Invalid response:', response);
12468							return;
12469						}
12470			
12471						setTimeout(() => {
12472							response.data.forEach((dataEntry, index) => {
12473								const countText = `(${dataEntry.found_posts})`;
12474								const { element, updateCount, emptyAction } = elementsToUp
12474date[index];
12475			
12476								const $el = $(element);
12477								const $afWrap = $el.closest('.wpr-advanced-filters-wrap');
12478
12479								if ($afWrap.attr('data-wpr-relation') == 'or' && $afWrap.closest('.elementor-widget-wpr-advanced-filters-pro').is($scope)) {
12480									return true;
12481								}
12482
12483								if (updateCount) {
12484									if ( $el.hasClass('wpr-woo-rating') ) {
12485										$el.find('.wpr-af-count').text(countText);
12486									} else if ($el.prop('tagName') === 'OPTION') {
12487										if ( $el.attr('value') != 0 ) {
12488											const cleanText = $el.text().replace(/\(\d+\)/, '');
12489											$el.text(cleanText + countText);
12490										}
12491									} else {
12492										$el.closest('.wpr-af-input-wrap').find('.wpr-af-count').text(countText);
12493									}
12494								}
12495
12496								if (emptyAction === 'hide' || emptyAction === 'disable') {
12497									if (dataEntry.found_posts === 0) {
12498										if (emptyAction === 'hide') {
12499											if ( $el.attr('value') != 0 ) {
12500												$el.hide();
12501												if ($el.is(':checkbox') || $el.is(':radio')) {
12502													$el.closest('.wpr-af-input-wrap').hide();
12503													if ( $el.closest('.wpr-af-visual-wrap') ) {
12504														$el.closest('.wpr-af-visual-wrap').hide();
12505													}
12506												}
12507											}
12508										} else {
12509											$el.prop('disabled', true);
12510										}
12511									} else {
12512										$el.prop('disabled', false);
12513										$el.show();
12514										if ($el.is(':checkbox') || $el.is(':radio')) {
12515											$el.closest('.wpr-af-input-wrap').show();
12516											$el.closest('.wpr-af-visual-wrap').show();
12517										}
12518									}
12519								}
12520
12521								if ( $afWrap.find('.wpr-advanced-filters-inner').children(':visible').length === 0 ) {
12522									$afWrap.find('.wpr-af-filters-label').hide();
12523								} else {
12524									$afWrap.find('.wpr-af-filters-label').show();
12525								}
12526							});
12527						}, 800);
12528					},
12529					error: function (err) {
12530						console.error('AJAX error:', err);
12531					}
12532				});
12533			}
12534
12535            function ajaxFilters(self = '') {
12536				if ( WprElements.editorCheck() ) {
12537					return;
12538				}
12539
12540				var triggerElement = self,
12541				activeFilters = $('.wpr-af-active-filters');
12542
12543				if ( activeFilters.length > 0 && activeFilters.hasClass('wpr-hidden-element') ) {
12544					activeFilters.removeClass('wpr-hidden-element');
12545				}
12546
12547                $('.wpr-advanced-filters-wrap').each(function() {
12548                    if ( $(this).find('input[type="checkbox"], input[type="radio"], input.wpr-rating-filter').length > 0 ) {
12549                        $(this).find('input[type="checkbox"], input[type="radio"], input.wpr-rating-filter').each(function() {
12550							let isRadioChecked = true;
12551
12552							if ( $(this).attr('type') == 'radio' && (!$(this).is(':checked')) && $(this).val() != self.val() ) {
12553								isRadioChecked = false;
12554							} else {
12555								isRadioChecked = true;
12556							}
12557							
12558							if ( isRadioChecked || $(this).hasClass('wpr-rating-filter')) {
12559								var selectedName = $(this).attr('name');
12560								var selectedValue = $(this).val();
12561
12562								updateURL(selectedName, selectedValue, $(this), finalURL);
12563							}
12564                        });	
12565                    }
12566
12567					$(this).find('input[type="text"], input[type="date"]').each(function() {
12568						var selectedName = $(this).attr('name');
12569						var selectedValue = $(this).val();
12570
12571						updateURL(selectedName, selectedValue, $(this), finalURL);
12572					});
12573
12574                    if ( $(this).find('select').length == 1 ) {
12575                        var selectedName = $(this).find('select').attr('name');
12576                        var selectedValue = $(this).find('select').val();
12577
12578                        updateURL(selectedName, selectedValue, $(this).find('select'), finalURL);
12579                    } else if ( $(this).find('select').length > 1 ) {
12580						if ( triggerElement && triggerElement.hasClass('wpr-af-main-select') ) {			
12581							$(this).find('select').each(function() {
12582								if ( $(this).hasClass('wpr-af-main-select') ) {
12583									var selectedName = $(this).attr('name');
12584									var selectedValue = $(this).val();
12585
12586									updateURL(selectedName, selectedValue, $(this), finalURL);
12587								} else {
12588									var selectedName = $(this).attr('name');
12589									var selectedValue = 0;
12590
12591									updateURL(selectedName, selectedValue, $(this), finalURL);
12592								}
12593							});
12594						} else {
12595							$(this).find('select').each(function() {
12596								var selectedName = $(this).attr('name');
12597								var selectedValue = $(this).val();
12598
12599								updateURL(selectedName, selectedValue, $(this), finalURL);
12600							});
12601						}
12602					}
12603
12604					if ( $(this).find('.wpr-af-range-apply-btn').length > 0 && $(this).data('wpr-applied') == 'yes' ) {
12605						var minInp = $(this).find('.wpr-af-rf-control-min-input'),
12606							maxInp = $(this).find('.wpr-af-rf-control-max-input'),
12607							selectedName = minInp.attr('name'),
12608							selectedValue = [];
12609						if ( minInp.length && maxInp.length && selectedName ) {
12610							var mn = parseRangeInputVal(minInp.val()), mx = parseRangeInputVal(maxInp.val());
12611							selectedValue.push(isNaN(mn) ? minInp.attr('min') || minInp.data('min') : mn);
12612							selectedValue.push(isNaN(mx) ? maxInp.attr('max') || maxInp.data('max') : mx);
12613							updateURL(selectedName, selectedValue, $(this).find('.wpr-af-range-apply-btn'), finalURL);
12614						}
12615					} else if ( $(this).find('.wpr-af-range-container').length > 0 && ($(this).data('wpr-applied') == 'yes' || self.hasClass('wpr-af-apply-btn')) ) {
12616						var minInp = $(this).find('.wpr-af-rf-control-min-input'),
12617							maxInp = $(this).find('.wpr-af-rf-control-max-input'),
12618							selectedName = minInp.attr('name'),
12619							selectedValue = [];
12620						if ( minInp.length && maxInp.length && selectedName ) {
12621							var mn = parseRangeInputVal(minInp.val()), mx = parseRangeInputVal(maxInp.val());
12622							selectedValue.push(isNaN(mn) ? minInp.attr('min') || minInp.data('min') : mn);
12623							selectedValue.push(isNaN(mx) ? maxInp.attr('max') || maxInp.data('max') : mx);
12624							updateURL(selectedName, selectedValue, $(this).find('.wpr-af-range-container'), finalURL);
12625						}
12626					}
12627                });
12628
12629				renderActiveFilters('ajax');
12630
12631				let targetGrid = actionSelector;
12632
12633                // If not ajax relocate
12634                if ( self.closest('.wpr-advanced-filters-wrap').length > 0 && 'yes' !== self.closest('.wpr-advanced-filters-wrap').data('enable-ajax') ) {
12635                    window.location.href = finalURL;
12636                } else {
12637                    // Settings
12638                    settings = targetGrid.attr( 'data-settings' );
12639
12640                    if ( typeof settings !== typeof undefined && settings !== false ) {
12641                        settings = JSON.parse( targetGrid.attr( 'data-settings' ) );
12642                    }
12643                    
12644                    // Create a URL object
12645                    var url = new URL(finalURL);
12646
12647                    // Extract the search query parameters
12648                    var queryParams = new URLSearchParams(url.search),
12649						loader = '<div class="wpr-filters-loader-wrap"><div class="wpr-ring"><div></div><div></div><div></div><div></div></div></div>';
12650
12651                    // Convert queryParams into an object
12652                    paramsObj = {};
12653                    
12654                    queryParams.forEach(function(value, key) {
12655                        paramsObj[key] = value;
12656                    });
12657
12658					let debounceTimer;
12659
12660					// Loading
12661					widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-load-more-btn' ).hide();
12662					
12663					if ( triggerElement.hasClass('wpr-af-reset-btn') ) {
12664						paramsObj = {};
12665					}
12666
12667					debounceAjaxCall(debounceTimer, paramsObj, targetGrid, settings, widgetSelector, triggerElement);
12668                }
12669            }
12670
12671			function updateURL(selectedName, selectedValue, element, ajaxFilterURL = '') {
12672				if ( !selectedName ) return;
12673				var currentURL = window.location.href,
12674					dataRelation = '',
12675					dataFilterType = '';
12676
12677
12678				if ( '' != ajaxFilterURL ) {
12679					currentURL = ajaxFilterURL;
12680				}
12681				
12682				if ( $('.wpr-af-apply-btn').length > 0 ) {
12683					currentURL = finalURL;
12684					dataRelation = element.closest('.wpr-advanced-filters-wrap').attr('data-wpr-relation');
12685					dataFilterType = element.closest('.wpr-advanced-filters-wrap').attr('data-wpr-filter-type');
12686				} else {
12687					dataRelation = element.closest('.wpr-advanced-filters-wrap').attr('data-wpr-relation');
12688					dataFilterType = element.closest('.wpr-advanced-filters-wrap').attr('data-wpr-filter-type');
12689				}
12690
12691				const url = new URL(currentURL);
12692
12693                if ( dataRelation && dataFilterType ) {
12694                    url.searchParams.set(selectedName.replace('wpr_af', 'wpr_afr'), dataRelation + ',' + dataFilterType);
12695                }
12696
12697				if ( element.prop('tagName') == "SELECT" ) {
12698					if ( selectedValue == 0 ) {
12699						url.searchParams.delete(selectedName);
12700						url.searchParams.delete(selectedName.replace('wpr_af', 'wpr_afr'));
12701					} else {
12702						url.searchParams.set(selectedName, selectedValue);
12703					}
12704				} else if ( element.hasClass('wpr-af-range-apply-btn') || element.hasClass('wpr-af-range-container') || element.hasClass('wpr-af-from-slider') || element.hasClass('wpr-af-to-slider') || element.hasClass('wpr-af-rf-control-min-input') || element.hasClass('wpr-af-rf-control-max-input') ) {
12705					url.searchParams.set(selectedName, selectedValue);
12706					url.searchParams.set(selectedName.replace('wpr_af', 'wpr_aft'), dataFilterType);
12707				} else if ( element.attr('type') == "text" || element.attr('type') == "date"  || element.attr('type') == "date_range" )  {
12708					if (url.searchParams.has(selectedName)) {
12709
12710						var currentValue = '';
12711
12712						// Get the current value of the query parameter
12713						if ( url.searchParams.get(selectedName) !== null ) {
12714							currentValue = url.searchParams.get(selectedName);
12715						}
12716
12717						// Combine the current value and the new selected value
12718						var updatedValue = selectedValue;
12719
12720						if ( element.hasClass('wpr-date-filter') ) {
12721							if ( selectedValue == '' ) {
12722								url.searchParams.delete(selectedName);
12723								url.searchParams.delete(selectedName.replace('wpr_af', 'wpr_afr'));
12724							} else {
12725								url.searchParams.set(selectedName, selectedValue);
12726							}
12727						}
12728
12729						if ( element.hasClass('wpr-date-filter-start') ) {
12730							if ( currentValue.indexOf(',') !== -1 ) {
12731								updatedValue = selectedValue + ',' + currentValue.split(',')[1];
12732
12733								if ( selectedValue == '' && currentValue.split(',')[1] == '' ) {
12734									url.searchParams.delete(selectedName);
12735									url.searchParams.delete(selectedName.replace('wpr_af', 'wpr_afr'));
12736								}
12737							} else {
12738								if ( selectedValue !== '' ) {
12739									updatedValue = selectedValue + ',' + currentValue;
12740								} else {
12741									url.searchParams.delete(selectedName);
12742									url.searchParams.delete(selectedName.replace('wpr_af', 'wpr_afr'));
12743								}
12744
12745								if ( selectedValue == '' && currentValue.split(',')[1] == '' ) {
12746									url.searchParams.delete(selectedName);
12747									url.searchParams.delete(selectedName.replace('wpr_af', 'wpr_afr'));
12748								}
12749							}
12750						}
12751
12752						if ( element.hasClass('wpr-date-filter-end') ) {
12753							if ( currentValue.indexOf(',') !== -1 ) {
12754								updatedValue = currentValue.split(',')[0] + ',' + selectedValue;
12755
12756								if ( selectedValue == '' && currentValue.split(',')[0] == '' ) {
12757									url.searchParams.delete(selectedName);
12758									url.searchParams.delete(selectedName.replace('wpr_af', 'wpr_afr'));
12759								}
12760							} else {
12761								if ( selectedValue !== '' ) {
12762									updatedValue = currentValue + ',' + selectedValue;
12763								} else {
12764									url.searchParams.delete(selectedName);
12765									url.searchParams.delete(selectedName.replace('wpr_af', 'wpr_afr'));
12766								}
12767
12768								if ( selectedValue == '' && currentValue.split(',')[0] == '' ) {
12769									url.searchParams.delete(selectedName);
12770									url.searchParams.delete(selectedName.replace('wpr_af', 'wpr_afr'));
12771								}
12772							}
12773						}
12774
12775						if ( updatedValue.includes(',') ) {
12776							updatedValue = updatedValue.split(',');
12777							updatedValue = [...new Set(updatedValue)];
12778							
12779							// updatedValue = updatedValue.filter(function(value) {
12780							// 	return value !== "";
12781							// });
12782							
12783							updatedValue = updatedValue.join(',');
12784						}
12785						
12786						if (updatedValue !== '') {
12787							// Set the query parameter with the updated value
12788							url.searchParams.set(selectedName, updatedValue);
12789						}
12790					} else {
12791						if ( element.hasClass('wpr-date-filter') ) {
12792							url.searchParams.set(selectedName, selectedValue);
12793						}
12794
12795						// If the query parameter doesn't exist, set it with the selected value
12796						if ( element.hasClass('wpr-date-filter-start') ) {
12797							url.searchParams.set(selectedName, selectedValue + ',' + '');
12798						}
12799
12800						if ( element.hasClass('wpr-date-filter-end') ) {
12801							url.searchParams.set(selectedName, ',' + '' + selectedValue);
12802						}
12803					}
12804
12805				} else {
12806					if ( element.attr('type') == "radio" ) {
12807						url.searchParams.delete(selectedName);
12808						url.searchParams.delete(selectedName.replace('wpr_af', 'wpr_afr'));
12809					}
12810
12811					if ( element.is(':checked') || (element.hasClass('wpr-rating-filter') && element.closest('.wpr-active-product-filter').length > 0) ) {
12812						if ( url.searchParams.has(selectedName) ) {
12813							// Get the current value of the query parameter
12814							const currentValue = url.searchParams.get(selectedName);
12815					
12816							// Combine the current value and the new selected value
12817							var updatedValue = selectedValue;
12818							updatedValue = currentValue + ',' + selectedValue;
12819
12820							if ( $.inArray(selectedValue, currentValue.split(',')) !== -1 ||  currentValue == selectedValue ) {
12821								return;
12822							}
12823
12824							if ( updatedValue.includes(',') ) {
12825								updatedValue = updatedValue.split(',');
12826								updatedValue = [...new Set(updatedValue)];
12827								updatedValue = updatedValue.filter(function(value) {
12828									return value !== "";
12829								});
12830								
12831								updatedValue = updatedValue.join(',');
12832							}
12833
12834							// Set the query parameter with the updated value
12835							url.searchParams.set(selectedName, updatedValue);
12836						} else {
12837							// If the query parameter doesn't exist, set it with the selected value
12838							url.searchParams.set(selectedName, selectedValue);
12839						}
12840					} else {
12841						if (url.searchParams.has(selectedName)) {
12842							// Get the current value of the query parameter
12843							const currentValue = url.searchParams.get(selectedName);
12844
12845							if ( currentValue.includes(',') || currentValue !== false ) {
12846								const currentValueArray = currentValue.split(',');
12847
12848								// Remove duplicates using Set
12849								const uniqueArray = [...new Set(currentValueArray)];
12850		
12851								// Omit the selectedValue from the array if it exists
12852								const indexToRemove = uniqueArray.indexOf(selectedValue);
12853
12854								if (indexToRemove !== -1) {
12855									uniqueArray.splice(indexToRemove, 1);
12856								}
12857								
12858								// Join the updated array back into a string using a comma (',') as the separator
12859								var updatedValue = uniqueArray.join(',');
12860					
12861								// Set the query parameter with the updated value
12862								url.searchParams.set(selectedName, updatedValue);
12863							} else {
12864								url.searchParams.delete(selectedName);
12865								url.searchParams.delete(selectedName.replace('wpr_af', 'wpr_afr'));
12866							}
12867						} else {
12868							// If the query parameter doesn't exist, set it with the selected value
12869							url.searchParams.delete(selectedName);
12870							url.searchParams.delete(selectedName.replace('wpr_af', 'wpr_afr'));
12871						}
12872					}
12873
12874					if (url.searchParams.get(selectedName) == '') {
12875						url.searchParams.delete(selectedName);
12876						url.searchParams.delete(selectedName.replace('wpr_af', 'wpr_afr'));
12877					}
12878				}
12879
12880				// Replace the current URL with the updated one
12881				if ( $('.wpr-af-apply-btn').length == 0 && 'yes' !== element.closest('.wpr-advanced-filters-wrap').data('enable-ajax') ) {
12882					window.location.href = url.toString();
12883				} else {
12884					if ( $('.wpr-af-apply-btn').length > 0 && $('.wpr-af-apply-btn').data('redirect-url') != '#' ) {
12885						url.pathname = $('.wpr-af-apply-btn').data('redirect-url');
12886					}
12887
12888					WprElements.changeFinalURL(url.toString());
12889				}
12890			}
12891
12892			function updateGrid(data, cache, startvar, targetGrid, settings, widgetSelector) {
12893					setTimeout(function() {
12894					if ( !cache ) {
12895						$('body').find('.wpr-filters-loader-wrap').remove();
12896					}
12897			
12898					// Ensure data is a jQuery object
12899					var newItems = $(data.data.output);
12900			
12901					// Wait for images to load before layout
12902					targetGrid.imagesLoaded(function() {
12903						if ( cache ) {
12904							targetGrid.removeClass( 'wpr-grid-cache' );
12905							$('body').find('.wpr-filters-loader-wrap').remove();
12906						}
12907
12908						targetGrid.isotopewpr('remove', targetGrid.children());
12909						targetGrid.removeClass('wpr-grid-loading');
12910			
12911						// Append new items
12912						targetGrid.append(newItems);
12913						targetGrid.isotopewpr('appended', newItems).isotopewpr('layout');
12914						WprElements.isotopeLayout(settings, '', widgetSelector, true, $scope);
12915						WprElements.mediaHoverLink($scope, targetGrid);
12916
12917						if ( targetGrid.data('lightGallery') ) {
12918							targetGrid.data( 'lightGallery' ).destroy( true );
12919						}
12920
12921						setTimeout(function() {
12922							WprElements.isotopeLayout(settings, '', widgetSelector, true, $scope);
12923							WprElements.lightboxPopup( settings, $scope, targetGrid );
12924							updateResultsCount(settings);
12925
12926							if ( widgetSelector.find('.woocommerce-result-count').length ) {
12927								var resultCount = widgetSelector.find('.woocommerce-result-count').text();
12928								
12929								// Determine the first number based on whether there are results
12930								var firstNumber = data.data.post_count > 0 ? (resultCount.match(/(\d+)\u2013/)?.[1] || '1') : '0';
12931								
12932								// If first number is 0 but we have results, change it to 1
12933								if (firstNumber === '0' && data.data.post_count > 0) {
12934									firstNumber = '1';
12935								}
12936								
12937								// Replace with new values from AJAX response
12938								var updatedResultCount = resultCount.replace(
12939									/(\d+)\u2013(\d+)\s+of\s+(\d+)/,
12940									firstNumber + '\u2013' + data.data.post_count + ' of ' + data.data.found_posts
12941								);
12942								
12943								widgetSelector.find('.woocommerce-result-count').text(updatedResultCount);
12944							}
12945
12946							if ( data.data.found_posts > 0 && !(data.data.found_posts <= widgetSelector.find('.wpr-grid-item').length) ) {
12947								if ( 'load-more' === settings.pagination_type ) {
12948										widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-pagination-finish' ).hide();
12949										widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-load-more-btn' ).show();
12950										if (! widgetSelector.find( '.wpr-grid-pagination' ).is(':visible') ) {
12951											widgetSelector.find( '.wpr-grid-pagination' ).delay( 1000 ).fadeIn( 500 );
12952										}
12953								}
12954							} else {
12955								widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-load-more-btn' ).hide();
12956								widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-pagination-finish' ).fadeIn( 1000 );
12957								widgetSelector.find( '.wpr-grid-pagination' ).delay( 1000 ).fadeOut( 500 );
12958								setTimeout(function() {
12959									widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-pagination-loading' ).hide();
12960								}, 500 );
12961							}
12962						}, 500);
12963					});
12964					const end = performance.now();
12965					// console.log(`AJAX call took ${end - startvar} ms`);
12966				}, 500);
12967			}
12968
12969			function debounceAjaxCall(debounceTimer, paramsObj, targetGrid, settings, widgetSelector, triggerElement = '') {
12970
12971				targetGrid.addClass('wpr-grid-loading');
12972
12973				clearTimeout(debounceTimer);
12974
12975				debounceTimer = setTimeout(function() {
12976					// isDebounceAjaxCallRunning = true;
12977					
12978					const start = performance.now();
12979					const cacheKey = 'wpr_grid_cache_' + JSON.stringify(paramsObj);
12980
12981					// Check if data is already cached
12982					const cachedData = localStorage.getItem(cacheKey);
12983					const expiryTime = 24 * 60 * 60 * 1000; // 24 hours
12984					const now = new Date().getTime();
12985
12986					if (cachedData && 'goga' === 'droga') {
12987						const cachedDataParsed = JSON.parse(cachedData);
12988
12989						if (cachedDataParsed && ((now - cachedDataParsed.timestamp) < expiryTime)) {
12990
12991							console.log((now - cachedDataParsed.timestamp), expiryTime);
12992							
12993							targetGrid.addClass( 'wpr-grid-cache' );
12994							updateGrid((cachedDataParsed.data), true, start, targetGrid, settings, widgetSelector);
12995							return;
12996							// Use cached data
12997						} else {
12998							localStorage.removeItem(cacheKey);
12999						}
13000					}
13001
13002					let orderby = '';
13003
13004					if ( widgetSelector.find('select.orderby').length > 0 ) {
13005						orderby = widgetSelector.find('select.orderby').val();
13006					}
13007
13008					if ( triggerElement.hasClass('wpr-load-more-btn') ) {
13009						widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-pagination-loading' ).show();
13010
13011						// Preserve widget base offset; skip via post__not_in of rendered IDs (avoids OOS/offset duplicates)
13012						if ( typeof settings.grid_settings._base_query_offset === 'undefined' ) {
13013							settings.grid_settings._base_query_offset = +settings.grid_settings.query_offset || 0;
13014						}
13015						var loadMoreItemCount = targetGrid.find('.wpr-grid-item').length;
13016						settings.grid_settings.query_offset = +settings.grid_settings._base_query_offset + loadMoreItemCount;
13017
13018						// Collect already-rendered product IDs (post-{ID} class)
13019						var excludeIds = [];
13020						targetGrid.find('.wpr-grid-item').each(function() {
13021							var m = ( this.className || '' ).match( /(?:^|\s)post-(\d+)(?:\s|$)/ );
13022							if ( m && m[1] ) {
13023								excludeIds.push( parseInt( m[1], 10 ) );
13024							}
13025						});
13026
13027						$.ajax({
13028							type: 'POST',
13029							url: WprConfig.ajaxurl,
13030							data: {
13031								action: experimentActionContent,
13032								nonce: WprConfig.nonce,
13033								// Base offset only — already-shown products are excluded by ID (do not also OFFSET by count)
13034								wpr_offset: +settings.grid_settings._base_query_offset,
13035								wpr_item_length: loadMoreItemCount,
13036								wpr_exclude_ids: excludeIds,
13037								grid_settings: settings.grid_settings,
13038								wpr_url_params: paramsObj,
13039								orderby: orderby,
13040							},
13041							success: function(response) {
13042								pagesLoadedExperiment++;
13043								// iGrid.css('opacity', 0);
13044								var rawItems = $(response.data.output);
13045								var items = rawItems.filter ? rawItems.filter( '.wpr-grid-item' ) : rawItems;
13046								var returnedCount = ( response.data && response.data.post_count != null )
13047									? +response.data.post_count
13048									: items.length;
13049								// found_posts is REMAINING after wpr_exclude_ids — has more if remaining > this page
13050								var remaining = response.data && response.data.found_posts != null ? +response.data.found_posts : 0;
13051								var hasMore = remaining > returnedCount;
13052	
13053								// $data.each(function() {
13054								// 	$(this).addClass('wpr-grid-hidden-item');
13055								// });
13056						
13057								// AF path skips InfiniteScroll init — append directly (same as AF infinite-scroll)
13058								if ( targetGrid.data('infiniteScroll') ) {
13059									targetGrid.infiniteScroll( 'appendItems', items );
13060								} else {
13061									targetGrid.append( items );
13062								}
13063								targetGrid.isotopewpr( 'appended', items );
13064								// isotopeFilters( settings ); // GOGA - if not images loaded
13065	
13066								items.imagesLoaded().progress( function( instance, image ) {
13067									WprElements.isotopeLayout(settings, '', widgetSelector, true, $scope);
13068		
13069									// Fix Layout
13070									setTimeout(function() {
13071										WprElements.isotopeLayout(settings, '', widgetSelector, true, $scope);
13072										// isotopeFilters( settings );
13073									}, 100 );
13074						
13075									setTimeout(function() {
13076										targetGrid.addClass( 'grid-images-loaded' );
13077									}, 500 );
13078								});
13079								
13080								if ( hasMore ) {
13081									if ( 'load-more' === settings.pagination_type ) {
13082										widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-pagination-loading' ).hide();
13083										widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-load-more-btn' ).delay(500).show();
13084									}
13085								} else {
13086									widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-pagination-loading' ).hide();
13087									widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-pagination-finish' ).fadeIn( 1000 );
13088									widgetSelector.find( '.wpr-grid-pagination' ).delay( 1000 ).fadeOut( 500 );
13089									setTimeout(function() {
13090										widgetSelector.find( '.wpr-grid-pagination' ).find( '.wpr-pagination-loading' ).hide();
13091									}, 500 );
13092								}
13093		
13094								// Init Likes
13095								// No need for this anymore
13096								// setTimeout(function() {
13097								// 	postLikes( settings );
13098								// }, 300 );
13099		
13100								// Init Lightbox
13101								WprElements.lightboxPopup( settings, widgetSelector, targetGrid );
13102		
13103								// Fix Lightbox
13104								targetGrid.data( 'lightGallery' ).destroy( true );
13105								targetGrid.lightGallery( settings.lightbox );
13106		
13107								// Init Media Hover Link
13108								WprElements.mediaHoverLink($scope, targetGrid);
13109								targetGrid.removeClass('wpr-grid-loading');
13110		
13111								// Init Post Sharing
13112								// postSharing();
13113		
13114								// lazyLoadObserver();
13115								// Maybe there is some other way
13116								window.dispatchEvent(new Event('resize'));
13117								window.dispatchEvent(new Event('scroll'));
13118								$(window).trigger('scroll');
13119
13120								if ( widgetSelector.find('.woocommerce-result-count').length ) {
13121									var resultCount = widgetSelector.find('.woocommerce-result-count').text(),
13122										updatedResultCount = resultCount.replace( /\d\u2013\d+/, '1\u2013' + ( widgetSelector.find('.wpr-grid-item').length ) );
13123
13124									widgetSelector.find('.woocommerce-result-count').text(updatedResultCount);
13125								}
13126							},
13127							error: function(error) {
13128								console.log(error);
13129							}
13130						});
13131					} else {
13132						// Filter change replaces grid — reset offset to widget base (not accumulated load-more skip)
13133						if ( typeof settings.grid_settings._base_query_offset === 'undefined' ) {
13134							settings.grid_settings._base_query_offset = +settings.grid_settings.query_offset || 0;
13135						}
13136						settings.grid_settings.query_offset = +settings.grid_settings._base_query_offset;
13137
13138						$.ajax({
13139							type: 'POST',
13140							url: WprConfig.ajaxurl,
13141							data: {
13142								action: experimentActionContent,
13143								nonce: WprConfig.nonce,
13144								wpr_item_length: targetGrid.find('.wpr-grid-item').length,
13145								grid_settings: settings.grid_settings,
13146								wpr_url_params: paramsObj,
13147								orderby: orderby,
13148							},
13149							success: function(response) { // GOGA: extend from filtersExperiment if/when needed
13150								// Set item with expiration
13151								const cacheData = {
13152									data: response.data.output,
13153									timestamp: new Date().getTime()
13154								};
13155
13156								// Cache the response
13157								// localStorage.setItem(cacheKey, JSON.stringify(cacheData));
13158								WprElements.changeInitialItems(0, gridScopeId);
13159								updateGrid(response, false, start, targetGrid, settings, widgetSelector);
13160							},
13161							error: function(error) {
13162								console.log(error);
13163							}
13164						});
13165					}
13166				}, 300); // Adjust timeout value based on the desired debounce delay
13167			}
13168		}, // End of widgetAdvancedFilters
13169
13170		widgetPageCart: function($scope) {
13171		}, // End of widgetPageCart
13172
13173		widgetPageMyAccount: function($scope) {
13174
13175			if ( WprElements.editorCheck() ) {
13176			
13177				$scope.find(".woocommerce-MyAccount-content").each(function() {
13178					if ( $(this).index() !== 1 ) {
13179						$(this).css('display', 'none');
13180					}
13181				});
13182
13183				$scope.find('.woocommerce-MyAccount-navigation-link').on('click', function() {
13184					var tabContent, tabLinks, pageName;
13185
13186					tabContent = $scope.find(".woocommerce-MyAccount-content");
13187					tabContent.each(function() {
13188							$(this).css('display', 'none');
13189					});
13190
13191					tabLinks = $scope.find(".woocommerce-MyAccount-navigation-link");
13192					tabLinks.each(function() {
13193						$(this).removeClass('is-active');
13194					});
13195
13196					pageName = $(this).attr('class').slice($(this).attr('class').indexOf('--') + 2);
13197					$(this).addClass('is-active');
13198
13199					$scope.find('[wpr-my-account-page="'+ pageName +'"]').css('display', 'block');
13200
13201				});
13202			}
13203			
13204			if ( $scope.find('.wpr-wishlist-remove').length ) {
13205				$scope.find('.wpr-wishlist-remove').on('click', function(e) {
13206					e.preventDefault();
13207					var product_id = $(this).data('product-id');
13208					$.ajax({
13209						url: WprConfig.ajaxurl,
13210						type: 'POST',
13211						data: {
13212                            action: 'remove_from_wishlist',
13213                            nonce: WprConfig.nonce,
13214							product_id: product_id,
13215						},
13216						success: function() {
13217							$scope.find('.wpr-wishlist-product[data-product-id="' + product_id + '"]').remove();
13218							WprElements.changeActionTargetProductId(product_id);
13219							$(document).trigger('removed_from_wishlist');
13220						}
13221					});
13222				});
13223
13224				$(document).on('removed_from_wishlist', function() {
13225					$scope.find('.wpr-wishlist-product[data-product-id="' + actionTargetProductId + '"]').remove();
13226				});
13227
13228			}
13229			
13230		}, // End of widgetPageMyAccount
13231
13232		widgetReadingProgressBar: function($scope) {
13233
13234			if ( $scope.find('.wpr-reading-progress-bar-container').length != 0 ) {
13235				var rpbContainer = $scope.find('.wpr-reading-progress-bar-container');
13236				readingProgressBar($scope, rpbContainer);
13237			}
13238
13239			function readingProgressBar($scope, rpbContainer) {
13240
13241				var initialPaddingTop = $('body').css('paddingTop');
13242				var initialPaddingBottom = $('body').css('paddingBottom');
13243
13244				if ( '0px' === rpbContainer.css('top') ) {
13245					if ( 'colored' == rpbContainer.data('background-type') ) {
13246						$('body').css('paddingTop', $scope.find('.wpr-reading-progress-bar').
13246css('height'));
13247					}
13248					if ( $('#wpadminbar').length ) {
13249						rpbContainer.css('top', $('#wpadminbar').height());
13250					}
13251					$('body').css('paddingBottom', initialPaddingBottom);
13252				} else if ( '0px' === rpbContainer.css('bottom') && 'colored' == rpbContainer.data('background-type') ) {
13253					$('body').css('paddingBottom', $scope.find('.wpr-reading-progress-bar').css('height'));
13254					$('body').css('paddingTop', initialPaddingTop);
13255				}
13256
13257				readingProgressBarFill($scope);
13258				window.onscroll = function() {
13259					readingProgressBarFill($scope);
13260				};
13261
13262			}
13263
13264			function readingProgressBarFill($scope) {
13265				if ( $scope.find('.wpr-reading-progress-bar').length ) {
13266					var winScroll = document.body.scrollTop || document.documentElement.scrollTop;
13267					var height = document.documentElement.scrollHeight - document.documentElement.clientHeight;
13268					var scrolled = (winScroll / height) * 100;
13269					$scope.find(".wpr-reading-progress-bar").css('width', scrolled + "%");
13270				}
13271			}
13272
13273		},
13274
13275		widgetDataTable: function($scope) {
13276            
13277            const ps = new PerfectScrollbar($scope.find('.wpr-table-inner-container')[0], {
13278                // suppressScrollX: true
13279            });
13280			
13281			var beforeFilter = $scope.find("tbody .wpr-table-row"),
13282				itemsPerPage = +$scope.find('.wpr-table-inner-container').attr('data-rows-per-page'),
13283				paginationListItems = $scope.find('.wpr-table-custom-pagination-list-item'),
13284				initialRows = $scope.find('.wpr-table-inner-container tbody tr'),
13285				table = $scope.find('.wpr-table-inner-container tbody'),
13286				pageIndex, value, paginationIndex;
13287
13288			// Table Custom Pagination
13289			if ( 'yes' === $scope.find('.wpr-table-inner-container').attr('data-custom-pagination') ) {
13290
13291				var tableRows = initialRows.filter(function(index) {
13292					return index < $scope.find('.wpr-table-inner-container').attr('data-rows-per-page');
13293				});
13294
13295				table.html(tableRows);
13296
13297				adjustPaginationList();
13298
13299				$scope.on('click', '.wpr-table-custom-pagination-list-item', function() {
13300						paginationListItems.removeClass('wpr-active-pagination-item');
13301						$(this).addClass('wpr-active-pagination-item');
13302						adjustPaginationList();
13303						table.hide();
13304						pageIndex = +$(this).text();
13305						itemsPerPage = +$scope.find('.wpr-table-inner-container').attr('data-rows-per-page');
13306
13307						table.html(initialRows.filter(function(index) {
13308								index++;
13309								return index > itemsPerPage * (pageIndex - 1) && index <= itemsPerPage * pageIndex;
13310						}));
13311
13312						table.show();
13313						beforeFilter = $scope.find("tbody .wpr-table-row");
13314						beforeFilter.find('.wpr-table-tr-before-remove').each(function() {
13315							$(this).removeClass('wpr-table-tr-before-remove');
13316						});
13317
13318						entryInfo();
13319				});
13320
13321				$scope.find('.wpr-table-prev-next').each(function() {
13322					pageIndex = +$scope.find('.wpr-active-pagination-item').text();
13323
13324					if ( $(this).hasClass('wpr-table-custom-pagination-prev')) {
13325
13326						$(this).on('click', function() {
13327
13328							if ( 1 < pageIndex ) {
13329								paginationListItems.removeClass('wpr-active-pagination-item');
13330								pageIndex--;
13331
13332								paginationListItems.each(function(index) {
13333									index++;
13334									if ( index === pageIndex) {
13335										$(this).addClass('wpr-active-pagination-item');
13336										pageIndex = +$(this).text();
13337									}
13338								});
13339								adjustPaginationList();
13340	
13341								table.html(initialRows.filter(function(index) {
13342									index++;
13343									return index > itemsPerPage * (pageIndex - 1) && index <= itemsPerPage * pageIndex;
13344								}));
13345
13346								beforeFilter = $scope.find("tbody .wpr-table-row");
13347
13348								if ( '' == value ) {
13349									table.html(beforeFilter);
13350								}
13351							}
13352
13353							entryInfo();
13354						});
13355
13356					} else {
13357
13358						$(this).on('click', function() {
13359
13360							if (  paginationListItems.length > pageIndex ) {
13361								paginationListItems.removeClass('wpr-active-pagination-item');
13362								pageIndex++;
13363								
13364								paginationListItems.each(function(index) {
13365									index++;
13366									if ( index === pageIndex) {
13367										$(this).addClass('wpr-active-pagination-item');
13368										pageIndex = +$(this).text();
13369									}
13370								});
13371								adjustPaginationList();
13372	
13373								table.html(initialRows.filter(function(index) {
13374									index++;
13375									return index > itemsPerPage * (pageIndex - 1) && index <= itemsPerPage * pageIndex;
13376								}));
13377
13378								beforeFilter = $scope.find("tbody .wpr-table-row");
13379													
13380								if ( '' == value ) {
13381									table.html(beforeFilter);
13382								}
13383							}
13384
13385							entryInfo();
13386						});
13387					}
13388	
13389					beforeFilter.find('.wpr-table-tr-before-remove').each(function() {
13390						$(this).removeClass('wpr-table-tr-before-remove');
13391					});
13392
13393				});
13394
13395			}
13396
13397			$scope.find('.wpr-table-inner-container').removeClass('wpr-hide-table-before-arrange');
13398
13399			entryInfo();
13400
13401			// Table Live Search
13402			beforeFilter = $scope.find("tbody .wpr-table-row");
13403			$scope.find(".wpr-table-live-search").keyup(function () {
13404				if ( this.value !== '' ) {
13405					$scope.find('.wpr-table-pagination-cont').addClass('wpr-hide-pagination-on-search');
13406				} else {
13407					$scope.find('.wpr-table-pagination-cont').removeClass('wpr-hide-pagination-on-search');
13408				}
13409				value = this.value.toLowerCase().trim();
13410
13411				var afterFilter = [];
13412
13413				initialRows.each(function (index) {
13414					// if (!index) return; // TODO: restore if better
13415					$(this).find("td").each(function () {
13416						var id = $(this).text().toLowerCase().trim();
13417						var not_found = (id.indexOf(value) == -1);
13418						// $(this).closest('tr').toggle(!not_found);
13419						// return not_found;
13420						if ( !not_found ) {
13421							afterFilter.push($(this).closest('tr'));
13422						}
13423					});
13424				});
13425
13426				table.html(afterFilter);
13427
13428				if ( '' == value ) {
13429					table.html(beforeFilter);
13430				}
13431
13432				entryInfo();
13433			});
13434
13435			// Table Sorting
13436			if ( 'yes' === $scope.find('.wpr-table-inner-container').attr('data-table-sorting') ) {
13437				$(window).click(function(e) {
13438					if ( !$(e.target).hasClass('wpr-table-th') && 0 === $(e.target).closest('.wpr-table-th').length ) {
13439						if ( !$(e.target).hasClass('wpr-active-td-bg-color') && 0 === $(e.target).closest('.wpr-active-td-bg-color').length ) {
13440							$scope.find('td').each(function() {
13441								if($(this).hasClass('wpr-active-td-bg-color')) {
13442									$(this).removeClass('wpr-active-td-bg-color');
13443								}
13444							});
13445						}
13446					}
13447				});
13448
13449				$scope.find('th').click(function(){
13450
13451					var indexOfTr = $(this).index();
13452
13453					$scope.find('td').each(function() {
13454						if($(this).index() === indexOfTr) {
13455							$(this).addClass('wpr-active-td-bg-color');
13456						} else {
13457							$(this).removeClass('wpr-active-td-bg-color');
13458						}
13459					});
13460
13461					$scope.find('th').each(function() {
13462						$(this).find('.wpr-sorting-icon').html('<i class="fas fa-sort" aria-hidden="true"></i>');
13463					});
13464
13465					var table = $(this).parents('table').eq(0);
13466					var rows = table.find('tr:gt(0)').toArray().sort(comparer($(this).index()))
13467
13468					this.asc = !this.asc
13469					if ($scope.hasClass('wpr-data-table-type-custom') ? !this.asc : this.asc) {
13470						if ($scope.hasClass('wpr-data-table-type-custom')) {
13471							$(this).find('.wpr-sorting-icon').html('<i class="fas fa-sort-down" aria-hidden="true"></i>');
13472						} else {
13473							$(this).find('.wpr-sorting-icon').html('<i class="fas fa-sort-up" aria-hidden="true"></i>');
13474						}
13475						rows = rows.reverse() 
13476					} 
13477	
13478					if($scope.hasClass('wpr-data-table-type-custom') ? this.asc : !this.asc) {
13479						
13480						if ($scope.hasClass('wpr-data-table-type-custom')) {
13481							$(this).find('.wpr-sorting-icon').html('<i class="fas fa-sort-up" aria-hidden="true"></i>');
13482						} else {
13483
13484							$(this).find('.wpr-sorting-icon').html('<i class="fas fa-sort-down" aria-hidden="true"></i>');
13485						}
13486					}
13487	
13488					for (var i = 0; i < rows.length; i++) {
13489						table.append(rows[i])
13490					}
13491	
13492					beforeFilter.find('.wpr-table-tr-before-remove').each(function() {
13493						$(this).closest('.wpr-table-row').next('.wpr-table-appended-tr').remove();
13494						$(this).removeClass('wpr-table-tr-before-remove');
13495					});
13496				});
13497			}
13498
13499			if ( $scope.find('.wpr-table-inner-container').attr('data-row-pagination') === 'yes' ) {
13500				$scope.find('.wpr-table-head-row').prepend('<th class="wpr-table-th-pag" style="vertical-align: middle;">' + '#' + '</th>')
13501				initialRows.each(function(index) {
13502						$(this).prepend('<td class="wpr-table-td-pag" style="vertical-align: middle;"><span style="vertical-align: middle;">'+ (index + 1) +'</span></td>')
13503				})	
13504			}
13505
13506			if ( $scope.find('.wpr-table-export-button-cont').length ) {
13507				var exportBtn = $scope.find('.wpr-table-export-button-cont .wpr-button');;
13508				exportBtn.each(function() {
13509					if ( $(this).hasClass('wpr-xls')) {
13510						$(this).on('click', function() {    
13511							let table = $scope.find('table');
13512							TableToExcel.convert(table[0], { // html code may contain multiple tables s
13512o here we are refering to 1st table tag
13513								name: `export.xlsx`, // fileName you could use any name
13514								sheet: {
13515									name: 'Sheet 1' // sheetName
13516								}
13517							});
13518						});
13519					} else if ( $(this).hasClass('wpr-csv')) {
13520						$(this).on('click', function() {
13521							htmlToCSV('why-this-arg?', "placeholder.csv", $scope.find('.wpr-data-table'));
13522						});
13523					}
13524				});
13525			}
13526
13527			// if('yes' === $scope.find('.wpr-table-inner-container').attr('data-enable-tr-link')) {
13528			// 	$scope.find('tbody tr:eq('+ $scope.find('.wpr-table-inner-container').attr('data-tr-index') +')').click(function() {
13529			// 		window.location.href = 'https://stackoverflow.com/questions/503093/how-do-i-redirect-to-another-webpage';
13530			// 		// window.open('https://stackoverflow.com/questions/503093/how-do-i-redirect-to-another-webpage', '_blank');
13531			// 	});
13532			// }
13533
13534			function entryInfo() {
13535
13536				if ( 'yes' !== $scope.find('.wpr-table-inner-container').attr('data-entry-info') ) {
13537					return;
13538				}
13539
13540				var entryPage = +$scope.find('.wpr-active-pagination-item').text(),
13541					lastEntry = itemsPerPage * entryPage - (itemsPerPage - $scope.find('tbody tr').length),
13542					firstEntry = lastEntry - $scope.find('tbody tr').length + 1;
13543
13544				$scope.find('.wpr-entry-info').html('Showing ' + firstEntry + ' to ' + lastEntry + ' of ' + initialRows.length + ' Entries.');
13545			}
13546
13547			function adjustPaginationList() {
13548				
13549				paginationIndex = $scope.find('.wpr-active-pagination-item').index();
13550				paginationListItems.each(function(index) {
13551					if (index == 0 || index == paginationListItems.length - 1 || index <= paginationIndex && index >= paginationIndex - 2) {
13552						$(this).css('display', 'flex');
13553					} else {
13554						$(this).css('display', 'none');
13555					}
13556				});
13557			}
13558			
13559			function comparer(index) {
13560				return function(a, b) {
13561					var valA = getCellValue(a, index), valB = getCellValue(b, index)
13562					return $.isNumeric(valA) && $.isNumeric(valB) ? valA - valB : valA.toString().localeCompare(valB)
13563				}
13564			}
13565
13566			function getCellValue (row, index) { 
13567				return $(row).children('td').eq(index).text() 
13568			}
13569
13570			function htmlToCSV(html, filename, view) {
13571				var data = [];
13572				var rows = view.find(".wpr-table-row");
13573						
13574				for (var i = 0; i < rows.length; i++) {
13575					var row = [], cols = rows[i].querySelectorAll(".wpr-table-text");
13576							
13577					for (var j = 0; j < cols.length; j++) {
13578							row.push(cols[j].innerText);
13579					}
13580					
13581					data.push(row.join(",")); 		
13582				}
13583			
13584				downloadCSVFile(data.join("\n"), filename);
13585			}
13586		
13587			function downloadCSVFile(csv, filename) {
13588				var csv_file, download_link;
13589			
13590				csv_file = new Blob([csv], {type: "text/csv"});
13591			
13592				download_link = document.createElement("a");
13593			
13594				download_link.download = filename;
13595			
13596				download_link.href = window.URL.createObjectURL(csv_file);
13597			
13598				download_link.style.display = "none";
13599			
13600				document.body.appendChild(download_link);
13601			
13602				download_link.click();
13603			} // Data Table CSV export
13604
13605		}, // End widgetDataTable
13606
13607		widgetPasswordProtectedContent: function( $scope ) {
13608			var ppcForm = $scope.find( '.wpr-ppc-form' );
13609
13610			if ( ! ppcForm.length ) {
13611				return;
13612			}
13613
13614			ppcForm.on( 'submit', function(e) {
13615				e.preventDefault();
13616
13617				var $form = $(this),
13618					$container = $scope.find( '.wpr-ppc-container' ),
13619					$error = $form.find( '.wpr-ppc-error' ),
13620					$input = $form.find( '.wpr-ppc-password-input' );
13621
13622				$error.hide();
13623
13624				$.ajax({
13625					url: WprConfig.ajaxurl,
13626					type: 'POST',
13627					data: {
13628						action: 'wpr_ppc_verify_password',
13629						widget_id: $form.data( 'widget-id' ),
13630						post_id: $form.data( 'post-id' ),
13631						password: $input.val(),
13632						nonce: $form.data( 'nonce' )
13633					},
13634					success: function( response ) {
13635						if ( response.success ) {
13636							$container.hide().html( '<div class="wpr-ppc-content">' + response.data.content + '</div>' ).fadeIn( 600 );
13637
13638							// Re-init Elementor widgets
13639							if ( window.elementorFrontend && elementorFrontend.elementsHandler ) {
13640								$container.find( '.elementor-element' ).each( function() {
13641									elementorFrontend.elementsHandler.runReadyTrigger( $( this ) );
13642								});
13643							}
13644						} else {
13645							$error.text( response.data.message ).show();
13646						}
13647					},
13648					error: function() {
13649						$error.text( 'Something went wrong. Please try again.' ).show();
13650					}
13651				});
13652			});
13653		}, // End widgetPasswordProtectedContent
13654
13655		widgetIconBox: function( $scope ) {
13656
13657			let tiltBox = $scope.find('.wpr-icon-box-wrap');
13658		
13659			if ( 'yes' === tiltBox.attr('enable-tilt') ) {
13660				tiltBox.universalTilt({
13661					settings: {
13662						base: tiltBox.attr('tilt-base'),
13663						disabled: 'none' === tiltBox.attr('tilt-disable') ? null : tiltBox.attr('tilt-disable'),
13664						easing: tiltBox.attr('tilt-easing'),
13665						max: 35,
13666						perspective: 800,
13667						reset: true,
13668						reverse: 'reverse' === tiltBox.attr('tilt-interaction'),
13669						scale: 1,
13670						shine: false,
13671						// 'shine-opacity': 0.9,
13672						// 'shine-save': false,
13673						speed: 200,
13674					},
13675					callbacks: {
13676					  // callbacks...
13677					}
13678				});
13679			}
13680		}, // End widgetIconBox
13681		
13682		widgetSeparator: function($scope) { // temporary
13683		
13684			var lottieAnimations = $scope.find('.wpr-separator-animations'),
13685				lottieDataSettings = lottieAnimations.attr('data-settings'),
13686				lottieJSON = null;
13687
13688			if ( ! lottieAnimations.length || ! lottieDataSettings || 'undefined' === typeof lottie ) {
13689				return;
13690			}
13691
13692			try {
13693				lottieJSON = JSON.parse(lottieDataSettings);
13694			} catch (e) {
13695				return;
13696			}
13697		
13698			var animation = lottie.loadAnimation({
13699			  container: lottieAnimations[0], // Required
13700			  path: lottieAnimations.attr('data-json-url'), // Required
13701			  renderer: lottieJSON.lottie_renderer, // Required
13702			  loop: 'yes' === lottieJSON.loop ? true : false, // Optional
13703			  autoplay: 'yes' === lottieJSON.autoplay ? true : false
13704			});
13705		}, // end widgetSeparator
13706		
13707		widgetCircleMenu: function( $scope ) {
13708			var $wrapper = $scope.find( '.wpr-circle-menu-wrapper' ),
13709				settings = $wrapper.data( 'settings' );
13710
13711			if ( ! settings ) {
13712				return;
13713			}
13714
13715			$wrapper.find( '.wpr-circle-menu-box' ).circleMenu({
13716				direction: settings.menuDirection,
13717				item_diameter: settings.menuDiameter.size,
13718				circle_radius: settings.menuRadius.size,
13719				speed: settings.menuSpeed.size,
13720				delay: settings.menuDelay.size,
13721				step_out: settings.menuStepOut.size,
13722				step_in: settings.menuStepIn.size,
13723				trigger: settings.menuTrigger,
13724				transition_function: settings.menuTransition
13725			});
13726
13727			$wrapper.find( '.wpr-circle-menu-box li' ).css( 'visibility', 'visible' );
13728		}, // End widgetCircleMenu
13729
13730		widgetUnfold: function( $scope ) {
13731			var $btn = $scope.find( '.wpr-unfold-btn' ),
13732				$wrapper = $scope.find( '.wpr-unfold-wrapper' ),
13733				$data = $scope.find( '.wpr-unfold-data' ),
13734				$dataInner = $scope.find( '.wpr-unfold-data-inner' ),
13735				$collapseIcon = $btn.find( '.wpr-unfold-collapse-icon' ),
13736				$expandIcon = $btn.find( '.wpr-unfold-expand-icon' ),
13737				config = $wrapper.data( 'config' ),
13738				duration = parseInt( config.transition_duration, 10 ) || 300,
13739				collapseHeight = parseInt( config.collapse_height, 10 ) || 79,
13740				hasIcons = $collapseIcon.length > 0 || $expandIcon.length > 0;
13741
13742			function updateText( text ) {
13743				if ( hasIcons ) {
13744					var textNode = $btn.contents().filter(function() {
13745						return this.nodeType === 3;
13746					})[0];
13747					if ( textNode ) {
13748						textNode.nodeValue = text;
13749					}
13750				} else {
13751					$btn.html( text );
13752				}
13753			}
13754
13755			function updateIcons( state ) {
13756				if ( hasIcons ) {
13757					if ( 'collapse' === state ) {
13758						$collapseIcon.show();
13759						$expandIcon.hide();
13760					} else {
13761						$expandIcon.show();
13762						$collapseIcon.hide();
13763					}
13764				}
13765			}
13766
13767			// Initial state
13768			if ( collapseHeight >= $dataInner.outerHeight() ) {
13769				$btn.hide();
13770				$data.addClass( 'active' ).height( 'auto' );
13771			} else {
13772				$btn.show();
13773				$data.removeClass( 'active' ).height( collapseHeight );
13774			}
13775
13776			$btn.off( 'click' ).on( 'click', function() {
13777				var isActive = $data.hasClass( 'active' );
13778
13779				if ( isActive ) {
13780					$data.stop().animate( { height: collapseHeight }, duration );
13781					updateText( config.expand_text );
13782					updateIcons( 'expand' );
13783				} else {
13784					$data.stop().animate( { height: $dataInner.outerHeight() }, duration, function() {
13785						$data.height( 'auto' );
13786					});
13787					updateText( config.collapse_text );
13788					updateIcons( 'collapse' );
13789				}
13790
13791				$data.toggleClass( 'active' );
13792
13793				if ( isActive ) {
13794					requestAnimationFrame(function() {
13795						$data[0].scrollIntoView({ block: 'center', behavior: 'smooth' });
13796					});
13797				}
13798			});
13799		}, // End widgetUnfold
13800
13801		// Editor Check
13802		editorCheck: function() {
13803			return $( 'body' ).hasClass( 'elementor-editor-active' ) ? true : false;
13804		},
13805
13806		// Featured Video - ensure self-hosted <video> elements autoplay reliably
13807		// and pause when scrolled out of view (saves battery / bandwidth).
13808		// YouTube / Vimeo iframes rely on their own embed params for autoplay
13809		// but are still wired up to lazy-inject if the markup was deferred.
13810		initFeaturedVideos: function( $scope ) {
13811			var $videos = $scope.find('.wpr-grid-featured-video video');
13812			if ( ! $videos.length ) {
13813				return;
13814			}
13815
13816			// Attempt an immediate play for each <video> (the `autoplay` attribute
13817			// already triggers this, but mobile Safari sometimes requires an
13818			// explicit play() after the element is attached to the DOM).
13819			$videos.each(function() {
13820				var videoEl = this;
13821				try {
13822					var p = videoEl.play();
13823					if ( p && typeof p.catch === 'function' ) {
13824						p.catch(function() {});
13825					}
13826				} catch (e) {}
13827			});
13828
13829			if ( 'undefined' === typeof IntersectionObserver ) {
13830				return;
13831			}
13832
13833			var observer = new IntersectionObserver(function( entries ) {
13834				entries.forEach(function( entry ) {
13835					var videoEl = entry.target;
13836					if ( entry.isIntersecting ) {
13837						try {
13838							var p = videoEl.play();
13839							if ( p && typeof p.catch === 'function' ) {
13840								p.catch(function() {});
13841							}
13842						} catch (e) {}
13843					} else {
13844						try {
13845							videoEl.pause();
13846						} catch (e) {}
13847					}
13848				});
13849			}, { threshold: 0.15 });
13850
13851			$videos.each(function() {
13852				observer.observe( this );
13853			});
13854		},
13855
13856		// Edith with Elementor - Admin Bar Menu
13857		changeAdminBarMenu: function() {
13858			let editLinks = $('#wp-admin-bar-elementor_edit_page-default');
13859
13860			editLinks.children('li').each(function(){
13861				let $this = $(this),
13862					template = $this.children('a').children('span').first().text();
13863
13864				if ( 0 === template.indexOf('wpr-mega-menu-item') ) {
13865					$this.remove();
13866				}
13867			});
13868		},
13869
13870		changeActionTargetProductId: function(productId) {
13871			actionTargetProductId = productId;
13872		},
13873
13874		changeFinalURL: function(url) {
13875			finalURL = url;
13876		},
13877
13878		prefersReducedMotion: function() {
13879			return window.matchMedia && window.matchMedia( '(prefers-reduced-motion: reduce)' ).matches;
13880		},
13881
13882		changeInitialItems: function(items, scopeId) {
13883			if (scopeId) {
13884				WprElements.gridInitialItems[scopeId] = items;
13885			} else {
13886				initialItems = items;
13887			}
13888		},
13889
13890		getInitialItems: function(scopeId) {
13891			return (scopeId && WprElements.gridInitialItems[scopeId] !== undefined) ? WprElements.gridInitialItems[scopeId] : initialItems;
13892		},
13893
13894		// Isotope Layout
13895		isotopeLayout: function ( settings, $response = '', $altScope = '', $scope = '' ) {
13896			if ( '' != $altScope ) {
13897				$scope = $altScope;
13898			}
13899
13900			var grid = $scope.find( '.wpr-grid' ),
13901				item = grid.find( '.wpr-grid-item' ),
13902				itemVisible = item.filter( ':visible' ),
13903				layout = settings.layout,
13904				defaultLayout = settings.layout,
13905				mediaAlign = settings.media_align,
13906				mediaWidth = settings.media_width,
13907				mediaDistance = settings.media_distance,
13908				columns = 3,
13909				columnsMobile = 1,
13910				columnsMobileExtra,
13911				columnsTablet = 2,
13912				columnsTabletExtra,
13913				columnsDesktop = parseInt(settings.columns_desktop, 10),
13914				columnsLaptop,
13915				columnsWideScreen,
13916				gutterHr = settings.gutter_hr,
13917				gutterVr = settings.gutter_vr,
13918				gutterHrMobile = settings.gutter_hr_mobile,
13919				gutterVrMobile = settings.gutter_vr_mobile,
13920				gutterHrMobileExtra = settings.gutter_hr_mobile_extra,
13921				gutterVrMobileExtra = settings.gutter_vr_mobile_extra,
13922				gutterHrTablet = settings.gutter_hr_tablet,
13923				gutterVrTablet = settings.gutter_vr_tablet,
13924				gutterHrTabletExtra = settings.gutter_hr_tablet_extra,
13925				gutterVrTabletExtra = settings.gutter_vr_tablet_extra,
13926				gutterHrWideScreen = settings.gutter_hr_widescreen,
13927				gutterVrWideScreen = settings.gutter_vr_widescreen,
13928				gutterHrLaptop = settings.gutter_hr_laptop,
13929				gutterVrLaptop = settings.gutter_vr_laptop,
13930				contWidth = grid.width() + gutterHr - 0.3,
13931				// viewportWidth = $( 'body' ).prop( 'clientWidth' ),
13932				viewportWidth = $(window).outerWidth(),
13933				defaultLayout,
13934				transDuration = 400;
13935
13936				if ( $response != '' ) {
13937					item = $response
13938				}
13939
13940			// Get Responsive Columns
13941			var prefixClass = $scope.attr('class'),
13942				prefixClass = prefixClass.split(' ');
13943
13944			for ( var i=0; i < prefixClass.length - 1; i++ ) {
13945
13946				if ( -1 !== prefixClass[i].search(/mobile\d/) ) {
13947					columnsMobile = prefixClass[i].slice(-1);
13948				}
13949
13950				if ( -1 !== prefixClass[i].search(/mobile_extra\d/) ) {
13951					columnsMobileExtra = prefixClass[i].slice(-1);
13952				}
13953
13954				if ( -1 !== prefixClass[i].search(/tablet\d/) ) {
13955					columnsTablet = prefixClass[i].slice(-1);
13956				}
13957
13958				if ( -1 !== prefixClass[i].search(/tablet_extra\d/) ) {
13959					columnsTabletExtra = prefixClass[i].slice(-1);
13960				}
13961
13962				if ( -1 !== prefixClass[i].search(/widescreen\d/) ) {
13963					columnsWideScreen = prefixClass[i].slice(-1);
13964				}
13965
13966				if ( -1 !== prefixClass[i].search(/laptop\d/) ) {
13967					columnsLaptop = prefixClass[i].slice(-1);
13968				}
13969			}
13970
13971			var MobileResp = +elementorFrontend.config.responsive.breakpoints.mobile.value;
13972			var MobileExtraResp = +elementorFrontend.config.responsive.breakpoints.mobile_extra.value;
13973			var TabletResp = +elementorFrontend.config.responsive.breakpoints.tablet.value;
13974			var TabletExtraResp = +elementorFrontend.config.responsive.breakpoints.tablet_extra.value;
13975			var LaptopResp = +elementorFrontend.config.responsive.breakpoints.laptop.value;
13976			var wideScreenResp = +elementorFrontend.config.responsive.breakpoints.widescreen.value;
13977
13978			var activeBreakpoints = elementorFrontend.config.responsive.activeBreakpoints;
13979
13980			// Mobile
13981			if ( MobileResp >= viewportWidth && activeBreakpoints.mobile != null ) {
13982				columns = columnsMobile;
13983				gutterHr = gutterHrMobile;
13984				gutterVr = gutterVrMobile;
13985
13986			// Mobile Extra
13987			} else if ( MobileExtraResp >= viewportWidth && activeBreakpoints.mobile_extra != null ) {
13988				columns = (columnsMobileExtra) ? columnsMobileExtra : columnsTablet;
13989				gutterHr = gutterHrMobileExtra;
13990				gutterVr = gutterVrMobileExtra;
13991
13992			// Tablet
13993			} else if ( TabletResp >= viewportWidth && activeBreakpoints.tablet != null ) {
13994				columns = columnsTablet;
13995				gutterHr = gutterHrTablet;
13996				gutterVr = gutterVrTablet;
13997
13998			// Tablet Extra
13999			} else if ( TabletExtraResp >= viewportWidth && activeBreakpoints.tablet_extra != null ) {
14000				columns = (columnsTabletExtra) ? columnsTabletExtra : columnsTablet;
14001				gutterHr = gutterHrTabletExtra;
14002				gutterVr = gutterVrTabletExtra;
14003
14004			// Laptop
14005			} else if ( LaptopResp >= viewportWidth && activeBreakpoints.laptop != null ) {
14006				columns = (columnsLaptop) ? columnsLaptop : columnsDesktop;
14007				gutterHr = gutterHrLaptop;
14008				gutterVr = gutterVrLaptop;
14009
14010			// Desktop
14011			} else if ( wideScreenResp > viewportWidth ) {
14012				columns = columnsDesktop;
14013				gutterHr = settings.gutter_hr;
14014				gutterVr = settings.gutter_vr;
14015			}  else {
14016				columns = (columnsWideScreen) ? columnsWideScreen : columnsDesktop;
14017				gutterHr = gutterHrWideScreen;
14018				gutterVr = gutterVrWideScreen;
14019			}
14020
14021			// Limit Columns for Higher Screens
14022			if ( columns > 8 ) {
14023				columns = 8;
14024			}
14025
14026			if ( 'string' == typeof(columns) && -1 !== columns.indexOf('pro') ) {
14027				columns = 3;
14028			}
14029
14030			contWidth = grid.width() + gutterHr - 0.3;
14031
14032			// Calculate Item Width
14033			item.outerWidth( Math.floor( contWidth / columns - gutterHr ) );
14034
14035			// Set Vertical Gutter
14036			item.css( 'margin-bottom', gutterVr +'px' );
14037
14038			// Reset Vertical Gutter for 1 Column Layout
14039			if ( 1 === columns ) {
14040				item.last().css( 'margin-bottom', '0' );
14041			}
14042
14043			// add last row & make all post equal height
14044			var maxTop = -1;
14045			itemVisible.each(function ( index ) {
14046
14047				// define
14048				var thisHieght = $(this).outerHeight(),
14049					thisTop = parseInt( $(this).css( 'top' ) , 10 );
14050
14051				// determine last row
14052				if ( thisTop > maxTop ) {
14053					maxTop = thisTop;
14054				}
14055				
14056			});
14057
14058			if ( 'fitRows' === layout ) {
14059				itemVisible.each(function() {
14060					if ( parseInt( $(this).css( 'top' ) ) === maxTop  ) {
14061						$(this).addClass( 'rf-last-row' );
14062					}
14063				});
14064			}
14065
14066			// List Layout
14067			if ( 'list' === layout ) {
14068				var imageHeight = item.find( '.wpr-grid-image-wrap' ).outerHeight();
14069					item.find( '.wpr-grid-item-below-content' ).css( 'min-height', imageHeight +'px' );
14070
14071				if ( $( 'body' ).prop( 'clientWidth' ) < 480 ) {
14072
14073					item.find( '.wpr-grid-media-wrap' ).css({
14074						'float' : 'none',
14075						'width' : '100%'
14076					});
14077
14078					item.find( '.wpr-grid-item-below-content' ).css({
14079						'float' : 'none',
14080						'width' : '100%',
14081					});
14082
14083					item.find( '.wpr-grid-image-wrap' ).css( 'padding', '0' );
14084
14085					item.find( '.wpr-grid-item-below-content' ).css( 'min-height', '0' );
14086
14087					if ( 'zigzag' === mediaAlign ) {
14088						item.find( '[class*="elementor-repeater-item"]' ).css( 'text-align', 'center' );
14089					}
14090
14091				} else {
14092
14093					if ( 'zigzag' !== mediaAlign ) {
14094
14095						item.find( '.wpr-grid-media-wrap' ).css({
14096							'float' : mediaAlign,
14097							'width' : mediaWidth +'%'
14098						});
14099
14100						var listGutter = 'left' === mediaAlign ? 'margin-right' : 'margin-left';
14101							item.find( '.wpr-grid-media-wrap' ).css( listGutter, mediaDistance +'px' );
14102
14103						item.find( '.wpr-grid-item-below-content' ).css({
14104							'float' : mediaAlign,
14105							'width' : 'calc((100% - '+ mediaWidth +'%) - '+ mediaDistance +'px)',
14106						});
14107
14108					// Zig-zag
14109					} else {
14110						// Even
14111						item.filter(':even').find( '.wpr-grid-media-wrap' ).css({
14112							'float' : 'left',
14113							'width' : mediaWidth +'%'
14114						});
14115						item.filter(':even').find( '.wpr-grid-item-below-content' ).css({
14116							'float' : 'left',
14117							'width' : 'calc((100% - '+ mediaWidth +'%) - '+ mediaDistance +'px)',
14118						});
14119						item.filter(':even').find( '.wpr-grid-media-wrap' ).css( 'margin-right', mediaDistance +'px' );
14120
14121						// Odd
14122						item.filter(':odd').find( '.wpr-grid-media-wrap' ).css({
14123							'float' : 'right',
14124							'width' : mediaWidth +'%'
14125						});
14126						item.filter(':odd').find( '.wpr-grid-item-below-content' ).css({
14127							'float' : 'right',
14128							'width' : 'calc((100% - '+ mediaWidth +'%) - '+ mediaDistance +'px)',
14129						});
14130						item.filter(':odd').find( '.wpr-grid-media-wrap' ).css( 'margin-left', mediaDistance +'px' );
14131
14132						// Fix Elements Align
14133						if ( ! grid.hasClass( 'wpr-grid-list-ready' ) ) {
14134							item.each( function( index ) {
14135								var element = $(this).find( '[class*="elementor-repeater-item"]' );
14136
14137								if ( index % 2 === 0 ) {
14138									element.each(function() {
14139										if ( ! $(this).hasClass( 'wpr-grid-item-align-center' ) ) {
14140											if ( 'none' === $(this).css( 'float' ) ) {
14141												$(this).css( 'text-align', 'left' );
14142											} else {
14143												$(this).css( 'float', 'left' );
14144											}
14145
14146											var inner = $(this).find( '.inner-block' );
14147										}
14148									});
14149								} else {
14150									element.each(function( index ) {
14151										if ( ! $(this).hasClass( 'wpr-grid-item-align-center' ) ) {
14152											if ( 'none' === $(this).css( 'float' ) ) {
14153												$(this).css( 'text-align', 'right' );
14154											} else {
14155												$(this).css( 'float', 'right' );
14156											}
14157
14158											var inner = $(this).find( '.inner-block' );
14159
14160											if ( '0px' !== inner.css( 'margin-left' ) ) {
14161												inner.css( 'margin-right', inner.css( 'margin-left' ) );
14162												inner.css( 'margin-left', '0' );
14163											}
14164
14165											// First Item
14166											if ( 0 === index ) {
14167												if ( '0px' !== inner.css( 'margin-right' ) ) {
14168													inner.css( 'margin-left', inner.css( 'margin-right' ) );
14169													inner.css( 'margin-right', '0' );
14170												}
14171											}
14172										}
14173									});
14174								}
14175							});
14176
14177						}
14178
14179						setTimeout(function() {
14180							if ( ! grid.hasClass( 'wpr-grid-list-ready' ) ) {
14181								grid.addClass( 'wpr-grid-list-ready' );
14182							}
14183						}, 500 );
14184					}
14185
14186				}
14187			}
14188
14189			// Set Layout
14190			defaultLayout = layout;
14191			if ( 'list' === layout ) {
14192				layout = 'fitRows';
14193			}
14194
14195			// No Transition
14196			if ( 'default' !== settings.filters_animation ) {
14197				transDuration = 0;
14198			}
14199
14200			if ( WprElements.prefersReducedMotion() ) {
14201				transDuration = 0;
14202			}
14203
14204			// Run Isotope
14205			var iGrid = grid.isotopewpr({
14206				layoutMode: layout,
14207				masonry: {
14208					// columnWidth: contWidth / columns,
14209					gutter: gutterHr
14210				},
14211				fitRows: {
14212					// columnWidth: contWidth / columns,
14213					gutter: gutterHr
14214				},
14215				transitionDuration: transDuration,
14216				  percentPosition: true
14217			});
14218		},
14219
14220		// Media Hover Link
14221		mediaHoverLink: function ($scope, iGrid) {
14222			var img;
14223			var thisImgSrc;
14224			let secondaryImg;
14225			
14226			iGrid.find('.wpr-grid-media-wrap').on('mouseover', function() {
14227				if ( 'yes' === $(this).find('.wpr-grid-image-wrap').attr('data-img-on-hover') ) {
14228					// img = $(this).find( 'img' );
14229					// thisImgSrc = img.attr('src');
14230					
14231					// secondaryImg = $(this).find('.wpr-grid-image-wrap').data('src-secondary');
14232					
14233					// if ( isValidHttpUrl(secondaryImg) ) {
14234					// 	img.attr( 'src', secondaryImg );
14235					// }
14236					
14237					if ( $(this).find('img:nth-of-type(2)').attr('src') !== undefined && $(this).find('img:nth-of-type(2)').attr('src') !== '' ) {
14238						// $(this).find('img:first-of-type').fadeOut(0).addClass('wpr-hidden-img');
14239						// $(this).find('img:nth-of-type(2)').fadeIn(500).removeClass('wpr-hidden-img');
14240						$(this).find('img:first-of-type').addClass('wpr-hidden-img');
14241						$(this).find('img:nth-of-type(2)').removeClass('wpr-hidden-img');
14242						$(this).find('.wpr-grid-featured-video').addClass('wpr-hidden-img');
14243					}
14244				}
14245			});
14246
14247			iGrid.find('.wpr-grid-media-wrap').on('mouseleave', function() {
14248				if ( 'yes' === $(this).find('.wpr-grid-image-wrap').attr('data-img-on-hover') ) {
14249					// if ( secondaryImg == img.attr('src') ) {
14250					// 	img.attr('src', thisImgSrc);
14251					// }
14252
14253					if ( $(this).find('img:nth-of-type(2)').attr('src') !== undefined && $(this).find('img:nth-of-type(2)').attr('src') !== '' ) {
14254						// $(this).find('img:nth-of-type(2)').fadeOut(0).addClass('wpr-hidden-img');
14255						// $(this).find('img:first-of-type').fadeIn(500).removeClass('wpr-hidden-img');
14256						$(this).find('img:nth-of-type(2)').addClass('wpr-hidden-img');
14257						$(this).find('img:first-of-type').removeClass('wpr-hidden-img');
14258						$(this).find('.wpr-grid-featured-video').removeClass('wpr-hidden-img');
14259					}
14260				}
14261			});
14262
14263			// Featured Video - kick off autoplay on self-hosted videos once they
14264			// enter the viewport (mobile Safari & data-saver modes sometimes
14265			// skip initial autoplay). Iframes (YouTube/Vimeo) handle this
14266			// themselves via their embed parameters.
14267			WprElements.initFeaturedVideos( iGrid );
14268
14269			if ( 'yes' === iGrid.find( '.wpr-grid-media-wrap' ).attr( 'data-overlay-link' ) && ! WprElements.editorCheck() ) {
14270				iGrid.find( '.wpr-grid-media-wrap' ).css('cursor', 'pointer');
14271
14272				iGrid.find( '.wpr-grid-media-wrap' ).on( 'click', function( event ) {
14273
14274					var targetClass = event.target.className;
14275
14276					if ( -1 !== targetClass.indexOf( 'inner-block' ) || -1 !== targetClass.indexOf( 'wpr-cv-inner' ) || 
14277							-1 !== targetClass.indexOf( 'wpr-grid-media-hover' ) ) {
14278							event.preventDefault();
14279							event.stopPropagation();
14280
14281						var itemUrl = $(this).find( '.wpr-grid-media-hover-bg' ).attr( 'data-url' ),
14282							itemUrl = itemUrl.replace('#new_tab', '');
14283
14284						if (itemUrl) {
14285							try {
14286								// Create a URL object to validate the URL
14287								var url = new URL(itemUrl);
14288
14289								// Define a list of allowed protocols
14290								var allowedProtocols = ['http:', 'https:'];
14291
14292								// Check if the URL's protocol is allowed
14293								if (allowedProtocols.includes(url.protocol)) {
14294									// Safe to use the URL
14295									var safeUrl = url.href;
14296
14297									if ('_blank' === iGrid.find('.wpr-grid-item-title a').attr('target')) {
14298										window.open(safeUrl, '_blank').focus();
14299									} else {
14300										window.location.href = safeUrl;
14301									}
14302								} else {
14303									console.error('Invalid URL scheme:', url.protocol);
14304								}
14305							} catch (e) {
14306								console.error('Invalid URL:', itemUrl);
14307							}
14308						}
14309					}
14310				});
14311			}				
14312		},
14313
14314		// Lightbox Popup
14315		lightboxPopup: function ( settings, $scope, iGrid ) {
14316			if ( -1 === iGrid.find( '.wpr-grid-item-lightbox' ).length ) {
14317				return;
14318			}
14319
14320			var lightbox = iGrid.find( '.wpr-grid-item-lightbox' ),
14321				lightboxOverlay = lightbox.find( '.wpr-grid-lightbox-overlay' ).first();
14322
14323			// Set Src Attributes
14324			lightbox.each(function() {
14325				var source = $(this).find('.inner-block > span').attr( 'data-src' ),
14326					gridItem = $(this).closest( 'article' ).not('.slick-cloned');
14327
14328				if ( ! iGrid.hasClass( 'wpr-media-grid' ) ) {
14329					gridItem.find( '.wpr-grid-image-wrap' ).attr( 'data-src', source );
14330				}
14331
14332				var dataSource = gridItem.find( '.wpr-grid-image-wrap' ).attr( 'data-src' );
14333
14334				if ( typeof dataSource !== typeof undefined && dataSource !== false ) {
14335					if ( -1 === dataSource.indexOf( 'wp-content' ) ) {
14336						gridItem.find( '.wpr-grid-image-wrap' ).attr( 'data-iframe', 'true' );
14337					}
14338				}
14339			});
14340
14341			// Init Lightbox
14342			iGrid.lightGallery( settings.lightbox );
14343
14344			// Fix LightGallery Thumbnails
14345			iGrid.on('onAfterOpen.lg',function() {
14346				if ( $('.lg-outer').find('.lg-thumb-item').length ) {
14347					$('.lg-outer').find('.lg-thumb-item').each(function() {
14348						var imgSrc = $(this).find('img').attr('src'),
14349							newImgSrc = imgSrc,
14350							extIndex = imgSrc.lastIndexOf('.'),
14351							imgExt = imgSrc.slice(extIndex),
14352							cropIndex = imgSrc.lastIndexOf('-'),
14353							cropSize = /\d{3,}x\d{3,}/.test(imgSrc.substring(extIndex,cropIndex)) ? imgSrc.substring(extIndex,cropIndex) : false;
14354						
14355						if ( 42 <= imgSrc.substring(extIndex,cropIndex).length ) {
14356							cropSize = '';
14357						}
14358
14359						if ( cropSize !== '' ) {
14360							if ( false !== cropSize ) {
14361								newImgSrc = imgSrc.replace(cropSize, '-150x150');
14362							} else {
14363								newImgSrc = [imgSrc.slice(0, extIndex), '-150x150', imgSrc.slice(extIndex)].join('');
14364							}
14365						}
14366
14367						// Change SRC
14368						$(this).find('img').attr('src', newImgSrc);
14369					});
14370				}
14371			});
14372
14373			// Show/Hide Controls
14374			iGrid.find( '.wpr-grid' ).on( 'onAferAppendSlide.lg, onAfterSlide.lg', function( event, prevIndex, index ) {
14375				var lightboxControls = $( '#lg-actual-size, #lg-zoom-in, #lg-zoom-out, #lg-download' ),
14376					lightboxDownload = $( '#lg-download' ).attr( 'href' );
14377
14378				if ( $( '#lg-download' ).length ) {
14379					if ( -1 === lightboxDownload.indexOf( 'wp-content' ) ) {
14380						lightboxControls.addClass( 'wpr-hidden-element' );
14381					} else {
14382						lightboxControls.removeClass( 'wpr-hidden-element' );
14383					}
14384				}
14385
14386				// Autoplay Button
14387				if ( '' === settings.lightbox.autoplay ) {
14388					$( '.lg-autoplay-button' ).css({
14389							'width' : '0',
14390							'height' : '0',
14391							'overflow' : 'hidden'
14392					});
14393				}
14394			});
14395
14396			// Overlay
14397			if ( lightboxOverlay.length ) {
14398				iGrid.find( '.wpr-grid-media-hover-bg' ).after( lightboxOverlay.remove() );
14399
14400				iGrid.find( '.wpr-grid-lightbox-overlay' ).on( 'click', function() {
14401					if ( ! WprElements.editorCheck() ) {
14402						$(this).closest( 'article' ).find( '.wpr-grid-image-wrap' ).trigger( 'click' );
14403					} else {
14404						alert( 'Lightbox is Disabled in the Editor! Please Preview this Page to see it in action.' );
14405					}
14406				});
14407			} else {
14408				lightbox.find( '.inner-block > span' ).on( 'click', function() {
14409					if ( ! WprElements.editorCheck() ) {
14410						var imageWrap = $(this).closest( 'article' ).find( '.wpr-grid-image-wrap' );
14411							imageWrap.trigger( 'click' );
14412					} else {
14413						alert( 'Lightbox is Disabled in the Editor! Please Preview this Page to see it in action.' );
14414					}
14415				});
14416			}
14417		},
14418
14419		// Add this helper function to sanitize HTML content
14420		sanitizeHTMLContent: function(html) {
14421			// Create a temporary DOM element
14422			var tempDiv = document.createElement('div');
14423			tempDiv.innerHTML = html;
14424			
14425			// Remove all script tags
14426			var scripts = tempDiv.getElementsByTagName('script');
14427			while(scripts.length > 0) {
14428				scripts[0].parentNode.removeChild(scripts[0]);
14429			}
14430
14431			// Remove all iframe tags
14432			var iframes = tempDiv.getElementsByTagName('iframe');
14433			while(iframes.length > 0) {
14434				iframes[0].parentNode.removeChild(iframes[0]);
14435			}
14436			
14437			// Find all elements to remove potential malicious attributes
14438			var allElements = tempDiv.getElementsByTagName('*');
14439			for (var i = 0; i < allElements.length; i++) {
14440				// Remove event handler attributes
14441				var attrs = allElements[i].attributes;
14442				for (var j = attrs.length - 1; j >= 0; j--) {
14443					var attrName = attrs[j].name;
14444					// Remove all on* event handlers
14445					if (attrName.substring(0, 2) === 'on') {
14446						allElements[i].removeAttribute(attrName);
14447					}
14448					// Remove javascript: URLs
14449					if (attrName === 'href' || attrName === 'src') {
14450						var value = attrs[j].value;
14451						if (value.toLowerCase().indexOf('javascript:') === 0) {
14452							allElements[i].removeAttribute(attrName);
14453						}
14454					}
14455				}
14456			}
14457			
14458			return tempDiv.innerHTML;
14459		},
14460
14461		sanitizeURL: function(dirtyURL) {
14462			if (!dirtyURL || typeof dirtyURL !== 'string') return null;
14463			
14464			// Sanitize the raw string (strip tags, attrs)
14465			const cleaned = DOMPurify.sanitize(dirtyURL, { ALLOWED_TAGS: [], ALLOWED_ATTR: [] }).trim();
14466			const lower = cleaned.toLowerCase();
14467			
14468			// Block dangerous schemes
14469			if (/^(javascript|data|vbscript):/.test(lower)) return null;
14470			
14471			// Parse URL (supports protocol-relative with base)
14472			let url;
14473			try {
14474				url = new URL(cleaned, window.location.origin);
14475			} catch {
14476				return null;
14477			}
14478			
14479			// Only http/https
14480			if (!/^https?:$/.test(url.protocol)) return null;
14481			
14482			// Whitelist domains (allow subdomains)
14483			const allowedDomains = ['youtube.com', 'youtu.be', 'vimeo.com', 'yourdomain.com'];
14484			const host = url.hostname.toLowerCase();
14485			const hostAllowed = allowedDomains.some(d => host === d || host.endsWith('.' + d));
14486			
14487			// Also allow direct video files anywhere
14488			const isDirectVideo = /\.(mp4|webm|ogg)(?:$|\?)/i.test(url.pathname);
14489			
14490			if (!hostAllowed && !isDirectVideo) return null;
14491			
14492			return url.toString();
14493		},
14494		  
14495		
14496		sanitizeDataAttr: function(value) {
14497			const raw = String(value || '').trim();
14498		
14499			// If value contains anything suspicious, block it
14500			const blacklisted = [
14501				'onerror', 'onclick', 'onload', 'script', '<', '>', '=', 'javascript:', 'data:', 'vbscript:', '&', '%3C', '%3E'
14502			];
14503		
14504			for (const keyword of blacklisted) {
14505				if (raw.toLowerCase().includes(keyword)) {
14506					return null;
14507				}
14508			}
14509		
14510			// Fallback DOMPurify to clean even benign input
14511			return DOMPurify.sanitize(raw, {
14512				SAFE_FOR_TEMPLATES: true,
14513				ALLOWED_TAGS: [],
14514				ALLOWED_ATTR: [],
14515			});
14516		},
14517
14518		closeSideBarOnReplace: function($scope = null, animationSpeed = 200) {
14519			// $scope.find('.widget_shopping_cart_content').addClass('wpr-mini-cart-slide-out');
14520			$scope.find('.wpr-shopping-cart-inner-wrap').addClass('wpr-mini-cart-slide-out');
14521			$scope.find('.wpr-mini-cart-slide-out').css('animation-speed', animationSpeed);
14522			$scope.find('.wpr-shopping-cart-wrap').fadeOut(animationSpeed);
14523			$('body').removeClass('wpr-mini-cart-sidebar-body');
14524			setTimeout(function() {
14525				// $scope.find('.widget_shopping_cart_content').removeClass('wpr-mini-cart-slide-out');
14526				$scope.find('.wpr-shopping-cart-inner-wrap').removeClass('wpr-mini-cart-slide-out');
14527				$scope.find('.wpr-mini-cart').css({"display": "none"});
14528			}, animationSpeed + 100);
14529		}
14530	} // End WprElements
14531	
14532	$( window ).on( 'elementor/frontend/init', WprElements.init );
14533
14534}( jQuery, window.elementorFrontend ) );
14535
14536// Resize Function - Debounce
14537(function($,sr){
14538
14539  var debounce = function (func, threshold, execAsap) {
14540      var timeout;
14541
14542      return function debounced () {
14543          var obj = this, args = arguments;
14544          function delayed () {
14545              if (!execAsap)
14546                  func.apply(obj, args);
14547              timeout = null;
14548          };
14549
14550          if (timeout)
14551              clearTimeout(timeout);
14552          else if (execAsap)
14553              func.apply(obj, args);
14554
14555          timeout = setTimeout(delayed, threshold || 100);
14556      };
14557  }
14558  // smartresize 
14559  jQuery.fn[sr] = function(fn){  return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); };
14560
14561})(jQuery,'smartresize');

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.