PageSourceSearch

https://www.eventsatbhafc.co.uk/themes/custom/bhafc_events/js/global.js?tmfm9f

js eventsatbhafc.co.uk collected 2026-10-06 13:39:25 UTC 17,897 bytes, 637 lines download raw bytes

1var cookieConsentStatus;
2var isTouch = isTouchDevice();
3function isTouchDevice() {
4    return 'ontouchstart' in document.documentElement;
5}
6var isMobileUserAgent = {
7    Android: function() {
8        return navigator.userAgent.match(/Android/i);
9    },
10    BlackBerry: function() {
11        return navigator.userAgent.match(/BlackBerry/i);
12    },
13    iOS: function() {
14        return navigator.userAgent.match(/iPhone|iPad|iPod/i);
15    },
16    Opera: function() {
17        return navigator.userAgent.match(/Opera Mini/i);
18    },
19    Windows: function() {
20        return navigator.userAgent.match(/IEMobile/i) || navigator.userAgent.match(/WPDesktop/i);
21    },
22    any: function() {
23        return (isMobileUserAgent.Android() || isMobileUserAgent.BlackBerry() || isMobileUserAgent.iOS() || isMobileUserAgent.Opera() || isMobileUserAgent.Windows());
24    }
25};
26
27var isMobile = isMobileWidth();
28function isMobileWidth() {
29    if (window.innerWidth <= 767) {
30        return true;
31    } else {
32        return false;
33    }
34}
35
36var isTablet = checkTablet();
37function checkTablet() {
38    if (window.innerWidth > 767 && window.innerWidth < 992) {
39        return true;
40    } else {
41        return false;
42    }
43}
44
45//Detect IE 10 and IE 11
46var isIE = function(){
47  return /Trident\/|MSIE/.test(window.navigator.userAgent);
48}
49
50function preventBodyScroll(eventType){
51  if(eventType == 'enable'){
52    jQuery('html, body').addClass('locked');
53  } else if(eventType == 'disable') {
54    jQuery('html, body').removeClass('locked');
55  }
56}
57
58function mobileMenu(){
59  jQuery('#mobile-menu-button').on('click', function(e){
60		var _this = jQuery(this);
61		e.preventDefault();
62		
63    if(_this.hasClass('open')){
64      _this.removeClass('open');
65      jQuery('#mobile-menu').removeClass('active');
66      jQuery('header').removeClass("scrolled-up");
67      jQuery('body').removeClass("mobile-overlay-open");
68      preventBodyScroll('disable');
69    } else {
70      _this.addClass('open');
71      jQuery('body').addClass("mobile-overlay-open");
72      jQuery('header').addClass("scrolled-up");
73      jQuery('#mobile-menu').addClass('active');
74      preventBodyScroll('enable');
75    }
76	});
77  
78  jQuery("#mobile-menu li.has-submenu > i, #mobile-menu li.has-submenu > span, #mobile-menu li.menu-item-has-children > i, #mobile-menu li.menu-item-has-children > span").off().on('click', function(e){    
79    e.preventDefault();
80    var _thisLink = jQuery(this);
81    var _parent = _thisLink.parent();
82    var target = _parent.find('.sub-menu');
83    if(target.length < 1){
84      target = _parent.find('.fixed-sub-menu');
85    }
86
87    if (target.hasClass('active')) {
88      target.removeClass('active');
89      _thisLink.removeClass('active');
90    } else {
91      target.addClass('active');
92      _thisLink.addClass('active');
93    }
94		
95  });
96}
97
98function stickyMenu(){
99  if(!isIE()){
100    const el = document.querySelector(".sticky");
101    function handleIntersection(entries) {
102      entries.map(function(e){
103        e.target.classList.toggle("is-pinned", e.intersectionRatio < 1);
104      });
105    }
106    const observer = new IntersectionObserver(handleIntersection, {threshold: [1]});
107    observer.observe(el);
108  }
109
110  var scrollPosition = jQuery(window).scrollTop();
111  jQuery(window).scroll(function() {
112    var scroll = jQuery(window).scrollTop();
113    //IF SCROLLING UP
114    if (scroll < scrollPosition) {
115      jQuery('header').addClass('scrolled-up');
116      jQuery('#mobile-menu').addClass('scrolled-up');
117      jQuery('body').addClass('nav_scrolled-up');
118    } else {
119      jQuery('header').removeClass('scrolled-up');
120      jQuery('#mobile-menu').removeClass('scrolled-up');
121      jQuery('body').removeClass('nav_scrolled-up');
122    }
123    scrollPosition = scroll;
124  });
125  /*
126  jQuery(window).scroll(function() {
127    var scroll = jQuery(window).scrollTop();
128    if (scroll > 40) {
129        jQuery('header').addClass('low-profile');
130        jQuery('#mobile-menu').addClass('low-profile');
131        //IF SCROLLING UP
132        if (scroll < scrollPosition) {
133            jQuery('header').removeClass('low-profile');
134            jQuery('#mobile-menu').removeClass('low-profile');
135        } else {
136            jQuery('header').addClass('low-profile');
137            jQuery('#mobile-menu').addClass('low-profile');
138        }
139    } else {
140        jQuery('header').removeClass('low-profile');
141        jQuery('#mobile-menu').removeClass('low-profile');
142    }
143    scrollPosition = scroll;
144  });
145  */
146}
147
148function lightboxGallery() { 
149  document.querySelectorAll('.image-gallery').forEach((galleryEl, index) => {
150    // Assign the ID *before* running GLightbox
151    galleryEl.setAttribute('data-gallery-id', index);
152
153    // Now init GLightbox AFTER the attribute exists
154    GLightbox({
155      selector: `.image-gallery[data-gallery-id="${index}"] a.lightbox-gallery`,
156      openEffect: 'zoom',
157      closeEffect: 'zoom',
158      touchNavigation: true,
159      loop: true,
160      width: '90vw',
161      height: '90vh',
162      onOpen: () => {
163        preventBodyScroll('enable');
164      },
165      onClose: () => {
166        preventBodyScroll('disable');
167      },
168      afterSlideChange: ({ slideIndex }) => {
169        const wrapper = document.querySelector('.gslide');
170        wrapper?.classList.add('glightbox-image-loaded');
171      }
172    });
173  });
174}
175
176function imageSlider(){
177  document.querySelectorAll('.image-slider__swiper').forEach(function(sliderEl) {
178    if (sliderEl.imageSliderSwiper) {
179      return;
180    }
181
182    var slides = sliderEl.querySelectorAll('.swiper-slide');
183    var resizeTimer;
184
185    function shouldLoop() {
186      return window.innerWidth < 768 && slides.length > 1;
187    }
188
189    function initSwiper() {
190      sliderEl.imageSliderLoop = shouldLoop();
191      sliderEl.imageSliderSwiper = new Swiper(sliderEl, {
192        loop: sliderEl.imageSliderLoop,
193        speed: 600,
194        slidesPerView: 1,
195        autoplay: {
196          delay: 8000,
197          disableOnInteraction: false,
198          pauseOnMouseEnter: false
199        },
200        navigation: {
201          nextEl: sliderEl.querySelector('.swiper-button-next'),
202          prevEl: sliderEl.querySelector('.swiper-button-prev')
203        },
204        on: {
205          init: function() {
206            AOS.refresh();
207          }
208        }
209      });
210    }
211
212    initSwiper();
213
214    window.addEventListener('resize', function() {
215      clearTimeout(resizeTimer);
216      resizeTimer = setTimeout(function() {
217        var loopSettingChanged = shouldLoop() !== sliderEl.imageSliderLoop;
218        if (!loopSettingChanged) {
219          return;
220        }
221
222        sliderEl.imageSliderSwiper.destroy(true, true);
223        initSwiper();
224      }, 150);
225    });
226  });
227}
228
229function heroSlider(){
230  document.querySelectorAll('.hero-slider .slider__swiper, .hero-slider .slick-slider').forEach(function(sliderEl) {
231    if (sliderEl.heroSliderSwiper) {
232      return;
233    }
234
235    sliderEl.classList.add('swiper');
236
237    var wrapperEl;
238    Array.prototype.slice.call(sliderEl.children).forEach(function(childEl) {
239      if (childEl.classList.contains('swiper-wrapper')) {
240        wrapperEl = childEl;
241      }
242    });
243    if (!wrapperEl) {
244      wrapperEl = document.createElement('div');
245      wrapperEl.className = 'swiper-wrapper';
246      Array.prototype.slice.call(sliderEl.children).forEach(function(childEl) {
247        if (!childEl.classList.contains('swiper-pagination')) {
248          wrapperEl.appendChild(childEl);
249        }
250      });
251      sliderEl.appendChild(wrapperEl);
252    }
253
254    var slides = wrapperEl.querySelectorAll('.swiper-slide');
255    var paginationEl = sliderEl.querySelector('.swiper-pagination');
256    var resizeTimer;
257
258    function shouldLoop() {
259      return window.innerWidth < 768 && slides.length > 1;
260    }
261
262    function initSwiper() {
263      sliderEl.heroSliderLoop = shouldLoop();
264      sliderEl.heroSliderSwiper = new Swiper(sliderEl, {
265        loop: sliderEl.heroSliderLoop,
266        speed: 600,
267        slidesPerView: 1,
268        autoplay: {
269          delay: 8000,
270          disableOnInteraction: false,
271          pauseOnMouseEnter: false
272        },
273        pagination: {
274          el: paginationEl,
275          clickable: true
276        },
277        on: {
278          init: function() {
279            AOS.refresh();
280          }
281        }
282      });
283    }
284
285    initSwiper();
286
287    window.addEventListener('resize', function() {
288      clearTimeout(resizeTimer);
289      resizeTimer = setTimeout(function() {
290        var loopSettingChanged = shouldLoop() !== sliderEl.heroSliderLoop;
291        if (!loopSettingChanged) {
292          return;
293        }
294
295        sliderEl.heroSliderSwiper.destroy(true, true);
296        initSwiper();
297      }, 150);
298    });
299  });
300}
301
302function testimonialSlider(){
303  var testimonialSliderSwiper = new Swiper('.testimonial-slider__swiper', {
304    loop: true,
305    speed: 600,
306    slidesPerView: 1,
307    pagination: {
308      el: '.swiper-pagination',
309      clickable: true,
310    },
311    navigation: {
312      nextEl: ".swiper-button-next",
313      prevEl: ".swiper-button-prev",
314    },
315    // Optional breakpoints if needed:
316    breakpoints: {
317      768: {
318        // Customize settings for viewports >= 768px if necessary.
319        loop: true,
320      },
321      480: {
322        // Customize settings for viewports >= 480px if necessary.
323        loop: true,
324      }
325    },
326    on: {
327      init: function () {
328        AOS.refresh();
329      }
330    }
331  });
332}
333
334function awardsCarousel(){
335  document.querySelectorAll('.awards-carousel').forEach(function(sliderEl) {
336    if (sliderEl.awardsCarouselSwiper) {
337      return;
338    }
339
340    sliderEl.classList.add('swiper');
341
342    var wrapperEl;
343    Array.prototype.slice.call(sliderEl.children).forEach(function(childEl) {
344      if (childEl.classList.contains('swiper-wrapper')) {
345        wrapperEl = childEl;
346      }
347    });
348
349    if (!wrapperEl) {
350      wrapperEl = document.createElement('div');
351      wrapperEl.className = 'swiper-wrapper';
352      Array.prototype.slice.call(sliderEl.children).forEach(function(childEl) {
353        wrapperEl.appendChild(childEl);
354      });
355      sliderEl.appendChild(wrapperEl);
356    }
357
358    var slides = wrapperEl.querySelectorAll('.awards-carousel__award');
359    slides.forEach(function(slideEl) {
360      slideEl.classList.add('swiper-slide');
361    });
362
363    sliderEl.awardsCarouselSwiper = new Swiper(sliderEl, {
364      loop: slides.length > 1,
365      slidesPerView: 2,
366      slidesPerGroup: 1,
367      centeredSlides: true,
368      centerInsufficientSlides: true,
369      autoplay: {
370        delay: 3000,
371        disableOnInteraction: false
372      },
373      breakpoints: {
374        768: {
375          slidesPerView: 4
376        }
377      },
378      on: {
379        init: function() {
380          AOS.refresh();
381        }
382      }
383    });
384  });
385}
386
387function inlineOverlay(){
388  GLightbox({
389    selector: 'a.inline-overlay',
390    openEffect: 'fade',
391    closeEffect: 'fade',
392    onOpen: () => {
393      preventBodyScroll('enable');
394    },
395    onClose: () => {
396      preventBodyScroll('disable');
397    }
398  });
399}
400
401function scrollToNextSection(object) {
402  // tolerate jQuery or DOM input
403  var el = object instanceof HTMLElement ? object : object[0];
404  if (!el) return;
405
406  var currentSection = el.closest('section');
407  if (!currentSection) return;
408
409  var targetSection = currentSection.nextElementSibling;
410  if (!targetSection || targetSection.tagName.toLowerCase() !== 'section') return;
411
412  var offset;
413  if (isTablet) {
414    offset = -140;
415  } else if (isMobile) {
416    offset = -120;
417  } else {
418    offset = -170;
419  }
420
421  var targetPosition =
422    targetSection.getBoundingClientRect().top +
423    window.pageYOffset +
424    offset;
425
426  window.scrollTo({
427    top: targetPosition,
428    behavior: 'smooth'
429  });
430}
431
432function handleCookieConsent(){
433  document.addEventListener('cookiesjsrUserConsent', function(event) {
434    cookieConsentStatus = event.detail.services;
435    window.dataLayer = window.dataLayer || [];
436    window.dataLayer.push({
437      'event': 'cookieConsentChanged',
438      'cookieConsentStatus': cookieConsentStatus
439    });
440 });
441}
442
443function subNav() {
444  const subNav = document.getElementById('sub-nav');
445  if (!subNav) return;
446
447  subNav.addEventListener('change', function () {
448    const target = document.getElementById(this.value);
449    if (!target) return;
450
451    let offset = -238;
452    if (window.isTablet) offset = -140;
453    if (window.isMobile) offset = -120;
454
455    scrollWithAOSCorrection(target, offset);
456  });
457}
458
459function scrollWithAOSCorrection(target, offset) {
460  // Perform the initial scroll
461  scrollToElement(target, offset);
462
463  // Now wait for layout to stabilise due to AOS animations
464  let lastTop = null;
465  let stableCount = 0;
466
467  const interval = setInterval(() => {
468    const currentTop = target.getBoundingClientRect().top;
469
470    if (currentTop === lastTop) {
471      stableCount++;
472      // After 3 consecutive matches, assume layout has stabilised
473      if (stableCount >= 3) {
474        clearInterval(interval);
475        scrollToElement(target, offset);
476      }
477    } else {
478      stableCount = 0; // Reset if movement is detected
479    }
480
481    lastTop = currentTop;
482  }, 50);
483}
484
485function scrollToElement(el, offset) {
486  const y = el.getBoundingClientRect().top + window.pageYOffset + offset;
487  window.scrollTo({ top: y, behavior: 'smooth' });
488}
489
490
491
492
493function eventsLandingBlock(){
494  if(jQuery(".events-no-results-true").length){
495    jQuery(".events__no-events").addClass("enable-no-results");
496  }
497}
498
499function instantBookBar(){
500  jQuery('.main-menu .instant-book').on('click', function(e){
501		var _this = jQuery(this);
502		e.preventDefault();
503		
504    if(_this.hasClass('open')){
505      _this.removeClass('open');
506      jQuery('.instant-book-bar').removeClass('active');
507      jQuery('header').removeClass("scrolled-up");
508      jQuery('body').removeClass("instant-book-bar-open");
509      // preventBodyScroll('disable');
510    } else {
511      _this.addClass('open');
512      jQuery('body').addClass("instant-book-bar-open");
513      jQuery('header').addClass("scrolled-up");
514      jQuery('.instant-book-bar').addClass('active');
515      // preventBodyScroll('enable');
516    }
517	});
518  jQuery(document).on('click', function(event) {
519    jQuery(document).on('click', function(event) {
520      if (!jQuery(event.target).closest('.top-bar, .main-bar, .instant-book-bar .instant-book__container').length) {
521        if (jQuery(window).width() >= 992) {
522        // console.log(true);
523          if (jQuery('.main-menu .instant-book').hasClass('open')) {
524            jQuery('.main-menu .instant-book').removeClass('open');
525            jQuery('.instant-book-bar').removeClass('active');
526            jQuery('header').removeClass("scrolled-up");
527            jQuery('body').removeClass("instant-book-bar-open");
528            // preventBodyScroll('disable');
529          }
530        }
531      }
532    });
533  });
534  jQuery('.instant-book-close').on('click', function(e){
535    // console.log(true);
536    if(jQuery('.main-menu .instant-book').hasClass('open')){
537      jQuery('.main-menu .instant-book').removeClass('open');
538      jQuery('.instant-book-bar').removeClass('active');
539      jQuery('header').removeClass("scrolled-up");
540      jQuery('body').removeClass("instant-book-bar-open");
541      // preventBodyScroll('disable');
542    }
543  });
544}
545
546function instantBookOverlay(){
547
548  var $body = jQuery('body');
549  var $overlay = jQuery('.instant-book-overlay');
550  var $trigger = jQuery('a.instant-book');
551
552  function openOverlay(){
553    $overlay.addClass('active');
554    $body.addClass('instant-book-overlay-open');
555    // preventBodyScroll('enable');
556  }
557
558  function closeOverlay(){
559    $overlay.removeClass('active');
560    $body.removeClass('instant-book-overlay-open');
561    // preventBodyScroll('disable');
562  }
563
564  // Open on button click (no state, no lies)
565  $trigger.on('click', function(e){
566    e.preventDefault();
567    openOverlay();
568  });
569
570  // Close button
571  jQuery('.instant-book-overlay .instant-book-close').on('click', function(e){
572    e.preventDefault();
573    closeOverlay();
574  });
575
576  // Click outside the box
577  $overlay.on('click', function(e){
578    if (jQuery(e.target).is('.instant-book-overlay__background')) {
579      closeOverlay();
580    }
581  });
582
583  // Escape key
584  jQuery(document).on('keydown', function(e){
585    if (e.key === 'Escape' && $overlay.hasClass('active')) {
586      closeOverlay();
587    }
588  });
589}
590
591
592function terrace(){
593  if(jQuery(".terrace-brand").length){
594    jQuery("body").addClass("terrace");
595  }
596}
597
598jQuery(document).ready(function() {
599	handleCookieConsent();
600  stickyMenu();
601  mobileMenu();
602  inlineOverlay();
603  awardsCarousel();
604  instantBookBar();
605
606  jQuery('section a.next-section').on('click', function(e){
607    e.preventDefault();
608		scrollToNextSection(jQuery(this));
609	});
610	
611	AOS.init({
612		// Global settings:
613		disable: function() {
614			var maxWidth = 992;
615			return window.innerWidth < maxWidth;
616		},
617		startEvent: 'DOMContentLoaded', // name of the event dispatched on the document, that AOS should initialize on
618		initClassName: 'aos-init', // class applied after initialization
619		animatedClassName: 'aos-animate', // class applied on animation
620		useClassNames: false, // if true, will add content of `data-aos` as classes on scroll
621		disableMutationObserver: false, // disables automatic mutations' detections (advanced)
622		debounceDelay: 50, // the delay on debounce used while resizing window (advanced)
623		throttleDelay: 99, // the delay on throttle used while scrolling the page (advanced)
624		
625		// Settings that can be overridden on per-element basis, by `data-aos-*` attributes:
626		offset: 100, // offset (in px) from the original trigger point
627		delay: 0, // values from 0 to 3000, with step 50ms
628		duration: 600, // values from 0 to 3000, with step 50ms
629		easing: 'ease', // default easing for AOS animations
630		once: false, // whether animation should happen only once - while scrolling down
631		mirror: false, // whether elements should animate out while scrolling past them
632		anchorPlacement: 'top-bottom', // defines which position of the element regarding to window should trigger the animation
633	  
634	});
635
636  
637});

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.