{"mappings":"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","sources":["src/110_menus/scrollspy/scrollspyCustomNav.js"],"sourcesContent":["(function ($, Drupal, window, document) {\n 'use strict';\n\n Drupal.behaviors.scrollspyCustomNav = {\n attach: function scrollspyCustomNav(context, settings) {\n if (typeof context['location'] !== 'undefined') {// Only fire on document load.\n window.addEventListener('load', function() {\n var anchorsToCreate = [];\n\n // Get all direct children from first .node__content element OR layout builder sections (still using this just for backwards-compatibility with work done previously on MA)\n var directChildren = $(`.block--main-page-content .node__content:first .pre-content-layout-region,\n .block--main-page-content .node__content:first .main__wrapper > .container > .layout,\n .block--main-page-content .node__content:first .post-content-layout-region,\n .region-postfix,\n .block--main-page-content .node__content:first`).children();\n\n // Get all elements that have 'scroll-' at the start of its id\n var scrollElements = $(`[id^=scroll-]`);\n\n // Merge two array together while replacing duplicates\n var elementsToTraverse = $.extend(directChildren, scrollElements);\n\n // Iterate though elements needing to be traversed...\n $.each(elementsToTraverse, (index, element) => {\n if ($('#block-scrollspycontainerblock-degrees-program').length) {\n if (!$(element).parent().hasClass('block--degrees-programs-scrollspy')) {\n return;\n }\n }\n\n var elementID = $(element).attr('id');\n\n // If the current element has an ID attribute...\n if (elementID !== undefined) {\n // Find h2s, grab the first only (h2s may be nested within an element), and retrieve it's text\n var h2Text = $(element).find('h2.field__label, .fieldset__legend h2, h2.block__title').first().text();\n\n // If this element has an h2...\n if (h2Text.length > 0) {\n if (elementID == 'scroll-visit-department') {\n elementID = h2Text;\n h2Text = 'Visit Department';\n }\n\n if ($(element).parent().hasClass('block--degrees-programs-scrollspy')) {\n elementID = $(element).find('[id^=scroll-dp-]').first().text();\n }\n\n anchorsToCreate.push({ element, h2Text, elementID });\n }\n }\n });\n\n var isProgram = ($('body.page-node-type-program').length > 0) ? true : false;\n\n // Building the markup\n var builtMarkupString = `
`;\n builtMarkupString += `
`;\n builtMarkupString += `
`;\n\n if (isProgram) {\n builtMarkupString += `
`;\n }\n else {\n builtMarkupString += `
`;\n }\n\n var visitDepartmentMarkupString;\n\n $.each(anchorsToCreate, (index, element) => {\n if (element.h2Text == 'Visit Department') {\n visitDepartmentMarkupString = `${element.h2Text.trim()}`;\n }\n else {\n if ($(element.element).parent().hasClass('block--degrees-programs-scrollspy')) {\n builtMarkupString += `${element.h2Text.trim()}`;\n }\n else {\n // Add each anchor tag with its corresponding data to the built markup\n builtMarkupString += `${element.h2Text.trim()}`;\n }\n }\n });\n\n var applyNowMarkupString = 'Apply Now';\n var applyNowMobileMarkupString;\n\n if (isProgram) {\n if (visitDepartmentMarkupString) {\n applyNowMobileMarkupString = `
${visitDepartmentMarkupString}Apply Now
`;\n builtMarkupString += `
` +\n visitDepartmentMarkupString +\n applyNowMarkupString +\n '
' +\n applyNowMobileMarkupString;\n }\n else {\n applyNowMobileMarkupString = '
Apply Now
';\n builtMarkupString += `
` +\n applyNowMarkupString +\n '
' +\n applyNowMobileMarkupString;\n }\n }\n else {\n builtMarkupString += '';\n }\n\n // Add the markup to the .region-content as the first direct child\n $('#block-scrollspycontainerblock > .block__content, #block-scrollspycontainerblock-degrees-program > .block__content').first().prepend(builtMarkupString);\n\n // Initialize scrollspy on the markup\n var navbar = $('#navbar-scrollspy');\n\n // Below is the functionality for the bar to scroll automatically on when links are out of the viewport but the component is within sight.\n var offset = 25;\n var anchorData = [];\n window.anchorData = anchorData;\n var anchors = $('.navbar-scroll-container a');\n\n // Checking if any anchors were found.\n if (anchors.length > 0) {\n $('.navbar-scroll-container').addClass('scroll-not-empty');\n }\n\n // Store each created anchor with its x position in the bar and its text.\n $.each(anchors, (index, element) => {\n window.anchorData.push({\n element,\n 'x': $(element).position().left,\n 'text': $(element).text()\n });\n });\n\n // Credits go to Colin Smith, taken from sidebar.js file.\n // ------------------------------------------------------------\n // On window load, get header and toolbar height (if logged in), and attach Zebra_Pin library to .region-scrollspy-container to be sticky.\n var zp_nav_scrollspy = new $.Zebra_Pin($('.region-scrollspy-container'), {\n z_index: 460,\n top_spacing: calculateOffset() ,\n });\n if (document.querySelector('body').classList.contains('user-logged-in')) {\n var scrollspy = new VanillaScrollspy(navbar[0], undefined, undefined, 0 - calculateLoggedInOffset());\n scrollspy.recalculateFn = function() {return 0 - calculateLoggedInOffset()};\n } else {\n var scrollspy = new VanillaScrollspy(navbar[0], undefined, undefined, calculateLoggedOutOffset());\n scrollspy.recalculateFn = function() {return calculateLoggedOutOffset() };\n }\n scrollspy.init();\n window.scrollspy = scrollspy;\n });\n\n // Helper function used to detect if element is within the viewport.\n // Credits go to Dan on StackOverflow:\n // https://stackoverflow.com/questions/123999/how-can-i-tell-if-a-dom-element-is-visible-in-the-current-viewport/7557433#7557433\n // ------------------------------------------------------------\n function isElementInViewport (el) {\n //special bonus for those using jQuery\n if (typeof jQuery === \"function\" && el instanceof jQuery) {\n el = el[0];\n }\n\n var rect = el.getBoundingClientRect();\n\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n );\n }\n\n\n // On window scroll...\n function scrollSpyMobileScroll() {\n // Grab the active anchors text.\n var activeAnchorText = $('.navbar-scroll-container a.active').first().text();\n\n // If active element exists...\n if (activeAnchorText.length > 0) {\n // Loop through created anchors and find the element in the array that has the active anchors text and store that element.\n var xToScrollTo = window.anchorData.find(element => element.text == activeAnchorText);\n\n // If an element was found from the loop above AND the element is not in the viewport...\n if (xToScrollTo != undefined && !isElementInViewport($(xToScrollTo.element)[0])) {\n // Scroll the bar to the position of the newly active anchor.\n $('.navbar-scroll-container').stop(true, false).animate({scrollLeft: xToScrollTo.x - calculateLoggedOutOffset()}, 100);\n }\n }\n };\n\n // Debounce window scroll event.\n var windowScroll;\n window.onscroll = function() {\n clearTimeout(windowScroll);\n windowScroll = setTimeout(scrollSpyMobileScroll(), 100);\n };\n }\n }\n };\n function calculateOffset($=jQuery) {\n var hasFixedAdminToolbar = $('body').hasClass('toolbar-fixed');\n var adminToolbarHeight = (hasFixedAdminToolbar) ? parseInt($('body').css('padding-top'), 10) : 0;\n var preHeaderOffsetHeight = $('.region-navigation').outerHeight();\n var preMobileHeaderOffsetHeight = $('.region-mobile-navigation').outerHeight();\n var topOffset = ($('.region-navigation').is(':visible')) ? adminToolbarHeight + preHeaderOffsetHeight : adminToolbarHeight + preMobileHeaderOffsetHeight;\n return topOffset;\n }\n function calculateLoggedInOffset() {\n //scrollspy bar\n return getHeightIfIdExists('block-views-block-contextual-banner') +\n getHeightIfIdExists('toolbar-bar') +\n getHeightIfIdExists('toolbar-item-administration-tray') +\n getHeightIfClassExists('.region-header .messages') +\n getHeightIfIdExists('block-views-block-alerts-information-alert-block') -\n getHeightIfIdExists('block-mount-allison-local-tasks');\n }\n\n function calculateLoggedOutOffset() {\n return getHeightIfClassExists('.region-navigation') +\n getHeightIfIdExists('navbar-scrollspy');\n }\n\n function getHeightIfIdExists(str) {\n let ele = document.getElementById(str);\n if (ele) {\n return ele.clientHeight;\n } else {\n return 0;\n }\n }\n\n function getHeightIfClassExists(str) {\n let ele = document.querySelector(str);\n if (ele) {\n return ele.clientHeight;\n } else {\n return 0;\n }\n }\n\n})(jQuery, Drupal, window, document);\n"],"names":[],"version":3,"file":"scrollspyCustomNav.js.map"}