PageSourceSearch

https://elixir-belgium.org/themes/custom/elixir_belgium/js/main.js?tlkf8o

js elixir-belgium.org collected 2026-10-03 23:01:36 UTC 23,636 bytes, 603 lines download raw bytes

1(function ($) {
2    Drupal.behaviors.elixir_belgium = {
3        attach: function (context, settings) {
4            "use strict"; // Start of use strict
5
6            /* ----------------------------------------------------------- */
7            /*  Fixed header
8            /* ----------------------------------------------------------- */
9
10
11            // Smooth scrolling using jQuery easing
12            // jQuery for page scrolling feature - requires jQuery Easing plugin
13
14
15            $('a.js-scroll-trigger').on('click', function (event) {
16                var $anchor = $(this);
17                $('html, body').stop().animate({
18                    scrollTop: $($anchor.attr('href')).offset().top
19                }, 1500, 'easeInOutExpo');
20                event.preventDefault();
21            });
22
23
24            // Closes responsive menu when a scroll trigger link is clicked
25            $('.js-scroll-trigger').on('click', function (event) {
26                hideMobileMenu($('.navbar-collapse'));
27            });
28            jQuery(document).ready(function ($) {
29                initPortfolioPopups();
30                customInitialize()
31            });
32
33
34
35            // Banner Slider
36            $('.banner-slider ').slick({
37                vertical: true,
38                autoplay: true,
39                autoplaySpeed: 5000,
40                verticalSwiping: true,
41                adaptiveHeight: true,
42                slidesToShow: 1,
43                slidesToScroll: 1,
44                dots: true,
45                arrows: false,
46                // prevArrow: '<div><button class="prevArrow arrowBtn"><i class="fa fa-angle-left"></i></button></div>',
47                // nextArrow: '<div><button class="nextArrow arrowBtn"><i class="fa fa-angle-right"></i></button></div>',
48
49                responsive: [{
50                    breakpoint: 768,
51                    settings: {
52                        slidesToShow: 1,
53                        slidesToScroll: 1,
54                        vertical: false,
55                        verticalSwiping: false,
56
57                    }
58                }]
59            });
60            // Banner Slider
61
62            $(window).off('load.elixirPortfolio').on('load.elixirPortfolio', initPortfolioFilters);
63            if (document.readyState === 'complete') {
64                window.setTimeout(initPortfolioFilters, 0);
65            }
66            $("ul.tabs").addClass("tabs-top");
67            jQuery(window).scroll(function () {
68                var scroll = $(window).scrollTop();
69                if (scroll >= 90) {
70                   // $("#main-menu").addClass("fixed-top ");
71                    $("ul.tabs").addClass("tabs-top");
72                } else {
73                   // $("#main-menu").removeClass("fixed-top");
74                    $("ul.tabs").removeClass("tabs-top");
75                }
76
77            });
78            var main_color = drupalSettings.main_color;
79            // alert("Main Color "+main_color);
80            $(':root').css('--main-theme-color', main_color);
81
82            $("time.timeago").timeago();
83            $('.carousel-item:first-child').addClass('active');
84            initMobileNavigation(context);
85            initBootstrapCarousel(context);
86
87            // function getUrlVars()
88            // {
89            //     var vars = [], hash;
90            //     var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
91            //     for(var i = 0; i < hashes.length; i++)
92            //     {
93            //         hash = hashes[i].split('=');
94            //         vars.push(hash[0]);
95            //         vars[hash[0]] = hash[1];
96            //     }
97            //     return vars;
98            // }
99
100            function initPortfolioFilters() {
101                var $container = $('.portfolioContainer');
102                var selector = $("#default_selector").attr('data-filter') || '*';
103                var selector2 = $("#default_selector").attr('data-filter-n');
104                var hashSelector = getHashFilter();
105                var $hashFilter = hashSelector ? findPortfolioFilter(hashSelector) : $();
106
107                if (!$container.length) {
108                    updateBreadcrumb();
109                    return;
110                }
111
112                if ($hashFilter.length) {
113                    selector = hashSelector;
114                    selector2 = $hashFilter.attr('data-filter-n');
115                }
116
117                bindPortfolioFilters($container);
118                applyPortfolioFilter($container, selector, selector2, false);
119                updateBreadcrumb();
120            }
121
122            function bindPortfolioFilters($container) {
123                $('.portfolioFilter a').off('click.elixirPortfolio').on('click.elixirPortfolio', function (event) {
124                    var $filter = $(this);
125                    var selector = $filter.attr('data-filter') || '*';
126                    var selector2 = $filter.attr('data-filter-n');
127
128                    event.preventDefault();
129
130                    applyPortfolioFilter($container, selector, selector2, true);
131                    return false;
132                });
133            }
134
135            function applyPortfolioFilter($container, selector, selector2, animate) {
136                syncPortfolioFilterState(selector);
137                updateTrainingDateVisibility(selector);
138                applyCustomOperations(selector, selector2, $container);
139
140                $container.each(function () {
141                    filterCards($(this), selector, animate);
142                });
143
144                initPortfolioPopups();
145            }
146
147            function filterCards($container, selector, animate) {
148                $container.children('.categories').each(function () {
149                    var $item = $(this);
150                    setCardVisibility($item, matchesFilter($item, selector), animate);
151                });
152            }
153
154            function setCardVisibility($item, isVisible, animate) {
155                var scheduleFrame = window.requestAnimationFrame || function (callback) {
156                    return window.setTimeout(callback, 0);
157                };
158                var timeout = $item.data('elixirFilterTimeout');
159                var wasHidden = $item.hasClass('filter-hidden');
160
161                if (timeout) {
162                    window.clearTimeout(timeout);
163                    $item.removeData('elixirFilterTimeout');
164                }
165
166                if (isVisible) {
167                    if (animate && wasHidden) {
168                        $item.addClass('filter-fading');
169                    }
170
171                    $item.removeClass('filter-hidden');
172
173                    if (animate && wasHidden) {
174                        scheduleFrame(function () {
175                            $item.removeClass('filter-fading');
176                        });
177                    }
178                    else {
179                        $item.removeClass('filter-fading');
180                    }
181                    return;
182                }
183
184                $item.addClass('filter-fading filter-hidden');
185            }
186
187            function matchesFilter($item, selector) {
188                var classes;
189
190                if (!selector || selector === '*') {
191                    return true;
192                }
193
194                try {
195                    if ($item.is(selector)) {
196                        return true;
197                    }
198                }
199                catch (error) {
200                    // Fall back to class checks below.
201                }
202
203                if (selector.charAt(0) !== '.') {
204                    return false;
205                }
206
207                classes = selector.split('.').filter(Boolean);
208                return classes.every(function (className) {
209                    return $item.hasClass(className);
210                });
211            }
212
213            function syncPortfolioFilterState(selector) {
214                $('.portfolioFilter .current').removeClass('current');
215                findPortfolioFilter(selector).addClass('current');
216            }
217
218            function findPortfolioFilter(selector) {
219                return $('.portfolioFilter a').filter(function () {
220                    return $(this).attr('data-filter') === selector;
221                }).first();
222            }
223
224            function getHashFilter() {
225                var hash = window.location.hash.replace('#', '');
226
227                if (!hash) {
228                    return '';
229                }
230
231                try {
232                    hash = decodeURIComponent(hash);
233                }
234                catch (error) {
235                    return '';
236                }
237
238                return '.' + hash;
239            }
240
241            function updateTrainingDateVisibility(selector) {
242                $('.portfolioContainer .date').show()
243
244                if (selector == ".Training_material" || selector == ".Dodona" || selector == ".e-learning") {
245                    $(`${selector} .date`).hide()
246                }
247            }
248
249            function initPortfolioPopups() {
250                if (!$.fn.magnificPopup) {
251                    return;
252                }
253
254                $('.portfolio-item .portfolio-popup').magnificPopup({
255                    type: 'image',
256                    removalDelay: 300,
257                    mainClass: 'mfp-fade',
258                    gallery: {
259                        enabled: true
260                    },
261                    zoom: {
262                        enabled: false,
263                        duration: 300,
264                        easing: 'ease-in-out',
265                        opener: function (openerElement) {
266                            return openerElement.is('img') ? openerElement : openerElement.find('img');
267                        }
268                    }
269                });
270            }
271
272            function applyCustomOperations(selector, selector2, $container) {
273                if (selector2 && selector2.toLowerCase().includes("partner")) {
274                    $(".shp0").removeClass("map-active")
275                    $(`#${selector2.replace(".partner_", "")}`).addClass("map-active")
276                    $(".partner_logo").hide()
277                    $(`#${selector.replace(".", "")}`).show()
278                    $(".belgium_map").show()
279                    return true;
280                }
281
282                let customDesc
283                if ($(`#custom-service-description`).length)
284                    customDesc = $(`#custom-service-description`)
285                else if ($(`#custom-training-description`).length)
286                    customDesc = $(`#custom-training-description`)
287                else if ($(`#custom-event-description`).length)
288                    customDesc = $(`#custom-event-description`)
289                else if ($(`#custom-project-description`).length)
290                    customDesc = $(`#custom-project-description`)
291
292                if (customDesc) {
293                    const desc = $(`a[data-filter='${selector}']`).attr('data-description')
294                    if (desc) customDesc.html(desc)
295                    else {
296                        if (selector === "*") customDesc.html($("#all-description").html())
297                        else customDesc.html("")
298                    }
299                }
300
301                // Training, Events and partners pages don't support "all"
302                if (selector != "*" && selector != ".Upcoming_trainings"
303                    && selector != ".Upcoming_events"
304                    && selector != ".VIB") {
305                    const hash = selector.replace(".", "")//.replace(/[^a-z0-9\s]/gi, '').replace(/[_\s]/g, '-')
306                    window.location.hash = hash
307                }
308
309                if (selector == ".Previous_trainings" || selector == ".Previous_events") {
310                    reverseOrder(selector, $container)
311                }
312
313                $(`.logo-container`).children().hide()
314                $(`.logo-container ${selector}`).show()
315
316            }
317
318            function customInitialize() {
319                jQuery("a[href='https://elixir-europe.org/']").attr('target', '_blank')
320            }
321
322            function initMobileNavigation(context) {
323                var $context = $(context);
324                var $toggles = $('.navbar-toggler', context);
325
326                if ($context.is('.navbar-toggler')) {
327                    $toggles = $toggles.add($context);
328                }
329
330                $toggles.each(function () {
331                    var $toggle = $(this);
332                    if ($toggle.data('elixirMobileNavigationBound')) {
333                        return;
334                    }
335
336                    $toggle.data('elixirMobileNavigationBound', true);
337                    $toggle.on('click.elixirMobileNavigation', function () {
338                        var $target = getNavigationTarget($toggle);
339                        var isOpen = !$target.hasClass('show');
340
341                        $target.toggleClass('show', isOpen);
342                        $toggle
343                            .toggleClass('collapsed', !isOpen)
344                            .attr('aria-expanded', isOpen ? 'true' : 'false');
345                    });
346                });
347
348                $('.navbar-collapse .nav-link', context).each(function () {
349                    var $link = $(this);
350                    if ($link.data('elixirMobileNavigationCloseBound')) {
351                        return;
352                    }
353
354                    $link.data('elixirMobileNavigationCloseBound', true);
355                    $link.on('click.elixirMobileNavigation', function () {
356                        hideMobileMenu($(this).closest('.navbar-collapse'));
357                    });
358                });
359            }
360
361            function getNavigationTarget($toggle) {
362                var selector = $toggle.attr('data-target') || $toggle.attr('data-bs-target');
363                if (!selector && $toggle.attr('aria-controls')) {
364                    selector = '#' + $toggle.attr('aria-controls');
365                }
366
367                return selector ? $(selector) : $toggle.closest('.navbar').find('.navbar-collapse').first();
368            }
369
370            function hideMobileMenu($target) {
371                if (!$target.length) {
372                    return;
373                }
374
375                $target.removeClass('show');
376                $('.navbar-toggler[aria-controls="' + $target.attr('id') + '"]')
377                    .addClass('collapsed')
378                    .attr('aria-expanded', 'false');
379            }
380
381            function updateBreadcrumb() {
382                const elem_event = $("#event_from")
383                const elem_project = $("#project_category")
384                const elem_service = $("#service_category")
385                const elem_training = $("#training_from")
386                const elem_partner = $("#partners_category")
387
388                if (elem_event.length) {
389                    const item = getTimeClass(elem_event)
390                    setBreadcrumb(`<a href="/events#${item}_events">${item}<a/>`)
391                }
392                else if (elem_project.length) {
393                    const f = elem_project.data("categories")
394                    const taxonomyId = elem_project.data("taxonomy")
395                    setBreadcrumb(`<a href="/projects#term-${taxonomyId}">${f}<a/>`)
396                }
397                else if (elem_service.length) {
398                    const f = elem_service.data("categories")
399                    const taxonomyId = elem_service.data("taxonomy")
400                    setBreadcrumb(`<a href="/services#term-${taxonomyId}">${f}<a/>`)
401                }
402                else if (elem_training.length) {
403                    const item = getTimeClass(elem_training)
404                    setBreadcrumb(`<a href="/training#${item}_trainings">${item}<a/>`)
405                }
406                else if (elem_partner.length) {
407                    const f = elem_partner.data("categories")
408                    setBreadcrumb(`<a href="/about/partners#${f.replace(/ /g, "_")}">${f}<a/>`)
409                }
410            }
411
412            function getTimeClass(element) {
413                const f = new Date(element.data("from").split("T")[0].split("-"))
414                return f >= new Date() ? "Upcoming" : "Previous"
415            }
416
417            function setBreadcrumb(html) {
418                $("#breadcrumb li:last-child").html(html)
419                $(".project-banner").show()
420            }
421
422            function initBootstrapCarousel(context) {
423                var $context = $(context);
424                var $carousels = $('#main-slider', context);
425                var $controls = $('.carousel-control-prev, .carousel-control-next', context);
426
427                if ($context.is('#main-slider')) {
428                    $carousels = $carousels.add($context);
429                }
430                if ($context.is('.carousel-control-prev, .carousel-control-next')) {
431                    $controls = $controls.add($context);
432                }
433
434                $carousels.each(function () {
435                    var $slider = $(this);
436                    if (!$slider.find('.carousel-item.active').length) {
437                        $slider.find('.carousel-item').first().addClass('active');
438                    }
439                    if ($slider.is('#main-slider')) {
440                        setupElixirCarousel($slider);
441                        return;
442                    }
443                    if (!$slider.data('elixirCarouselInitialized') && $.fn.carousel) {
444                        try {
445                            $slider.carousel({
446                                interval: 5000
447                            });
448                            $slider.data('elixirCarouselInitialized', true);
449                        }
450                        catch (error) {
451                            $slider.data('elixirCarouselInitialized', true);
452                        }
453                    }
454                });
455
456                $controls.each(function () {
457                    var $control = $(this);
458                    if ($control.data('elixirCarouselBound')) {
459                        return;
460                    }
461
462                    $control.data('elixirCarouselBound', true);
463                    $control.on('click.elixirCarousel', function (event) {
464                        var $button = $(this);
465                        var target = $button.attr('data-target') || $button.attr('href');
466                        var action = $button.attr('data-slide');
467                        var $slider = target ? $(target) : $button.closest('.carousel');
468
469                        if (!$slider.length || !action) {
470                            return;
471                        }
472
473                        event.preventDefault();
474                        event.stopPropagation();
475
476                        if ($slider.is('#main-slider')) {
477                            moveCarousel($slider, action);
478                            return;
479                        }
480
481                        if ($.fn.carousel) {
482                            try {
483                                $slider.carousel(action);
484                                return;
485                            }
486                            catch (error) {
487                                // Fall back to class switching below.
488                            }
489                        }
490
491                        moveCarousel($slider, action);
492                    });
493                });
494            }
495
496            function setupElixirCarousel($slider) {
497                var interval = parseInt($slider.attr('data-interval'), 10) || 5000;
498                var start;
499                var stop;
500
501                if ($slider.data('elixirCarouselInitialized')) {
502                    return;
503                }
504
505                stop = function () {
506                    var timer = $slider.data('elixirCarouselTimer');
507                    if (timer) {
508                        window.clearInterval(timer);
509                        $slider.removeData('elixirCarouselTimer');
510                    }
511                };
512
513                start = function () {
514                    stop();
515                    if ($slider.find('.carousel-item').length > 1) {
516                        $slider.data('elixirCarouselTimer', window.setInterval(function () {
517                            moveCarousel($slider, 'next');
518                        }, interval));
519                    }
520                };
521
522                $slider.data('elixirCarouselInitialized', true);
523                $slider.on('mouseenter.elixirCarousel focusin.elixirCarousel', stop);
524                $slider.on('mouseleave.elixirCarousel focusout.elixirCarousel', start);
525                start();
526            }
527
528            function moveCarousel($slider, action) {
529                var $items = $slider.find('.carousel-item');
530                var $active = $items.filter('.active').first();
531                var currentIndex = $items.index($active);
532                var nextIndex;
533                var $next;
534                var direction = action === 'prev' ? 'prev' : 'next';
535                var orderClass = direction === 'next' ? 'carousel-item-next' : 'carousel-item-prev';
536                var directionClass = direction === 'next' ? 'carousel-item-left' : 'carousel-item-right';
537                var completed = false;
538                var finish;
539
540                if (!$items.length || $slider.data('elixirCarouselAnimating')) {
541                    return;
542                }
543
544                if (currentIndex < 0) {
545                    $items.first().addClass('active');
546                    return;
547                }
548
549                nextIndex = action === 'prev'
550                    ? (currentIndex - 1 + $items.length) % $items.length
551                    : (currentIndex + 1) % $items.length;
552
553                if (nextIndex === currentIndex) {
554                    return;
555                }
556
557                $next = $items.eq(nextIndex);
558                $slider.data('elixirCarouselAnimating', true);
559                $items.removeClass('carousel-item-next carousel-item-prev carousel-item-left carousel-item-right');
560
561                finish = function () {
562                    if (completed) {
563                        return;
564                    }
565                    completed = true;
566                    $active.removeClass('active ' + directionClass);
567                    $next.removeClass(orderClass + ' ' + directionClass).addClass('active');
568                    $slider.removeData('elixirCarouselAnimating');
569                };
570
571                $next.addClass(orderClass);
572
573                if ($next[0]) {
574                    $next[0].offsetHeight;
575                }
576
577                $active.addClass(directionClass);
578                $next.addClass(directionClass);
579
580                $next.one('transitionend webkitTransitionEnd oTransitionEnd', finish);
581                window.setTimeout(finish, 750);
582            }
583
584            function reverseOrder(cls, $container) {
585                var sortedKey = 'elixirSorted' + cls.replace(/[^a-z0-9]/gi, '');
586                var $containers = $container && $container.length ? $container : $(cls).parent();
587
588                $containers.each(function () {
589                    var $parent = $(this);
590                    var $items = $parent.children(cls);
591
592                    if (!$items.length || $parent.data(sortedKey)) {
593                        return;
594                    }
595
596                    $parent.append($items.get().reverse());
597                    $parent.data(sortedKey, true);
598                });
599            }
600
601        }
602    }
603})(jQuery, Drupal);// End of use strict

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.