jQuery(function($) {ServicesModuleInitialize();});function ServicesModuleInitialize() {$(document).on('s123.page.ready', function( event ) {var $section = $('section.s123-module-services');$section.each(function( index ) {var $sectionThis = $(this);var categories = new ModuleLayoutCategories({$items :  $sectionThis.find('.services-category'),$categoriesContainer : $sectionThis.find('.categories-panel'),$filterButton : $sectionThis.find('.items-responsive-filter'),$categories : $sectionThis.find('.items-categories-container li')});if ( $sectionThis.hasClass('layout-10') ) {$sectionThis.find('.service-item-description').each(function() {const $paragraph = $(this);const element = $paragraph.get(0);if (element.scrollHeight > element.clientHeight) {$paragraph.addClass('show-more');$paragraph.attr('data-rel', 'tooltip');$paragraph.off('click.openMore').on('click.openMore', function() {var $this = $(this);if ( $this.hasClass('show-more-disabled') ) return;bootbox.alert({title: $this.data('title'),message: $this.html(),backdrop: true});});}});}
if ( $sectionThis.hasClass('layout-13') ) {$sectionThis.find('.services-category').each(function() {$sectionThis.find('.service-item').removeClass('active');$sectionThis.find('.service-image').removeClass('active');$sectionThis.find('.service-info').addClass('service-more-info-hidden');var $firstItem = $(this).find('.service-item').first();$firstItem.addClass('active');var imgKey = $firstItem.data('img-key');if (imgKey !== undefined) {$sectionThis.find('.service-image[data-img-key="' + imgKey + '"]').addClass('active');var $firstInfo = $sectionThis.find('.service-info[data-img-key="' + imgKey + '"]');if ($firstInfo.length > 0) {$firstInfo.removeClass('service-more-info-hidden');}}});$sectionThis.find('.service-items .service-item').on('click mouseenter',function() {let $this = $(this);if ( $this.hasClass('active') ) return;let imgKey = $this.data('img-key');$sectionThis.find('.service-item').removeClass('active');$sectionThis.find('.service-image.active').stop().fadeOut(500).removeClass('active');$sectionThis.find('.service-info').addClass('service-more-info-hidden');$sectionThis.find('.service-item[data-img-key="' + imgKey + '"]').addClass('active');var $newImage = $sectionThis.find('.service-image[data-img-key="' + imgKey + '"]');$newImage.addClass('active').stop().fadeIn(500);var $targetInfo = $sectionThis.find('.service-info[data-img-key="' + imgKey + '"]');if ($targetInfo.length > 0) {$targetInfo.removeClass('service-more-info-hidden');}});$sectionThis.off('module_layout_categories.shown').on('module_layout_categories.shown', function( event, catID ) {var $category = $(this).find('.services-category[data-categories-filter="'+catID+'"]');$sectionThis.find('.service-item').removeClass('active');$sectionThis.find('.service-image.active').fadeOut(500).removeClass('active');$sectionThis.find('.service-image').removeClass('active');$sectionThis.find('.service-info').addClass('service-more-info-hidden');var imgKey = $category.find('.service-item:first-child').data('img-key');if (imgKey !== undefined) {$sectionThis.find(`.service-item[data-img-key="${imgKey}"]`).addClass('active');$sectionThis.find(`.service-image[data-img-key="${imgKey}"]`).addClass('active').fadeIn(500);var $targetInfo = $sectionThis.find(`.service-info[data-img-key="${imgKey}"]`);if ($targetInfo.length > 0) {$targetInfo.removeClass('service-more-info-hidden');}}});}
$modulesMobileCarouselViewOBJ = new ModulesMobileCarouselView({$section : $sectionThis});if ( $sectionThis.find('.mapPopupActivator').length > 0 ) {$sectionThis.find('.mapPopupActivator').each(function() {var $mapLink = $(this);var location = $mapLink.data('location');$mapLink.off('click.mapPopup').on('click.mapPopup', function(e) {e.preventDefault();buildPopup('popupServiceMap','','', $GLOBALS["maps-display-domain"] + '/include/globalMapDisplay.php?cad=1&q=' + encodeURIComponent(location) + '&fl=1&l=' + encodeURIComponent(languageCode) + '&ilfc=' + encodeURIComponent(longFreeCustomer), true, false, true, '', '');});});}
initPseudoLinks($sectionThis);initAttributePopovers($sectionThis);});});function initPseudoLinks($container) {var $pseudoLinks = $container.find('[data-link-element="true"][data-href]');if ( $pseudoLinks.length === 0 ) return;$pseudoLinks.off('mousedown.pseudoLink').on('mousedown.pseudoLink', function(e) {if (e.which === 2) {e.preventDefault();e.stopPropagation();var href = $(this).data('href');if (href) {window.open(href, '_blank');}}});$pseudoLinks.off('click.pseudoLink').on('click.pseudoLink', function(e) {e.preventDefault();e.stopPropagation();var $el = $(this);var href = $el.data('href');var target = $el.data('target');if ( !href ) return;var open_in_new_tab_boo = e.ctrlKey || e.metaKey || target === '_blank';if ( open_in_new_tab_boo ) {window.open(href, '_blank');} else {window.location.href = href;}});$pseudoLinks.off('auxclick.pseudoLink').on('auxclick.pseudoLink', function(e) {if (e.which === 2) {e.preventDefault();e.stopPropagation();}});}
function initAttributePopovers($container) {var $attrElements = $container.find('.service-extra-attr');if ( $attrElements.length === 0 ) return;$attrElements.each(function() {var $attrEl = $(this);var titleText = $attrEl.attr('title');if ( !titleText || titleText.trim() === '' ) return;$attrEl.popover({container: 'body',content: titleText,html: false,trigger: 'hover',placement: 'top',template: '<div class="popover service-attr-popover" role="tooltip"><div class="arrow"></div><div class="popover-content"></div></div>'});});}}
jQuery(function($) {TestimonialsModuleInitialize_Layout1_Layout8_Layout9();});function TestimonialsModuleInitialize_Layout1_Layout8_Layout9() {$(document).on('s123.page.ready', function( event ) {var $sections = $('.s123-module-testimonials.layout-1, .s123-module-testimonials.layout-8, .s123-module-testimonials.layout-9');$sections.each(function( index ) {var $s = $(this);var $carousel = $s.find('[data-ride="carousel"]');var layout_customize = $s.find('.layout-customize').length > 0 ? tryParseJSON($s.find('.layout-customize').val()) : '';var testimonialsInterval = 10000;if ( layout_customize != '' ) {testimonialsInterval = layout_customize.testimonialsInterval * 1000;}
$carousel.carousel({interval: isMobileDevice.any() ? false : testimonialsInterval});$carousel.find('.carousel-control.left').click(function() {$carousel.carousel('prev');});$carousel.find('.carousel-control.right').click(function() {$carousel.carousel('next');});$carousel.find('.carousel-indicators li').click(function(){$carousel.carousel($(this).data('slide-to'));});});});$( document ).on( "s123.page.load", function( event ) {setTestimonialsHeight();});if ( IsWizard() ) {$(document).on('wizard.preview.device.changed', function( event ) {setTestimonialsHeight();});}
function setTestimonialsHeight() {var $sections = $('.s123-module-testimonials.layout-1, .s123-module-testimonials.layout-8, .s123-module-testimonials.layout-9');$sections.each(function( index ) {var $s = $(this);var $carousel = $s.find('[data-ride="carousel"]');$carousel.find('.item, .testimonial-image').css({ minHeight: '' });if ( !IsIE11() ) {var selector = $s.hasClass('layout-8') && findBootstrapEnvironment() !== 'xs' ? '.testimonial-image' : '.item';$carousel.find(selector).css({minHeight: Math.max.apply(Math, $carousel.find('.item').map(function() { return $(this).outerHeight(); }))});}});}}
jQuery(function($) {TestimonialsModuleInitialize_Layouts();setTimeout(function() {var $globalSections = $('.global-layout-2');if ($globalSections.length > 0 && typeof window.GlobalLayout2 === 'undefined') {const script = document.createElement('script');script.src = '/versions/2/wizard/modules/globalLayouts/globalLayout-vertical-scroll/js/module.globalLayout-2.js';document.head.appendChild(script);}}, 500);});function TestimonialsModuleInitialize_Layouts() {$(document).on('s123.page.ready', function( event ) {var $sections = $('.s123-module-testimonials');$sections.each(function( index ) {var $s = $(this);var $categories = $s.find('.testimonials-category');var categories = new ModuleLayoutCategories({$items :  $s.find('.testimonials-category'),$categoriesContainer : $s.find('.categories-panel'),$filterButton : $s.find('.items-responsive-filter'),$categories : $s.find('.items-categories-container li')});if ($s.hasClass('layout-13')) {initializeTestimonialsLayout13($s);}
if ($s.hasClass('layout-14') && $s.hasClass('global-layout-2')) {if (typeof window.GlobalLayout2 === 'undefined') {const script = document.createElement('script');script.src = '/versions/2/wizard/modules/globalLayouts/globalLayout-vertical-scroll/js/module.globalLayout-2.js';script.onload = function() {if (typeof window.GlobalLayout2 !== 'undefined') {window.GlobalLayout2.initialize();}};document.head.appendChild(script);} else {if (typeof window.GlobalLayout2.initialize === 'function') {window.GlobalLayout2.initialize();}}}});});}
function initializeTestimonialsLayout13($section) {var $rows = $section.find('.testimonials-row[data-animate="true"]');if ($rows.length === 0) return;function adjustAnimationForScreenSize() {$rows.each(function() {var $row = $(this);var $grid = $row.find('.testimonials-grid');var baseDuration = parseFloat($row.attr('data-animation-duration')) || 30;var totalItems = parseInt($row.attr('data-total-items')) || 0;var originalItems = parseInt($row.attr('data-original-items')) || 0;if (totalItems === 0 || originalItems === 0) return;var screenWidth = $(window).width();var baseScreenWidth = 1920; // Desktop width used in PHP calculation
var itemWidth = screenWidth <= 767 ? 250 : 280; // Mobile vs Desktop
var screenRatio = baseScreenWidth / screenWidth;var adjustedDuration = baseDuration * Math.sqrt(screenRatio); // Use sqrt for gentler scaling
var itemsOnScreen = Math.ceil(screenWidth / itemWidth);var itemRatio = Math.min(originalItems / itemsOnScreen, 3); // Cap at 3x
if (itemRatio < 1.5) {adjustedDuration *= 1.2; // 20% slower for sparse layouts
}
adjustedDuration = Math.max(9, Math.min(adjustedDuration, 106));$grid.css('animation-duration', adjustedDuration + 's');});}
adjustAnimationForScreenSize();var resizeTimer;$(window).on('resize', function() {clearTimeout(resizeTimer);resizeTimer = setTimeout(function() {adjustAnimationForScreenSize();}, 250);});}
jQuery(function($) {TestimonialsModuleInitialize_Layout12();});function TestimonialsModuleInitialize_Layout12() {$(document).on('s123.page.ready', function( event ) {var $sections = $('.s123-module-testimonials.layout-12');$sections.each(function( index ) {var $s = $(this);var $categories = $s.find('.testimonials-category');var categories = new ModuleLayoutCategories({$items :  $s.find('.testimonials-category'),$categoriesContainer : $s.find('.categories-panel'),$filterButton : $s.find('.items-responsive-filter'),$categories : $s.find('.items-categories-container li')});var $carousel = $($s.find('.testimonials-continuous-slider').get(0));var slidesToShow = whatScreen.any() == 'mobile' ? 1 : 3;$(window).on('resize', function() {if (whatScreen.any() == 'mobile') {slidesToShow = 1;} else {slidesToShow = 3;}
$carousel.slick('destroy');testimonialsLayout12Slick($carousel,slidesToShow);});if ( !$carousel.hasClass('slick-initialized') ) {testimonialsLayout12Slick($carousel,slidesToShow);}
$s.on('module_layout_categories.show', function (event, category) {$carousel.slick('destroy');$carousel = $s.find('.testimonials-category[data-categories-filter="'+category+'"] .testimonials-continuous-slider');if ( !$carousel.hasClass('slick-initialized') ) {testimonialsLayout12Slick($carousel,slidesToShow);}});});});}
function testimonialsLayout12Slick( $carousel, slidesToShow ) {$carousel.slick({slidesToShow: slidesToShow,  // number of slides to show at once
slidesToScroll: 1,  // number of slides to scroll at once
autoplay: true,infinite: true,speed: 8000,  // speed of the transition, play with this value to achieve desired effect
autoplaySpeed: 0,  // no delay between auto-play transitions
cssEase: 'linear',  // this gives the linear movement between slides
arrows: false,  // optional: disable arrows
pauseOnHover: true,  // optional: prevent pause when hover
draggable: false,centerMode: false,rtl: $('html').attr('dir') == 'rtl' ? true : false,adaptiveHeight: true});}
jQuery(function($) {TestimonialsModuleInitialize_Layout16();});function TestimonialsModuleInitialize_Layout16() {$(document).on('s123.page.ready', function(event) {var $sections = $('.s123-module-testimonials.layout-16');$sections.each(function(index) {var $s = $(this);var $categories = $s.find('.testimonials-category');var layout_customize = $s.find('.layout-customize').length > 0 ? tryParseJSON($s.find('.layout-customize').val()) : '';var categories = new ModuleLayoutCategories({$items: $s.find('.testimonials-category'),$categoriesContainer: $s.find('.categories-panel'),$filterButton: $s.find('.items-responsive-filter'),$categories: $s.find('.items-categories-container li')});$categories.each(function(catIndex) {var $category = $(this);initializeTestimonialStack($category, layout_customize);});});});}
function initializeTestimonialStack($category, layout_customize) {if ($category.data('testimonials-initialized')) {return;}
var $cards = $category.find('.testimonial-card');var $prevBtn = $category.find('.testimonials-stack-prev');var $nextBtn = $category.find('.testimonials-stack-next');var autoRotateInterval = null;var isAnimating = false;var isMouseHovering = false;var isEditableFocused = false;var rotationInterval = 10000;if ($cards.length === 0) return;var categoryId = $category.attr('data-categories-filter') || 'default-' + Math.random().toString(36).substr(2, 9);var visibilityEventName = 'visibilitychange.testimonials-' + categoryId;$category.data('testimonials-initialized', true);var allItems = [];$cards.each(function(index) {allItems.push({element: $(this),uniqueId: $(this).data('unique-id'),itemIndex: $(this).data('item-index')});});var currentIndex = 0;var totalItems = allItems.length;var cardCountClass = 'cards-' + Math.min(totalItems, 5);$category.find('.testimonials-stack-wrapper').addClass(cardCountClass);function rotateForward() {if (document.hidden) return;if (isAnimating || totalItems <= 1) return;isAnimating = true;$cards.addClass('animating');var maxPosition = totalItems - 1; // Highest position (e.g., 5 for 6 cards)
var movedCardId = null;$cards.each(function() {var $card = $(this);var currentPos = parseInt($card.attr('data-stack-position'));if (currentPos === maxPosition) {$card.attr('data-stack-position', 0);movedCardId = $card.data('unique-id');}});setTimeout(function() {if (document.hidden) {$cards.removeClass('animating');isAnimating = false;return;}
$cards.each(function() {var $card = $(this);var currentPos = parseInt($card.attr('data-stack-position'));var cardId = $card.data('unique-id');if (cardId !== movedCardId && currentPos !== maxPosition) {var newPos = currentPos + 1;$card.attr('data-stack-position', newPos);}});}, 200);currentIndex = (currentIndex - 1 + totalItems) % totalItems;setTimeout(function() {if (document.hidden) {$cards.removeClass('animating');isAnimating = false;return;}
$cards.removeClass('animating');isAnimating = false;}, 700);}
function rotateBackward() {if (document.hidden) return;if (isAnimating || totalItems <= 1) return;isAnimating = true;$cards.addClass('animating');var maxPosition = totalItems - 1; // Highest position (e.g., 5 for 6 cards)
var movedCardId = null;$cards.each(function() {var $card = $(this);var currentPos = parseInt($card.attr('data-stack-position'));if (currentPos === 0) {$card.attr('data-stack-position', maxPosition);movedCardId = $card.data('unique-id');}});setTimeout(function() {if (document.hidden) {$cards.removeClass('animating');isAnimating = false;return;}
$cards.each(function() {var $card = $(this);var currentPos = parseInt($card.attr('data-stack-position'));var cardId = $card.data('unique-id');if (cardId !== movedCardId && currentPos > 0) {var newPos = currentPos - 1;$card.attr('data-stack-position', newPos);}});}, 200);currentIndex = (currentIndex + 1) % totalItems;setTimeout(function() {if (document.hidden) {$cards.removeClass('animating');isAnimating = false;return;}
$cards.removeClass('animating');isAnimating = false;}, 700);}
function shouldPauseRotation() {return isMouseHovering || isEditableFocused;}
function updateRotationState() {if (shouldPauseRotation()) {stopAutoRotate();} else {startAutoRotate();}}
function startAutoRotate() {if (shouldPauseRotation()) {return;}
stopAutoRotate();if (totalItems > 1) {autoRotateInterval = setInterval(function() {rotateForward();}, rotationInterval); // 10 seconds
}}
function stopAutoRotate() {if (autoRotateInterval) {clearInterval(autoRotateInterval);autoRotateInterval = null;}}
function resetAutoRotate() {stopAutoRotate();startAutoRotate();}
$nextBtn.on('click', function(e) {e.preventDefault();rotateForward();resetAutoRotate();});$prevBtn.on('click', function(e) {e.preventDefault();rotateBackward();resetAutoRotate();});$cards.on('mouseenter', function() {isMouseHovering = true;updateRotationState();});$cards.on('mouseleave', function() {isMouseHovering = false;updateRotationState();});$category.on('focus', '[data-inline-edit-field]', function() {isEditableFocused = true;updateRotationState();});$category.on('blur', '[data-inline-edit-field]', function() {isEditableFocused = false;updateRotationState();});$category.find('.testimonial-favicon-link[data-rel="tooltip"]').each(function() {if (typeof $(this).tooltip === 'function') {$(this).tooltip();}});$(document).on('keydown', function(e) {if (!$category.is(':visible')) return;if ( isEditableFocused ) return;if (e.keyCode === 37) {rotateBackward();resetAutoRotate();} else if (e.keyCode === 39) {rotateForward();resetAutoRotate();}});startAutoRotate();$(document).off(visibilityEventName).on(visibilityEventName, function() {if (document.hidden) {stopAutoRotate();$cards.removeClass('animating');isAnimating = false;} else {if ($category.is(':visible')) {isAnimating = false; // Ensure flag is reset
updateRotationState();}}});$category.on('module_layout_categories.hide', function() {stopAutoRotate();$(document).off(visibilityEventName);$category.removeData('testimonials-initialized');});$category.on('module_layout_categories.show', function() {updateRotationState();});}
jQuery(function($) {GlobalCarouselModuleInitialize();});function GlobalCarouselModuleInitialize() {$( document ).on( "module_layout_categories.shown", function( event, categoryFilter ) {requestAnimationFrame(function() {var $visibleCarousels = $('.global-carousel-category[data-categories-filter="' + categoryFilter + '"] .s123-module-global-carousel-slider');$visibleCarousels.each(function() {var $carousel = $(this);var $section = $carousel.closest('.s123-module');var layout_customize = $section.find('.layout-customize').length > 0 ? tryParseJSON($section.find('.layout-customize').val()) : '';var intervalSetting = layout_customize && (layout_customize.carouselInterval || layout_customize.testimonialsInterval);var globalCarouselInterval = intervalSetting ? intervalSetting * 1000 : 10000;var carouselId = $carousel.attr('data-carousel-id') || 'unknown';if (!$carousel.data('carousel-initialized')) {initializeGlobalCarousel($carousel, globalCarouselInterval);} else {$carousel.data('currentIndex', 0);var $dots = $carousel.find('.s123-module-global-carousel-dot');$dots.removeClass('active').first().addClass('active');var $track = $carousel.find('.s123-module-global-carousel-track');if ($track.length > 0) {$track.css('transition', 'transform 0.5s ease');$track.css('transform', 'translateX(0px)');}}
bindCarouselArrowEvents($carousel);if (typeof S123 !== 'undefined' && S123.s123IconToSvg) {$(document).trigger('s123.page.ready.s123IconToSvg');}});setGlobalCarouselHeight();});});$(document).on('s123.page.ready', function( event ) {var $sections = $('.s123-module').has('.s123-module-global-carousel-slider');$sections.each(function() {var $s = $(this);if ($s.find('.items-categories-container li').length > 0) {var categories = new ModuleLayoutCategories({$items: $s.find('.global-carousel-category'),$categoriesContainer: $s.find('.s123-categories'),$filterButton: $s.find('.items-responsive-filter'),$categories: $s.find('.items-categories-container li')});}});var $carousels = $('.s123-module-global-carousel-slider').filter(function() {return $(this).closest('.global-carousel-category').is(':visible');});$carousels.each(function( index ) {var $carousel = $(this);var $section = $carousel.closest('.s123-module');var layout_customize = $section.find('.layout-customize').length > 0 ? tryParseJSON($section.find('.layout-customize').val()) : '';var globalCarouselInterval = 10000;if ( layout_customize != '' ) {var intervalSetting = layout_customize.carouselInterval || layout_customize.testimonialsInterval;if (intervalSetting) {globalCarouselInterval = intervalSetting * 1000;}}
initializeGlobalCarousel($carousel, globalCarouselInterval);bindCarouselArrowEvents($carousel);if (typeof S123 !== 'undefined' && S123.s123IconToSvg) {$(document).trigger('s123.page.ready.s123IconToSvg');}});});$( document ).on( "s123.page.load", function( event ) {setGlobalCarouselHeight();});if ( IsWizard() ) {$(document).on('wizard.preview.device.changed', function( event ) {setGlobalCarouselHeight();});}}
function bindCarouselArrowEvents($carousel) {var isRTL = $('html').attr('dir') === 'rtl';var carouselId = $carousel.attr('data-carousel-id') || 'default';$carousel.find('.s123-module-global-carousel-arrow-right, .s123-module-global-carousel-arrow-left, .s123-module-global-carousel-dot').off('click.globalCarousel' + carouselId);$carousel.find('.s123-module-global-carousel-arrow-right').on('click.globalCarousel' + carouselId, function(e) {e.preventDefault();e.stopPropagation();if (isRTL) {$carousel.trigger('globalCarousel.next');} else {$carousel.trigger('globalCarousel.next');}});$carousel.find('.s123-module-global-carousel-arrow-left').on('click.globalCarousel' + carouselId, function(e) {e.preventDefault();e.stopPropagation();if (isRTL) {$carousel.trigger('globalCarousel.prev');} else {$carousel.trigger('globalCarousel.prev');}});$carousel.find('.s123-module-global-carousel-dot').on('click.globalCarousel' + carouselId, function(e){e.preventDefault();e.stopPropagation();$carousel.trigger('globalCarousel.goTo', $(this).data('slide-to'));});}
function initializeGlobalCarousel($carousel, globalCarouselInterval) {var $track = $carousel.find('.s123-module-global-carousel-track');var $slides = $carousel.find('.s123-module-global-carousel-slide');var $dots = $carousel.find('.s123-module-global-carousel-dot');if ($carousel.data('carousel-initialized')) {return;}
$carousel.data('carousel-initialized', true);var originalSlides = parseInt($carousel.attr('data-original-slides')) || $slides.length;var totalSlides = $slides.length;$carousel.data('currentIndex', 0);$carousel.data('originalSlides', originalSlides);$carousel.data('totalSlides', totalSlides);var slideWidth = $slides.first().outerWidth();var slideGap = 20;var slideStep = slideWidth + slideGap;var originalItemsData = [];try {originalItemsData = JSON.parse($carousel.attr('data-original-items') || '[]');} catch(e) {console.error('Failed to parse original items data');}
$carousel.data('originalItemsData', originalItemsData);function addClonesAtEnd() {var originalSlides = $carousel.data('originalSlides');var $currentSlides = $track.find('.s123-module-global-carousel-slide');var currentCount = $currentSlides.length;for (var i = 0; i < originalSlides; i++) {var $originalSlide = $currentSlides.eq(i);var $clone = $originalSlide.clone(true);$clone.attr('data-slide-index', currentCount + i);$clone.attr('data-is-clone', 'true');$track.append($clone);}
$carousel.data('totalSlides', $track.find('.s123-module-global-carousel-slide').length);if (typeof lazyLoadInit === 'function') {lazyLoadInit();}}
function recalculateDimensions() {var $currentSlides = $track.find('.s123-module-global-carousel-slide');if ($currentSlides.length === 0) return;slideWidth = $currentSlides.first().outerWidth();slideStep = slideWidth + slideGap;var windowWidth = $(window).width();if (windowWidth >= 768 && windowWidth <= 1024) {slideGap = 18;slideStep = slideWidth + slideGap;} else if (windowWidth <= 767) {slideGap = 15;slideStep = slideWidth + slideGap;} else {slideGap = 20;slideStep = slideWidth + slideGap;}}
function updateSliderPosition(instant) {var isRTL = $('html').attr('dir') === 'rtl';var translateX;var currentIndex = $carousel.data('currentIndex') || 0;var originalSlides = $carousel.data('originalSlides');if (instant) {$track.addClass('no-transition');$track[0].offsetHeight;}
if (isRTL) {translateX = (currentIndex * slideStep);} else {translateX = -(currentIndex * slideStep);}
$track.css('transform', 'translateX(' + translateX + 'px)');if (instant) {requestAnimationFrame(function() {$track.removeClass('no-transition');});}
var mappedIndex = currentIndex % originalSlides;$dots.removeClass('active');if ($dots.length > 0) {$dots.eq(mappedIndex).addClass('active');}}
function nextSlide() {var currentIndex = $carousel.data('currentIndex') || 0;var originalSlides = $carousel.data('originalSlides');var totalSlides = $carousel.data('totalSlides');var shouldStartCloning = true;if (originalSlides > 10 && currentIndex < 5) {shouldStartCloning = false;}
var nextIndex = currentIndex + 1;if (shouldStartCloning && nextIndex > 0 && nextIndex % originalSlides === 0) {var nextSet = Math.floor(nextIndex / originalSlides);if (nextSet >= 2) {recalculateDimensions();$track.addClass('no-transition');$track.css('transition', 'none');$track[0].offsetHeight; // Force reflow
var $currentSlides = $track.find('.s123-module-global-carousel-slide');$currentSlides.slice(0, originalSlides).remove();currentIndex = currentIndex - originalSlides;nextIndex = nextIndex - originalSlides;$carousel.data('currentIndex', currentIndex);totalSlides = $track.find('.s123-module-global-carousel-slide').length;$carousel.data('totalSlides', totalSlides);$track.find('.s123-module-global-carousel-slide').each(function(idx) {$(this).attr('data-slide-index', idx);});var isRTL = $('html').attr('dir') === 'rtl';var translateX = isRTL ? (currentIndex * slideStep) : -(currentIndex * slideStep);$track.css('transform', 'translateX(' + translateX + 'px)');$track[0].offsetHeight;$track.removeClass('no-transition');$track.css('transition', '');}}
currentIndex = nextIndex;$carousel.data('currentIndex', currentIndex);totalSlides = $carousel.data('totalSlides');var needsClones = currentIndex >= totalSlides - (originalSlides * 2);if (shouldStartCloning && needsClones) {addClonesAtEnd();addClonesAtEnd();$carousel.data('totalSlides', $track.find('.s123-module-global-carousel-slide').length);}
updateSliderPosition(false);}
function prevSlide() {var currentIndex = $carousel.data('currentIndex') || 0;currentIndex = currentIndex - 1;if (currentIndex < 0) {currentIndex = 0;}
$carousel.data('currentIndex', currentIndex);updateSliderPosition(false);}
function goToSlide(index) {var originalSlides = $carousel.data('originalSlides');var currentIndex = $carousel.data('currentIndex') || 0;var currentSet = Math.floor(currentIndex / originalSlides);var targetIndex = (currentSet * originalSlides) + index;var totalSlides = $carousel.data('totalSlides');if (targetIndex >= 0 && targetIndex < totalSlides) {$carousel.data('currentIndex', targetIndex);updateSliderPosition(false);}}
var carouselId = $carousel.attr('data-carousel-id') || 'default';$carousel.off('globalCarousel.next.carousel' + carouselId + ' globalCarousel.prev.carousel' + carouselId + ' globalCarousel.goTo.carousel' + carouselId);var autoPlayInterval;var startAutoPlay, stopAutoPlay;if (globalCarouselInterval && globalCarouselInterval > 0) {if (typeof isMobileDevice !== 'undefined' && !isMobileDevice.any()) {startAutoPlay = function() {stopAutoPlay(); // Clear any existing interval
autoPlayInterval = setInterval(function() {nextSlide();}, globalCarouselInterval);};stopAutoPlay = function() {if (autoPlayInterval) {clearInterval(autoPlayInterval);autoPlayInterval = null;}};var carouselId = $carousel.attr('data-carousel-id') || $carousel.attr('data-total-slides') || Math.random().toString(36);$(document).off('visibilitychange.globalCarousel' + carouselId);$(window).off('blur.globalCarousel' + carouselId);$(window).off('focus.globalCarousel' + carouselId);$(window).on('blur.globalCarousel' + carouselId, function() {stopAutoPlay();});$(window).on('focus.globalCarousel' + carouselId, function() {$carousel.data('currentIndex', 0);requestAnimationFrame(function() {recalculateDimensions();updateSliderPosition(false);startAutoPlay();});});startAutoPlay();}}
$carousel.on('globalCarousel.next.carousel' + carouselId, function() {nextSlide();if (typeof startAutoPlay === 'function') {startAutoPlay();}});$carousel.on('globalCarousel.prev.carousel' + carouselId, function() {prevSlide();if (typeof startAutoPlay === 'function') {startAutoPlay();}});$carousel.on('globalCarousel.goTo.carousel' + carouselId, function(event, index) {goToSlide(index);if (typeof startAutoPlay === 'function') {startAutoPlay();}});$(window).off('resize.globalSlider' + carouselId).on('resize.globalSlider' + carouselId, function() {recalculateDimensions();updateSliderPosition(false);setGlobalCarouselHeight();});requestAnimationFrame(function() {recalculateDimensions();updateSliderPosition(false);setGlobalCarouselHeight();});}
function setGlobalCarouselHeight() {var $sections = $('.s123-module-global-carousel-slider').closest('.s123-module');$sections.each(function() {var $s = $(this);var $carousel = $s.find('.s123-module-global-carousel-slider');$carousel.find('.s123-module-global-carousel-slide, .box').css({ minHeight: '' });});}
function tryParseJSON(jsonString) {try {var o = JSON.parse(jsonString);if (o && typeof o === "object") {return o;}} catch (e) {return false;}
return false;}
jQuery(function($) {TwitterTweetsModuleInitialize();});function TwitterTweetsModuleInitialize() {$(document).on('s123.page.ready', function( event ) {var $section = $('section.s123-module-twitter-tweets');$section.each(function( index ) {var $sectionThis = $(this);$sectionThis.find('.tweet-settings').each(function(){const $settings = $(this);const settings = tryParseJSON($settings.val());if ( !settings ) return;$settings.replaceWith(`<blockquote class="twitter-tweet" data-dnt="true" data-theme="${settings.theme}"><a href="${settings.tweetURL}">${settings.title}</a></blockquote><script class="twitter-tweet-script" async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>`);});});});}
jQuery(function($) {TwitterTweetsLayout2ModuleInitialize();});function TwitterTweetsLayout2ModuleInitialize() {$(document).on('s123.page.ready', function(event) {var $sections = $('section.s123-module-twitter-tweets.layout-2');$sections.each(function(index) {var $sectionThis = $(this);initializeTwitterTweetsLayout2($sectionThis);});});}
var twitterWidgetsLoaded = false;var twitterWidgetsLoading = false;var logCounters = {initializeSection: 0,loadWidgets: 0,setupEventListeners: 0,monitoringSetup: 0,tweetProcessing: 0};function initializeTwitterTweetsLayout2($section) {logCounters.initializeSection++;if (logCounters.initializeSection > 3) {return;}
var tweetSettings = $section.find('.item-set-1 .tweet-settings').length;var existingTweets = $section.find('.item-set-1 .twitter-tweet').length;if (tweetSettings === 0 && existingTweets === 0) {return;}
if (existingTweets > 0) {setTimeout(function() {var $allTwitterIframes = $('iframe[id*="twitter-widget"]');if ($allTwitterIframes.length > 0) {$allTwitterIframes.each(function() {var $iframe = $(this);var currentLoading = $iframe.attr('loading');if (currentLoading !== 'lazy') {$iframe.attr('loading', 'lazy');}});}}, 2000);}
if (tweetSettings > 0) {$section.find('.item-set-1 .tweet-settings').each(function(index) {const $settings = $(this);const $tweetBody = $settings.closest('.tweet-body');if ($tweetBody.find('[data-tweet-processed="true"]').length > 0) {return;}
logCounters.tweetProcessing++;const settings = tryParseJSON($settings.val());if (!settings) {$tweetBody.html('<div class="tweet-error">Invalid tweet configuration</div>');return;}
const $existingTweet = $tweetBody.find('.twitter-tweet[data-iframe-loaded="true"], .twitter-tweet[data-iframe-preserved="true"]');if ($existingTweet.length > 0) {return; // Skip recreating tweet
}
$tweetBody.html('<div class="tweet-loading"></div>');try {const tweetHTML = `<blockquote class="twitter-tweet" data-dnt="true" data-theme="${settings.theme}" data-conversation="none" data-cards="hidden" data-width="300" data-lang="en" data-limit="1" data-tweet-url="${settings.tweetURL}" data-tweet-title="${settings.title}">
<div class="tweet-placeholder" style="min-height: 200px; border: 1px solid #e1e8ed; border-radius: 12px; padding: 20px; background: #f7f9fa; display: flex; align-items: center; justify-content: center; color: #657786; font-size: 14px;">
<div style="text-align: center;">
<div style="margin-bottom: 8px;">🐦</div>
<div>Tweet will load when visible</div>
</div>
</div>
<a href="${settings.tweetURL}" style="display: none;">${settings.title}</a>
</blockquote>`;$settings.replaceWith(tweetHTML);const $newTweet = $tweetBody.find('.twitter-tweet');$newTweet.attr('role', 'article');$newTweet.attr('aria-label', 'Twitter Tweet');const $correspondingItem = $tweetBody.closest('.global-layout-2-item');const uniqueId = $correspondingItem.data('unique-id');if (uniqueId) {const $correspondingItemSet2 = $section.find('.item-set-2 .global-layout-2-item[data-unique-id="' + uniqueId + '-copy"]');if ($correspondingItemSet2.length > 0) {const $tweetBodySet2 = $correspondingItemSet2.find('.tweet-body');$tweetBodySet2.html($tweetBody.html());}}} catch (error) {$tweetBody.html('<div class="tweet-error">Error loading tweet</div>');}});}
loadTwitterWidgetsOnce();if (!$section.data('twitter-monitoring-setup')) {logCounters.monitoringSetup++;$section.data('twitter-monitoring-setup', true);monitorTweetLoading($section);}}
function loadTwitterWidgetsOnce() {logCounters.loadWidgets++;if (logCounters.loadWidgets > 5) {return;}
if (twitterWidgetsLoaded || twitterWidgetsLoading) {return;}
if (typeof twttr !== 'undefined') {twitterWidgetsLoaded = true;setupTwitterEventListeners();return;}
if (!document.querySelector('script[src*="platform.twitter.com/widgets.js"]')) {twitterWidgetsLoading = true;const script = document.createElement('script');script.async = true;script.src = 'https://platform.twitter.com/widgets.js';
script.charset = 'utf-8';script.className = 'twitter-widgets-script';script.onload = function() {twitterWidgetsLoaded = true;twitterWidgetsLoading = false;if (typeof twttr !== 'undefined') {setupTwitterEventListeners();}};script.onerror = function() {twitterWidgetsLoading = false;$('.tweet-loading').each(function() {$(this).replaceWith('<div class="tweet-error">Failed to load Twitter widgets</div>');});};document.head.appendChild(script);} else {twitterWidgetsLoading = true;}}
function setupTwitterEventListeners() {logCounters.setupEventListeners++;if (logCounters.setupEventListeners > 2) {return;}
if (window.twitterEventListenersSetup) {return;}
window.twitterEventListenersSetup = true;if (typeof twttr !== 'undefined') {twttr.events.bind('rendered', function(event) {const $iframe = $(event.target);if ($iframe.length) {const iframeId = $iframe.attr('id');if (iframeId && iframeId.includes('twitter-widget')) {$iframe.attr('loading', 'lazy');try {const iframeDoc = $iframe[0].contentDocument || $iframe[0].contentWindow.document;const images = iframeDoc.querySelectorAll('img');images.forEach(function(img) {img.setAttribute('loading', 'lazy');});} catch (e) {}}
$iframe.css({'width': '100%','max-width': 'none','height': '240px','max-height': '240px'});try {$iframe.contents().find('span').css('font-size', '13px');$iframe.contents().find('body').css('font-size', '13px');} catch (e) {$iframe.closest('.twitter-tweet').css({'font-size': '13px','line-height': '1.3'});}
applyLazyLoadingToTweetImages($iframe);$iframe.closest('.twitter-tweet').attr('data-iframe-loaded', 'true');$iframe.closest('.global-layout-2-item').find('.tweet-loading').remove();}});twttr.events.bind('loaded', function(event) {});}}
function monitorTweetLoading($section) {setTimeout(function() {$section.find('.twitter-tweet').each(function() {const $tweet = $(this);if (!$tweet.attr('data-rendered') && !$tweet.find('iframe').length) {const $errorDiv = $('<div class="tweet-error">Tweet could not be loaded</div>');$tweet.replaceWith($errorDiv);}});}, 15000); // Wait 15 seconds for tweets to load (increased from 10s)
}
function refreshTwitterTweetsLayout2($section) {initializeTwitterTweetsLayout2($section);}
function initializeTwitterTweetsLayout2ManualCarousel($section) {$section.find('.global-layout-2-column').each(function() {var $column = $(this);var $grid = $column.find('.global-layout-2-grid');if ($grid.length > 0 && $column.data('animate') === true) {var animationDuration = $column.data('animation-duration') || 60;var direction = $column.data('direction') || 'up';$grid.css('animation-duration', animationDuration + 's');$column.on('mouseenter', function() {$grid.css('animation-play-state', 'paused');});$column.on('mouseleave', function() {$grid.css('animation-play-state', 'running');});}});}
function tryParseJSON(jsonString) {try {return JSON.parse(jsonString);} catch (e) {return null;}}
window.TwitterTweetsLayout2 = {initialize: TwitterTweetsLayout2ModuleInitialize,refresh: refreshTwitterTweetsLayout2,loadWidgets: loadTwitterWidgetsOnce};function showLoggingSummary() {if (logCounters.initializeSection > 5) {}
if (logCounters.loadWidgets > 3) {}
if (logCounters.setupEventListeners > 1) {}
if (logCounters.tweetProcessing > 20) {}}
setTimeout(function() {showLoggingSummary();setInterval(showLoggingSummary, 30000); // Every 30 seconds
}, 10000); // First summary after 10 seconds
function optimizeTwitterIframeRendering($section) {$section.find('iframe[id^="twitter-widget"]').each(function() {const iframe = this;$(iframe).css({'transform': 'translateZ(0)','backface-visibility': 'hidden','will-change': 'auto'});});}
$(document).ready(function() {if (typeof window.GlobalLayout2 === 'undefined') {const script = document.createElement('script');script.src = '/versions/2/wizard/modules/globalLayouts/globalLayout-vertical-scroll/js/module.globalLayout-2.js';document.head.appendChild(script);}
setTimeout(function() {$('.s123-module-twitter-tweets.layout-2').each(function() {optimizeTwitterIframeRendering($(this));});}, 2000); // Wait for tweets to load
});function addLazyLoadingToExistingTwitterIframes($section) {const $twitterIframes = $section.find('iframe[id*="twitter-widget"]');if ($twitterIframes.length === 0) {return;}
$twitterIframes.each(function(index) {const $iframe = $(this);const iframeId = $iframe.attr('id');const currentLoading = $iframe.attr('loading');if (currentLoading !== 'lazy') {$iframe.attr('loading', 'lazy');try {const iframeDoc = $iframe[0].contentDocument || $iframe[0].contentWindow.document;const images = iframeDoc.querySelectorAll('img');images.forEach(function(img) {if (img.getAttribute('loading') !== 'lazy') {img.setAttribute('loading', 'lazy');}});} catch (e) {}}});}
function setupPeriodicTwitterIframeScan($section) {if ($section.data('twitter-iframe-scanner-setup')) {return;}
$section.data('twitter-iframe-scanner-setup', true);let scanCount = 0;const maxScans = 30; // Safety limit to prevent infinite scanning
const scanInterval = setInterval(function() {scanCount++;const $pendingBlockquotes = $section.find('.twitter-tweet-lazy');if ($pendingBlockquotes.length === 0) {clearInterval(scanInterval);return;}
const $newIframes = $section.find('iframe[id*="twitter-widget"]:not([loading="lazy"])');if ($newIframes.length > 0) {$newIframes.each(function() {const $iframe = $(this);const iframeId = $iframe.attr('id');$iframe.attr('loading', 'lazy');try {const iframeDoc = $iframe[0].contentDocument || $iframe[0].contentWindow.document;const images = iframeDoc.querySelectorAll('img:not([loading="lazy"])');images.forEach(function(img) {img.setAttribute('loading', 'lazy');});} catch (e) {}});}
if (scanCount >= maxScans) {clearInterval(scanInterval);}}, 1000); // Scan every 1 second
}
function setupTwitterIframeLazyLoading($section) {const $lazyTweets = $section.find('.twitter-tweet-lazy[data-lazy-load="true"]');if ($lazyTweets.length === 0) {const $allTweets = $section.find('.twitter-tweet');return;}
const observer = new IntersectionObserver(function(entries) {entries.forEach(function(entry) {if (entry.isIntersecting) {const $tweet = $(entry.target);if ($tweet.data('loading') || $tweet.attr('data-iframe-loaded') === 'true') {return;}
$tweet.data('loading', true);const tweetURL = $tweet.attr('data-tweet-url');const tweetTitle = $tweet.attr('data-tweet-title');if (tweetURL && tweetTitle) {$tweet.html(`<a href="${tweetURL}">${tweetTitle}</a>`);$tweet.removeAttr('data-lazy-load')
.removeAttr('data-tweet-url')
.removeAttr('data-tweet-title')
.removeClass('twitter-tweet-lazy');if (typeof twttr !== 'undefined' && twttr.widgets && twttr.widgets.load) {twttr.widgets.load($tweet[0]);}}
observer.unobserve(entry.target);}});}, {root: null, // Use viewport as root
threshold: 0.1, // Trigger when 10% visible
rootMargin: '100px' // Start loading 100px before entering viewport
});$lazyTweets.each(function(index) {observer.observe(this);});}
function applyLazyLoadingToTweetImages($iframe) {try {const iframe = $iframe[0];if (!iframe || !iframe.contentDocument) {return;}
const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;const images = iframeDoc.querySelectorAll('img');if (images.length === 0) {return;}
const observer = new IntersectionObserver(function(entries) {entries.forEach(function(entry) {if (entry.isIntersecting) {const img = entry.target;const lazySrc = img.getAttribute('data-src') || img.getAttribute('data-lazy-src');if (lazySrc && !img.src) {img.src = lazySrc;img.removeAttribute('data-src');img.removeAttribute('data-lazy-src');}
observer.unobserve(img);}});}, {root: null, // Use viewport as root
threshold: 0.1,rootMargin: '50px' // Start loading 50px before image enters viewport
});images.forEach(function(img) {if (img.src && !img.getAttribute('data-src') && !img.getAttribute('data-lazy-src')) {img.setAttribute('data-lazy-src', img.src);img.removeAttribute('src');}
observer.observe(img);});} catch (error) {}}
function addSmoothAnimationResetHandling($iframe) {try {const $grid = $iframe.closest('.global-layout-2-grid');const $column = $iframe.closest('.global-layout-2-column');if ($grid.length === 0 || $column.length === 0) {return;}
const animationDuration = parseFloat($column.data('animation-duration')) || 17;const animationDurationMs = animationDuration * 1000;let lastTransform = '';let resetCount = 0;const checkAnimationReset = () => {const currentTransform = window.getComputedStyle($grid[0]).transform;if (currentTransform.includes('matrix(1, 0, 0, 1, 0, 0)') ||currentTransform.includes('matrix(1, 0, 0, 1, 0, -')) {if (lastTransform && lastTransform !== currentTransform) {resetCount++;$grid.css('opacity', '0.98');setTimeout(() => {$grid.css('opacity', '1');}, 50); // Very brief opacity change to mask the flash
}}
lastTransform = currentTransform;};const resetInterval = setInterval(checkAnimationReset, animationDurationMs / 10);setTimeout(() => {clearInterval(resetInterval);}, 300000); // 5 minutes
} catch (error) {}}
