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.