1/** 2 * Dependency-free slider for .agc-novi-slider, replicating the behavior 3 * of the old agcga-imis Swiper init (extracted 2026-08-12): slides per 4 * view 1 (<768px) / 2 (<1024px) / 3 (>=1024px), grouped paging, 20px 5 * gaps, 1.2s ease, prev/next arrows, clickable bullets. 6 */ 7( function () { 8 'use strict'; 9 10 var GAP = 20; 11 var SPEED_MS = 1200; 12 13 function slidesPerView( width ) { 14 if ( width >= 1024 ) return 3; 15 if ( width >= 768 ) return 2; 16 return 1; 17 } 18 19 function initSlider( root ) { 20 var wrapper = root.querySelector( '.swiper-wrapper' ); 21 var slides = wrapper ? wrapper.children : []; 22 if ( ! wrapper || ! slides.length ) return; 23 24 var prev = root.querySelector( '.swiper-button-prev' ); 25 var next = root.querySelector( '.swiper-button-next' ); 26 var pagination = root.querySelector( '.swiper-pagination' ); 27 28 var perView = 0; 29 var page = 0; 30 var retries = 0; 31 32 function pageCount() { 33 return Math.max( 1, Math.ceil( slides.length / perView ) ); 34 } 35 36 function layout() { 37 // A container measured at 0 (fonts/sections still settling) 38 // would write 0px slide widths â wait for real geometry. 39 if ( root.clientWidth < 60 ) { 40 if ( retries < 40 ) { 41 retries++; 42 setTimeout( layout, 125 ); 43 } 44 return; 45 } 46 perView = slidesPerView( root.clientWidth ); 47 var slideWidth = ( root.clientWidth - GAP * ( perView - 1 ) ) / perView; 48 for ( var i = 0; i < slides.length; i++ ) { 49 slides[ i ].style.width = slideWidth + 'px'; 50 slides[ i ].style.marginRight = i === slides.length - 1 ? '0' : GAP + 'px'; 51 } 52 page = Math.min( page, pageCount() - 1 ); 53 update(); 54 } 55 56 function update() { 57 var slideWidth = ( root.clientWidth - GAP * ( perView - 1 ) ) / perView; 58 // Last page aligns to the final slide instead of leaving a gap. 59 var maxStart = Math.max( 0, slides.length - perView ); 60 var startSlide = Math.min( page * perView, maxStart ); 61 wrapper.style.transform = 'translateX(-' + startSlide * ( slideWidth + GAP ) + 'px)'; 62 63 if ( prev ) prev.classList.toggle( 'agc-disabled', page === 0 ); 64 if ( next ) next.classList.toggle( 'agc-disabled', page >= pageCount() - 1 ); 65 renderBullets(); 66 } 67 68 function renderBullets() { 69 if ( ! pagination ) return; 70 var total = pageCount(); 71 var html = ''; 72 for ( var i = 0; i < total; i++ ) { 73 html += '<span class="swiper-pagination-bullet' + ( i === page ? ' swiper-pagination-bullet-active' : '' ) + '" data-page="' + i + '" role="button" aria-label="Go to slide group ' + ( i + 1 ) + '"></span>'; 74 } 75 pagination.innerHTML = html; 76 } 77 78 function goTo( target ) { 79 page = Math.max( 0, Math.min( target, pageCount() - 1 ) ); 80 update(); 81 } 82 83 if ( prev ) prev.addEventListener( 'click', function () { goTo( page - 1 ); } ); 84 if ( next ) next.addEventListener( 'click', function () { goTo( page + 1 ); } ); 85 if ( pagination ) { 86 pagination.addEventListener( 'click', function ( event ) { 87 var bullet = event.target.closest( '[data-page]' ); 88 if ( bullet ) goTo( parseInt( bullet.getAttribute( 'data-page' ), 10 ) ); 89 } ); 90 } 91 92 var resizeTimer = null; 93 window.addEventListener( 'resize', function () { 94 clearTimeout( resizeTimer ); 95 resizeTimer = setTimeout( layout, 150 ); 96 } ); 97 98 wrapper.style.transition = 'transform ' + SPEED_MS + 'ms ease'; 99 layout(); 100 window.addEventListener( 'load', layout ); 101 } 102 103 function boot() { 104 var sliders = document.querySelectorAll( '.agc-novi-slider' ); 105 for ( var i = 0; i < sliders.length; i++ ) { 106 initSlider( sliders[ i ] ); 107 } 108 } 109 110 if ( 'loading' === document.readyState ) { 111 document.addEventListener( 'DOMContentLoaded', boot ); 112 } else { 113 boot(); 114 } 115} )();
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.