PageSourceSearch

https://www.gallerieaccademia.it/wp-content/themes/Divi-child/js/custom.js?ver=1.1

js gallerieaccademia.it collected 2026-10-01 10:42:15 UTC 31,020 bytes, 1,078 lines download raw bytes

1jQuery(document).ready(function(){
2	
3    // the same height for all blocks / blog module, grid style
4    var maxHeightBlock = 0;
5	jQuery('.et_pb_blog_grid .et_pb_post').each(function() {maxHeightBlock = Math.max(maxHeightBlock, jQuery(this).height()); }).height(maxHeightBlock);
6    
7});
8
9/* ==========================================================================
10   Menu Toggle
11   ========================================================================== */
12jQuery(function($){
13$('.slide-in-open').click(function(){   
14
15    $('.et_pb_searchform input[name="et_pb_include_pages"]').remove();
16    $('.et_pb_searchform input[name="et_pb_include_posts"]').remove();
17    $('.et_pb_searchform input[name="et_pb_searchform_submit"]').remove();
18    
19$(this).toggleClass('open');
20$('.slide-in-menu-container').toggleClass('slide-in-menu');
21$('body').toggleClass('menu-open');
22});
23});
24
25
26
27jQuery(window).load(function () {
28    setTimeout(function () {
29        setup_collapsible_submenus();
30    }, 981);
31    
32});  
33
34
35function setup_collapsible_submenus() {   
36    jQuery('.et_mobile_menu .first-level ul.sub-menu li').each(function(e){
37        jQuery(this).addClass('second-level');
38    })
39    var clicked = 0
40    var FirstLevel = jQuery('.et_mobile_menu .first-level > a');
41    FirstLevel.off('click').click(function () {
42        
43        var $this = jQuery(this);
44        if (!$this.siblings('.sub-menu').length) {
45            return true;
46        }      
47        
48        jQuery(this).attr('href', '#');
49        if (jQuery(this).attr('class') == 'icon-switch') {
50            jQuery(this).parent().children().children().removeClass('reveal-items')
51            jQuery(this).removeClass('icon-switch')
52        } else {
53            if (FirstLevel.parent().children().children().hasClass('reveal-items')) {
54                FirstLevel.parent().children().children().removeClass('reveal-items')
55                FirstLevel.removeClass('icon-switch')
56            }
57
58            if (jQuery(this).parent().children().children().hasClass('reveal-items')) {
59                jQuery(this).parent().children().children().removeClass('reveal-items')
60                jQuery(this).removeClass('icon-switch')
61            } else {
62                jQuery(this).parent().children().children().addClass('reveal-items')
63                jQuery(this).addClass('icon-switch')
64            }
65        }       
66        return false
67    })
68}
69
70
71
72
73jQuery(document).ready(function ($) {
74    $('.menu-img-1').addClass('active');
75
76    $(document).on('mouseenter', '.first-level[class*="menu-hover-"]', function () {     
77
78        $('[class*="menu-img-"]').removeClass('active');
79
80        let classes = $(this).attr('class');
81        let match = classes.match(/menu-hover-(\d+)/);
82
83        if (match) {
84            let index = match[1];
85            $('.menu-img-' + index).addClass('active');
86        }
87    });
88});
89
90
91/* ==========================================================================
92   language_switcher
93   ========================================================================== */
94
95jQuery(document).ready(function(){
96    var theLanguage = jQuery('html').attr('lang');
97    
98        
99    
100    jQuery('body').on('change','select#lang-switch',function(e){      
101      var selectedVal = jQuery(this).val();      
102      window.location.href = selectedVal;
103      return false;
104  });
105    
106});
107
108
109/* ==========================================================================
110  slick
111   ========================================================================== */
112
113
114jQuery('.whatson-slider').slick({
115        slidesToShow: 1,
116        slidesToScroll: 1,
117        centerMode: false,
118        centerPadding: '0px',
119        autoplay: false,
120        autoplaySpeed: 700,
121        arrows:true,
122        dots: false,
123        pauseOnHover: true,
124        variableWidth: true,
125          nextArrow: '.whatson-slider-btn .custom-next-btn',
126        prevArrow: '.whatson-slider-btn .custom-prev-btn',
127
128    });
129
130
131jQuery('.event-slider').on('init', function () {
132        jQuery(this).find('.slick-prev, .slick-next').wrapAll('<div class="event-nav-wrapper custom-slider-btn"></div>');
133    });
134jQuery('.event-slider').slick({
135        slidesToShow: 1,
136        slidesToScroll: 1,
137        centerMode: true,
138        centerPadding: '0px',
139        autoplay: false,
140        autoplaySpeed: 700,
141        arrows:true,
142        dots: false,
143        pauseOnHover: true,
144
145    });
146
147
148
149jQuery('.news-slider').on('init', function () {
150        jQuery(this).find('.slick-prev, .slick-next').wrapAll('<div class="news-nav-wrapper custom-slider-btn"></div>');
151    });
152jQuery('.news-slider').slick({
153        slidesToShow: 1,
154        slidesToScroll: 1,
155        centerMode: true,
156        centerPadding: '0px',
157        autoplay: false,
158        autoplaySpeed: 700,
159        arrows:true,
160        dots: false,
161        pauseOnHover: true,
162
163    });
164
165
166
167jQuery('.hp-slider-row > .et_pb_column').on('init', function () {
168        jQuery(this).find('.slick-prev, .slick-next').wrapAll('<div class="slider-nav-wrapper"></div>');
169    });
170
171jQuery('.hp-slider-row > .et_pb_column').slick({
172        slidesToShow: 1,
173        slidesToScroll: 1,
174        centerMode: true,
175        centerPadding: '0px',
176        autoplay: true,
177        autoplaySpeed: 2000,
178        arrows:true,
179        dots: false,
180        pauseOnHover: true,
181
182    });
183    
184
185
186jQuery('.hp-gallery-ct-slider').slick({
187        slidesToShow: 1,
188        slidesToScroll: 1,
189        centerMode: true,
190        centerPadding: '0px',
191        autoplay: false,
192        autoplaySpeed: 700,
193        arrows:true,
194        dots: false,
195        pauseOnHover: true,
196         asNavFor: '.hp-gallery-image-slider',
197          nextArrow: '.hp-gallery-slider-btn .custom-next-btn',
198        prevArrow: '.hp-gallery-slider-btn .custom-prev-btn',
199
200    });
201
202
203jQuery('.hp-gallery-image-slider').slick({
204        slidesToShow: 1,
205        slidesToScroll: 1,
206        centerMode: true,
207        centerPadding: '0px',
208        autoplay: false,
209        autoplaySpeed: 700,
210        arrows:false,
211        dots: false,
212        pauseOnHover: true,
213         asNavFor: '.hp-gallery-ct-slider',
214    
215
216    });
217
218
219jQuery('.collezioni-text-slider').slick({
220        slidesToShow: 1,
221        slidesToScroll: 1,
222        centerMode: true,
223        centerPadding: '0px',
224        autoplay: false,
225        autoplaySpeed: 700,
226        arrows:true,
227        dots: false,
228        pauseOnHover: true,
229         asNavFor: '.collezioni-image-sldier, .collezioni-bg-image-slider .et_pb_column',
230          nextArrow: '.collezioni-slider-btn .custom-next-btn',
231        prevArrow: '.collezioni-slider-btn .custom-prev-btn',
232
233    });
234
235
236
237jQuery('.collezioni-image-sldier').slick({
238        slidesToShow: 1,
239        slidesToScroll: 1,
240        centerMode: true,
241        centerPadding: '0px',
242        autoplay: false,
243        autoplaySpeed: 700,
244        arrows:false,
245        dots: false,
246        pauseOnHover: true,
247         asNavFor: '.collezioni-text-slider, .collezioni-bg-image-slider .et_pb_column',
248
249    });
250
251jQuery('.collezioni-bg-image-slider .et_pb_column').slick({
252        slidesToShow: 1,
253        slidesToScroll: 1,
254        centerMode: true,
255        centerPadding: '0px',
256        autoplay: false,
257        autoplaySpeed: 700,
258        arrows:false,
259        dots: false,
260        pauseOnHover: true,
261         asNavFor: '.collezioni-text-slider, .collezioni-image-sldier',
262
263    });
264
265
266var $relatedSlider = jQuery('.related-work-slider');
267$relatedSlider.slick({
268    slidesToShow: 4,
269    slidesToScroll: 1,
270    centerMode: false,
271    centerPadding: '0px',
272    autoplay: false,
273    autoplaySpeed: 700,
274    arrows: true,
275    dots: false,
276    pauseOnHover: true,
277    nextArrow: '.related-slider-btn .custom-next-btn',
278    prevArrow: '.related-slider-btn .custom-prev-btn',
279
280    responsive: [
281        {
282            breakpoint: 1199,
283            settings: {
284                slidesToShow: 3,
285            }
286        },
287        {
288            breakpoint: 767,
289            settings: {
290                slidesToShow: 2,
291            }
292        }
293        
294    ]
295
296});
297
298
299jQuery(function () {
300
301    if (jQuery(".timeline-slider-row")[0]) {
302
303        var isMobile = function () {
304            return jQuery(window).width() <= 767;
305        };
306
307        function getSlickOptions() {
308            if (isMobile()) {
309                return {
310                    slidesToShow: 2,
311                    slidesToScroll: 1,
312                    infinite: false,
313                    arrows: false,
314                    dots: false,
315                    vertical: true,
316                    verticalSwiping: true
317                };
318            }
319            return {
320                slidesToShow: 5,
321                slidesToScroll: 1,
322                infinite: false,
323                arrows: false,
324                dots: false,
325                variableWidth: true,
326            };
327        }
328
329        function updateArrows($s, prev, next, mprev, mnext) {
330            var currentSlide = $s.slick('slickCurrentSlide');
331            var slideCount = $s.slick('getSlick').slideCount;
332            var slidesToShow = $s.slick('getSlick').options.slidesToShow;
333            var atStart = currentSlide === 0;
334            var atEnd = currentSlide >= slideCount - slidesToShow;
335            jQuery(prev).toggleClass('inactive', atStart);
336            jQuery(next).toggleClass('inactive', atEnd);
337            jQuery(mprev).toggleClass('inactive', atStart);
338            jQuery(mnext).toggleClass('inactive', atEnd);
339        }
340
341        function initSlider(sel, prev, next, mprev, mnext) {
342            var $s = jQuery(sel);
343            $s.slick(getSlickOptions());
344
345            jQuery(prev).on('click', function () {
346                $s.slick('slickPrev');
347            });
348            jQuery(next).on('click', function () {
349                $s.slick('slickNext');
350            });
351            jQuery(mprev).on('click', function () {
352                $s.slick('slickPrev');
353            });
354            jQuery(mnext).on('click', function () {
355                $s.slick('slickNext');
356            });
357
358            $s.on('afterChange', function () {
359                updateArrows($s, prev, next, mprev, mnext);
360            });
361            updateArrows($s, prev, next, mprev, mnext);
362
363            $s.on('click', '.timeline-slide-item', function () {
364                var $item = jQuery(this);
365                var wasActive = $item.hasClass('active');
366                $s.find('.timeline-slide-item').removeClass('active');
367                if (!wasActive) {
368                    $item.addClass('active');
369                }
370            });
371        }
372
373        initSlider('.slider-terra', '#prev-terra', '#next-terra', '#mprev-terra', '#mnext-terra');
374        initSlider('.slider-primo', '#prev-primo', '#next-primo', '#mprev-primo', '#mnext-primo');
375
376        function moveButtonsToAccordion() {
377            jQuery('.timeline-tab-content').each(function () {
378                var $content = jQuery(this);
379                var tab = $content.attr('id').replace('tab-', '');
380                if (!$content.children('.timeline-accordion-body').length) {
381                    $content.children().wrapAll('<div class="timeline-accordion-body"></div>');
382                }
383                jQuery('.timeline-tab-btn[data-tab="' + tab + '"]').prependTo($content);
384            });
385        }
386
387        function moveButtonsToTabsRow() {
388            jQuery('.timeline-tabs-row').append(
389                    jQuery('.timeline-tab-btn[data-tab="primo"]'),
390                    jQuery('.timeline-tab-btn[data-tab="terra"]')
391                    );
392        }
393
394        function syncAccordionOpen() {
395            jQuery('.timeline-tab-content').removeClass('accordion-open');
396            jQuery('.timeline-tab-btn').removeClass('active');
397            jQuery('.timeline-tab-content.active').addClass('accordion-open');
398            jQuery('.timeline-tab-content.active > .timeline-tab-btn').addClass('active');
399        }
400
401        if (isMobile()) {
402            moveButtonsToAccordion();
403            syncAccordionOpen();
404        }
405
406        var prevMobile = isMobile();
407        jQuery(window).on('resize', function () {
408            var nowMobile = isMobile();
409            if (nowMobile !== prevMobile) {
410                prevMobile = nowMobile;
411                if (nowMobile) {
412                    moveButtonsToAccordion();
413                    syncAccordionOpen();
414                } else {
415                    moveButtonsToTabsRow();
416                }
417                ['.slider-terra', '.slider-primo'].forEach(function (sel) {
418                    var $s = jQuery(sel);
419                    if ($s.hasClass('slick-initialized')) {
420                        $s.slick('unslick');
421                        $s.slick(getSlickOptions());
422                    }
423                });
424
425                updateArrows(jQuery('.slider-terra'), '#prev-terra', '#next-terra', '#mprev-terra', '#mnext-terra');
426                updateArrows(jQuery('.slider-primo'), '#prev-primo', '#next-primo', '#mprev-primo', '#mnext-primo');
427            }
428        });
429
430        jQuery('.timeline-tab-btn').on('click', function () {
431            var tab = jQuery(this).data('tab');
432            var $content = jQuery('#tab-' + tab);
433            if (isMobile()) {
434                var willOpen = !$content.hasClass('accordion-open');
435                jQuery('.timeline-tab-btn').removeClass('active');
436                jQuery('.timeline-tab-content').removeClass('active accordion-open');
437                if (willOpen) {
438                    jQuery(this).addClass('active');
439                    $content.addClass('active accordion-open');
440                    jQuery('.slider-' + tab).slick('setPosition');
441                }
442            } else {
443                jQuery('.timeline-tab-btn').removeClass('active');
444                jQuery(this).addClass('active');
445                jQuery('.timeline-tab-content').removeClass('active');
446                $content.addClass('active');
447                jQuery('.slider-' + tab).slick('setPosition');
448            }
449        });
450    }
451});
452
453 
454function setWorkImageHeight() {
455
456    var maxHeight = 0;
457
458    jQuery('.work-grid .work-image').not('.work-list-grid .work-image').find('img').each(function () {
459            var imgHeight = jQuery(this).outerHeight();
460            if (imgHeight > maxHeight) {
461                maxHeight = imgHeight;
462            }
463
464        });
465
466    jQuery('.work-grid .work-image').not('.work-list-grid .work-image').height(maxHeight);
467
468}
469
470    // Run after images load
471    jQuery(window).on('load', function () {
472        setTimeout(function () {
473            setWorkImageHeight();         
474        }, 200);
475    });
476    
477          
478
479    // Also run after slick initializes / changes
480    $relatedSlider.on('setPosition afterChange', function () {
481        setTimeout(function () {
482            setWorkImageHeight();
483        }, 200);
484    });
485
486
487
488
489jQuery('.hp-nav-ct-slider').slick({
490        slidesToShow: 1,
491        slidesToScroll: 1,
492        centerMode: true,
493        centerPadding: '0px',
494        autoplay: false,
495        autoplaySpeed: 700,
496        arrows:true,
497        dots: false,
498        pauseOnHover: true,
499         asNavFor: '.hp-nav-image-slider',
500          nextArrow: '.strom-slider-btn .custom-next-btn',
501        prevArrow: '.strom-slider-btn .custom-prev-btn',
502
503    });
504
505
506
507 var $slider = jQuery('.hp-nav-image-slider');
508     $slider.slick({
509        slidesToShow: 1,
510        slidesToScroll: 1,
511        centerMode: true,
512        centerPadding: '0px',
513        autoplay: false,
514        autoplaySpeed: 700,
515        arrows:false,
516        dots: false,
517        pauseOnHover: true,
518         asNavFor: '.hp-nav-ct-slider',
519    });
520
521
522
523if (jQuery(window).width() < 980) {
524    var $stripSlider = jQuery('.horiz-column-strip');
525     $stripSlider.slick({
526        slidesToShow: 1,
527        centerMode: false,
528        centerPadding: '0px',
529        autoplay: false,
530        autoplaySpeed: 700,
531        arrows:true,
532        dots: false,
533        pauseOnHover: true,
534        variableWidth: true
535    });
536}
537
538    
539        
540    
541    
542jQuery(document).ready(function ($) {
543
544    if ($(window).width() >= 980 && $('.hp-nav-image-slider').length) {
545
546        var zoomLevel = 1;
547
548        /* ----------- ADD LENS (once per slide) ----------- */
549
550        function addLens() {
551            $slider.find('.et_pb_image').each(function () {
552                if (!$(this).find('.lens').length) {
553                    $(this).append('<div class="lens"></div>');
554                }
555            });
556        }
557
558        /* ----------- SET INITIAL LENS (CENTER)----------- */
559
560        function setInitialLens($wrapper) {
561            var $img = $wrapper.find('img');
562            var $lens = $wrapper.find('.lens');
563            if (!$img.length)
564                return;
565            if (!$img[0].complete) {
566                $img.on('load', function () {
567                    setInitialLens($wrapper);
568                });
569                return;
570            }
571
572           var imgSrc = $img.attr('src');
573           var w = $img[0].naturalWidth || $img.width();
574           var h = $img[0].naturalHeight || $img.height();
575
576            var lensW = $lens.outerWidth();
577            var lensH = $lens.outerHeight();
578
579            var x = w / 2;
580            var y = h / 2;
581
582            $lens.css({
583                display: 'block',
584                backgroundImage: "url('" + imgSrc + "')",
585                left: (x - lensW / 2) + 'px',
586                top: (y - lensH / 2) + 'px',
587                backgroundSize: (w * zoomLevel) + 'px ' + (h * zoomLevel) + 'px',
588                backgroundPosition:
589                        '-' + ((x * zoomLevel) - lensW / 2) + 'px ' +
590                        '-' + ((y * zoomLevel) - lensH / 2) + 'px'
591            });
592        }
593
594
595        /* ----------- INIT ONLY ACTIVE SLIDE ----------- */
596
597        function initLens() {
598            addLens();
599            $slider.find('.slick-active.et_pb_image').each(function () {
600                setInitialLens($(this));
601            });
602        }
603
604        $slider.on('afterChange', function () {
605            requestAnimationFrame(function () {
606                requestAnimationFrame(function () {
607                    initLens();
608                });
609            });
610        });
611
612        // Lazy load fix (Divi images)
613        $slider.on('lazyLoaded', function () {
614            setTimeout(function () {
615                initLens();
616            }, 300);
617        });
618
619        if ($slider.hasClass('slick-initialized')) {           
620                initLens();          
621        }
622
623        var rafId = null;
624        var lastEvent = null;
625        var blurTimeout;
626
627        $slider.on('mousemove', '.et_pb_image', function (e) {
628            
629            var $wrapper = $(this);
630            if (!$wrapper.closest('.slick-slide').hasClass('slick-active'))
631                return;
632
633            lastEvent = e;
634            if (rafId)
635                return;
636
637            rafId = requestAnimationFrame(function () {
638                var $img = $wrapper.find('img');
639                $img.css('filter', 'blur(9px)');           
640                var $lens = $wrapper.find('.lens');
641
642                if (!$img.length) {
643                    rafId = null;
644                    return;
645                }
646
647                var imgEl = $img[0];
648                var rect = imgEl.getBoundingClientRect();
649
650                var x = lastEvent.clientX - rect.left;
651                var y = lastEvent.clientY - rect.top;
652
653                var lensW = $lens.outerWidth();
654                var lensH = $lens.outerHeight();
655
656                var w = rect.width;
657                var h = rect.height;
658
659                x = Math.max(lensW / 2, Math.min(x, w - lensW / 2));
660                y = Math.max(lensH / 2, Math.min(y, h - lensH / 2));
661
662                // Move lens
663                $lens[0].style.left = (rect.left + x - lensW / 2 - $wrapper[0].getBoundingClientRect().left) + 'px';
664                $lens[0].style.top = (rect.top + y - lensH / 2 - $wrapper[0].getBoundingClientRect().top) + 'px';
665
666                // Ratios
667                var imgW = imgEl.naturalWidth;
668                var imgH = imgEl.naturalHeight;
669
670                var ratioX = imgW / w;
671                var ratioY = imgH / h;
672
673                var bgX = (x * ratioX * zoomLevel) - lensW / 2;
674                var bgY = (y * ratioY * zoomLevel) - lensH / 2;
675
676                $lens[0].style.backgroundPosition = '-' + bgX + 'px -' + bgY + 'px';
677
678                rafId = null;
679            });
680        });
681
682        $slider.on('mouseleave', '.et_pb_image', function () {            
683             var $img = $(this).find('img');
684             $img.css('filter', 'blur(0px)');
685            setInitialLens($(this));
686        });
687    }
688
689});
690    
691 
692if (jQuery(".banner-zoom-section")[0]) {
693var zooImage = jQuery('#zoom-image-url').val();
694var zviewer = OpenSeadragon({
695    id: "openseadragon-viewer",
696    prefixUrl: "https://cdnjs.cloudflare.com/ajax/libs/openseadragon/4.1.0/images/",
697    tileSources: {
698        type: "image",
699        url: zooImage, 
700        buildPyramid: false
701    },
702    homeFillsViewer: true,
703    defaultZoomLevel: 1,
704    minZoomLevel: 0.8, 
705    maxZoomLevel: 10, 
706    visibilityRatio: 1, 
707    showNavigator: true, 
708    navigatorPosition: "TOP_RIGHT", 
709    navigatorSizeRatio: 0.3, 
710    showNavigationControl: true,
711    navigationControlAnchor: OpenSeadragon.ControlAnchor.TOP_RIGHT,
712    autoHideControls: false,
713    gestureSettingsMouse: {
714        scrollToZoom: false,
715        clickToZoom: false,
716        dblClickToZoom: false
717    }
718});
719
720
721zviewer.addHandler('open', function () {
722
723    // Aggiungi classe al wrapper dei controlli
724    var container = document.querySelector('#openseadragon-viewer .openseadragon-container');
725    if (container && container.children.length >= 3) {
726        container.children[2].classList.add('osd-controller-wrapper');
727    }
728
729    // Pan in alto solo per immagini verticali
730    var tiledImage = zviewer.world.getItemAt(0);
731    if (tiledImage) {
732        var size = tiledImage.getContentSize();
733        if (size.y > size.x) {
734            zviewer.viewport.panTo(new OpenSeadragon.Point(0.5, 0.55), true);
735        }
736    }
737
738});
739
740// Scroll sul viewer: scorre la pagina (no zoom)
741jQuery("#openseadragon-viewer").on("wheel", function(event) {
742    if (event.originalEvent.ctrlKey) {
743        return;
744    }
745    event.preventDefault();
746    requestAnimationFrame(function() {
747        window.scrollBy(0, event.originalEvent.deltaY);
748    });
749});
750
751// Scroll sul navigator: zoom
752zviewer.navigator.addHandler('scroll', function(event) {
753    event.preventDefault();
754    zviewer.viewport.zoomBy(event.scroll > 0 ? 1.2 : 0.8);
755    zviewer.viewport.applyConstraints();
756});
757
758
759// Responsive: rimuovi controlli e thumbnail su mobile
760function adjustViewerForMobile() {
761    if (window.innerWidth <= 768) {
762        zviewer.showNavigator = false;
763        zviewer.showNavigationControl = false;
764        zviewer.forceRedraw();
765    } else {
766        zviewer.showNavigator = true;
767        zviewer.showNavigationControl = true;
768        zviewer.forceRedraw();
769    }
770}
771
772adjustViewerForMobile();
773window.addEventListener("resize", adjustViewerForMobile);
774    
775}
776
777
778//  ------------------------- Popup Gallery    -------------------------
779
780let viewer;
781let viewer1, viewer2;
782
783jQuery('.open-gallery').click(function(){
784    let img = jQuery(this).attr('src');   
785    jQuery('.thumbs img').removeClass('active');
786    jQuery('.thumbs img[data-img="'+img+'"]').addClass('active');
787
788    jQuery('.osd-popup').fadeIn();
789
790    if(!viewer){
791        viewer = OpenSeadragon({
792            id: "osd-viewer",
793            prefixUrl: "https://cdnjs.cloudflare.com/ajax/libs/openseadragon/4.1.0/images/",
794              showZoomControl: true,
795              showHomeControl: false,
796              showFullPageControl: false,
797              showRotationControl: false,
798            tileSources: {
799                type:'image',
800                url: img
801            }
802        });
803    } else {
804        viewer.open({ type:'image', url: img });
805    }
806});
807
808jQuery('.close').click(function(){
809    jQuery('.osd-popup').fadeOut();
810});
811
812
813jQuery('.thumbs img').click(function(){
814    let img = jQuery(this).data('img');   
815    jQuery('.thumbs img').removeClass('active');
816    jQuery(this).addClass('active');
817    if(viewer){
818        viewer.open({ type:'image', url: img });
819    }
820});
821
822
823jQuery('.download').click(function(){
824    let img = jQuery('.thumbs img.active').data('img');
825    window.open(img);
826});
827
828let compareViewers = {};
829
830// Compare
831jQuery('.compare').click(function(){
832    let thumbs = jQuery('.thumbs img');
833    if(thumbs.length < 2){
834        alert('Need at least 2 images');
835        return;
836    }
837    
838     jQuery('.top-bar').hide();
839    jQuery('#osd-viewer').hide();
840    jQuery('.compare-container').addClass('active');
841    let html = '';
842    compareViewers = {}; 
843    thumbs.each(function(){
844
845        let img = jQuery(this).data('img');
846        let uid = 'viewer_' + Math.random().toString(36).substr(2, 9);
847        html += `
848            <div class="compare-view" data-id="${uid}">
849                <button class="compare-close" data-id="${uid}">✕</button>
850                <div id="${uid}" style="width:100%;height:100%;"></div>
851            </div>
852        `;      
853        compareViewers[uid] = {
854            img: img,
855            instance: null
856        };
857    });
858
859    jQuery('.compare-container').html(html);  
860    Object.keys(compareViewers).forEach(function(uid){
861
862        compareViewers[uid].instance = OpenSeadragon({
863            id: uid,
864            prefixUrl: "https://cdnjs.cloudflare.com/ajax/libs/openseadragon/4.1.0/images/",
865            showNavigationControl: false,
866            
867            tileSources: {
868                type:'image',
869                url: compareViewers[uid].img
870            },
871            
872            gestureSettingsMouse: {
873                scrollToZoom: false,
874                clickToZoom: true, 
875                dblClickToZoom: true
876            }
877        });
878
879    });
880
881});
882
883
884jQuery(document).on('click', '.compare-close', function(){
885    let uid = jQuery(this).data('id');
886    let $parent = jQuery(this).closest('.compare-view'); 
887    if(compareViewers[uid] && compareViewers[uid].instance){
888        compareViewers[uid].instance.destroy();
889        delete compareViewers[uid];
890    }
891  
892    $parent.remove();
893
894    let remainingViews = jQuery('.compare-view');   
895   
896    if(remainingViews.length === 1){
897        jQuery('.top-bar').show();
898    }
899   
900    if(remainingViews.length <= 1){
901        let lastImg = null;       
902        remainingViews.each(function(){
903            let id = jQuery(this).data('id');
904            if(compareViewers[id]){
905                lastImg = compareViewers[id].img;
906            }
907        });     
908        Object.keys(compareViewers).forEach(function(id){
909            if(compareViewers[id].instance){
910                compareViewers[id].instance.destroy();
911            }
912        });
913
914        compareViewers = {};
915        jQuery('.compare-container').removeClass('active').empty();
916        jQuery('#osd-viewer').show();      
917        if(viewer && lastImg){
918            viewer.open({
919                type:'image',
920                url: lastImg
921            });
922        }
923    }
924
925});
926
927
928jQuery('.external-thumbs img').click(function(){
929
930    let img = jQuery(this).data('img');
931
932    // Update main image
933    jQuery('.open-gallery').attr('src', img);
934
935    // Active state
936    jQuery('.external-thumbs img').removeClass('active');
937    jQuery(this).addClass('active');
938
939});
940
941
942//  ------------------------- Horizontal Gallery Strip -------------------------
943
944
945if (document.querySelector('.horiz-gallery-strip') && jQuery(window).width() >= 980) {
946
947gsap.registerPlugin(ScrollTrigger);
948
949let container = document.querySelector('.horiz-gallery-strip')
950
951let horizontalScroll = gsap.to(container, {
952      ease: 'none',
953      x: () => -(container.scrollWidth - window.innerWidth),
954      scrollTrigger: {
955        trigger: '.horiz-gallery-wrapper',
956        start: 'center center',
957        end: () => '+=' + (container.scrollWidth - window.innerWidth),
958        scrub: true,
959        pin: true,
960        invalidateOnRefresh: true,
961        markers: false,
962      },
963    })
964
965gsap.to('.horiz-sidebar', {
966      ease: 'none',
967      x: () => window.innerWidth * 2,
968      scrollTrigger: {
969        containerAnimation: horizontalScroll,
970        trigger: '.horiz-sidebar',
971        start: 'left left',
972        end: () => '+=' + window.innerWidth * 2,
973        scrub: true,
974        invalidateOnRefresh: true,
975        onRefresh: self => self.animation.progress((horizontalScroll.time() - self.start) / (self.end - self.start))
976      },
977    });
978
979}
980
981jQuery(function ($) {
982
983    jQuery('.custom-toggle-menu').removeClass('et-menu').removeClass('nav').removeClass('downwards').addClass('custom-toggle-menu');
984
985    $('.custom-toggle-menu li.menu-item-has-children').each(function () {
986        $(this).append('<span class="toggle-btn">+</span>');
987    });
988
989    function toggleSubmenu($trigger) {
990        var $parent = $trigger.closest('li');
991        var $btn = $parent.children('.toggle-btn');
992
993        // close others
994        $parent.siblings('.open').removeClass('open')
995                .children('.toggle-btn').text('+');
996
997        // toggle current
998        $parent.toggleClass('open');
999        $btn.text($parent.hasClass('open') ? '−' : '+');
1000    }
1001
1002    $('.custom-toggle-menu').on('click', '.toggle-btn', function (e) {
1003        e.preventDefault();
1004        toggleSubmenu($(this));
1005    });
1006
1007    $('.custom-toggle-menu').on('click', 'li.menu-item-has-children > a', function (e) {
1008        e.preventDefault();
1009        toggleSubmenu($(this));
1010    });
1011
1012});
1013
1014
1015jQuery(window).on('load', function () {
1016
1017    if (jQuery('.work-list-grid').length) {
1018
1019        let $grid = jQuery('.work-list-grid');
1020
1021        $grid.masonry({
1022            itemSelector: '.work-grid',
1023            columnWidth: '.work-grid',
1024            percentPosition: true,
1025            gutter: 0
1026        });
1027
1028    }
1029
1030});
1031
1032jQuery(function($){
1033    var $logo = $('.site-logo img');
1034    if($logo.length){
1035        var title = $logo.attr('title');       
1036        if(title){
1037            $logo.attr(
1038                'title',
1039                title.replace(/&#39;/g, "'")
1040            );
1041        }
1042    }
1043});
1044
1045
1046 const observer = new IntersectionObserver((entries) => {
1047  entries.forEach(entry => {
1048    if (entry.isIntersecting) {
1049      entry.target.classList.add('in-view');
1050      observer.unobserve(entry.target);
1051    }
1052  });
1053}, { threshold: 0.5 });
1054
1055document.querySelectorAll('.page-heading').forEach(el => observer.observe(el));
1056
1057
1058jQuery(document).ready(function () {
1059    if (jQuery('.chosen-select').length) {
1060        jQuery(".chosen-select").chosen();
1061    }
1062});
1063
1064jQuery(function ($) {
1065    if (jQuery('.chosen-select').length) {
1066        var isMobile = /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);
1067
1068        if (isMobile) {
1069            $('.chosen-select').each(function () {
1070                var placeholder = $(this).data('placeholder');
1071
1072                $(this).find('option:first').text(placeholder);
1073            });
1074        }
1075
1076    }
1077
1078});

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.