https://www.iium.edu.my/wp-content/plugins/royal-elementor-addons/assets/js/frontend.js?ver=1.7.1065
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, ' '); 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.