{"version":3,"sources":["webpack://asp.net/./Scripts/utilities/utilities.js","webpack://asp.net/./Scripts/components/grid-overlay.js","webpack://asp.net/./Scripts/components/modal.js","webpack://asp.net/./Scripts/utilities/window-metrics.js","webpack://asp.net/./Scripts/pages/home.js","webpack://asp.net/./Scripts/components/header.js","webpack://asp.net/./Scripts/pages/ahus-overview.js","webpack://asp.net/./Scripts/pages/diagnosing-ahus.js","webpack://asp.net/./Scripts/utilities/zoomable-image.js","webpack://asp.net/./Scripts/pages/complement-system.js","webpack://asp.net/./Scripts/pages/pathophysiology.js","webpack://asp.net/./Scripts/components/tab-container.js","webpack://asp.net/./Scripts/pages/resources-hcp.js","webpack://asp.net/./Scripts/pages/styleguide.js","webpack://asp.net/./Scripts/main.js"],"names":["settings","browserIsIe","browserIsEdge","scrollTween","test","navigator","userAgent","Element","prototype","matches","msMatchesSelector","remove","this","parentElement","removeChild","NodeList","HTMLCollection","i","length","node","screenshotMode","exec","document","location","search","hasPassiveEvents","window","passiveTestOptions","addEventListener","removeEventListener","previousBodyOverflowSetting","previousBodyPaddingRight","isIosDevice","platform","locks","documentListenerAdded","initialClientY","allowTouchMove","el","some","lock","options","preventDefault","rawEvent","e","event","target","touches","restoreOverflowSetting","setTimeout","undefined","body","style","paddingRight","overflow","classList","Utilities","url","Image","src","value","toString","element","type","toLowerCase","childNodes","childNode","nodeType","tagName","results","push","selector","closest","parentNode","removeAttribute","template","div","createElement","innerHTML","firstChild","amPm","date","Date","year","getFullYear","substring","hour","getHours","minutes","getMinutes","getMonth","getDate","replace","x","match","position","callback","progress","currentScrollTop","pageYOffset","duration","Math","abs","scrollTo","progressObject","TweenLite","fromTo","ease","Power2","easeOut","onUpdate","onComplete","scrollTop","targetElement","console","error","ontouchstart","targetTouches","clientY","ontouchmove","scrollHeight","clientHeight","isTargetElementTotallyScrolled","stopPropagation","handleScroll","passive","reserveScrollBarGap","scrollBarGap","innerWidth","documentElement","clientWidth","add","setOverflowHidden","forEach","filter","gridOverlay","gridOverlayVisible","GridOverlay","parameters","createElementFromTemplate","appendChild","key","resetStyles","display","templates","backdrop","modal","open","initialScale","scaleUp","scaleDown","easing","close","endScale","minimumTimeBeforeAllowingClose","slowMoScale","fadeAndPartialVerticalEnvelope","envelopeAmount","presentationTypes","fade","verticalEnvelope","openModals","Modal","className","showPresentationType","closePresentationType","immediate","callbacks","t","timeline","bodyContent","header","querySelector","main","footer","presentationType","call","tabIndexElements","querySelectorAll","tabIndexElement","tabIndex","getAttribute","parseInt","setAttribute","container","closeButton","content","opacity","adjustContentHeight","top","height","transform","overflowY","availableHeight","getComputedStyle","contentHeight","offsetHeight","marginTop","marginBottom","scrollableViewHeight","innerHeight","numberToPx","includesScrollingContent","openStartTime","getTime","closeCallback","preShow","postShow","percentComplete","onCompleteCallback","shiftKey","TimelineMax","to","scale","round","containerHeight","offset","restoreTabIndices","originalTabIndex","closing","contains","preClose","postClose","splice","breakpoints","small","medium","large","extraLarge","largeWithMargins","sortedBreakpoints","lastBreakpoint","currentBreakpoint","breakpointChangeCallbacks","updateWindowMetrics","breakpoint","matchMedia","mobileDesktopTransition","WindowMetrics","isMobile","breakpointName","sort","a","b","breakpointToTest","HomePage","root","overlapCallout","extraPadding","homeMargin","getBoundingClientRect","setProperty","stickyModes","off","alwaysVisible","revealOnScroll","mobileMenuModes","alwaysOpen","collapsable","desktopMenuModes","cssOnly","dropdown","Menu","mobileMenuMode","desktopMenuMode","isOpen","submenuContainer","label","submenuItems","slowMo","submenuItem","link","href","pathname","openCloseTimeline","updateScrollability","Header","stickyMode","isSticky","suppressSticky","stickyTimeline","scrollVelocity","lastScrollPosition","lastScrollTime","links","navigation","navigationContent","hamburger","getElementById","menus","menuItems","menu","stickyScrollPosition","resizeCallback","normalHeight","stickyHeight","calculateStickyHeight","updateStickyBodyPadding","toggleSticky","updateStickiness","hamburgerClickCallback","backdropClickCallback","yPercent","Power3","bounds","openHeight","scrollPosition","scrollTime","timeDifference","paddingTop","updateHeight","AhusOverview","ahusoverviewMargin","DiagnosingAhus","caseStudies","tabSwitcher","activeId","videoId","videoTabLinks","videoWrapDivs","newVideoId","w","_wq","wistiaVideos","v","id","onReady","video","pause","time","play","calculateTargetScrollPosition","targetScrollPosition","caseStudyTabId","s","async","c","triggerLinks","hash","rubberBandModes","disabled","independentAxes","vector","ZoomableImage","flickEnabled","rubberBandMode","smallImage","dX","dY","localX","clientX","localY","clickPointX","clickPointY","left","localPercentX","localPercentY","viewport","dragImage","adjustTopLeftPosition","imageLeftPosition","imageTopPosition","setupDragCallback","loaded","loadCallback","indexOf","width","imageScale","centerPointX","centerPointY","yDelta","xDelta","scaleDelta","animationState","visibility","tickCallback","TweenMax","Power1","halfImageWidth","offsetLeft","offsetTop","determineCappedDragOffsetX","proposedDX","leftEdge","rightEdge","determineCappedDragOffsetY","proposedDY","topEdge","bottomEdge","calculateViewportIntersectionVelocityAndTime","proposedDistance","cappedDistance","initialVelocity","deceleration","intersectVelocity","sqrt","velocity","calculateFlickAnimationSettings","originX","originY","velocityX","velocityY","velocityMagnitude","totalTime","angle","atan","cosAngle","cos","sinAngle","sin","decelerationX","decelerationY","proposedDistanceX","cappedDistanceX","proposedDistanceY","cappedDistanceY","intersectVelocityAndTimeX","intersectVelocityAndTimeY","rubberBandStartVelocityAndTime","calculateRubberBandAnimationSettings","flickSettings","totalDistance","rubberBandRestingPositionOffsetX","rubberBandRestingPositionOffsetY","rubberBandStartTime","rubberBandStartDistance","rubberBandStartVelocity","rubberBandStretchDuration","distanceBeyondBounds","rubberBandDeceleration","rubberBandRestDuration","rubberBandSettings","Object","assign","setupVectorRubberBandAnimation","elapsedTime","flickTimeline","Power0","easeNone","distanceAlongFlickPath","offsetX","offsetY","elapsedTimeStep2","easeInOut","getRatio","flickDistanceX","flickDistanceY","setupIndependentAxesRubberBandAnimation","rubberBandSettingsX","rubberBandSettingsY","elapsedTimeX","elapsedTimeY","ticker","startCallback","kill","thisX","thisY","lastX","lastY","startX","startY","newDX","newDY","lastSampleTime","moveCallback","currentTime","dT","releaseCallback","flickSettingsX","flickSettingsY","distanceX","distanceY","ComplementSystem","enlargableImages","calloutMargin","Pathophysiology","slideIndex","previousButton","nextButton","slideButton1","slideButton2","slideButton3","slideButton4","slideButton5","moveSlide","n","showSlide","currentSlide","carousel","slides","dots","hotspots","radioBttns","h","radio","checked","r","item","wipeMode","fixedDuration","fixedSpeed","animation","wipe","Tab","button","buttonClickCallback","innerContent","insertBefore","TabContainer","containerElement","mobileWipeSpeed","desktopWipeSpeed","navigationTimeline","state","currentTabIndex","tabPanelContent","getChildElement","tabButtonContainer","tabContentContainer","tabs","tabButtonElements","getChildElements","tabContentElements","tab","navigate","toTabIndex","fromTab","onNavigateFromTab","toTab","onNavigateToTab","wipeDuration","zIndex","boxShadow","borderTop","shadowOpacity","RecourcesHcp","loadWistiaJS","StyleGuide","AhusHcpSource","referencesContainer","referencesControl","referencesContent","references","maxScrollPosition","scrollWindowToPosition","jumplinks","j","loc","eopCallouts","ctaEl","myHref","hasAttribute","externalLinks","externalLink","welcomeKey","localStorage","getItem","setItem"],"mappings":"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","file":"Scripts\\main.min.js","sourcesContent":["let\r\n settings = {\r\n scrolling: {\r\n pixelsPerSecond: 500,\r\n minDuration: 0.25,\r\n maxDuration: 1.0\r\n }\r\n },\r\n\r\n browserIsIe = false,\r\n browserIsEdge = false,\r\n\r\n scrollTween = null;\r\n\r\n// Detect if the browser is IE or Edge; found this here:\r\n// https://stackoverflow.com/questions/31757852/how-can-i-detect-internet-explorer-ie-and-microsoft-edge-using-javascript\r\nif (/MSIE 10/i.test(navigator.userAgent))\r\n browserIsIe = true;\r\n\r\nif (/MSIE 9/i.test(navigator.userAgent) || /rv:11.0/i.test(navigator.userAgent))\r\n browserIsIe = true;\r\n\r\nif (/Edge\\/\\d./i.test(navigator.userAgent))\r\n browserIsEdge = true;\r\n\r\n// Perform some IE fixes\r\nif (browserIsIe && !browserIsEdge) {\r\n // matches\r\n if (!Element.prototype.matches) {\r\n Element.prototype.matches = Element.prototype.msMatchesSelector;\r\n }\r\n\r\n // remove\r\n Element.prototype.remove = function () {\r\n if (this.parentElement !== null)\r\n this.parentElement.removeChild(this);\r\n }\r\n\r\n NodeList.prototype.remove = HTMLCollection.prototype.remove = function () {\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n let node = this[i];\r\n\r\n if (node !== null && node.parentElement !== null)\r\n node.parentElement.removeChild(node);\r\n }\r\n }\r\n}\r\n\r\n// Screenshot mode is enabled by including \"?screenshot-mode\" in the URL\r\nlet screenshotMode = /[\\?\\&]screenshot-mode/.exec(document.location.search) !== null;\r\n\r\n/**********************************************************\r\n * \r\n * Code supporting the scroll locking methods - this was adapted from\r\n * \"body-scroll-lock\" found here:\r\n * https://github.com/willmcpo/body-scroll-lock\r\n * \r\n *********************************************************/\r\n\r\n// Older browsers don't support event options, feature detect it.\r\nlet hasPassiveEvents = false;\r\nif (typeof window !== 'undefined') {\r\n const passiveTestOptions = {\r\n get passive() {\r\n hasPassiveEvents = true;\r\n return undefined;\r\n },\r\n };\r\n window.addEventListener('testPassive', null, passiveTestOptions);\r\n window.removeEventListener('testPassive', null, passiveTestOptions);\r\n}\r\n\r\nconst isIosDevice =\r\n typeof window !== 'undefined' &&\r\n window.navigator &&\r\n window.navigator.platform &&\r\n /iP(ad|hone|od)/.test(window.navigator.platform);\r\n\r\nlet locks = [];\r\nlet documentListenerAdded = false;\r\nlet initialClientY = -1;\r\nlet previousBodyOverflowSetting;\r\nlet previousBodyPaddingRight;\r\n\r\n// returns true if `el` should be allowed to receive touchmove events.\r\nconst allowTouchMove = (el) =>\r\n locks.some(lock => {\r\n if (lock.options.allowTouchMove && lock.options.allowTouchMove(el)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n\r\nconst preventDefault = (rawEvent) => {\r\n const e = rawEvent || window.event;\r\n\r\n // For the case whereby consumers adds a touchmove event listener to document.\r\n // Recall that we do document.addEventListener('touchmove', preventDefault, { passive: false })\r\n // in disableBodyScroll - so if we provide this opportunity to allowTouchMove, then\r\n // the touchmove event on document will break.\r\n if (allowTouchMove(e.target)) {\r\n return true;\r\n }\r\n\r\n // Do not prevent if the event has more than one touch (usually meaning this is a multi touch gesture like pinch to zoom).\r\n if (e.touches.length > 1) return true;\r\n\r\n if (e.preventDefault) e.preventDefault();\r\n\r\n return false;\r\n};\r\n\r\nconst setOverflowHidden = (options) => {\r\n // Setting overflow on body/documentElement synchronously in Desktop Safari slows down\r\n // the responsiveness for some reason. Setting within a setTimeout fixes this.\r\n setTimeout(() => {\r\n // If previousBodyPaddingRight is already set, don't set it again.\r\n if (previousBodyPaddingRight === undefined) {\r\n const reserveScrollBarGap = !!options && options.reserveScrollBarGap === true;\r\n const scrollBarGap = window.innerWidth - document.documentElement.clientWidth;\r\n\r\n if (reserveScrollBarGap && scrollBarGap > 0) {\r\n previousBodyPaddingRight = document.body.style.paddingRight;\r\n document.body.style.paddingRight = `${scrollBarGap}px`;\r\n }\r\n }\r\n\r\n // If previousBodyOverflowSetting is already set, don't set it again.\r\n if (previousBodyOverflowSetting === undefined) {\r\n previousBodyOverflowSetting = document.body.style.overflow;\r\n document.body.style.overflow = 'hidden';\r\n document.body.classList.add('no-select');\r\n }\r\n });\r\n};\r\n\r\nconst restoreOverflowSetting = () => {\r\n // Setting overflow on body/documentElement synchronously in Desktop Safari slows down\r\n // the responsiveness for some reason. Setting within a setTimeout fixes this.\r\n setTimeout(() => {\r\n if (previousBodyPaddingRight !== undefined) {\r\n document.body.style.paddingRight = previousBodyPaddingRight;\r\n\r\n // Restore previousBodyPaddingRight to undefined so setOverflowHidden knows it\r\n // can be set again.\r\n previousBodyPaddingRight = undefined;\r\n }\r\n\r\n if (previousBodyOverflowSetting !== undefined) {\r\n document.body.style.overflow = previousBodyOverflowSetting;\r\n document.body.classList.remove('no-select');\r\n\r\n // Restore previousBodyOverflowSetting to undefined\r\n // so setOverflowHidden knows it can be set again.\r\n previousBodyOverflowSetting = undefined;\r\n }\r\n });\r\n};\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#Problems_and_solutions\r\nconst isTargetElementTotallyScrolled = (targetElement) =>\r\n targetElement ? targetElement.scrollHeight - targetElement.scrollTop <= targetElement.clientHeight : false;\r\n\r\nconst handleScroll = (event, targetElement) => {\r\n const clientY = event.targetTouches[0].clientY - initialClientY;\r\n\r\n if (allowTouchMove(event.target)) {\r\n return false;\r\n }\r\n\r\n if (targetElement && targetElement.scrollTop === 0 && clientY > 0) {\r\n // element is at the top of its scroll.\r\n return preventDefault(event);\r\n }\r\n\r\n if (isTargetElementTotallyScrolled(targetElement) && clientY < 0) {\r\n // element is at the top of its scroll.\r\n return preventDefault(event);\r\n }\r\n\r\n event.stopPropagation();\r\n return true;\r\n};\r\n\r\n/**********************************************************\r\n * \r\n * Utilities class\r\n * \r\n *********************************************************/\r\n\r\nexport class Utilities {\r\n // IE & Edge flags\r\n static get browserIsIe() {\r\n return browserIsIe;\r\n }\r\n\r\n static get browserIsEdge() {\r\n return browserIsEdge;\r\n }\r\n\r\n static get screenshotMode() {\r\n return screenshotMode;\r\n }\r\n\r\n // Preloads images - used mainly for CSS rules that are\r\n // triggered by events (:hover), as that can cause a brief\r\n // flicker while the browser loads the event-related asset\r\n static preloadImage(url) {\r\n var image = new Image();\r\n image.src = url;\r\n }\r\n\r\n static numberToPx(value) {\r\n return value.toString() + \"px\";\r\n }\r\n\r\n static getChildElement(element, type) {\r\n type = type.toLowerCase();\r\n\r\n for (var i = 0; i < element.childNodes.length; i++) {\r\n var childNode = element.childNodes[i];\r\n if (childNode.nodeType != 1)\r\n continue;\r\n\r\n if (childNode.tagName.toLowerCase() == type)\r\n return childNode;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n static getChildElements(element, type) {\r\n var results = [];\r\n\r\n type = type.toLowerCase();\r\n\r\n for (var i = 0; i < element.childNodes.length; i++) {\r\n var childNode = element.childNodes[i];\r\n if (childNode.nodeType != 1)\r\n continue;\r\n\r\n if (childNode.tagName.toLowerCase() == type)\r\n results.push(childNode);\r\n }\r\n\r\n return results;\r\n }\r\n\r\n static getClosestElement(element, selector) {\r\n if (element.closest)\r\n return element.closest(selector);\r\n\r\n var node = element.parentNode;\r\n while (node && node.tagName !== undefined) {\r\n if (node.matches(selector))\r\n return node;\r\n\r\n node = node.parentNode;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n static resetStyles(element) {\r\n element.removeAttribute(\"style\");\r\n }\r\n\r\n static createElementFromTemplate(template) {\r\n var div = document.createElement(\"div\");\r\n div.innerHTML = template;\r\n\r\n return div.firstChild;\r\n }\r\n\r\n static formatDateFromJson(value) {\r\n var\r\n date = new Date(value),\r\n year = date.getFullYear().toString().substring(2, 4),\r\n hour = date.getHours(),\r\n minutes = date.getMinutes().toString(),\r\n amPm;\r\n\r\n if (hour >= 12) {\r\n amPm = \"pm\";\r\n\r\n if (hour > 12)\r\n hour -= 12;\r\n } else {\r\n amPm = \"am\";\r\n }\r\n\r\n if (minutes.length == 1)\r\n minutes = \"0\" + minutes;\r\n\r\n return `${date.getMonth() + 1}/${date.getDate()}/${year} ${hour}:${minutes}${amPm}`;\r\n }\r\n\r\n static addZipCodeInputValidation(element) {\r\n element.addEventListener(\"input\", function (e) {\r\n e.target.value = e.target.value.replace(/\\D/g, \"\");\r\n });\r\n }\r\n\r\n static addNpiCodeInputValidation(element) {\r\n element.addEventListener(\"input\", function (e) {\r\n e.target.value = e.target.value.replace(/\\D/g, \"\");\r\n });\r\n }\r\n\r\n static addTelephoneInputValidation(element) {\r\n element.addEventListener(\"input\", function (e) {\r\n var x = e.target.value.replace(/\\D/g, \"\").match(/(\\d{0,1})(\\d{0,1})(\\d{0,1})(\\d{0,1})(\\d{0,1})(\\d{0,1})(\\d{0,1})(\\d{0,1})(\\d{0,1})(\\d{0,1})(\\d{0,9})/);\r\n e.target.value = (!x[1] ? \"\" : \"(\" + x[1]) + (!x[2] ? \"\" : x[2]) + (x[4] ? x[3] + \") \" : x[3]) + x[4] + x[5] + x[6] + (x[7] ? \"-\" + x[7] + x[8] + x[9] + x[10] : \"\") + (x[11] ? \" \" + x[11] : \"\");\r\n });\r\n }\r\n \r\n static get currentlyScrolling() {\r\n return scrollTween !== null;\r\n }\r\n\r\n static scrollWindowToPosition(position, callback) {\r\n // Stop any ongoing animation\r\n if (scrollTween)\r\n scrollTween.progress(1);\r\n\r\n var\r\n currentScrollTop = window.pageYOffset,\r\n duration = Math.abs(position - currentScrollTop) / settings.scrolling.pixelsPerSecond;\r\n\r\n // Transition immediately if the distance is small\r\n if (duration < settings.scrolling.minDuration) {\r\n window.scrollTo(0, position);\r\n\r\n if (callback)\r\n callback();\r\n return;\r\n }\r\n\r\n // Cap the duration\r\n if (duration > settings.scrolling.maxDuration)\r\n duration = settings.scrolling.maxDuration;\r\n\r\n // Perform the transition\r\n var progressObject = {\r\n position: 0\r\n };\r\n\r\n scrollTween = TweenLite.fromTo(\r\n progressObject,\r\n duration,\r\n {\r\n position: currentScrollTop\r\n },\r\n {\r\n ease: Power2.easeOut,\r\n position: position,\r\n onUpdate: function () {\r\n window.scrollTo(0, progressObject.position);\r\n },\r\n onComplete: function () {\r\n scrollTween = null;\r\n\r\n if (callback)\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n static scrollElementToPosition(element, position, callback) {\r\n // Stop any ongoing animation\r\n if (scrollTween)\r\n scrollTween.progress(1);\r\n\r\n var\r\n currentScrollTop = element.scrollTop,\r\n duration = Math.abs(position - currentScrollTop) / settings.scrolling.pixelsPerSecond;\r\n\r\n // Transition immediately if the distance is small\r\n if (duration < settings.scrolling.minDuration) {\r\n element.scrollTop = position;\r\n\r\n if (callback)\r\n callback();\r\n return;\r\n }\r\n\r\n // Cap the duration\r\n if (duration > settings.scrolling.maxDuration)\r\n duration = settings.scrolling.maxDuration;\r\n\r\n // Perform the transition\r\n var progressObject = {\r\n position: 0\r\n };\r\n\r\n scrollTween = TweenLite.fromTo(\r\n progressObject,\r\n duration,\r\n {\r\n position: currentScrollTop\r\n },\r\n {\r\n ease: Power2.easeOut,\r\n position: position,\r\n onUpdate: function () {\r\n element.scrollTop = progressObject.position;\r\n },\r\n onComplete: function () {\r\n scrollTween = null;\r\n\r\n if (callback)\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n /**********************************************************\r\n * \r\n * Scroll locking methods\r\n * \r\n *********************************************************/\r\n\r\n static lockScrolling(targetElement, options) {\r\n if (isIosDevice) {\r\n // targetElement must be provided, and disableBodyScroll must not have been\r\n // called on this targetElement before.\r\n if (!targetElement) {\r\n // eslint-disable-next-line no-console\r\n console.error(\r\n 'lockScrolling: targetElement required'\r\n );\r\n return;\r\n }\r\n\r\n if (targetElement && !locks.some(lock => lock.targetElement === targetElement)) {\r\n const lock = {\r\n targetElement,\r\n options: options || {},\r\n };\r\n\r\n locks = [...locks, lock];\r\n\r\n targetElement.ontouchstart = (event) => {\r\n if (event.targetTouches.length === 1) {\r\n // detect single touch.\r\n initialClientY = event.targetTouches[0].clientY;\r\n }\r\n };\r\n\r\n targetElement.ontouchmove = (event) => {\r\n if (event.targetTouches.length === 1) {\r\n // detect single touch.\r\n handleScroll(event, targetElement);\r\n }\r\n };\r\n\r\n if (!documentListenerAdded) {\r\n document.addEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined);\r\n documentListenerAdded = true;\r\n }\r\n }\r\n } else {\r\n setOverflowHidden(options);\r\n const lock = {\r\n targetElement,\r\n options: options || {},\r\n };\r\n\r\n locks = [...locks, lock];\r\n }\r\n }\r\n\r\n static unlockScrolling() {\r\n if (isIosDevice) {\r\n // Clear all locks ontouchstart/ontouchmove handlers, and the references.\r\n locks.forEach((lock) => {\r\n lock.targetElement.ontouchstart = null;\r\n lock.targetElement.ontouchmove = null;\r\n });\r\n\r\n if (documentListenerAdded) {\r\n document.removeEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined);\r\n documentListenerAdded = false;\r\n }\r\n\r\n locks = [];\r\n\r\n // Reset initial clientY.\r\n initialClientY = -1;\r\n } else {\r\n restoreOverflowSetting();\r\n locks = [];\r\n }\r\n }\r\n\r\n static unlockScrollingForTargetElement(targetElement) {\r\n if (isIosDevice) {\r\n if (!targetElement) {\r\n // eslint-disable-next-line no-console\r\n console.error(\r\n 'unlockScrollingForTargetElement: targetElement required'\r\n );\r\n return;\r\n }\r\n\r\n targetElement.ontouchstart = null;\r\n targetElement.ontouchmove = null;\r\n\r\n locks = locks.filter(lock => lock.targetElement !== targetElement);\r\n\r\n if (documentListenerAdded && locks.length === 0) {\r\n document.removeEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined);\r\n\r\n documentListenerAdded = false;\r\n }\r\n } else {\r\n locks = locks.filter(lock => lock.targetElement !== targetElement);\r\n if (!locks.length) {\r\n restoreOverflowSetting();\r\n }\r\n }\r\n }\r\n}\r\n","import { Utilities } from \"../utilities/utilities.js\";\r\n\r\nlet gridOverlay = null,\r\n\tgridOverlayVisible = false;\r\n\r\nexport class GridOverlay {\r\n\tstatic initialize(parameters) {\r\n\t\tif (gridOverlay)\r\n\t\t\treturn;\r\n\r\n gridOverlay = Utilities.createElementFromTemplate(`
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n\t
\r\n
`);\r\n\r\n document.body.appendChild(gridOverlay);\r\n\r\n window.addEventListener(\"keypress\", function (event) {\r\n if (event.key == \"`\") {\r\n if (gridOverlayVisible)\r\n Utilities.resetStyles(gridOverlay);\r\n else\r\n gridOverlay.style.display = \"block\";\r\n\r\n gridOverlayVisible = !gridOverlayVisible;\r\n }\r\n });\r\n\t}\r\n}","import { Utilities } from \"../utilities/utilities.js\";\r\n\r\nvar\r\n // General settings\r\n settings = {\r\n templates: {\r\n backdrop: `
`,\r\n modal: `
\r\n
\r\n \r\n \r\n
\r\n
\r\n
`\r\n },\r\n\r\n open: {\r\n duration: 0.5,\r\n initialScale: {\r\n scaleUp: 0.9,\r\n scaleDown: 1.15\r\n },\r\n easing: Power2.easeOut\r\n },\r\n\r\n close: {\r\n duration: 0.5,\r\n endScale: {\r\n scaleUp: 1.1,\r\n scaleDown: 0.95\r\n },\r\n easing: Power2.easeOut\r\n },\r\n\r\n minimumTimeBeforeAllowingClose: 200,\r\n slowMoScale: 5,\r\n\r\n fadeAndPartialVerticalEnvelope: {\r\n envelopeAmount: 0.25\r\n }\r\n },\r\n\r\n presentationTypes = {\r\n fade: 0,\r\n scaleUp: 1,\r\n scaleDown: 2,\r\n verticalEnvelope: 3,\r\n fadeAndPartialVerticalEnvelope: 4\r\n },\r\n \r\n openModals = [];\r\n\r\nexport class Modal {\r\n static show(template, className, showPresentationType, closePresentationType, immediate, callbacks, event) {\r\n var t = {\r\n timeline: null,\r\n\r\n bodyContent: {\r\n header: document.body.querySelector(\"header\"),\r\n main: document.body.querySelector(\"main\"),\r\n footer: document.body.querySelector(\"footer\")\r\n },\r\n\r\n close: function (immediate, presentationType, event) {\r\n if (t.timeline !== null)\r\n return false;\r\n \r\n close.call(t, callbacks, immediate, presentationType, event);\r\n return false;\r\n }\r\n };\r\n \r\n // Remove tabindex values from everything\r\n var tabIndexElements = document.querySelectorAll(\"*[tabindex]\");\r\n for (var i = 0; i < tabIndexElements.length; i++) {\r\n var tabIndexElement = tabIndexElements[i],\r\n tabIndex = tabIndexElement.getAttribute(\"tabindex\");\r\n\r\n // Skip elements already out of the tabindex flow\r\n if (parseInt(tabIndex) < 0)\r\n continue;\r\n\r\n // Store original tab index (this would not work right if we\r\n // were to allow more than one modal onscreen at a time, I think)\r\n tabIndexElement.setAttribute(\"data-original-tabindex\", tabIndex);\r\n tabIndexElement.setAttribute(\"tabindex\", \"-1\");\r\n }\r\n\r\n // Setup DOM elements\r\n t.backdrop = Utilities.createElementFromTemplate(settings.templates.backdrop);\r\n t.container = Utilities.createElementFromTemplate(settings.templates.modal)\r\n t.closeButton = t.container.querySelector(\".modal-close-button\");\r\n t.content = t.container.querySelector(\".modal-content\");\r\n\r\n if (className)\r\n t.container.classList.add(className);\r\n\r\n // Add the template content into the modal\r\n t.content.innerHTML = template;\r\n\r\n // Append elements to the end of the DOM\r\n t.backdrop.style.opacity = 0;\r\n // add class name to backdrop pls\r\n t.backdrop.classList.add(className);\r\n document.body.appendChild(t.backdrop);\r\n\r\n t.container.style.opacity = 0;\r\n document.body.appendChild(t.container);\r\n\r\n // Make content scrollable if it's too tall to fit in the available space\r\n t.adjustContentHeight = function () {\r\n // Reset everything\r\n t.container.classList.remove(\"short-modal\");\r\n\r\n t.container.style.top = \"\";\r\n t.container.style.height = \"\";\r\n t.container.style.transform = \"\";\r\n t.container.style.height = \"\";\r\n\r\n t.content.style.overflowY = \"\";\r\n t.content.style.height = \"auto\";\r\n\r\n // Determine the size of the viewport and the content container\r\n var availableHeight = t.container.clientHeight,\r\n style = getComputedStyle(t.content),\r\n contentHeight = t.content.offsetHeight + parseInt(style.marginTop) + parseInt(style.marginBottom);\r\n\r\n if (contentHeight > availableHeight) {\r\n // There isn't enough space in the viewport to display all the content -\r\n // determine the size of the scrollable view\r\n var\r\n margin = contentHeight - t.content.clientHeight,\r\n scrollableViewHeight = availableHeight - margin;\r\n\r\n // If the scrollable view is really narrow, adjust the positioning of the modal to maximize\r\n // the amount of scrollable space onscreen - this is largely to accomodate mobile devices\r\n // in landscape orientation, where the popup keyboard shrinks the available space to almost\r\n // nothing\r\n if (scrollableViewHeight < 100) {\r\n scrollableViewHeight = window.innerHeight;\r\n t.container.classList.add(\"short-modal\");\r\n immediate = true;\r\n }\r\n\r\n t.content.style.height = Utilities.numberToPx(scrollableViewHeight);\r\n t.content.style.overflowY = \"scroll\";\r\n\r\n t.includesScrollingContent = true;\r\n } else {\r\n // There is enough room on screen to present the modal without a scrollbar -\r\n // just set our flag\r\n t.includesScrollingContent = false;\r\n }\r\n };\r\n\r\n window.addEventListener(\"resize\", function () {\r\n t.adjustContentHeight();\r\n });\r\n\r\n // Setup events\r\n var\r\n openStartTime = (new Date()).getTime(),\r\n\r\n closeCallback = function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Check if we're animating\r\n if (t.timeline !== null) {\r\n // Check if the minimum amount of time has elapsed since starting\r\n // the animation; if it hasn't, stop here\r\n let elapsed = (new Date()).getTime() - openStartTime;\r\n if (elapsed < settings.minimumTimeBeforeAllowingClose)\r\n return false;\r\n }\r\n\r\n close.call(t, callbacks, false, closePresentationType, event);\r\n };\r\n\r\n t.backdrop.addEventListener(\"click\", closeCallback);\r\n t.closeButton.addEventListener(\"click\", closeCallback);\r\n \r\n // Run \"preShow\" callback, if specified\r\n if (callbacks) {\r\n if (typeof callbacks.preShow == \"function\")\r\n callbacks.preShow.call(t);\r\n }\r\n\r\n // Do this after preShow is called, in case that callback adjusts the\r\n // height of the modal's content\r\n t.adjustContentHeight();\r\n \r\n // Fix content position\r\n Utilities.lockScrolling(t.content);\r\n\r\n // Present modal\r\n if (immediate) {\r\n // Transition immediately\r\n t.backdrop.style.opacity = 1;\r\n t.container.style.opacity = 1;\r\n\r\n // Run \"postShow\" callback, if specified\r\n if (callbacks) {\r\n if (typeof callbacks.postShow == \"function\")\r\n callbacks.postShow.call(t);\r\n }\r\n } else {\r\n // Animate transition\r\n var\r\n duration = settings.open.duration,\r\n\r\n progress = {\r\n percentComplete: 0\r\n },\r\n\r\n onCompleteCallback = function () {\r\n t.timeline = null;\r\n\r\n // Run \"postShow\" callback, if specified\r\n if (callbacks) {\r\n if (typeof callbacks.postShow == \"function\")\r\n callbacks.postShow.call(t);\r\n }\r\n };\r\n\r\n // Scale duration if the shift key is pressed\r\n if (event) {\r\n if (event.shiftKey === true)\r\n duration *= settings.slowMoScale;\r\n }\r\n\r\n // Create timeline\r\n t.timeline = new TimelineMax();\r\n \r\n switch (showPresentationType) {\r\n case presentationTypes.scaleUp:\r\n t.timeline.to(\r\n progress,\r\n duration,\r\n {\r\n ease: settings.open.easing,\r\n percentComplete: 1,\r\n\r\n onUpdate: function () {\r\n var scale = Math.round((settings.open.initialScale.scaleUp + ((1 - settings.open.initialScale.scaleUp) * progress.percentComplete)) * 1000) / 1000;\r\n scale = scale.toString();\r\n\r\n var transform = \"translate(-50%, -50%) scale(\" + scale + \", \" + scale + \")\";\r\n\r\n t.backdrop.style.opacity = progress.percentComplete;\r\n t.container.style.opacity = progress.percentComplete;\r\n t.container.style.transform = transform;\r\n },\r\n\r\n onComplete: onCompleteCallback\r\n });\r\n break;\r\n\r\n case presentationTypes.scaleDown:\r\n t.timeline.to(\r\n progress,\r\n duration,\r\n {\r\n ease: settings.open.easing,\r\n percentComplete: 1,\r\n\r\n onUpdate: function () {\r\n var scale = Math.round((settings.open.initialScale.scaleDown + ((1 - settings.open.initialScale.scaleDown) * progress.percentComplete)) * 1000) / 1000;\r\n scale = scale.toString();\r\n\r\n var transform = \"translate(-50%, -50%) scale(\" + scale + \", \" + scale + \")\";\r\n\r\n t.backdrop.style.opacity = progress.percentComplete;\r\n t.container.style.opacity = progress.percentComplete;\r\n t.container.style.transform = transform;\r\n },\r\n\r\n onComplete: onCompleteCallback\r\n });\r\n break;\r\n\r\n case presentationTypes.verticalEnvelope:\r\n {\r\n var containerHeight = t.container.clientHeight;\r\n\r\n t.container.style.height = Utilities.numberToPx(0);\r\n t.container.style.opacity = 1;\r\n\r\n t.timeline.to(\r\n progress,\r\n duration,\r\n {\r\n ease: settings.open.easing,\r\n percentComplete: 1,\r\n\r\n onUpdate: function () {\r\n var height = progress.percentComplete * containerHeight,\r\n\r\n // 2 = inner content remains still\r\n // > 2 = inner content shifts upward\r\n // < 2 = inner content shifts downward\r\n offset = (height - containerHeight) / 2.5;\r\n\r\n t.container.style.height = Utilities.numberToPx(height);\r\n t.content.style.top = Utilities.numberToPx(offset);\r\n\r\n t.closeButton.style.transform = `translate(0px, ${offset}px)`;\r\n\r\n t.backdrop.style.opacity = progress.percentComplete;\r\n },\r\n\r\n onComplete: function () {\r\n t.container.style.height = \"\";\r\n t.content.style.top = \"\";\r\n t.closeButton.style.transform = \"\";\r\n onCompleteCallback();\r\n }\r\n });\r\n }\r\n break;\r\n\r\n case presentationTypes.fadeAndPartialVerticalEnvelope:\r\n {\r\n var containerHeight = t.container.clientHeight;\r\n\r\n t.timeline.to(\r\n progress,\r\n duration,\r\n {\r\n ease: settings.open.easing,\r\n percentComplete: 1,\r\n\r\n onUpdate: function () {\r\n let height = Math.round((((1 - settings.fadeAndPartialVerticalEnvelope.envelopeAmount) * containerHeight) + (settings.fadeAndPartialVerticalEnvelope.envelopeAmount * containerHeight * progress.percentComplete)) * 1000) / 1000;\r\n\r\n t.backdrop.style.opacity = progress.percentComplete;\r\n\r\n t.container.style.opacity = progress.percentComplete;\r\n t.container.style.height = Utilities.numberToPx(height);\r\n },\r\n\r\n onComplete: function () {\r\n t.container.style.height = \"\";\r\n onCompleteCallback();\r\n }\r\n });\r\n }\r\n break;\r\n\r\n // Default to fade transition\r\n default:\r\n t.timeline.to(\r\n progress,\r\n duration,\r\n {\r\n ease: settings.open.easing,\r\n percentComplete: 1,\r\n\r\n onUpdate: function () {\r\n t.backdrop.style.opacity = progress.percentComplete;\r\n t.container.style.opacity = progress.percentComplete;\r\n },\r\n\r\n onComplete: onCompleteCallback\r\n });\r\n break;\r\n }\r\n }\r\n\r\n // Add this modal to the reference array\r\n openModals.push(t);\r\n }\r\n\r\n static get numberOfOpenModals() {\r\n return openModals.length;\r\n }\r\n\r\n static get anyOpenModalContainsScrollingContent() {\r\n for (var i = 0; i < openModals.length; i++) {\r\n if (openModals[i].includesScrollingContent)\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n static get presentationTypes() {\r\n return presentationTypes;\r\n }\r\n}\r\n\r\n// Private methods\r\nlet\r\n close = function (callbacks, immediate, presentationType, event) {\r\n var\r\n t = this,\r\n\r\n restoreTabIndices = function () {\r\n // Remove tabindex values from everything\r\n var tabIndexElements = document.querySelectorAll(\"*[data-original-tabindex]\");\r\n\r\n for (var i = 0; i < tabIndexElements.length; i++) {\r\n var tabIndexElement = tabIndexElements[i],\r\n originalTabIndex = tabIndexElement.getAttribute(\"data-original-tabindex\");\r\n\r\n tabIndexElement.setAttribute(\"tabindex\", originalTabIndex);\r\n tabIndexElement.removeAttribute(\"data-original-tabindex\");\r\n }\r\n };\r\n\r\n if (t.closing === true)\r\n return;\r\n\r\n t.closing = true;\r\n\r\n // Force immediate transition if we're in \"short\" mode\r\n if (t.container.classList.contains(\"short-modal\"))\r\n immediate = true;\r\n\r\n // Stop any ongoing animation\r\n if (t.timeline)\r\n t.timeline.progress(1);\r\n\r\n // Run \"preClose\" callback, if specified\r\n if (callbacks) {\r\n if (typeof callbacks.preClose == \"function\")\r\n callbacks.preClose.call(t);\r\n }\r\n\r\n // Unfix content position\r\n Utilities.unlockScrollingForTargetElement(t.content);\r\n\r\n if (immediate) {\r\n // Transition immediately\r\n t.backdrop.parentNode.removeChild(t.backdrop);\r\n t.container.parentNode.removeChild(t.container);\r\n\r\n // Run \"postClose\" callback, if specified\r\n if (callbacks) {\r\n if (typeof callbacks.postClose == \"function\")\r\n callbacks.postClose.call(t);\r\n }\r\n\r\n // Restore tabindex values\r\n restoreTabIndices();\r\n } else {\r\n // Animate transition\r\n var\r\n duration = settings.close.duration,\r\n\r\n progress = {\r\n percentComplete: 0\r\n },\r\n\r\n onCompleteCallback = function () {\r\n t.backdrop.parentNode.removeChild(t.backdrop);\r\n t.container.parentNode.removeChild(t.container);\r\n\r\n t.timeline = null;\r\n\r\n // Run \"postClose\" callback, if specified\r\n if (callbacks) {\r\n if (typeof callbacks.postClose == \"function\")\r\n callbacks.postClose.call(t);\r\n }\r\n\r\n // Restore tabindex values\r\n restoreTabIndices();\r\n };\r\n\r\n // Scale duration if the shift key is pressed\r\n if (event) {\r\n if (event.shiftKey === true)\r\n duration *= settings.slowMoScale;\r\n }\r\n\r\n // Create timeline\r\n t.timeline = new TimelineMax();\r\n\r\n switch (presentationType) {\r\n case presentationTypes.scaleUp:\r\n t.timeline.to(\r\n progress,\r\n duration,\r\n {\r\n ease: settings.close.easing,\r\n percentComplete: 1,\r\n\r\n onUpdate: function () {\r\n var scale = Math.round((1 + ((settings.close.endScale.scaleUp - 1) * progress.percentComplete)) * 1000) / 1000;\r\n scale = scale.toString();\r\n\r\n var transform = \"translate(-50%, -50%) scale(\" + scale + \", \" + scale + \")\";\r\n\r\n t.backdrop.style.opacity = 1 - progress.percentComplete;\r\n t.container.style.opacity = 1 - progress.percentComplete;\r\n t.container.style.transform = transform;\r\n },\r\n\r\n onComplete: onCompleteCallback\r\n });\r\n break;\r\n\r\n case presentationTypes.scaleDown:\r\n t.timeline.to(\r\n progress,\r\n duration,\r\n {\r\n ease: settings.close.easing,\r\n percentComplete: 1,\r\n\r\n onUpdate: function () {\r\n var scale = Math.round((1 + ((settings.close.endScale.scaleDown - 1) * progress.percentComplete)) * 1000) / 1000;\r\n scale = scale.toString();\r\n\r\n var transform = \"translate(-50%, -50%) scale(\" + scale + \", \" + scale + \")\";\r\n\r\n t.backdrop.style.opacity = 1 - progress.percentComplete;\r\n t.container.style.opacity = 1 - progress.percentComplete;\r\n t.container.style.transform = transform;\r\n },\r\n\r\n onComplete: onCompleteCallback\r\n });\r\n break;\r\n\r\n case presentationTypes.verticalEnvelope:\r\n var containerHeight = t.container.clientHeight;\r\n\r\n t.timeline.to(\r\n progress,\r\n duration,\r\n {\r\n ease: settings.close.easing,\r\n percentComplete: 1,\r\n\r\n onUpdate: function () {\r\n var height = (1 - progress.percentComplete) * containerHeight,\r\n\r\n // 2 = inner content remains still\r\n // > 2 = inner content shifts upward\r\n // < 2 = inner content shifts downward\r\n offset = (height - containerHeight) / 2.5;\r\n\r\n t.container.style.height = Utilities.numberToPx(height);\r\n t.content.style.top = Utilities.numberToPx(offset);\r\n\r\n t.closeButton.style.transform = `translate(0px, ${offset}px)`;\r\n\r\n t.backdrop.style.opacity = 1 - progress.percentComplete;\r\n },\r\n\r\n onComplete: function () {\r\n t.container.style.height = \"\";\r\n t.content.style.top = \"\";\r\n t.closeButton.style.transform = \"\";\r\n\r\n onCompleteCallback();\r\n }\r\n });\r\n break;\r\n\r\n // Default to fade transition\r\n default:\r\n t.timeline.to(\r\n progress,\r\n duration,\r\n {\r\n ease: settings.close.easing,\r\n percentComplete: 1,\r\n\r\n onUpdate: function () {\r\n t.backdrop.style.opacity = 1 - progress.percentComplete;\r\n t.container.style.opacity = 1 - progress.percentComplete;\r\n },\r\n\r\n onComplete: onCompleteCallback\r\n });\r\n break;\r\n }\r\n }\r\n\r\n // Remove this modal from the reference array\r\n for (var i = 0; i < openModals.length; i++) {\r\n if (openModals[i] !== t)\r\n continue;\r\n\r\n openModals.splice(i, 1);\r\n break;\r\n }\r\n };\r\n","var\r\n settings = {\r\n // Responsive breakpoints\r\n breakpoints: {\r\n small: 0,\r\n medium: 768,\r\n large: 960,\r\n extraLarge: 1200,\r\n largeWithMargins: 1344\r\n }\r\n },\r\n\r\n sortedBreakpoints = [],\r\n lastBreakpoint = null,\r\n currentBreakpoint = null,\r\n breakpointChangeCallbacks = [],\r\n\r\n updateWindowMetrics = function () {\r\n // Update the current responsive breakpoint\r\n lastBreakpoint = currentBreakpoint;\r\n for (var i = 0; i < sortedBreakpoints.length; i++) {\r\n var breakpoint = sortedBreakpoints[i];\r\n\r\n if (window.matchMedia(\"(min-width: \" + breakpoint + \"px)\").matches) {\r\n currentBreakpoint = breakpoint;\r\n break;\r\n }\r\n }\r\n\r\n // Check if the breakpoint has changed\r\n if (lastBreakpoint !== currentBreakpoint && lastBreakpoint !== null) {\r\n // Determine if we're crossing the mobile-desktop threshold\r\n var mobileDesktopTransition = false;\r\n if (WindowMetrics.isMobile(lastBreakpoint))\r\n mobileDesktopTransition = !WindowMetrics.isMobile();\r\n else\r\n mobileDesktopTransition = WindowMetrics.isMobile();\r\n\r\n // Execute breakpoint change callbacks\r\n for (var i = 0; i < breakpointChangeCallbacks.length; i++)\r\n breakpointChangeCallbacks[i](mobileDesktopTransition);\r\n }\r\n };\r\n\r\n// Initialize the sorted breakpoint array\r\nfor (var breakpointName in settings.breakpoints)\r\n sortedBreakpoints.push(settings.breakpoints[breakpointName]);\r\n\r\nsortedBreakpoints.sort(function (a, b) {\r\n return b - a;\r\n});\r\n\r\n// Setup resize callback\r\nwindow.addEventListener(\"resize\", updateWindowMetrics);\r\nupdateWindowMetrics();\r\n\r\nexport class WindowMetrics {\r\n static get breakpoints() {\r\n return settings.breakpoints;\r\n }\r\n\r\n static get lastBreakpoint() {\r\n return lastBreakpoint;\r\n }\r\n\r\n static get currentBreakpoint() {\r\n return currentBreakpoint;\r\n }\r\n\r\n static isMobile(breakpointToTest) {\r\n if (typeof breakpointToTest == \"number\")\r\n return breakpointToTest <= settings.breakpoints.small;\r\n else\r\n return currentBreakpoint <= settings.breakpoints.small;\r\n }\r\n\r\n static addBeakpointChangeCallback(callback) {\r\n breakpointChangeCallbacks.push(callback);\r\n }\r\n}\r\n","import { WindowMetrics } from \"../utilities/window-metrics.js\";\r\n\r\nexport class HomePage {\r\n constructor(parameters) {\r\n var t = this;\r\n\r\n let root = document.documentElement;\r\n\r\n // let's move the red Alexion Connect div to tuck under \r\n // the gray callout by updating the css variables \r\n function overlapCallout() {\r\n var calloutHeight = document.querySelector('.callout').getBoundingClientRect().height,\r\n extraPadding,\r\n homeMargin = (calloutHeight / 2);\r\n\r\n if (WindowMetrics.isMobile()) {\r\n if (window.innerWidth < 375) {\r\n extraPadding = 144;\r\n } else if (window.innerWidth < 400) {\r\n extraPadding = 144 + ((window.innerWidth - 375) * 1.5);\r\n } else {\r\n extraPadding = 48;\r\n }\r\n }\r\n else {\r\n extraPadding = 104;\r\n }\r\n\r\n root.style.setProperty('--home-margin', '-' + homeMargin + 'px');\r\n root.style.setProperty('--home-padding', homeMargin + extraPadding + 'px');\r\n\r\n }\r\n\r\n window.addEventListener('DOMContentLoaded', (event) => {\r\n overlapCallout();\r\n });\r\n\r\n window.addEventListener('resize', (event) => {\r\n overlapCallout();\r\n });\r\n\r\n }\r\n}\r\n","import { Utilities } from \"../utilities/utilities.js\";\r\nimport { WindowMetrics } from \"../utilities/window-metrics.js\";\r\n\r\nlet\r\n // Defines the sticky behavior of the header\r\n stickyModes = {\r\n // Header never becomes sticky\r\n off: 0,\r\n\r\n // Header is always sticky\r\n alwaysVisible: 1,\r\n\r\n // Header is sticky but appears and disappears\r\n // as the user scrolls the page upward and downward\r\n revealOnScroll: 2\r\n },\r\n\r\n // Defines menu behavior on mobile\r\n mobileMenuModes = {\r\n // Menus are not collapsable & always open\r\n alwaysOpen: 0,\r\n\r\n // Menus may be opened and closed, and the menu corresponding\r\n // to the current page will initially be presented in an open state\r\n collapsable: 1\r\n },\r\n\r\n // Defines menu behavior on desktop\r\n desktopMenuModes = {\r\n // Don't do anything with the menus via javascript -\r\n // it's assumed any transitions will be handled by CSS\r\n cssOnly: 0,\r\n\r\n // Animate menus opening vertically\r\n dropdown: 1\r\n },\r\n\r\n settings = {\r\n slowMoScale: 4,\r\n\r\n // Opening and closing the mobile menu via the hamburger\r\n openDuration: 0.5,\r\n closeDuration: 0.375,\r\n\r\n // Opening and closing submenus, both mobile (click) & desktop (hover)\r\n submenuOpenDuration: 0.375,\r\n submenuCloseDuration: 0.375,\r\n\r\n // Sticky show/hide duration, for the \"revealOnScroll\" mode\r\n stickyDuration: 0.375,\r\n\r\n // \"revealOnScroll\" -related settings\r\n scrollVelocity: {\r\n minimumScrollDistanceToTriggerSticky: 500,\r\n smoothing: 0.9,\r\n triggerSpeed: 1.2 // pixels per millisecond\r\n },\r\n\r\n // Class names\r\n selectedClassName: \"selected\",\r\n openClassName: \"open\"\r\n };\r\n\r\n// Menus within the header navigation\r\nclass Menu {\r\n constructor(header, container, mobileMenuMode, desktopMenuMode) {\r\n let t = this;\r\n\r\n t.isOpen = false;\r\n t.header = header;\r\n t.mobileMenuMode = mobileMenuMode;\r\n t.desktopMenuMode = desktopMenuMode;\r\n\r\n t.container = container;\r\n\r\n // Check if this menu has a submenu\r\n t.submenuContainer = t.container.querySelector(\".primary nav > ul\");\r\n if (t.submenuContainer) {\r\n // This menu item contains a submenu\r\n let label = t.container.querySelector(\"a\"),\r\n submenuItems = t.submenuContainer.querySelectorAll(\"li\");\r\n\r\n // Setup mobile menu mode\r\n switch (mobileMenuMode) {\r\n case mobileMenuModes.collapsable:\r\n // Setup open & close functionality. Note - don't use touch events\r\n // here so that menus won't toggle if users touch them while attempting\r\n // to scroll through the menu\r\n label.addEventListener(\"click\", function (event) {\r\n let slowMo = event.shiftKey === true;\r\n\r\n if (t.isOpen)\r\n t.close(false, slowMo);\r\n else\r\n t.open(false, slowMo);\r\n });\r\n break;\r\n\r\n // mobileMenuModes.alwaysOpen\r\n default:\r\n // Just open the submenu & don't add an open/close click event\r\n t.submenuContainer.classList.add(settings.openClassName);\r\n t.isOpen = true;\r\n break;\r\n }\r\n \r\n // Setup desktop menu mode\r\n switch (desktopMenuMode) {\r\n case desktopMenuModes.dropdown:\r\n // The menu slides open and closed vertically\r\n {\r\n let timeline = null;\r\n\r\n t.container.addEventListener(\"mouseenter\", function (event) {\r\n // Stop if we're in mobile mode\r\n if (WindowMetrics.isMobile())\r\n return;\r\n\r\n let slowMo = event.shiftKey === true;\r\n\r\n // Stop any ongoing animation\r\n if (timeline)\r\n timeline.progress(1);\r\n\r\n // Set initial conditions\r\n Utilities.resetStyles(t.submenuContainer);\r\n\r\n t.submenuContainer.style.display = \"block\";\r\n t.submenuContainer.style.height = \"auto\";\r\n let height = t.submenuContainer.clientHeight;\r\n\r\n /* Setup animation*/\r\n let duration = settings.submenuOpenDuration;\r\n if (slowMo === true)\r\n duration *= settings.slowMoScale;\r\n\r\n timeline = new TimelineMax();\r\n timeline.fromTo(\r\n t.submenuContainer,\r\n duration,\r\n {\r\n height: 0\r\n },\r\n {\r\n ease: Power2.easeOut,\r\n height: height,\r\n onComplete: () => {\r\n timeline = null;\r\n Utilities.resetStyles(t.submenuContainer);\r\n }\r\n });\r\n });\r\n\r\n t.container.addEventListener(\"mouseleave\", function (event) {\r\n // Stop if we're in mobile mode\r\n if (WindowMetrics.isMobile())\r\n return;\r\n\r\n let slowMo = event.shiftKey === true;\r\n\r\n // Stop any ongoing animation\r\n if (timeline)\r\n timeline.progress(1);\r\n\r\n // Set initial conditions\r\n Utilities.resetStyles(t.submenuContainer);\r\n\r\n t.submenuContainer.style.display = \"block\";\r\n t.submenuContainer.style.height = \"auto\";\r\n\r\n // Setup animation\r\n let duration = settings.submenuCloseDuration;\r\n if (slowMo === true)\r\n duration *= settings.slowMoScale;\r\n\r\n timeline = new TimelineMax();\r\n timeline.fromTo(\r\n t.submenuContainer,\r\n duration,\r\n {\r\n opacity: 1\r\n },\r\n {\r\n ease: Power2.easeOut,\r\n opacity: 0,\r\n onComplete: () => {\r\n timeline = null;\r\n Utilities.resetStyles(t.submenuContainer);\r\n }\r\n });\r\n });\r\n }\r\n break;\r\n\r\n // desktopMenuModes.cssOnly\r\n default:\r\n // Nothing needed here\r\n break;\r\n }\r\n\r\n // Set active state\r\n for (let i = 0; i < submenuItems.length; i++) {\r\n let submenuItem = submenuItems[i],\r\n link = submenuItem.querySelector(\"a\");\r\n\r\n if (link == null)\r\n continue;\r\n \r\n // Check if this submenu item's href matches the current page\r\n let href = link.getAttribute(\"href\");\r\n if (document.location.pathname == href) {\r\n // Open the submenu\r\n t.submenuContainer.classList.add(settings.openClassName);\r\n t.isOpen = true;\r\n\r\n // Set the \"selected\" class to the submenu and submenu item\r\n submenuItem.classList.add(settings.selectedClassName);\r\n t.container.classList.add(settings.selectedClassName);\r\n break;\r\n }\r\n }\r\n } else {\r\n // This menu item is just a single link - set active state\r\n let link = t.container.querySelector(\"a\");\r\n if (link) {\r\n let href = link.getAttribute(\"href\");\r\n\r\n if (document.location.pathname == href)\r\n t.container.classList.add(settings.selectedClassName);\r\n }\r\n }\r\n }\r\n\r\n open(immediate, slowMo = false) {\r\n let t = this;\r\n\r\n // Stop if we're already open\r\n if (t.isOpen)\r\n return;\r\n\r\n // Stop if we don't have a submenu\r\n if (t.submenuContainer == undefined)\r\n return;\r\n\r\n // Stop if we're not in mobile mode\r\n if (!WindowMetrics.isMobile())\r\n return;\r\n\r\n t.isOpen = true;\r\n\r\n // Stop any ongoing animation\r\n if (t.header.openCloseTimeline)\r\n t.header.openCloseTimeline.progress(1);\r\n\r\n // Set initial conditions\r\n Utilities.resetStyles(t.submenuContainer);\r\n t.submenuContainer.classList.add(settings.openClassName);\r\n \r\n if (immediate) {\r\n updateScrollability.call(t.header, true);\r\n } else {\r\n // Setup animation\r\n let duration = settings.submenuOpenDuration;\r\n if (slowMo === true)\r\n duration *= settings.slowMoScale;\r\n\r\n // Determine the height of the open menu\r\n let height = t.submenuContainer.clientHeight;\r\n\r\n t.header.openCloseTimeline = new TimelineMax();\r\n t.header.openCloseTimeline.fromTo(\r\n t.submenuContainer,\r\n duration,\r\n {\r\n height: 0\r\n },\r\n {\r\n ease: Power2.easeOut,\r\n height: height,\r\n onUpdate: function () {\r\n updateScrollability.call(t.header, true);\r\n }\r\n });\r\n\r\n t.header.openCloseTimeline.add(function () {\r\n t.header.openCloseTimeline = null;\r\n\r\n Utilities.resetStyles(t.submenuContainer);\r\n });\r\n }\r\n }\r\n\r\n close(immediate, slowMo = false) {\r\n let t = this;\r\n\r\n // Stop if we're already closed\r\n if (!t.isOpen)\r\n return;\r\n\r\n // Stop if we don't have a submenu\r\n if (t.submenuContainer == undefined)\r\n return;\r\n\r\n // Stop if we're not in mobile mode\r\n if (!WindowMetrics.isMobile())\r\n return;\r\n\r\n t.isOpen = false;\r\n\r\n // Stop any ongoing animation\r\n if (t.header.openCloseTimeline)\r\n t.header.openCloseTimeline.progress(1);\r\n\r\n // Set initial conditions\r\n Utilities.resetStyles(t.submenuContainer);\r\n t.submenuContainer.classList.add(settings.openClassName);\r\n \r\n if (immediate) {\r\n t.submenuContainer.classList.remove(settings.openClassName);\r\n updateScrollability.call(t.header, true);\r\n } else {\r\n // Setup animation\r\n let duration = settings.submenuCloseDuration;\r\n if (slowMo === true)\r\n duration *= settings.slowMoScale;\r\n\r\n // Determine the height of the open menu\r\n let height = t.submenuContainer.clientHeight;\r\n\r\n t.header.openCloseTimeline = new TimelineMax();\r\n t.header.openCloseTimeline.fromTo(\r\n t.submenuContainer,\r\n duration,\r\n {\r\n height: height\r\n },\r\n {\r\n ease: Power2.easeOut,\r\n height: 0,\r\n onUpdate: function () {\r\n updateScrollability.call(t.header, true);\r\n }\r\n });\r\n\r\n t.header.openCloseTimeline.add(function () {\r\n t.header.openCloseTimeline = null;\r\n\r\n Utilities.resetStyles(t.submenuContainer);\r\n t.submenuContainer.classList.remove(settings.openClassName);\r\n });\r\n }\r\n }\r\n}\r\n\r\n// The main Header class\r\nexport class Header {\r\n constructor(stickyMode, mobileMenuMode, desktopMenuMode) {\r\n let t = this;\r\n\r\n // Settings\r\n t.stickyMode = stickyMode;\r\n t.mobileMenuMode = mobileMenuMode;\r\n t.desktopMenuMode = desktopMenuMode;\r\n\r\n // Mobile open/close state\r\n t.isOpen = false;\r\n t.openCloseTimeline = null;\r\n\r\n // Sticky state\r\n t.isSticky = false;\r\n t.suppressSticky = false;\r\n t.stickyTimeline = null;\r\n\r\n // \"revealOnScroll\" -specific stuff\r\n if (desktopMenuMode == desktopMenuModes.revealOnScroll) {\r\n t.scrollVelocity = 0;\r\n t.lastScrollPosition = window.pageYOffset;\r\n t.lastScrollTime = (new Date()).getTime();\r\n }\r\n\r\n // Setup DOM\r\n //t.container = document.querySelector(\"header\");\r\n //t.links = document.getElementById(\"cl-header-links\");\r\n //t.content = document.getElementById(\"cl-header-content\");\r\n //t.navigation = document.getElementById(\"cl-header-navigation\");\r\n //t.navigationContent = t.navigation.querySelector(\"div\");\r\n //t.hamburger = document.getElementById(\"cl-header-hamburger\");\r\n //t.backdrop = document.getElementById(\"cl-header-backdrop\");\r\n\r\n\r\n t.container = document.querySelector(\"header\"); // header dom el\r\n t.links = document.querySelector(\"header .header-navigation .navigation.secondary\"); // secondary nav\r\n t.content = document.querySelector(\"header div div.flex-row\"); // header inner content?\r\n t.navigation = document.querySelector(\"header .header-navigation .navigation.primary\"); // primary nav\r\n t.navigationContent = t.navigation.querySelector(\"nav\"); // menu inside \r\n t.hamburger = document.querySelector(\"#hamburger\"); // hamburger icon\r\n t.backdrop = document.getElementById(\"header-backdrop\"); // header bg\r\n\r\n // Create backdrop\r\n // this was being created twice :( \r\n //t.backdrop = Utilities.createElementFromTemplate(`
`); //blur bg\r\n //t.container.parentNode.insertBefore(t.backdrop, t.container);\r\n\r\n // Create menus\r\n t.menus = [];\r\n let menuItems = t.container.querySelectorAll(\"#header-navigation > div > ul > li\");\r\n for (let i = 0; i < menuItems.length; i++) {\r\n let menu = new Menu(\r\n t,\r\n menuItems[i],\r\n mobileMenuMode,\r\n desktopMenuMode);\r\n t.menus.push(menu);\r\n }\r\n \r\n // Setup resize callback\r\n t.stickyScrollPosition;\r\n let resizeCallback = function () {\r\n // Recalculate the header height - the \"sticky\" class mucks with our\r\n // ability to measure the header's unsticky height, so remove it for\r\n // a moment if necessary\r\n if (t.isSticky)\r\n t.container.classList.remove(\"sticky\");\r\n\r\n // Recalculate the scroll position at which the\r\n // header becomes sticky\r\n t.normalHeight = t.container.clientHeight;\r\n t.stickyHeight = calculateStickyHeight.call(t);\r\n t.stickyScrollPosition = t.container.clientHeight - t.stickyHeight;\r\n\r\n if (t.isSticky)\r\n t.container.classList.add(\"sticky\");\r\n \r\n // Update the sticky body padding, if necessary\r\n updateStickyBodyPadding.call(t);\r\n\r\n // If we're in mobile mode, update scrollability\r\n if (WindowMetrics.isMobile())\r\n updateScrollability.call(t, true);\r\n };\r\n\r\n window.addEventListener(\"resize\", resizeCallback);\r\n resizeCallback();\r\n\r\n // Register for breakpoint change notifications\r\n WindowMetrics.addBeakpointChangeCallback(function (mobileDesktopTransition) {\r\n if (!mobileDesktopTransition)\r\n return;\r\n\r\n // Close header on mobile-desktop transitions\r\n t.close(true);\r\n \r\n // ...also make sure it's not sticky, if we're using \"revealOnScroll\" mode\r\n if (t.stickyMode == stickyModes.revealOnScroll) {\r\n if (t.isSticky)\r\n t.toggleSticky(true);\r\n }\r\n });\r\n\r\n // Setup scroll callback, but only if screenshot mode isn't enabled\r\n if (!Utilities.screenshotMode) {\r\n window.addEventListener(\"scroll\", function () {\r\n // Skip this if we're in mobile mode and the header is open\r\n if (WindowMetrics.isMobile()) {\r\n if (t.isOpen)\r\n return;\r\n }\r\n\r\n // Update stickiness\r\n updateStickiness.call(t);\r\n });\r\n }\r\n\r\n //// Setup ISI anchor link\r\n //let isiLink = t.container.querySelector(\".header-isi-link\");\r\n //if (isiLink) {\r\n // isiLink.addEventListener(\"click\", function (event) {\r\n // event.preventDefault();\r\n // event.stopPropagation();\r\n\r\n // if (WindowMetrics.isMobile()) {\r\n // if (t.isOpen)\r\n // t.close(false);\r\n // }\r\n\r\n // let\r\n // psp = document.getElementById(\"psp\"),\r\n // footer = document.querySelector(\"footer\"),\r\n // position = psp.offsetTop + t.container.offsetHeight - 100,\r\n // contentHeight = footer.offsetTop + footer.offsetHeight;\r\n\r\n // if (position + window.innerHeight > contentHeight)\r\n // position = contentHeight - window.innerHeight;\r\n\r\n // Utilities.scrollWindowToPosition(\r\n // position,\r\n // null);\r\n // });\r\n //}\r\n\r\n // Setup hamburger click\r\n let\r\n hamburgerClickCallback = function (event) {\r\n let slowMo = event.shiftKey === true;\r\n\r\n if (t.isOpen)\r\n t.close(false, slowMo);\r\n else\r\n t.open(false, slowMo);\r\n },\r\n\r\n backdropClickCallback = function (event) {\r\n // Debounce this so that it doesn't trigger repeatedly by accident\r\n if (t.openCloseTimeline)\r\n return;\r\n\r\n hamburgerClickCallback(event);\r\n };\r\n\r\n t.hamburger.addEventListener(\"click\", hamburgerClickCallback);\r\n t.hamburger.addEventListener(\"touchstart\", function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n t.hamburger.removeEventListener(\"touchstart\", hamburgerClickCallback);\r\n hamburgerClickCallback(event);\r\n });\r\n\r\n t.backdrop.addEventListener(\"click\", backdropClickCallback);\r\n t.backdrop.addEventListener(\"touchstart\", function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n t.backdrop.removeEventListener(\"touchstart\", backdropClickCallback);\r\n backdropClickCallback(event);\r\n });\r\n }\r\n\r\n static get stickyModes() {\r\n return stickyModes;\r\n }\r\n\r\n static get mobileMenuModes() {\r\n return mobileMenuModes;\r\n }\r\n\r\n static get desktopMenuModes() {\r\n return desktopMenuModes;\r\n }\r\n\r\n static initialize(stickyMode, mobileMenuMode, desktopMenuMode) {\r\n // Default initialization; there should only be one of these at a time\r\n new Header(stickyMode, mobileMenuMode, desktopMenuMode);\r\n }\r\n\r\n enableTriggeringStickyMode() {\r\n t.suppressSticky = false;\r\n }\r\n\r\n disableTriggeringStickyMode() {\r\n t.suppressSticky = true;\r\n }\r\n\r\n toggleSticky(immediate) {\r\n let t = this;\r\n\r\n // Don't do anything if we're open\r\n if (t.isOpen)\r\n return;\r\n\r\n // Don't do anything if we're suppressing stickiness\r\n if (t.suppressSticky)\r\n return;\r\n\r\n // Stop any ongoing animation\r\n if (t.stickyTimeline)\r\n t.stickyTimeline.progress(1);\r\n\r\n // Reset our scroll velocity\r\n t.scrollVelocity = 0;\r\n \r\n // Update our sticky flag\r\n t.isSticky = !t.isSticky;\r\n\r\n if (immediate) {\r\n // Transition immediately\r\n if (t.isSticky)\r\n t.container.classList.add(\"sticky\");\r\n else\r\n t.container.classList.remove(\"sticky\");\r\n\r\n updateStickyBodyPadding.call(t);\r\n } else {\r\n // Animate transition\r\n t.stickyTimeline = new TimelineMax();\r\n\r\n if (t.isSticky) {\r\n // Make the header sticky\r\n t.container.classList.add(\"sticky\");\r\n updateStickyBodyPadding.call(t);\r\n\r\n t.stickyTimeline.fromTo(\r\n t.container,\r\n settings.stickyDuration,\r\n {\r\n yPercent: -100\r\n },\r\n {\r\n ease: Power3.easeOut,\r\n yPercent: 0,\r\n onComplete: function () {\r\n t.stickyTimeline = null;\r\n\r\n Utilities.resetStyles(t.container);\r\n }\r\n });\r\n } else {\r\n // Make the header unsticky\r\n t.stickyTimeline.fromTo(\r\n t.container,\r\n settings.stickyDuration,\r\n {\r\n yPercent: 0\r\n },\r\n {\r\n ease: Power3.easeOut,\r\n yPercent: -100,\r\n onComplete: function () {\r\n t.stickyTimeline = null;\r\n\r\n t.container.classList.remove(\"sticky\");\r\n Utilities.resetStyles(t.container);\r\n\r\n updateStickyBodyPadding.call(t);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n open(immediate, slowMo = false) {\r\n let t = this;\r\n\r\n // Stop if we're already open\r\n if (t.isOpen)\r\n return;\r\n\r\n t.isOpen = true;\r\n\r\n // Stop any ongoing animation\r\n if (t.openCloseTimeline)\r\n t.openCloseTimeline.progress(1);\r\n\r\n // Set initial state\r\n t.container.classList.add(settings.openClassName);\r\n t.navigation.style.display = \"block\";\r\n t.backdrop.style.display = \"block\";\r\n\r\n let\r\n bounds = t.navigation.getBoundingClientRect(),\r\n openHeight = t.navigationContent.clientHeight;\r\n if (openHeight + bounds.top > window.innerHeight)\r\n openHeight = window.innerHeight - bounds.top;\r\n \r\n // Fix content position so that it's not scrollable\r\n Utilities.lockScrolling(t.navigation);\r\n\r\n if (immediate === true) {\r\n // Transition immediately\r\n t.openCloseTimeline = null;\r\n\r\n t.navigation.style.height = Utilities.numberToPx(openHeight);\r\n t.backdrop.style.opacity = 1;\r\n\r\n if (WindowMetrics.isMobile()) {\r\n // Update scrollability\r\n updateScrollability.call(t, false);\r\n }\r\n } else {\r\n // Setup animation\r\n let duration = settings.openDuration;\r\n if (slowMo === true)\r\n duration *= settings.slowMoScale;\r\n\r\n t.openCloseTimeline = new TimelineMax();\r\n\r\n t.openCloseTimeline.fromTo(\r\n t.navigation,\r\n duration,\r\n {\r\n height: 0\r\n },\r\n {\r\n ease: Power3.easeOut,\r\n height: openHeight,\r\n onUpdate: function () {\r\n if (WindowMetrics.isMobile()) {\r\n // Update scrollability\r\n updateScrollability.call(t, false);\r\n }\r\n }\r\n },\r\n 0);\r\n\r\n t.openCloseTimeline.fromTo(\r\n t.backdrop,\r\n duration,\r\n {\r\n opacity: 0\r\n },\r\n {\r\n ease: Power3.easeOut,\r\n opacity: 1\r\n },\r\n 0);\r\n\r\n t.openCloseTimeline.add(function () {\r\n t.openCloseTimeline = null;\r\n });\r\n }\r\n }\r\n\r\n close(immediate, slowMo = false) {\r\n let t = this;\r\n\r\n // Stop if we're already closed\r\n if (!t.isOpen) {\r\n Utilities.resetStyles(t.navigation);\r\n Utilities.resetStyles(t.backdrop);\r\n return;\r\n }\r\n\r\n t.isOpen = false;\r\n\r\n // Stop any ongoing animation\r\n if (t.openCloseTimeline)\r\n t.openCloseTimeline.progress(1);\r\n\r\n // Set initial state\r\n t.container.classList.remove(settings.openClassName);\r\n t.navigation.style.display = \"block\";\r\n t.backdrop.style.display = \"block\";\r\n\r\n let openHeight = t.navigationContent.clientHeight;\r\n\r\n // Undo the underlying body content's fixed positioning\r\n Utilities.unlockScrolling(t.navigation);\r\n\r\n if (immediate === true) {\r\n // Transition immediately\r\n t.openCloseTimeline = null;\r\n\r\n Utilities.resetStyles(t.navigation);\r\n Utilities.resetStyles(t.backdrop);\r\n } else {\r\n // Setup animation\r\n let duration = settings.openDuration;\r\n if (slowMo === true)\r\n duration *= settings.slowMoScale;\r\n\r\n t.openCloseTimeline = new TimelineMax();\r\n\r\n t.openCloseTimeline.fromTo(\r\n t.navigation,\r\n duration,\r\n {\r\n height: openHeight\r\n },\r\n {\r\n ease: Power3.easeOut,\r\n height: 0\r\n },\r\n 0);\r\n\r\n t.openCloseTimeline.fromTo(\r\n t.backdrop,\r\n duration,\r\n {\r\n opacity: 1\r\n },\r\n {\r\n ease: Power3.easeOut,\r\n opacity: 0\r\n },\r\n 0);\r\n\r\n t.openCloseTimeline.add(function () {\r\n t.openCloseTimeline = null;\r\n\r\n Utilities.resetStyles(t.navigation);\r\n Utilities.resetStyles(t.backdrop);\r\n });\r\n }\r\n }\r\n}\r\n\r\n// Private methods\r\nlet\r\n // This function determines the height of the sticky\r\n // header, which in turn determines the scroll position\r\n // at which the header becomes sticky. This should be\r\n // modified when necessary to accomodate differing\r\n // site designs\r\n calculateStickyHeight = function () {\r\n let t = this;\r\n\r\n if (WindowMetrics.isMobile()) {\r\n // In mobile mode, the height of the sticky header\r\n // matches its content region\r\n return t.content.clientHeight;\r\n } else {\r\n // In desktop mode, the height of the sticky header\r\n // matches its navigation bar\r\n return t.navigation.querySelector(\"ul\").clientHeight;\r\n }\r\n },\r\n\r\n // Manages the sticky state of the header; used when\r\n // the window is resized or scrolls\r\n updateStickiness = function () {\r\n let t = this,\r\n scrollPosition = window.pageYOffset;\r\n\r\n // Check what sticky mode we're configured to use\r\n switch (t.stickyMode) {\r\n case stickyModes.alwaysVisible:\r\n // Simply toggle the \"sticky\" class on and off and set the top padding\r\n // on the element\r\n if (scrollPosition > t.stickyScrollPosition) {\r\n // We're scrolled beyond the point where the header\r\n // should be sticky\r\n if (!t.isSticky)\r\n t.toggleSticky(true);\r\n } else {\r\n // We're scrolled above the point where the header\r\n // should be sticky\r\n if (t.isSticky)\r\n t.toggleSticky(true);\r\n }\r\n break;\r\n\r\n case stickyModes.revealOnScroll:\r\n // Determine the current scroll velocity\r\n let scrollTime = (new Date()).getTime(),\r\n timeDifference = scrollTime - t.lastScrollTime;\r\n\r\n // Filter out large gaps in time and smooth out big changes in velocity\r\n if (timeDifference > 500)\r\n t.scrollVelocity = 0;\r\n else\r\n t.scrollVelocity = (t.lastScrollPosition - scrollPosition) / timeDifference;\r\n\r\n // Update the previousle sampled values to what we just measured\r\n t.lastScrollPosition = scrollPosition;\r\n t.lastScrollTime = scrollTime;\r\n\r\n // Check if we're at the top of the page, supressing the sticky toggle if the user hasn't\r\n // scrolled at least a third of a screen height down the page\r\n if (scrollPosition > settings.scrollVelocity.minimumScrollDistanceToTriggerSticky && scrollPosition > t.stickyScrollPosition) {\r\n // We're not at the top of the page - check if we've surpassed our scroll speed threshold\r\n // scrolling either upward or downward\r\n if (t.scrollVelocity >= settings.scrollVelocity.triggerSpeed) {\r\n // We've surpassed the threshold scrolling upward - make the header sticky if it isn't\r\n if (!t.isSticky)\r\n t.toggleSticky(false);\r\n } else if (t.scrollVelocity <= -settings.scrollVelocity.triggerSpeed) {\r\n // We've surpassed the threshold scrolling downward - make the header unsticky if it isn't\r\n if (t.isSticky)\r\n t.toggleSticky(false);\r\n }\r\n } else if (scrollPosition <= t.stickyScrollPosition) {\r\n // We're at the top of the page - make sure the header is unsticky\r\n if (t.isSticky)\r\n t.toggleSticky(true);\r\n }\r\n break;\r\n\r\n // Do nothing if we're not using one of the sticky modes\r\n default:\r\n return;\r\n }\r\n },\r\n\r\n updateStickyBodyPadding = function () {\r\n let t = this;\r\n\r\n // Update the body padding to match the normal, unsticky height of the header\r\n // to accomodate it changing to fixed positioning; otherwise, remove the padding\r\n if (t.isSticky)\r\n document.body.style.paddingTop = Utilities.numberToPx(t.normalHeight);\r\n else\r\n document.body.style.paddingTop = \"\";\r\n },\r\n\r\n // Manages whether the mobile header's content has scrolling\r\n // enabled; used when the menu opens, when its submenus open or close,\r\n // and when the window is resized\r\n updateScrollability = function (updateHeight) {\r\n let t = this;\r\n\r\n // We only need to do this if the mobile menu is open\r\n if (!t.isOpen)\r\n return;\r\n\r\n // Determine the amount of space between the top of the menu's\r\n // content and the bottom of the viewport\r\n let bounds = t.navigation.getBoundingClientRect(),\r\n availableHeight = window.innerHeight - bounds.top;\r\n\r\n // Check if the available space is smaller than the menu's content\r\n if (availableHeight < t.navigationContent.clientHeight) {\r\n // There isn't enough room for the menu - enable scrolling\r\n t.navigation.style.overflowY = \"scroll\";\r\n\r\n // Update the height of the open menu (i.e., when the window resizes)\r\n if (updateHeight)\r\n t.navigation.style.height = Utilities.numberToPx(availableHeight);\r\n } else {\r\n // There's enough room to display the full menu - disable scrolling\r\n t.navigation.style.overflowY = \"\";\r\n\r\n // Update the height of the open menu (i.e., when the window resizes)\r\n if (updateHeight)\r\n t.navigation.style.height = Utilities.numberToPx(t.navigationContent.clientHeight);\r\n }\r\n };\r\n","import { WindowMetrics } from \"../utilities/window-metrics.js\";\r\n\r\nexport class AhusOverview {\r\n constructor(parameters) {\r\n var t = this;\r\n\r\n let root = document.documentElement;\r\n // let's move the red Triggers div to tuck under \r\n // the gray callout by updating the css variables \r\n function overlapCallout() {\r\n var calloutHeight = document.querySelector('.callout').getBoundingClientRect().height,\r\n extraPadding,\r\n ahusoverviewMargin = (calloutHeight / 2);\r\n\r\n if (WindowMetrics.isMobile()) {\r\n extraPadding = 60;\r\n }\r\n else {\r\n extraPadding = 75;\r\n }\r\n root.style.setProperty('--ahusoverview-margin', '-' + ahusoverviewMargin + 'px');\r\n root.style.setProperty('--ahusoverview-padding', ahusoverviewMargin + extraPadding + 'px');\r\n };\r\n\r\n window.addEventListener('DOMContentLoaded', (event) => {\r\n overlapCallout();\r\n });\r\n\r\n window.addEventListener('resize', (event) => {\r\n overlapCallout();\r\n });\r\n\r\n }\r\n}","import { Modal } from \"../components/modal.js\";\r\nimport { Utilities } from \"../utilities/utilities.js\";\r\n\r\nexport class DiagnosingAhus {\r\n constructor(parameters) {\r\n var t = this;\r\n\r\n // triggering conditions video modals \r\n var caseStudies = document.querySelectorAll('#triggering-conditions .cta.video'),\r\n template = `
\r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n

Hear how your peers recognize persistent TMA and navigate the differential diagnosis of atypical-HUS in a pregnancy/postpartum setting.

\r\n\r\n

Learn more about how atypical-HUS is diagnosed in this scenario by downloading and reviewing a case study.

\r\n

These are some triggers seen in atypical-HUS patients. Additional triggers may exist. See the Diagnosing aHUS page for a more comprehensive list.

\r\n
\r\n
\r\n DOWNLOAD PDF\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n

Hear how your peers work with a team of specialists to recognize persistent TMA and organ damage in the differential diagnosis of atypical-HUS in patients with malignant hypertension.

\r\n\r\n

Learn more about how atypical-HUS is diagnosed in this scenario by downloading and reviewing a case study.

\r\n

These are some triggers seen in atypical-HUS patients. Additional triggers may exist. See the Diagnosing aHUS page for a more comprehensive list.

\r\n
\r\n
\r\n DOWNLOAD PDF\r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n
\r\n
\r\n

Hear how your peers confirm TMA and assess renal function and other organ damage to navigate the differential diagnosis of atypical-HUS in patients with systemic lupus erythematosus.

\r\n

Learn more about how atypical-HUS is diagnosed in this scenario by downloading and reviewing a case study.

\r\n

These are some triggers seen in atypical-HUS patients. Additional triggers may exist. See the Diagnosing aHUS page for a more comprehensive list.

\r\n
\r\n
\r\n DOWNLOAD PDF\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n

Hear how your peers confirm complement-mediated TMA and navigate the differential diagnosis of atypical-HUS in a transplant setting.

\r\n

Learn more about how atypical-HUS is diagnosed in this scenario by downloading and reviewing a case study.

\r\n

These are some triggers seen in atypical-HUS patients. Additional triggers may exist. See the Diagnosing aHUS page for a more comprehensive list.

\r\n
\r\n
DOWNLOAD PDF
\r\n
\r\n
\r\n
\r\n
`,\r\n targetElement = document.getElementById('anchor-tma-triggers');\r\n\r\n function tabSwitcher(activeId, videoId) {\r\n var videoTabLinks = document.querySelectorAll('.video-navigation ul li'),\r\n videoWrapDivs = document.querySelectorAll('.video-wrap div'),\r\n newVideoId = videoId;\r\n\r\n for (var t = 0; t < videoTabLinks.length; t++) {\r\n videoTabLinks[t].classList.remove('active');\r\n }\r\n for (var w = 0; w < videoWrapDivs.length; w++) {\r\n videoWrapDivs[w].classList.remove('active');\r\n }\r\n document.getElementById('video-link-' + activeId).classList.add('active');\r\n document.getElementById('video-' + activeId).classList.add('active');\r\n\r\n window._wq = window._wq || [];\r\n // hide all videos\r\n var wistiaVideos = document.querySelectorAll('.wistia_embed');\r\n for (var v = 0; v < wistiaVideos.length; v++) {\r\n let wistiaVideo = wistiaVideos[v];\r\n wistiaVideo.style.display = 'none';\r\n }\r\n // show current video\r\n document.querySelector('.wistia_embed.wistia_async_' + newVideoId).style.display = 'block';\r\n // pause all videos and move time to zero\r\n _wq.push({\r\n id: \"_all\", onReady: function (video) {\r\n video.pause();\r\n video.time(0);\r\n }\r\n });\r\n\r\n // start playing current video\r\n _wq.push({\r\n id: newVideoId, onReady: function (video) {\r\n video.play();\r\n }\r\n }); \r\n\r\n }\r\n\r\n var calculateTargetScrollPosition = function (targetElement) {\r\n let targetScrollPosition = targetElement.getBoundingClientRect().top;\r\n\r\n // Incorporate current scroll offset\r\n targetScrollPosition += window.pageYOffset;\r\n\r\n // Check if we're in mobile\r\n //if (WindowMetrics.isMobile()) {\r\n // targetScrollPosition -= document.querySelector('header').clientHeight;\r\n //} else {\r\n targetScrollPosition -= document.querySelector('header').clientHeight;\r\n //}\r\n\r\n return targetScrollPosition;\r\n };\r\n\r\n for (var i = 0; i < caseStudies.length; i++) {\r\n let caseStudy = caseStudies[i];\r\n\r\n caseStudy.addEventListener('click', function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n let caseStudyTabId = this.getAttribute('data-video-label'),\r\n videoId = this.getAttribute('data-video-id');\r\n\r\n Modal.show(\r\n template,\r\n 'case-study-videos',\r\n Modal.presentationTypes.fade,\r\n Modal.presentationTypes.fade,\r\n false,\r\n {\r\n preShow: function () {\r\n // load Wistia javascript for videos \r\n var s = document.createElement(\"script\");\r\n s.src = \"https://fast.wistia.com/embed/medias/4iw7sw1hf2.jsonp\";\r\n s.async = true;\r\n document.body.appendChild(s);\r\n\r\n var c = document.createElement(\"script\");\r\n c.src = \"https://fast.wistia.com/assets/external/E-v1.js\";\r\n c.async = true;\r\n document.body.appendChild(c);\r\n },\r\n postShow: function () {\r\n let modal = this;\r\n\r\n tabSwitcher(caseStudyTabId, videoId);\r\n\r\n let videoTabLinks = document.querySelectorAll('.video-navigation ul li');\r\n\r\n for (var v = 0; v < videoTabLinks.length; v++) {\r\n let videoTabLink = videoTabLinks[v];\r\n\r\n videoTabLink.addEventListener('click', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n var videoTabId = this.querySelector('a').getAttribute('data-video-label');\r\n var videoId = this.querySelector('a').getAttribute('data-video-id');\r\n tabSwitcher(videoTabId, videoId);\r\n\r\n });\r\n\r\n }\r\n\r\n var triggerLinks = modal.container.querySelectorAll('p.footnote a');\r\n\r\n for (var i = 0; i < triggerLinks.length; i++) {\r\n let triggerLink = triggerLinks[i];\r\n\r\n triggerLink.addEventListener('click', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n modal.close(false, Modal.presentationTypes.fade);\r\n\r\n let targetScrollPosition = calculateTargetScrollPosition(targetElement);\r\n Utilities.scrollWindowToPosition(targetScrollPosition);\r\n });\r\n };\r\n }\r\n },\r\n event\r\n );\r\n\r\n })\r\n }\r\n\r\n window.addEventListener('load', function (event) {\r\n // picking up hash in url from hcp-resources-and-video page \r\n var urlHash = window.location.hash;\r\n if (urlHash == '#triggers') {\r\n let targetScrollPosition = calculateTargetScrollPosition(targetElement);\r\n Utilities.scrollWindowToPosition(targetScrollPosition);\r\n }\r\n });\r\n }\r\n}\r\n","import { Utilities } from \"./utilities.js\";\r\nimport { WindowMetrics } from \"./window-metrics.js\";\r\n\r\nlet\r\n // These determine how flick animations behave when the flicked image\r\n // hits a viewport boundary\r\n rubberBandModes = {\r\n // The animation is capped at the boundary & nothing happens\r\n disabled: 0,\r\n\r\n // The animation rubber-bands where it hits boundaries in\r\n // the x and y dimensions, independently\r\n independentAxes: 1,\r\n\r\n // The animation rubber-bands where it hits any boundary along\r\n // the path of motion - this generally feels a little less hectic\r\n // than the \"independentAxes\" mode, but it also makes it kind of\r\n // feel like things are getting \"snagged\" at the edge of the\r\n // screen; for this site we're not currently using this mode\r\n vector: 2\r\n },\r\n\r\n settings = {\r\n // Fullscreen animation settings\r\n zoomInDuration: 0.5,\r\n zoomOutDuration: 0.25,\r\n\r\n // Minimum pixels per second to trigger a flick gesture\r\n minVelocity: 500.0,\r\n\r\n // Rate of deceleration of the flick animation, in\r\n // pixels per second squared\r\n deceleration: -2000.0,\r\n\r\n // Maximum duration of a flick animation\r\n maxTimeToRest: 1.0,\r\n\r\n // Minimum rate between move and release events for velocity\r\n // to be considered\r\n minSampleInterval: 50,\r\n\r\n // Maximum distance out of bounds the image can move\r\n rubberBandMaxDistance: 100,\r\n\r\n // Maximum duration of the time for the flick to finish after\r\n // going out of bounds, in seconds\r\n rubberBandMaxTime: 0.5,\r\n\r\n // Minimum time for the rubber band motion to come to rest\r\n // at its final position - this prevents things from looking\r\n // too jerky\r\n rubberBandMinResetTime: 0.5,\r\n\r\n // The time to snap into position after dragging the image\r\n // out of bounds but not causing a flick\r\n outOfBoundsResetSpeed: 1000,\r\n outOfBoundsMinResetTime: 0.25,\r\n outOfBoundsMaxResetTime: 1.0\r\n };\r\n\r\nexport class ZoomableImage {\r\n constructor(container, flickEnabled, rubberBandMode) {\r\n let t = this;\r\n\r\n t.container = container;\r\n t.flickEnabled = flickEnabled;\r\n t.rubberBandMode = rubberBandMode;\r\n t.smallImage = t.container.querySelector(\"img\");\r\n t.dX = 0;\r\n t.dY = 0;\r\n\r\n t.container.addEventListener(\"click\", (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Only allow this in mobile mode\r\n if (!WindowMetrics.isMobile())\r\n return;\r\n\r\n // Determine where the user clicked and center the image on that point\r\n let bounds = t.smallImage.getBoundingClientRect(),\r\n localX = event.clientX,\r\n localY = event.clientY;\r\n\r\n if (localX == undefined)\r\n localX = event.touches[0].clientX;\r\n if (localY == undefined)\r\n localY = event.touches[0].clientY;\r\n\r\n // Record the raw screen coordinates while we're at it\r\n t.clickPointX = localX;\r\n t.clickPointY = localY;\r\n\r\n localX -= bounds.left;\r\n localY -= bounds.top;\r\n\r\n t.localPercentX = localX / t.smallImage.clientWidth;\r\n t.localPercentY = localY / t.smallImage.clientHeight;\r\n\r\n if (t.localPercentX < 0)\r\n t.localPercentX = 0;\r\n else if (t.localPercentX > 1)\r\n t.localPercentX = 1;\r\n\r\n if (t.localPercentY < 0)\r\n t.localPercentY = 0;\r\n else if (t.localPercentY > 1)\r\n t.localPercentY = 1;\r\n\r\n // Get this before locking scrolling - that affects the values\r\n // on some browsers\r\n bounds = t.smallImage.getBoundingClientRect();\r\n\r\n // Create backdrop\r\n t.backdrop = Utilities.createElementFromTemplate(`
`);\r\n document.body.appendChild(t.backdrop);\r\n\r\n // Create viewport\r\n t.viewport = Utilities.createElementFromTemplate(`
`);\r\n document.body.appendChild(t.viewport);\r\n\r\n // Create image\r\n t.dragImage = new Image();\r\n t.dragImage.src = t.smallImage.src;\r\n t.dragImage.className = \"zoomable-image-drag\";\r\n document.body.appendChild(t.dragImage);\r\n\r\n // Create close button\r\n t.closeButton = Utilities.createElementFromTemplate(``);\r\n document.body.appendChild(t.closeButton);\r\n\r\n t.closeCallback = function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Exit zoomed mode\r\n t.close();\r\n };\r\n\r\n t.backdrop.addEventListener(\"click\", t.closeCallback);\r\n t.closeButton.addEventListener(\"click\", t.closeCallback);\r\n\r\n // Setup resize callback\r\n t.resizeCallback = () => {\r\n if (WindowMetrics.isMobile()) {\r\n // Make sure t.imageLeftPosition and t.imageTopPosition are within the desired range\r\n adjustTopLeftPosition.call(t);\r\n\r\n // Update the image position\r\n t.dragImage.style.left = `${t.imageLeftPosition}px`;\r\n t.dragImage.style.top = `${t.imageTopPosition}px`;\r\n } else {\r\n // We've switched to desktop - exit zoomed mode\r\n window.removeEventListener(\"resize\", t.resizeCallback);\r\n t.close();\r\n }\r\n };\r\n\r\n window.addEventListener(\"resize\", t.resizeCallback);\r\n\r\n // Setup dragging\r\n setupDragCallback.call(t);\r\n\r\n // Lock scrolling\r\n Utilities.lockScrolling(t.viewport);\r\n\r\n // Wait until the image has loaded to continue\r\n let\r\n loaded = false,\r\n loadCallback = function () {\r\n if (loaded)\r\n return;\r\n\r\n if (t.dragImage.clientWidth == 0)\r\n return;\r\n\r\n loaded = true;\r\n\r\n // If there's a \"@2x\" somewhere in the file name,\r\n // display it at half size\r\n if (t.dragImage.src.indexOf(\"@2x\") >= 0) {\r\n t.dragImage.width /= 2;\r\n t.imageScale = 2;\r\n } else {\r\n t.imageScale = 1;\r\n }\r\n\r\n // Determine the final (zoomed in) image size & position - initially we\r\n // assume that we'll move the image to the calculated offset\r\n let centerPointX = t.localPercentX * t.dragImage.clientWidth,\r\n centerPointY = t.localPercentY * t.dragImage.clientHeight;\r\n\r\n t.imageLeftPosition = t.clickPointX + (t.dragImage.clientWidth / 2) - centerPointX;\r\n t.imageTopPosition = t.clickPointY - centerPointY;\r\n\r\n // Make sure t.imageLeftPosition and t.imageTopPosition are within the desired range\r\n adjustTopLeftPosition.call(t);\r\n\r\n // Determine initial (zoomed out) image size & position\r\n let yDelta = t.imageTopPosition - (bounds.top + (bounds.height / 2) - (t.dragImage.clientHeight / 2)),\r\n xDelta = t.imageLeftPosition - (bounds.left + (bounds.width / 2)),\r\n scaleDelta = 1 - (t.smallImage.clientWidth / t.dragImage.clientWidth),\r\n animationState = {\r\n percentComplete: 0\r\n };\r\n\r\n // Show the image\r\n t.dragImage.style.visibility = \"visible\";\r\n\r\n // Animate the transition\r\n let timeline = new TimelineMax(),\r\n tickCallback = function () {\r\n let top = t.imageTopPosition - ((1 - animationState.percentComplete) * yDelta);\r\n t.dragImage.style.top = `${Math.round(top * 1000) / 1000}px`;\r\n\r\n let left = t.imageLeftPosition - ((1 - animationState.percentComplete) * xDelta);\r\n t.dragImage.style.left = `${Math.round(left * 1000) / 1000}px`;\r\n\r\n let scale = 1 - ((1 - animationState.percentComplete) * scaleDelta);\r\n t.dragImage.style.transform = `translate(-50%, 0%) scale(${Math.round(scale * 1000) / 1000})`;\r\n };\r\n\r\n tickCallback();\r\n\r\n // Fade in the backdrop & button\r\n timeline.to(\r\n t.backdrop,\r\n settings.zoomInDuration,\r\n {\r\n ease: Power3.easeOut,\r\n opacity: 1\r\n },\r\n 0);\r\n\r\n timeline.to(\r\n t.closeButton,\r\n settings.zoomInDuration,\r\n {\r\n ease: Power3.easeOut,\r\n opacity: 1\r\n },\r\n 0);\r\n\r\n // Zoom in the image and shift it into place\r\n timeline.to(\r\n animationState,\r\n settings.zoomInDuration,\r\n {\r\n ease: Power3.easeOut,\r\n percentComplete: 1,\r\n onUpdate: tickCallback\r\n },\r\n 0);\r\n };\r\n\r\n t.dragImage.addEventListener(\"load\", loadCallback);\r\n loadCallback();\r\n });\r\n }\r\n\r\n close() {\r\n let t = this;\r\n\r\n t.backdrop.removeEventListener(\"click\", t.closeCallback);\r\n t.closeButton.removeEventListener(\"click\", t.closeCallback);\r\n\r\n // Fade everything out\r\n TweenMax.fromTo(\r\n [\r\n t.backdrop,\r\n t.dragImage,\r\n t.closeButton\r\n ],\r\n settings.zoomOutDuration,\r\n {\r\n opacity: 1\r\n },\r\n {\r\n ease: Power1.easeOut,\r\n opacity: 0,\r\n onComplete: function () {\r\n // Remove resize callback\r\n window.removeEventListener(\"resize\", t.resizeCallback);\r\n\r\n // Unlock scrolling\r\n Utilities.unlockScrolling(t.viewport);\r\n\r\n // Remove everything from the DOM\r\n document.body.removeChild(t.backdrop);\r\n document.body.removeChild(t.viewport);\r\n document.body.removeChild(t.dragImage);\r\n document.body.removeChild(t.closeButton);\r\n\r\n // Reset drag offsets\r\n t.dX = 0;\r\n t.dY = 0;\r\n }\r\n });\r\n }\r\n\r\n static get rubberBandModes() {\r\n return rubberBandModes;\r\n }\r\n}\r\n\r\n// Private methods\r\nlet\r\n // Adjusts the default zoomed image positioning -\"t.imageLeftPosition\" and\r\n // \"t.imageTopPosition\" - to make sure the image is within our viewport's bounds\r\n adjustTopLeftPosition = function () {\r\n let t = this,\r\n halfImageWidth = t.dragImage.clientWidth / 2;\r\n\r\n // Make sure the t.imageLeftPosition value is within the desired range\r\n if (t.dragImage.clientWidth > t.viewport.clientWidth) {\r\n // The image is wider than the viewport\r\n let leftEdge = t.imageLeftPosition - halfImageWidth + t.dX;\r\n if (leftEdge > t.viewport.offsetLeft) {\r\n t.imageLeftPosition = t.viewport.offsetLeft + halfImageWidth - t.dX;\r\n } else {\r\n let rightEdge = t.imageLeftPosition + halfImageWidth + t.dX;\r\n if (rightEdge < t.viewport.offsetLeft + t.viewport.clientWidth)\r\n t.imageLeftPosition = t.viewport.offsetLeft + t.viewport.clientWidth - halfImageWidth - t.dX;\r\n }\r\n } else {\r\n // The image is narrower than the viewport - make sure it's in the viewport's bounds\r\n let leftEdge = t.imageLeftPosition - halfImageWidth + t.dX;\r\n if (leftEdge < t.viewport.offsetLeft) {\r\n t.imageLeftPosition = t.viewport.offsetLeft + halfImageWidth - t.dX;\r\n } else {\r\n let rightEdge = t.imageLeftPosition + halfImageWidth + t.dX;\r\n if (rightEdge > t.viewport.offsetLeft + t.viewport.clientWidth)\r\n t.imageLeftPosition = t.viewport.offsetLeft + t.viewport.clientWidth - halfImageWidth - t.dX;\r\n }\r\n }\r\n\r\n // Make sure the t.imageTopPosition value is within the desired range\r\n if (t.dragImage.clientHeight > t.viewport.clientHeight) {\r\n // The image is taller than the viewport\r\n let topEdge = t.imageTopPosition + t.dY;\r\n if (topEdge > t.viewport.offsetTop) {\r\n t.imageTopPosition = t.viewport.offsetTop - t.dY;\r\n } else {\r\n let bottomEdge = t.imageTopPosition + t.dragImage.clientHeight + t.dY;\r\n if (bottomEdge < t.viewport.offsetTop + t.viewport.clientHeight)\r\n t.imageTopPosition = t.viewport.offsetTop + t.viewport.clientHeight - t.dragImage.clientHeight - t.dY;\r\n }\r\n } else {\r\n // The image is shorter than the viewport - make sure it's in the viewport's bounds\r\n let topEdge = t.imageTopPosition + t.dY;\r\n if (topEdge < t.viewport.offsetTop) {\r\n t.imageTopPosition = t.viewport.offsetTop - t.dY;\r\n } else {\r\n let bottomEdge = t.imageTopPosition + t.dragImage.clientHeight + t.dY;\r\n if (bottomEdge > t.viewport.offsetTop + t.viewport.clientHeight)\r\n t.imageTopPosition = t.viewport.offsetTop + t.viewport.clientHeight - t.dragImage.clientHeight - t.dY;\r\n }\r\n }\r\n },\r\n\r\n // Checks a proposed X offset to be used in a translation from the default\r\n // \"t.imageLeftPosition\" value - if the offset puts the image out of bounds,\r\n // an adjusted value is returned\r\n determineCappedDragOffsetX = function (proposedDX) {\r\n let t = this,\r\n halfImageWidth = t.dragImage.clientWidth / 2;\r\n\r\n if (t.dragImage.clientWidth > t.viewport.clientWidth) {\r\n // The image is wider than the viewport\r\n let leftEdge = t.imageLeftPosition - halfImageWidth + proposedDX;\r\n if (leftEdge > t.viewport.offsetLeft) {\r\n return t.viewport.offsetLeft - (t.imageLeftPosition - halfImageWidth);\r\n } else {\r\n let rightEdge = t.imageLeftPosition + halfImageWidth + proposedDX;\r\n if (rightEdge < t.viewport.offsetLeft + t.viewport.clientWidth)\r\n return t.viewport.offsetLeft + t.viewport.clientWidth - (t.imageLeftPosition + halfImageWidth);\r\n }\r\n } else {\r\n // The image is narrower than the viewport\r\n let leftEdge = t.imageLeftPosition - halfImageWidth + proposedDX,\r\n rightEdge = leftEdge + t.dragImage.clientWidth;\r\n if (leftEdge < t.viewport.offsetLeft) {\r\n if (rightEdge < t.viewport.offsetLeft + t.viewport.clientWidth)\r\n return t.viewport.offsetLeft - (t.imageLeftPosition - halfImageWidth);\r\n } else if (rightEdge > t.viewport.offsetLeft + t.viewport.clientWidth) {\r\n if (leftEdge > t.viewport.offsetLeft)\r\n return t.viewport.offsetLeft + t.viewport.clientWidth - (t.imageLeftPosition + halfImageWidth);\r\n }\r\n }\r\n\r\n // The proposed value is ok\r\n return proposedDX;\r\n },\r\n\r\n // Checks a proposed Y offset to be used in a translation from the default\r\n // \"t.imageTopPosition\" value - if the offset puts the image out of bounds,\r\n // an adjusted value is returned\r\n determineCappedDragOffsetY = function (proposedDY) {\r\n let t = this;\r\n\r\n if (t.dragImage.clientHeight > t.viewport.clientHeight) {\r\n // The image is taller than the viewport\r\n let topEdge = t.imageTopPosition + proposedDY;\r\n if (topEdge > t.viewport.offsetTop) {\r\n return t.viewport.offsetTop - t.imageTopPosition;\r\n } else {\r\n let bottomEdge = t.imageTopPosition + t.dragImage.clientHeight + proposedDY;\r\n if (bottomEdge < t.viewport.offsetTop + t.viewport.clientHeight)\r\n return t.viewport.offsetTop + t.viewport.clientHeight - (t.imageTopPosition + t.dragImage.clientHeight);\r\n }\r\n } else {\r\n // The image is shorter than the viewport\r\n let topEdge = t.imageTopPosition + proposedDY,\r\n bottomEdge = topEdge + t.dragImage.clientHeight;\r\n if (topEdge < t.viewport.offsetTop) {\r\n if (bottomEdge < t.viewport.offsetTop + t.viewport.clientHeight)\r\n return t.viewport.offsetTop - t.imageTopPosition;\r\n } else if (bottomEdge > t.viewport.offsetTop + t.viewport.clientHeight) {\r\n if (topEdge > t.viewport.offsetTop)\r\n return t.viewport.offsetTop + t.viewport.clientHeight - (t.imageTopPosition + t.dragImage.clientHeight);\r\n }\r\n }\r\n\r\n // The proposed value is ok\r\n return proposedDY;\r\n },\r\n\r\n // Calculates the time at which a proposed flick animation will intersect\r\n // with a viewport boundary\r\n calculateViewportIntersectionVelocityAndTime = function (proposedDistance, cappedDistance, initialVelocity, deceleration) {\r\n let hittingBounds = Math.abs(proposedDistance - cappedDistance) > 0.0001;\r\n if (!hittingBounds)\r\n return null;\r\n\r\n if (deceleration == 0)\r\n return null;\r\n\r\n // vf^2 = v0^2 + 2ad\r\n // vf = Math.sqrt(v0^2 + 2ad)\r\n let intersectVelocity = Math.sqrt((initialVelocity * initialVelocity) + (2 * deceleration * cappedDistance));\r\n if (initialVelocity < 0 && intersectVelocity > 0)\r\n intersectVelocity = -intersectVelocity;\r\n\r\n // vf = v0 + at\r\n // t = (vf - v0) / a\r\n let intersectTime = (intersectVelocity - initialVelocity) / deceleration;\r\n\r\n return {\r\n velocity: intersectVelocity,\r\n time: intersectTime\r\n };\r\n },\r\n\r\n // This produces all of the information necessary to produce a basic\r\n // flick animation\r\n calculateFlickAnimationSettings = function (\r\n originX,\r\n originY,\r\n velocityX,\r\n velocityY,\r\n velocityMagnitude,\r\n deceleration) {\r\n let\r\n t = this,\r\n\r\n totalTime = velocityMagnitude / Math.abs(deceleration),\r\n //angle = velocityX < 0.00001 && velocityX > -0.00001 ? Math.PI / 2 : Math.atan(velocityY / velocityX),\r\n angle = Math.atan(velocityY / velocityX),\r\n cosAngle = Math.cos(angle),\r\n sinAngle = Math.sin(angle);\r\n\r\n if (Math.abs(cosAngle) < 0.0001)\r\n cosAngle = 0;\r\n if (Math.abs(sinAngle) < 0.0001)\r\n sinAngle = 0;\r\n\r\n // Adjust the decceleration rate so that the flick comes to rest\r\n // within the specified amount of time\r\n if (totalTime > settings.maxTimeToRest) {\r\n totalTime = settings.maxTimeToRest;\r\n deceleration = -velocityMagnitude / totalTime;\r\n }\r\n\r\n // Calculate the velocity and acceleration along the x and y axes\r\n let\r\n decelerationX = cosAngle * Math.abs(deceleration),\r\n decelerationY = sinAngle * Math.abs(deceleration);\r\n\r\n if (velocityX < 0 && decelerationX < 0 || velocityX > 0 && decelerationX > 0)\r\n decelerationX = -decelerationX;\r\n if (velocityY < 0 && decelerationY < 0 || velocityY > 0 && decelerationY > 0)\r\n decelerationY = -decelerationY;\r\n\r\n // Determine if the image will intersect the viewport bounds during\r\n // the flick, and if so, at what time the intersection occurs\r\n let proposedDistanceX = (velocityX * totalTime) + (0.5 * decelerationX * totalTime * totalTime),\r\n cappedDistanceX = determineCappedDragOffsetX.call(t, proposedDistanceX + originX),\r\n\r\n proposedDistanceY = (velocityY * totalTime) + (0.5 * decelerationY * totalTime * totalTime),\r\n cappedDistanceY = determineCappedDragOffsetY.call(t, proposedDistanceY + originY);\r\n\r\n // From now on, we'll want the distance from our origin point and not\r\n // an absolute value\r\n cappedDistanceX -= originX;\r\n cappedDistanceY -= originY;\r\n\r\n // Determine if the image will intersect the viewport bounds during\r\n // the flick, and if so, at what time the intersection occurs\r\n let\r\n intersectVelocityAndTimeX = calculateViewportIntersectionVelocityAndTime(\r\n proposedDistanceX,\r\n cappedDistanceX,\r\n velocityX,\r\n decelerationX),\r\n\r\n intersectVelocityAndTimeY = calculateViewportIntersectionVelocityAndTime(\r\n proposedDistanceY,\r\n cappedDistanceY,\r\n velocityY,\r\n decelerationY),\r\n\r\n rubberBandStartVelocityAndTime;\r\n\r\n if (intersectVelocityAndTimeX !== null) {\r\n // We're intersecting the viewport bounds horizontally\r\n if (intersectVelocityAndTimeY !== null) {\r\n // We're intersecting the viewport bounds both horizontally\r\n // and vertically - choose whichever happens first\r\n if (intersectVelocityAndTimeX.time < intersectVelocityAndTimeY.time)\r\n rubberBandStartVelocityAndTime = intersectVelocityAndTimeX;\r\n else\r\n rubberBandStartVelocityAndTime = intersectVelocityAndTimeY;\r\n } else {\r\n // We're only intersecting the viewport bounds horizontally\r\n rubberBandStartVelocityAndTime = intersectVelocityAndTimeX;\r\n }\r\n } else {\r\n if (intersectVelocityAndTimeY !== null) {\r\n // We're only intersecting the viewport bounds vertically\r\n rubberBandStartVelocityAndTime = intersectVelocityAndTimeY;\r\n } else {\r\n // We're not intersecting the viewport bounds at all\r\n rubberBandStartVelocityAndTime = null;\r\n }\r\n }\r\n\r\n return {\r\n originX: originX,\r\n originY: originY,\r\n velocityX: velocityX,\r\n velocityY: velocityY,\r\n velocityMagnitude: velocityMagnitude,\r\n deceleration: deceleration,\r\n\r\n totalTime: totalTime,\r\n cosAngle: cosAngle,\r\n sinAngle: sinAngle,\r\n\r\n decelerationX: decelerationX,\r\n decelerationY: decelerationY,\r\n\r\n cappedDistanceX: cappedDistanceX,\r\n cappedDistanceY: cappedDistanceY,\r\n\r\n intersectVelocityAndTimeX: intersectVelocityAndTimeX,\r\n intersectVelocityAndTimeY: intersectVelocityAndTimeY,\r\n rubberBandStartVelocityAndTime: rubberBandStartVelocityAndTime\r\n };\r\n },\r\n\r\n // This produces all of the information necessary to produce a rubber band\r\n // animation along an arbitrary vector defined by x and y velocities\r\n calculateRubberBandAnimationSettings = function (flickSettings) {\r\n let\r\n // The total length to come to a stop for this flick - this is a magnitude and always\r\n // a positive value\r\n totalDistance = (flickSettings.velocityMagnitude * flickSettings.totalTime) + (0.5 * flickSettings.deceleration * flickSettings.totalTime * flickSettings.totalTime);\r\n\r\n // There's no rubber band animation to be made if this is null\r\n if (flickSettings.rubberBandStartVelocityAndTime == null)\r\n return flickSettings;\r\n\r\n let\r\n // The distance into the flick at which we intersect a viewport boundary\r\n rubberBandStartTime = flickSettings.rubberBandStartVelocityAndTime.time,\r\n rubberBandStartDistance = (flickSettings.velocityMagnitude * rubberBandStartTime) + (0.5 * flickSettings.deceleration * rubberBandStartTime * rubberBandStartTime),\r\n rubberBandRestingPositionOffsetX,\r\n rubberBandRestingPositionOffsetY;\r\n\r\n // When the rubber band starts out of bounds, the entire animation is the rubber band\r\n // and we'll be ending at a location behind our starting point\r\n if (rubberBandStartDistance < 0) {\r\n rubberBandRestingPositionOffsetX = flickSettings.cosAngle * rubberBandStartDistance;\r\n if (flickSettings.velocityX > 0 && rubberBandRestingPositionOffsetX > 0 || flickSettings.velocityX < 0 && rubberBandRestingPositionOffsetX < 0)\r\n rubberBandRestingPositionOffsetX = -rubberBandRestingPositionOffsetX;\r\n\r\n rubberBandRestingPositionOffsetY = flickSettings.sinAngle * rubberBandStartDistance;\r\n if (flickSettings.velocityY > 0 && rubberBandRestingPositionOffsetY > 0 || flickSettings.velocityY < 0 && rubberBandRestingPositionOffsetY < 0)\r\n rubberBandRestingPositionOffsetY = -rubberBandRestingPositionOffsetY;\r\n\r\n rubberBandStartDistance = 0;\r\n } else {\r\n rubberBandRestingPositionOffsetX = 0;\r\n rubberBandRestingPositionOffsetY = 0;\r\n }\r\n\r\n let\r\n // The velocity of the animation at the time of the boundary intersection\r\n rubberBandStartVelocity = Math.sqrt((flickSettings.velocityMagnitude * flickSettings.velocityMagnitude) + (2 * flickSettings.deceleration * rubberBandStartDistance)),\r\n\r\n // The time between the intersection and coming to a rest\r\n rubberBandStretchDuration = flickSettings.totalTime - rubberBandStartTime,\r\n\r\n // The distance traveled beyond the boundary intersection point\r\n distanceBeyondBounds = totalDistance - rubberBandStartDistance,\r\n\r\n // The deceleration required to come to a rest given the distance & time beyond the intersection\r\n rubberBandDeceleration = flickSettings.deceleration;\r\n\r\n // Adjust total flick distance and the deceleration & deceleration time beyond the intersection\r\n // point so that we come to a rest within the desired distance\r\n if (distanceBeyondBounds > settings.rubberBandMaxDistance) {\r\n // The flick is sending the image beyond our maximum rubber band\r\n // distance - cap it\r\n rubberBandDeceleration = -(rubberBandStartVelocity * rubberBandStartVelocity) / (2 * settings.rubberBandMaxDistance);\r\n rubberBandStretchDuration = rubberBandStartVelocity / Math.abs(rubberBandDeceleration);\r\n totalDistance = rubberBandStartDistance + settings.rubberBandMaxDistance;\r\n distanceBeyondBounds = totalDistance - rubberBandStartDistance;\r\n }\r\n\r\n // Now that the distance and decelaration of the rubber band has been determined,\r\n // calculate its duration\r\n let rubberBandRestDuration = rubberBandStretchDuration >= settings.rubberBandMinResetTime ? rubberBandStretchDuration : settings.rubberBandMinResetTime;\r\n\r\n // Add all of the base flick values to a new object\r\n let rubberBandSettings = {};\r\n Object.assign(rubberBandSettings, flickSettings);\r\n\r\n // Add all of the rubber band -specific values to the object & return it\r\n return Object.assign(\r\n rubberBandSettings,\r\n {\r\n totalTime: rubberBandStartTime\r\n + rubberBandStretchDuration\r\n + rubberBandRestDuration,\r\n\r\n rubberBandStartVelocity: rubberBandStartVelocity,\r\n\r\n rubberBandStartTime: rubberBandStartTime,\r\n rubberBandStretchDuration: rubberBandStretchDuration,\r\n rubberBandRestDuration: rubberBandRestDuration,\r\n\r\n totalDistance: totalDistance,\r\n rubberBandStartDistance: rubberBandStartDistance,\r\n distanceBeyondBounds: distanceBeyondBounds,\r\n\r\n rubberBandRestingPositionOffsetX: rubberBandRestingPositionOffsetX,\r\n rubberBandRestingPositionOffsetY: rubberBandRestingPositionOffsetY,\r\n\r\n rubberBandDeceleration: rubberBandDeceleration\r\n });\r\n },\r\n\r\n // This creates the animation for the \"vector\" rubber band mode\r\n setupVectorRubberBandAnimation = function (rubberBandSettings) {\r\n let\r\n t = this,\r\n\r\n animationState = {\r\n elapsedTime: 0\r\n };\r\n\r\n t.flickTimeline.fromTo(\r\n animationState,\r\n rubberBandSettings.totalTime,\r\n {\r\n elapsedTime: 0,\r\n },\r\n {\r\n ease: Power0.easeNone,\r\n elapsedTime: rubberBandSettings.totalTime,\r\n onUpdate: function () {\r\n // Determine which portion of the animation we're in\r\n let distanceAlongFlickPath,\r\n offsetX = 0,\r\n offsetY = 0;\r\n\r\n if (animationState.elapsedTime < rubberBandSettings.rubberBandStartTime) {\r\n // We're animating toward the boundary intersection point\r\n distanceAlongFlickPath = (rubberBandSettings.velocityMagnitude * animationState.elapsedTime) + (0.5 * rubberBandSettings.deceleration * animationState.elapsedTime * animationState.elapsedTime);\r\n } else if (animationState.elapsedTime < rubberBandSettings.rubberBandStartTime + rubberBandSettings.rubberBandStretchDuration) {\r\n // We're rubber banding beyond the bondary intersection point\r\n let elapsedTimeStep2 = animationState.elapsedTime - rubberBandSettings.rubberBandStartTime;\r\n\r\n distanceAlongFlickPath = rubberBandSettings.rubberBandStartDistance + (rubberBandSettings.rubberBandStartVelocity * elapsedTimeStep2) + (0.5 * rubberBandSettings.rubberBandDeceleration * elapsedTimeStep2 * elapsedTimeStep2);\r\n } else {\r\n // We're coming to a rest at our final position\r\n let elapsedTimeStep3 = animationState.elapsedTime - (rubberBandSettings.rubberBandStartTime + rubberBandSettings.rubberBandStretchDuration),\r\n percentComplete = elapsedTimeStep3 / rubberBandSettings.rubberBandRestDuration;\r\n\r\n if (percentComplete < 0)\r\n percentComplete = 0;\r\n else if (percentComplete > 1)\r\n percentComplete = 1;\r\n\r\n percentComplete = Power2.easeInOut.getRatio(percentComplete);\r\n distanceAlongFlickPath = rubberBandSettings.rubberBandStartDistance + ((1 - percentComplete) * rubberBandSettings.distanceBeyondBounds);\r\n\r\n offsetX = percentComplete * rubberBandSettings.rubberBandRestingPositionOffsetX;\r\n offsetY = percentComplete * rubberBandSettings.rubberBandRestingPositionOffsetY;\r\n }\r\n\r\n\r\n // Update our flick distance values\r\n t.flickDistanceX = rubberBandSettings.cosAngle * distanceAlongFlickPath;\r\n if (rubberBandSettings.velocityX < 0 && t.flickDistanceX > 0 || rubberBandSettings.velocityX > 0 && t.flickDistanceX < 0)\r\n t.flickDistanceX = -t.flickDistanceX;\r\n\r\n t.flickDistanceX += offsetX;\r\n\r\n t.flickDistanceY = rubberBandSettings.sinAngle * distanceAlongFlickPath;\r\n if (rubberBandSettings.velocityY < 0 && t.flickDistanceY > 0 || rubberBandSettings.velocityY > 0 && t.flickDistanceY < 0)\r\n t.flickDistanceY = -t.flickDistanceY;\r\n\r\n t.flickDistanceY += offsetY;\r\n\r\n // Update the transformation\r\n t.dragImage.style.transform = `translate(calc(-50% + ${t.dX + t.flickDistanceX}px), ${t.dY + t.flickDistanceY}px)`;\r\n }\r\n });\r\n },\r\n\r\n // This creates the animation for the \"independentAxes\" rubber band mode\r\n setupIndependentAxesRubberBandAnimation = function (rubberBandSettingsX, rubberBandSettingsY) {\r\n let t = this,\r\n\r\n animationState = {\r\n elapsedTimeX: 0,\r\n elapsedTimeY: 0\r\n };\r\n\r\n if (rubberBandSettingsX.rubberBandStartVelocityAndTime != null) {\r\n t.flickTimeline.fromTo(\r\n animationState,\r\n rubberBandSettingsX.totalTime,\r\n {\r\n elapsedTimeX: 0,\r\n },\r\n {\r\n ease: Power0.easeNone,\r\n elapsedTimeX: rubberBandSettingsX.totalTime,\r\n onUpdate: function () {\r\n // Determine which portion of the animation we're in\r\n let distanceAlongFlickPath,\r\n offsetX = 0;\r\n\r\n if (animationState.elapsedTimeX < rubberBandSettingsX.rubberBandStartTime) {\r\n // We're animating toward the boundary intersection point\r\n distanceAlongFlickPath = (rubberBandSettingsX.velocityMagnitude * animationState.elapsedTimeX) + (0.5 * rubberBandSettingsX.deceleration * animationState.elapsedTimeX * animationState.elapsedTimeX);\r\n } else if (animationState.elapsedTimeX < rubberBandSettingsX.rubberBandStartTime + rubberBandSettingsX.rubberBandStretchDuration) {\r\n // We're rubber banding beyond the bondary intersection point\r\n let elapsedTimeStep2 = animationState.elapsedTimeX - rubberBandSettingsX.rubberBandStartTime;\r\n\r\n distanceAlongFlickPath = rubberBandSettingsX.rubberBandStartDistance + (rubberBandSettingsX.rubberBandStartVelocity * elapsedTimeStep2) + (0.5 * rubberBandSettingsX.rubberBandDeceleration * elapsedTimeStep2 * elapsedTimeStep2);\r\n } else {\r\n // We're coming to a rest at our final position\r\n let elapsedTimeStep3 = animationState.elapsedTimeX - (rubberBandSettingsX.rubberBandStartTime + rubberBandSettingsX.rubberBandStretchDuration),\r\n percentComplete = elapsedTimeStep3 / rubberBandSettingsX.rubberBandRestDuration;\r\n\r\n if (percentComplete < 0)\r\n percentComplete = 0;\r\n else if (percentComplete > 1)\r\n percentComplete = 1;\r\n\r\n percentComplete = Power2.easeInOut.getRatio(percentComplete);\r\n distanceAlongFlickPath = rubberBandSettingsX.rubberBandStartDistance + ((1 - percentComplete) * rubberBandSettingsX.distanceBeyondBounds);\r\n\r\n\r\n offsetX = percentComplete * rubberBandSettingsX.rubberBandRestingPositionOffsetX;\r\n }\r\n\r\n // Update our flick distance values\r\n t.flickDistanceX = rubberBandSettingsX.cosAngle * distanceAlongFlickPath;\r\n if (rubberBandSettingsX.velocityX < 0 && t.flickDistanceX > 0 || rubberBandSettingsX.velocityX > 0 && t.flickDistanceX < 0)\r\n t.flickDistanceX = -t.flickDistanceX;\r\n\r\n t.flickDistanceX += offsetX;\r\n }\r\n },\r\n 0);\r\n } else {\r\n t.flickTimeline.fromTo(\r\n animationState,\r\n rubberBandSettingsX.totalTime,\r\n {\r\n elapsedTimeX: 0,\r\n },\r\n {\r\n ease: Power0.easeNone,\r\n elapsedTimeX: rubberBandSettingsX.totalTime,\r\n onUpdate: function () {\r\n // Update our flick distance values\r\n let distanceAlongFlickPath = (rubberBandSettingsX.velocityMagnitude * animationState.elapsedTimeX) + (0.5 * rubberBandSettingsX.deceleration * animationState.elapsedTimeX * animationState.elapsedTimeX),\r\n percentComplete = animationState.elapsedTimeX / rubberBandSettingsX.totalTime,\r\n offsetX = percentComplete * rubberBandSettingsX.rubberBandRestingPositionOffsetX;\r\n\r\n t.flickDistanceX = rubberBandSettingsX.cosAngle * distanceAlongFlickPath;\r\n if (rubberBandSettingsX.velocityX < 0 && t.flickDistanceX > 0 || rubberBandSettingsX.velocityX > 0 && t.flickDistanceX < 0)\r\n t.flickDistanceX = -t.flickDistanceX;\r\n\r\n //t.flickDistanceX += offsetX;\r\n\r\n // Cap the value if necessary\r\n if (rubberBandSettingsX.velocityX >= 0) {\r\n if (t.flickDistanceX > rubberBandSettingsX.cappedDistanceX)\r\n t.flickDistanceX = rubberBandSettingsX.cappedDistanceX;\r\n } else {\r\n if (t.flickDistanceX < rubberBandSettingsX.cappedDistanceX)\r\n t.flickDistanceX = rubberBandSettingsX.cappedDistanceX;\r\n }\r\n }\r\n },\r\n 0);\r\n }\r\n\r\n if (rubberBandSettingsY.rubberBandStartVelocityAndTime != null) {\r\n t.flickTimeline.fromTo(\r\n animationState,\r\n rubberBandSettingsY.totalTime,\r\n {\r\n elapsedTimeY: 0,\r\n },\r\n {\r\n ease: Power0.easeNone,\r\n elapsedTimeY: rubberBandSettingsY.totalTime,\r\n onUpdate: function () {\r\n // Determine which portion of the animation we're in\r\n let distanceAlongFlickPath,\r\n offsetY = 0;\r\n\r\n if (animationState.elapsedTimeY < rubberBandSettingsY.rubberBandStartTime) {\r\n // We're animating toward the boundary intersection point\r\n distanceAlongFlickPath = (rubberBandSettingsY.velocityMagnitude * animationState.elapsedTimeY) + (0.5 * rubberBandSettingsY.deceleration * animationState.elapsedTimeY * animationState.elapsedTimeY);\r\n } else if (animationState.elapsedTimeY < rubberBandSettingsY.rubberBandStartTime + rubberBandSettingsY.rubberBandStretchDuration) {\r\n // We're rubber banding beyond the bondary intersection point\r\n let elapsedTimeStep2 = animationState.elapsedTimeY - rubberBandSettingsY.rubberBandStartTime;\r\n\r\n distanceAlongFlickPath = rubberBandSettingsY.rubberBandStartDistance + (rubberBandSettingsY.rubberBandStartVelocity * elapsedTimeStep2) + (0.5 * rubberBandSettingsY.rubberBandDeceleration * elapsedTimeStep2 * elapsedTimeStep2);\r\n } else {\r\n // We're coming to a rest at our final position\r\n let elapsedTimeStep3 = animationState.elapsedTimeY - (rubberBandSettingsY.rubberBandStartTime + rubberBandSettingsY.rubberBandStretchDuration),\r\n percentComplete = elapsedTimeStep3 / rubberBandSettingsY.rubberBandRestDuration;\r\n\r\n if (percentComplete < 0)\r\n percentComplete = 0;\r\n else if (percentComplete > 1)\r\n percentComplete = 1;\r\n\r\n percentComplete = Power2.easeInOut.getRatio(percentComplete);\r\n distanceAlongFlickPath = rubberBandSettingsY.rubberBandStartDistance + ((1 - percentComplete) * rubberBandSettingsY.distanceBeyondBounds);\r\n\r\n offsetY = percentComplete * rubberBandSettingsY.rubberBandRestingPositionOffsetY;\r\n }\r\n\r\n // Update our flick distance values\r\n t.flickDistanceY = rubberBandSettingsY.sinAngle * distanceAlongFlickPath;\r\n if (rubberBandSettingsY.velocityX < 0 && t.flickDistanceY > 0 || rubberBandSettingsY.velocityX > 0 && t.flickDistanceY < 0)\r\n t.flickDistanceY = -t.flickDistanceY;\r\n\r\n t.flickDistanceY += offsetY;\r\n }\r\n },\r\n 0);\r\n } else {\r\n t.flickTimeline.fromTo(\r\n animationState,\r\n rubberBandSettingsY.totalTime,\r\n {\r\n elapsedTimeY: 0,\r\n },\r\n {\r\n ease: Power0.easeNone,\r\n elapsedTimeY: rubberBandSettingsY.totalTime,\r\n onUpdate: function () {\r\n // Update our flick distance values\r\n let distanceAlongFlickPath = (rubberBandSettingsY.velocityMagnitude * animationState.elapsedTimeY) + (0.5 * rubberBandSettingsY.deceleration * animationState.elapsedTimeY * animationState.elapsedTimeY),\r\n percentComplete = animationState.elapsedTimeY / rubberBandSettingsY.totalTime,\r\n offsetY = percentComplete * rubberBandSettingsY.rubberBandRestingPositionOffsetY;\r\n\r\n t.flickDistanceY = rubberBandSettingsY.sinAngle * distanceAlongFlickPath;\r\n if (rubberBandSettingsY.velocityX < 0 && t.flickDistanceX > 0 || rubberBandSettingsY.velocityX > 0 && t.flickDistanceX < 0)\r\n t.flickDistanceY = -t.flickDistanceY;\r\n\r\n //t.flickDistanceY += offsetY;\r\n\r\n // Cap the value if necessary\r\n if (rubberBandSettingsY.velocityY >= 0) {\r\n if (t.flickDistanceY > rubberBandSettingsY.cappedDistanceY)\r\n t.flickDistanceY = rubberBandSettingsY.cappedDistanceY;\r\n } else {\r\n if (t.flickDistanceY < rubberBandSettingsY.cappedDistanceY)\r\n t.flickDistanceY = rubberBandSettingsY.cappedDistanceY;\r\n }\r\n }\r\n },\r\n 0);\r\n }\r\n\r\n let tickCallback = function () {\r\n if (t.flickTimeline != null) {\r\n // Update the transformation\r\n t.dragImage.style.transform = `translate(calc(-50% + ${t.dX + t.flickDistanceX}px), ${t.dY + t.flickDistanceY}px)`;\r\n } else {\r\n TweenMax.ticker.removeEventListener(\"tick\", tickCallback);\r\n }\r\n };\r\n\r\n TweenMax.ticker.addEventListener(\"tick\", tickCallback);\r\n },\r\n\r\n // Sets up the mousedown / touchstart event on the image and all the drag-\r\n // related events that can happen afterward\r\n setupDragCallback = function () {\r\n let\r\n t = this,\r\n\r\n startCallback = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Stop any ongoing animation\r\n if (t.flickTimeline) {\r\n t.flickTimeline.kill();\r\n t.flickTimeline = null;\r\n\r\n t.dX += t.flickDistanceX;\r\n t.dY += t.flickDistanceY;\r\n\r\n t.dX = determineCappedDragOffsetX.call(t, t.dX);\r\n t.dY = determineCappedDragOffsetY.call(t, t.dY);\r\n\r\n // Update image position\r\n t.dragImage.style.transform = `translate(calc(-50% + ${t.dX}px), ${t.dY}px)`;\r\n }\r\n\r\n let\r\n // The mousedown position that initiated the drag\r\n startX = event.clientX,\r\n startY = event.clientY,\r\n\r\n // The current drag position\r\n thisX,\r\n thisY,\r\n\r\n // The last position recorded mid-drag\r\n // (used for calculating velocity)\r\n lastX,\r\n lastY,\r\n\r\n // The new value for t.dX and t.dY, assigned at\r\n // the end of the drag\r\n newDX = 0,\r\n newDY = 0,\r\n\r\n lastSampleTime = (new Date()).getTime(),\r\n velocityX = 0,\r\n velocityY = 0;\r\n\r\n if (startX == undefined)\r\n startX = event.touches[0].clientX;\r\n if (startY == undefined)\r\n startY = event.touches[0].clientY;\r\n\r\n thisX = startX;\r\n thisY = startY;\r\n lastX = thisX;\r\n lastY = thisY;\r\n\r\n // Add body class\r\n document.body.classList.add(\"zoomable-image-dragging\");\r\n\r\n // Setup drag event\r\n let\r\n moveCallback = (event) => {\r\n //event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Determine new offset\r\n thisX = event.clientX;\r\n if (thisX == undefined)\r\n thisX = event.touches[0].clientX;\r\n\r\n thisY = event.clientY;\r\n if (thisY == undefined)\r\n thisY = event.touches[0].clientY;\r\n\r\n newDX = thisX - startX + t.dX;\r\n newDY = thisY - startY + t.dY;\r\n\r\n if (t.flickEnabled) {\r\n // Update velocity\r\n let currentTime = (new Date()).getTime(),\r\n dT = currentTime - lastSampleTime;\r\n\r\n // Filter out any delays in sampling\r\n if (dT > settings.minSampleInterval) {\r\n velocityX = 0;\r\n velocityY = 0;\r\n //velocityX = velocityX * 0.9;\r\n //velocityY = velocityY * 0.9;\r\n } else if (dT > 0) {\r\n velocityX = (velocityX * 0.9) + (((thisX - lastX) / dT) * 0.1);\r\n velocityY = (velocityY * 0.9) + (((thisY - lastY) / dT) * 0.1);\r\n }\r\n\r\n lastSampleTime = currentTime;\r\n lastX = thisX;\r\n lastY = thisY;\r\n }\r\n\r\n // Skip this if we allow rubber banding\r\n if (t.rubberBandMode == rubberBandModes.disabled) {\r\n // Make sure the newDX value is within the desired range\r\n newDX = determineCappedDragOffsetX.call(t, newDX);\r\n\r\n // Make sure the newDY value is within the desired range\r\n newDY = determineCappedDragOffsetY.call(t, newDY);\r\n }\r\n\r\n // Update image position\r\n t.dragImage.style.transform = `translate(calc(-50% + ${newDX}px), ${newDY}px)`;\r\n };\r\n\r\n window.addEventListener(\"mousemove\", moveCallback);\r\n window.addEventListener(\"touchmove\", moveCallback);\r\n\r\n // Setup finishing event\r\n let\r\n releaseCallback = (event) => {\r\n // This causes things to break for some reason,\r\n // so let's not do it\r\n //event.preventDefault();\r\n //event.stopPropagation();\r\n\r\n t.dX = newDX;\r\n t.dY = newDY;\r\n\r\n window.removeEventListener(\"mousemove\", moveCallback);\r\n window.removeEventListener(\"touchmove\", moveCallback);\r\n\r\n window.removeEventListener(\"mouseup\", releaseCallback);\r\n window.removeEventListener(\"touchend\", releaseCallback);\r\n\r\n document.body.classList.remove(\"zoomable-image-dragging\");\r\n\r\n // Stop here if we're not configured to perform flick animations\r\n if (!t.flickEnabled)\r\n return;\r\n\r\n // Make sure the release event occured within our\r\n // minimum sample interval\r\n let currentTime = (new Date()).getTime(),\r\n dT = currentTime - lastSampleTime;\r\n\r\n if (dT > settings.minSampleInterval) {\r\n velocityX = 0;\r\n velocityY = 0;\r\n } else {\r\n // Convert from pixels/millisecond to pixels/second so that all our\r\n // ongoing calculations are in seconds\r\n velocityX *= 1000;\r\n velocityY *= 1000;\r\n }\r\n\r\n // Determine if the user released the drag with a velocity that\r\n // exceeds our minimum for triggering a flick animation\r\n let velocityMagnitude = Math.sqrt((velocityX * velocityX) + (velocityY * velocityY));\r\n if (velocityMagnitude >= settings.minVelocity) {\r\n // We're performing a flick - calculate all of the animation settings\r\n // we'll need based on what we know so far\r\n let flickSettings = calculateFlickAnimationSettings.call(\r\n t,\r\n t.dX,\r\n t.dY,\r\n velocityX,\r\n velocityY,\r\n velocityMagnitude,\r\n settings.deceleration);\r\n\r\n t.flickDistanceX = 0;\r\n t.flickDistanceY = 0;\r\n\r\n t.flickTimeline = new TimelineMax();\r\n\r\n // If we've determined that a viewport\r\n // intersection will occur, check if we're configured to rubber band\r\n if (flickSettings.rubberBandStartVelocityAndTime !== null && t.rubberBandMode != rubberBandModes.disabled) {\r\n // Continue based on the specified rubber band mode\r\n switch (t.rubberBandMode) {\r\n case rubberBandModes.independentAxes:\r\n let\r\n flickSettingsX = calculateFlickAnimationSettings.call(\r\n t,\r\n t.dX,\r\n t.dY,\r\n velocityX,\r\n 0,\r\n Math.abs(velocityX),\r\n settings.deceleration),\r\n\r\n flickSettingsY = calculateFlickAnimationSettings.call(\r\n t,\r\n t.dX,\r\n t.dY,\r\n 0,\r\n velocityY,\r\n Math.abs(velocityY),\r\n settings.deceleration),\r\n\r\n rubberBandSettingsX = calculateRubberBandAnimationSettings(flickSettingsX),\r\n rubberBandSettingsY = calculateRubberBandAnimationSettings(flickSettingsY);\r\n\r\n setupIndependentAxesRubberBandAnimation.call(t, rubberBandSettingsX, rubberBandSettingsY);\r\n break;\r\n\r\n // rubberBandModes.vector\r\n default:\r\n let rubberBandSettings = calculateRubberBandAnimationSettings(flickSettings);\r\n\r\n setupVectorRubberBandAnimation.call(t, rubberBandSettings);\r\n break;\r\n }\r\n } else {\r\n // No viewport intersection was detected or we're not configured\r\n // to rubber band - just perform the animation & cap the position at\r\n // the viewport bounds if necessary\r\n let animationState = {\r\n elapsedTime: 0\r\n };\r\n\r\n t.flickTimeline.to(\r\n animationState,\r\n flickSettings.totalTime,\r\n {\r\n ease: Power0.easeNone,\r\n elapsedTime: flickSettings.totalTime,\r\n onUpdate: function () {\r\n // Update our flick distance values\r\n let distanceAlongFlickPath = (velocityMagnitude * animationState.elapsedTime) + (0.5 * flickSettings.deceleration * animationState.elapsedTime * animationState.elapsedTime);\r\n\r\n t.flickDistanceX = flickSettings.cosAngle * distanceAlongFlickPath;\r\n if (velocityX < 0 && t.flickDistanceX > 0 || velocityX > 0 && t.flickDistanceX < 0)\r\n t.flickDistanceX = -t.flickDistanceX;\r\n\r\n t.flickDistanceY = flickSettings.sinAngle * distanceAlongFlickPath;\r\n if (velocityY < 0 && t.flickDistanceY > 0 || velocityY > 0 && t.flickDistanceY < 0)\r\n t.flickDistanceY = -t.flickDistanceY;\r\n\r\n // Cap the values if necessary\r\n if (velocityX >= 0) {\r\n if (t.flickDistanceX > flickSettings.cappedDistanceX)\r\n t.flickDistanceX = flickSettings.cappedDistanceX;\r\n } else {\r\n if (t.flickDistanceX < flickSettings.cappedDistanceX)\r\n t.flickDistanceX = flickSettings.cappedDistanceX;\r\n }\r\n\r\n if (velocityY >= 0) {\r\n if (t.flickDistanceY > flickSettings.cappedDistanceY)\r\n t.flickDistanceY = flickSettings.cappedDistanceY;\r\n } else {\r\n if (t.flickDistanceY < flickSettings.cappedDistanceY)\r\n t.flickDistanceY = flickSettings.cappedDistanceY;\r\n }\r\n\r\n // Update the transformation\r\n t.dragImage.style.transform = `translate(calc(-50% + ${t.dX + t.flickDistanceX}px), ${t.dY + t.flickDistanceY}px)`;\r\n }\r\n });\r\n }\r\n\r\n // Finish up\r\n t.flickTimeline.add(function () {\r\n t.flickTimeline = null;\r\n\r\n // Update our current drag offset\r\n t.dX += t.flickDistanceX;\r\n t.dY += t.flickDistanceY;\r\n });\r\n } else {\r\n // We're not performing a flick - if rubber banding is enabled,\r\n // check if the user released the image outside of the viewport's bounds\r\n if (t.rubberBandMode != rubberBandModes.disabled) {\r\n let cappedDistanceX = determineCappedDragOffsetX.call(t, t.dX),\r\n cappedDistanceY = determineCappedDragOffsetY.call(t, t.dY),\r\n distanceX = cappedDistanceX - t.dX,\r\n distanceY = cappedDistanceY - t.dY;\r\n\r\n if (Math.abs(distanceX) > 0.0001 || Math.abs(distanceY) > 0.0001) {\r\n // We need to shift the image back into bounds\r\n let distance = Math.sqrt((distanceX * distanceX) + (distanceY * distanceY)),\r\n duration = distance / settings.outOfBoundsResetSpeed;\r\n\r\n if (duration < settings.outOfBoundsMinResetTime)\r\n duration = settings.outOfBoundsMinResetTime;\r\n else if (duration > settings.outOfBoundsMaxResetTime)\r\n duration = settings.outOfBoundsMaxResetTime;\r\n\r\n t.flickTimeline = new TimelineMax();\r\n t.flickTimeline.to(\r\n t,\r\n duration,\r\n {\r\n ease: Power2.easeOut,\r\n dX: cappedDistanceX,\r\n dY: cappedDistanceY,\r\n onUpdate: function () {\r\n // Update the transformation\r\n t.dragImage.style.transform = `translate(calc(-50% + ${t.dX}px), ${t.dY}px)`;\r\n }\r\n });\r\n\r\n // Finish up\r\n t.flickTimeline.add(function () {\r\n t.flickTimeline = null;\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n window.addEventListener(\"mouseup\", releaseCallback);\r\n window.addEventListener(\"touchend\", releaseCallback);\r\n };\r\n\r\n t.dragImage.addEventListener(\"mousedown\", startCallback);\r\n t.dragImage.addEventListener(\"touchstart\", startCallback);\r\n };\r\n","import { WindowMetrics } from \"../utilities/window-metrics.js\";\r\nimport { ZoomableImage } from \"../utilities/zoomable-image.js\";\r\n\r\nexport class ComplementSystem {\r\n constructor(parameters) {\r\n var t = this;\r\n let root = document.documentElement;\r\n\r\n // Setup enlargable images\r\n let enlargableImages = document.querySelectorAll(\".enlargable-image\");\r\n for (let i = 0; i < enlargableImages.length; i++)\r\n new ZoomableImage(enlargableImages[i]);\r\n\r\n // let's move the red featured-slab div to tuck under\r\n // the gray callout by updating the css variables\r\n function overlapCallout() {\r\n var calloutHeight = document.querySelector('.callout').getBoundingClientRect().height,\r\n extraPadding,\r\n calloutMargin = (calloutHeight / 2);\r\n\r\n if (WindowMetrics.isMobile()) {\r\n extraPadding = 60;\r\n }\r\n else {\r\n extraPadding = 74;\r\n }\r\n \r\n root.style.setProperty('--complement-margin', '-' + calloutMargin + 'px');\r\n root.style.setProperty('--complement-padding', calloutMargin + extraPadding + 'px');\r\n\r\n }\r\n\r\n window.addEventListener('DOMContentLoaded', (event) => {\r\n overlapCallout();\r\n });\r\n\r\n window.addEventListener('resize', (event) => {\r\n overlapCallout();\r\n });\r\n\r\n }\r\n}","import { ZoomableImage } from \"../utilities/zoomable-image.js\";\r\n\r\nexport class Pathophysiology {\r\n constructor(parameters) {\r\n var t = this;\r\n\r\n // carousel functionality\r\n let slideIndex = 1,\r\n previousButton = document.getElementById(\"previous-btn\"),\r\n nextButton = document.getElementById(\"next-btn\"),\r\n slideButton1 = document.getElementById(\"slide-title-1\"),\r\n slideButton2 = document.getElementById(\"slide-title-2\"),\r\n slideButton3 = document.getElementById(\"slide-title-3\"),\r\n slideButton4 = document.getElementById(\"slide-title-4\"),\r\n slideButton5 = document.getElementById(\"slide-title-5\");\r\n\r\n //show first slide\r\n showSlide(slideIndex);\r\n\r\n function moveSlide(n) {\r\n showSlide(slideIndex += n);\r\n }\r\n\r\n function currentSlide(n) {\r\n showSlide(slideIndex = n);\r\n }\r\n\r\n function showSlide(n) {\r\n let i,\r\n carousel = document.getElementById(\"desktop-carousel\");\r\n var slides = carousel.querySelectorAll(\".carousel-slide\");\r\n var dots = carousel.querySelectorAll(\".slide-title\");\r\n if (n > slides.length) {\r\n slideIndex = 1;\r\n }\r\n if (n < 1) {\r\n slideIndex = slides.length;\r\n }\r\n for (i = 0; i < slides.length; i++) {\r\n slides[i].style.display = \"none\";\r\n }\r\n for (i = 0; i < dots.length; i++) {\r\n dots[i].className = dots[i].className.replace(\" active\", \"\");\r\n }\r\n\r\n slides[slideIndex - 1].style.display = \"block\";\r\n dots[slideIndex - 1].className += \" active\";\r\n }\r\n\r\n previousButton.addEventListener(\"click\", function () {\r\n moveSlide(-1);\r\n });\r\n\r\n nextButton.addEventListener(\"click\", function () {\r\n moveSlide(1);\r\n });\r\n\r\n slideButton1.addEventListener(\"click\", function () {\r\n currentSlide(1);\r\n });\r\n\r\n slideButton2.addEventListener(\"click\", function () {\r\n currentSlide(2);\r\n });\r\n\r\n slideButton3.addEventListener(\"click\", function () {\r\n currentSlide(3);\r\n });\r\n\r\n slideButton4.addEventListener(\"click\", function () {\r\n currentSlide(4);\r\n });\r\n\r\n slideButton5.addEventListener(\"click\", function () {\r\n currentSlide(5);\r\n });\r\n\r\n\r\n // Setup enlargable images\r\n let enlargableImages = document.querySelectorAll(\".enlargable-image\");\r\n for (let i = 0; i < enlargableImages.length; i++)\r\n new ZoomableImage(enlargableImages[i]);\r\n\r\n\r\n // body with active spots \r\n var hotspots = document.querySelectorAll('#hotspots .hotspot'),\r\n radioBttns = document.querySelectorAll('#body-content input[type=\"radio\"]');\r\n // event listener for svg spots\r\n for (var h = 0; h < hotspots.length; h++) {\r\n let hotspot = hotspots[h];\r\n hotspot.addEventListener('click', function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n var radio = this.getAttribute('data-radio');\r\n\r\n for (var s = 0; s < hotspots.length; s++) {\r\n hotspots[s].classList.remove('active');\r\n }\r\n document.getElementById(radio).checked = true;\r\n this.classList.add('active');\r\n });\r\n }\r\n // event listener for radio buttons\r\n for (var r = 0; r < radioBttns.length; r++) {\r\n let radioBttn = radioBttns[r];\r\n\r\n radioBttn.addEventListener('change', function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n var item = event.target.value;\r\n\r\n for (var s = 0; s < hotspots.length; s++) {\r\n hotspots[s].classList.remove('active');\r\n }\r\n document.querySelector('.' + item).classList.add('active');\r\n\r\n });\r\n }\r\n document.addEventListener(\"DOMContentLoaded\", function (event) {\r\n // reset body to first selection\r\n for (var s = 0; s < hotspots.length; s++) {\r\n hotspots[s].classList.remove('active');\r\n } \r\n hotspots[0].classList.add('active');\r\n document.getElementById('neurological').checked = true;\r\n });\r\n\r\n }\r\n}","import { Utilities } from \"../utilities/utilities.js\";\r\nimport { WindowMetrics } from \"../utilities/window-metrics.js\";\r\n\r\nvar\r\n wipeMode = {\r\n fixedDuration: 0,\r\n fixedSpeed: 1\r\n },\r\n\r\n settings = {\r\n animation: {\r\n wipe: {\r\n ease: Power1.easeOut,\r\n slowMoScale: 5\r\n }\r\n }\r\n };\r\n\r\nclass Tab {\r\n constructor(button, content, buttonClickCallback) {\r\n var t = this;\r\n\r\n t.button = button;\r\n\r\n t.innerContent = content;\r\n t.content = document.createElement(\"div\");\r\n t.innerContent.parentNode.insertBefore(t.content, t.innerContent);\r\n t.content.appendChild(t.innerContent);\r\n\r\n // Setup tab button\r\n t.button.addEventListener(\"click\", buttonClickCallback);\r\n \r\n // Set visibility\r\n t.content.style.display = \"none\";\r\n }\r\n\r\n onNavigateToTab(immediate) {\r\n // ...\r\n }\r\n\r\n onNavigateFromTab(immediate) {\r\n // ...\r\n }\r\n}\r\n\r\nexport class TabContainer {\r\n constructor(containerElement, wipeMode, mobileWipeSpeed, desktopWipeSpeed) {\r\n var t = this;\r\n\r\n t.wipeMode = wipeMode;\r\n t.mobileWipeSpeed = mobileWipeSpeed;\r\n t.desktopWipeSpeed = desktopWipeSpeed;\r\n t.navigationTimeline = null;\r\n t.state = {\r\n currentTabIndex: null\r\n };\r\n\r\n // Get references to DOM elements\r\n t.container = containerElement;\r\n t.tabPanelContent = Utilities.getChildElement(t.container, \"div\");\r\n t.tabButtonContainer = t.tabPanelContent.querySelector(\".tab-buttons\");\r\n t.tabContentContainer = t.tabPanelContent.querySelector(\".tab-content\");\r\n\r\n // Setup tabs\r\n t.tabs = [];\r\n var\r\n tabButtonElements = Utilities.getChildElements(t.tabButtonContainer, \"div\"),\r\n tabContentElements = Utilities.getChildElements(t.tabContentContainer, \"div\");\r\n\r\n for (let i = 0; i < tabButtonElements.length; i++) {\r\n var tab = new Tab(\r\n tabButtonElements[i],\r\n tabContentElements[i],\r\n function (event) {\r\n t.navigate(i, false, event);\r\n });\r\n\r\n t.tabs.push(tab);\r\n }\r\n\r\n // Set initial state\r\n t.navigate(0, true);\r\n\r\n t.container.style.visibility = \"visible\";\r\n }\r\n\r\n static get wipeMode() {\r\n return wipeMode;\r\n }\r\n\r\n navigate(toTabIndex, immediate, event) {\r\n var t = this;\r\n\r\n // Don't do anything if we're on the requested tab\r\n if (toTabIndex === t.state.currentTabIndex)\r\n return;\r\n\r\n // Stop any ongoing animation\r\n if (t.navigationTimeline)\r\n t.navigationTimeline.progress(1);\r\n\r\n if (immediate || t.state.currentTabIndex === null) {\r\n // Hide current tab\r\n if (t.state.currentTabIndex !== null) {\r\n var fromTab = t.tabs[t.state.currentTabIndex];\r\n\r\n fromTab.button.classList.remove(\"selected\");\r\n\r\n Utilities.resetStyles(fromTab.content);\r\n Utilities.resetStyles(fromTab.innerContent);\r\n fromTab.content.style.display = \"none\";\r\n\r\n // Send post-navigation event\r\n fromTab.onNavigateFromTab(immediate);\r\n }\r\n\r\n // Show new tab\r\n var toTab = t.tabs[toTabIndex];\r\n\r\n toTab.button.classList.add(\"selected\");\r\n Utilities.resetStyles(toTab.content);\r\n Utilities.resetStyles(toTab.innerContent);\r\n\r\n // Send pre-navigation event\r\n toTab.onNavigateToTab(immediate);\r\n } else {\r\n let\r\n fromTab = t.tabs[t.state.currentTabIndex],\r\n toTab = t.tabs[toTabIndex],\r\n wipeDuration;\r\n\r\n // Set initial state\r\n Utilities.resetStyles(fromTab.content);\r\n Utilities.resetStyles(fromTab.innerContent);\r\n Utilities.resetStyles(toTab.content);\r\n Utilities.resetStyles(toTab.innerContent);\r\n\r\n t.tabContentContainer.style.width = Utilities.numberToPx(t.tabPanelContent.clientWidth);\r\n t.tabContentContainer.style.height = Utilities.numberToPx(fromTab.content.clientHeight);\r\n\r\n fromTab.content.style.position = \"absolute\";\r\n fromTab.content.style.zIndex = \"1\";\r\n fromTab.content.style.boxShadow = \"rgba(255,255,255,0.75) 0px -50px 100px\";\r\n fromTab.content.style.borderTop = \"solid 1px #e6e6e6\";\r\n\r\n toTab.content.style.position = \"absolute\";\r\n\r\n // Update buttons\r\n fromTab.button.classList.remove(\"selected\");\r\n toTab.button.classList.add(\"selected\");\r\n\r\n // Send pre-navigation event\r\n toTab.onNavigateToTab(immediate);\r\n\r\n // Determine wipe duration based on the selected mode\r\n switch (t.wipeMode) {\r\n case wipeMode.fixedSpeed:\r\n if (WindowMetrics.isMobile())\r\n wipeDuration = toTab.content.clientHeight / t.mobileWipeSpeed;\r\n else\r\n wipeDuration = toTab.content.clientHeight / t.desktopWipeSpeed;\r\n break;\r\n\r\n default: // wipeMode.fixedDuration\r\n if (WindowMetrics.isMobile())\r\n wipeDuration = t.mobileWipeSpeed;\r\n else\r\n wipeDuration = t.desktopWipeSpeed;\r\n break;\r\n };\r\n\r\n if (event.shiftKey === true)\r\n wipeDuration *= settings.animation.wipe.slowMoScale;\r\n\r\n // Animate transition\r\n t.navigationTimeline = new TimelineMax();\r\n\r\n t.navigationTimeline.fromTo(\r\n t.tabContentContainer,\r\n wipeDuration,\r\n {\r\n height: fromTab.content.clientHeight + 2\r\n },\r\n {\r\n ease: settings.animation.wipe.ease,\r\n height: toTab.content.clientHeight + 2 // Not sure where the extra 2 pixels are coming from; probably top & bottom borders\r\n },\r\n 0);\r\n\r\n t.navigationTimeline.fromTo(\r\n fromTab.content,\r\n wipeDuration,\r\n {\r\n // This is due to the 1px top border we added above\r\n top: -1,\r\n height: fromTab.content.clientHeight\r\n },\r\n {\r\n ease: settings.animation.wipe.ease,\r\n top: toTab.content.clientHeight - 1,\r\n height: 0\r\n },\r\n 0);\r\n\r\n t.navigationTimeline.fromTo(\r\n fromTab.innerContent,\r\n wipeDuration,\r\n {\r\n top: 0\r\n },\r\n {\r\n ease: settings.animation.wipe.ease,\r\n top: -toTab.content.clientHeight\r\n },\r\n 0);\r\n\r\n t.navigationTimeline.fromTo(\r\n toTab.content,\r\n wipeDuration,\r\n {\r\n height: 0\r\n },\r\n {\r\n ease: settings.animation.wipe.ease,\r\n height: toTab.content.clientHeight\r\n },\r\n 0);\r\n\r\n var progressObject = {};\r\n t.navigationTimeline.fromTo(\r\n progressObject,\r\n wipeDuration / 3,\r\n {\r\n shadowOpacity: 0.75\r\n },\r\n {\r\n ease: Power0.easeNone,\r\n shadowOpacity: 0,\r\n onUpdate: function () {\r\n fromTab.content.style.boxShadow = `rgba(228,228,228,${progressObject.shadowOpacity}) 0px -50px 100px`;\r\n }\r\n },\r\n wipeDuration - (wipeDuration / 3));\r\n\r\n t.navigationTimeline.add(function () {\r\n t.navigationTimeline = null;\r\n\r\n Utilities.resetStyles(fromTab.content);\r\n Utilities.resetStyles(fromTab.innerContent);\r\n fromTab.content.style.display = \"none\";\r\n\r\n Utilities.resetStyles(toTab.content);\r\n Utilities.resetStyles(toTab.innerContent);\r\n\r\n Utilities.resetStyles(t.tabContentContainer);\r\n\r\n // Send post-navigation event\r\n fromTab.onNavigateFromTab(immediate);\r\n });\r\n }\r\n\r\n // Update state\r\n t.state.currentTabIndex = toTabIndex;\r\n }\r\n}\r\n","import { TabContainer } from \"../components/tab-container.js\";\r\nimport { Modal } from \"../components/modal.js\";\r\n\r\nexport class RecourcesHcp {\r\n constructor(parameters) {\r\n var t = this;\r\n\r\n // master tab container\r\n new TabContainer(\r\n document.querySelector(\".tab-container\"),\r\n TabContainer.wipeMode.fixedSpeed,\r\n 500, // mobile speed\r\n 500); // desktop speed\r\n\r\n function loadWistiaJS() {\r\n // load Wistia javascript for videos \r\n var s = document.createElement(\"script\");\r\n s.src = \"https://fast.wistia.com/embed/medias/4iw7sw1hf2.jsonp\";\r\n s.async = true;\r\n document.body.appendChild(s);\r\n\r\n var c = document.createElement(\"script\");\r\n c.src = \"https://fast.wistia.com/assets/external/E-v1.js\";\r\n c.async = true;\r\n document.body.appendChild(c);\r\n }\r\n\r\n // content in tab 1 launches a modal \r\n var videoLink = document.querySelector('#downloadables a[data-video-id]'),\r\n diffDiagnosisTemplate = `
\r\n
\r\n
\r\n
\r\n
\r\n
`;\r\n\r\n videoLink.addEventListener('click', function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n var videoId = this.getAttribute('data-video-id');\r\n\r\n Modal.show(\r\n diffDiagnosisTemplate,\r\n 'video-modal',\r\n Modal.presentationTypes.fade,\r\n Modal.presentationTypes.fade,\r\n false,\r\n {\r\n preShow: function () {\r\n //let modal = this;\r\n loadWistiaJS();\r\n },\r\n postShow: function () {\r\n let modal = this;\r\n window._wq = window._wq || [];\r\n // start playing current video\r\n _wq.push({\r\n id: videoId, onReady: function (video) {\r\n video.play();\r\n }\r\n }); \r\n }\r\n },\r\n event\r\n );\r\n });\r\n\r\n // contents in tab 2 launches a modal \r\n var caseStudies = document.querySelectorAll('#triggering-conditions a[data-video-label]'),\r\n templateB = `
\r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n

Hear how your peers recognize persistent TMA and navigate the differential diagnosis of atypical-HUS in a pregnancy/postpartum setting.

\r\n\r\n

Learn more about how atypical-HUS is diagnosed in this scenario by downloading and reviewing a case study.

\r\n\r\n

These are some triggers seen in atypical-HUS patients. Additional triggers may exist. See the Diagnosing aHUS page for a more comprehensive list.

\r\n
\r\n
\r\n DOWNLOAD PDF\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n

Hear how your peers work with a team of specialists to recognize persistent TMA and organ damage in the differential diagnosis of atypical-HUS in patients with malignant hypertension.

\r\n\r\n

Learn more about how atypical-HUS is diagnosed in this scenario by downloading and reviewing a case study.

\r\n\r\n

These are some triggers seen in atypical-HUS patients. Additional triggers may exist. See the Diagnosing aHUS page for a more comprehensive list.

\r\n
\r\n
\r\n DOWNLOAD PDF\r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n
\r\n
\r\n

Hear how your peers confirm TMA and assess renal function and other organ damage to navigate the differential diagnosis of atypical-HUS in patients with systemic lupus erythematosus.

\r\n

Learn more about how atypical-HUS is diagnosed in this scenario by downloading and reviewing a case study.

\r\n\r\n

These are some triggers seen in atypical-HUS patients. Additional triggers may exist. See the Diagnosing aHUS page for a more comprehensive list.

\r\n
\r\n
\r\n DOWNLOAD PDF\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n

Hear how your peers confirm complement-mediated TMA and navigate the differential diagnosis of atypical-HUS in a transplant setting.

\r\n\r\n

Learn more about how atypical-HUS is diagnosed in this scenario by downloading and reviewing a case study.

\r\n\r\n

These are some triggers seen in atypical-HUS patients. Additional triggers may exist. See the Diagnosing aHUS page for a more comprehensive list.

\r\n
\r\n
DOWNLOAD PDF
\r\n
\r\n
\r\n
\r\n
`;\r\n // simple tab switcher inside modal\r\n function tabSwitcher(activeId, videoId) {\r\n var videoTabLinks = document.querySelectorAll('.video-navigation ul li'),\r\n videoWrapDivs = document.querySelectorAll('.video-wrap div'),\r\n newVideoId = videoId;\r\n\r\n for (var t = 0; t < videoTabLinks.length; t++) {\r\n videoTabLinks[t].classList.remove('active');\r\n }\r\n for (var w = 0; w < videoWrapDivs.length; w++) {\r\n videoWrapDivs[w].classList.remove('active');\r\n }\r\n document.getElementById('video-link-' + activeId).classList.add('active');\r\n document.getElementById('video-' + activeId).classList.add('active');\r\n\r\n window._wq = window._wq || [];\r\n // hide all videos\r\n var wistiaVideos = document.querySelectorAll('.wistia_embed');\r\n for (var v = 0; v < wistiaVideos.length; v++) {\r\n let wistiaVideo = wistiaVideos[v];\r\n wistiaVideo.style.display = 'none';\r\n }\r\n // show current video\r\n document.querySelector('.wistia_embed.wistia_async_' + newVideoId).style.display = 'block';\r\n // pause all videos and move time to zero\r\n _wq.push({\r\n id: \"_all\", onReady: function (video) {\r\n video.pause();\r\n video.time(0);\r\n }\r\n });\r\n\r\n // start playing current video\r\n _wq.push({\r\n id: newVideoId, onReady: function (video) {\r\n video.play();\r\n }\r\n }); \r\n\r\n }\r\n\r\n for (var i = 0; i < caseStudies.length; i++) {\r\n let caseStudy = caseStudies[i];\r\n\r\n caseStudy.addEventListener('click', function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n let caseStudyTabId = this.getAttribute('data-video-label'),\r\n videoId = this.getAttribute('data-video-id');\r\n\r\n Modal.show(\r\n templateB,\r\n 'case-study-videos',\r\n Modal.presentationTypes.fade,\r\n Modal.presentationTypes.fade,\r\n false,\r\n {\r\n preShow: function () {\r\n //let modal = this;\r\n //loadBrightcoveJS();\r\n loadWistiaJS();\r\n },\r\n postShow: function () {\r\n let modal = this;\r\n\r\n tabSwitcher(caseStudyTabId, videoId);\r\n\r\n let videoTabLinks = document.querySelectorAll('.video-navigation ul li');\r\n\r\n for (var v = 0; v < videoTabLinks.length; v++) {\r\n let videoTabLink = videoTabLinks[v];\r\n\r\n videoTabLink.addEventListener('click', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n var videoTabId = this.querySelector('a').getAttribute('data-video-label');\r\n var videoId = this.querySelector('a').getAttribute('data-video-id');\r\n tabSwitcher(videoTabId, videoId);\r\n\r\n });\r\n\r\n }\r\n\r\n var triggerLinks = modal.container.querySelectorAll('p.footnote a'),\r\n loc = document.getElementById('anchor-tma-triggers');\r\n\r\n for (var i = 0; i < triggerLinks.length; i++) {\r\n let triggerLink = triggerLinks[i];\r\n\r\n triggerLink.addEventListener('click', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n modal.close(false, Modal.presentationTypes.fade);\r\n window.location = '/physician/diagnosing-ahus#triggers';\r\n });\r\n };\r\n }\r\n },\r\n event\r\n );\r\n\r\n })\r\n }\r\n\r\n }\r\n}","import { TabContainer } from \"../components/tab-container.js\";\r\nimport { WindowMetrics } from \"../utilities/window-metrics.js\";\r\n\r\nexport class StyleGuide {\r\n constructor(parameters) {\r\n var t = this;\r\n\r\n let root = document.documentElement;\r\n // master tab container\r\n new TabContainer(\r\n document.querySelector(\".tab-container\"),\r\n TabContainer.wipeMode.fixedSpeed,\r\n 500, // mobile speed\r\n 500); // \r\n\r\n // let's move the red Alexion Connect div to tuck under\r\n // the gray callout by updating the css variables\r\n function overlapCallout() {\r\n var calloutHeight = document.querySelector('.callout').getBoundingClientRect().height,\r\n extraPadding,\r\n homeMargin = (calloutHeight / 2);\r\n\r\n if (WindowMetrics.isMobile()) {\r\n extraPadding = 60;\r\n }\r\n else {\r\n extraPadding = 74;\r\n }\r\n\r\n root.style.setProperty('--home-margin', '-' + homeMargin + 'px');\r\n root.style.setProperty('--home-padding', homeMargin + extraPadding + 'px');\r\n\r\n }\r\n\r\n window.addEventListener('DOMContentLoaded', (event) => {\r\n overlapCallout();\r\n });\r\n\r\n window.addEventListener('resize', (event) => {\r\n overlapCallout();\r\n });\r\n }\r\n}","import { GridOverlay } from \"./components/grid-overlay.js\";\r\nimport { Utilities } from \"./utilities/utilities.js\";\r\nimport { Modal } from \"./components/modal.js\";\r\nimport { HomePage } from \"./pages/home.js\";\r\nimport { WindowMetrics } from \"./utilities/window-metrics.js\";\r\nimport { Header } from \"./components/header.js\";\r\nimport { AhusOverview } from \"./pages/ahus-overview.js\";\r\nimport { DiagnosingAhus } from \"./pages/diagnosing-ahus.js\";\r\nimport { ComplementSystem } from \"./pages/complement-system.js\";\r\nimport { Pathophysiology } from \"./pages/pathophysiology.js\";\r\nimport { RecourcesHcp } from \"./pages/resources-hcp.js\";\r\nimport { AlexionConnectBanner } from \"./components/alexion-connect.js\";\r\n\r\nimport { StyleGuide } from \"./pages/styleguide.js\";\r\n\r\nexport class AhusHcpSource {\r\n constructor(parameters) {\r\n var t = this;\r\n\r\n // Setup grid overlay\r\n GridOverlay.initialize();\r\n\r\n // Perform page-specific setup\r\n switch (document.body.id) {\r\n case \"home\":\r\n new HomePage(parameters);\r\n break;\r\n\r\n case \"ahus-overview\":\r\n new AhusOverview(parameters);\r\n break;\r\n\r\n case \"diagnosing-ahus\":\r\n new DiagnosingAhus(parameters);\r\n break;\r\n\r\n case \"complement-system-and-ahus\":\r\n new ComplementSystem(parameters);\r\n break;\r\n\r\n case \"pathophysiology\":\r\n new Pathophysiology(parameters);\r\n break;\r\n\r\n case \"resources-hcp\":\r\n new RecourcesHcp(parameters);\r\n break;\r\n\r\n case \"styleguide\":\r\n new StyleGuide(parameters);\r\n break;\r\n default:\r\n break;\r\n }\r\n t.header = new Header();\r\n // initialize sticky header \r\n Header.initialize(\r\n Header.stickyModes.alwaysVisible,\r\n Header.mobileMenuModes.collapsable,\r\n Header.desktopMenuModes.dropdown);\r\n\r\n // references accordion in footer\r\n var referencesContainer = document.querySelector('#references'),\r\n referencesControl = document.querySelector('#references p'),\r\n referencesContent = document.querySelector('#references ol');\r\n\r\n referencesControl.addEventListener('click', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n var timeline = new TimelineMax();\r\n\r\n if (referencesContainer.classList.contains('open')) {\r\n // Closing\r\n references.classList.remove('open');\r\n\r\n timeline.add(\"start\");\r\n\r\n timeline.fromTo(\r\n referencesContainer,\r\n 1.0,\r\n {\r\n height: referencesControl.clientHeight + referencesContent.clientHeight\r\n },\r\n {\r\n ease: Power2.easeOut,\r\n height: referencesControl.clientHeight\r\n },\r\n 0);\r\n\r\n timeline.fromTo(\r\n referencesContent,\r\n 0.5,\r\n {\r\n opacity: 1\r\n },\r\n {\r\n ease: Power2.easeOut,\r\n opacity: 0\r\n },\r\n 0);\r\n\r\n timeline.add(function () {\r\n // Remove the hard-coded height once the animation is finished\r\n Utilities.resetStyles(referencesContainer);\r\n\r\n // And re-hide the content\r\n Utilities.resetStyles(referencesContent);\r\n });\r\n\r\n timeline.add(\"end\");\r\n\r\n // Scroll upward if the collapsed references makes the window shorter\r\n let maxScrollPosition = document.body.clientHeight - referencesContent.clientHeight - window.innerHeight;\r\n if (window.pageYOffset > maxScrollPosition)\r\n Utilities.scrollWindowToPosition(maxScrollPosition);\r\n } else {\r\n // Opening\r\n referencesContainer.classList.add(\"open\");\r\n referencesContent.style.display = 'block';\r\n\r\n timeline.add(\"start\");\r\n\r\n timeline.fromTo(\r\n referencesContainer,\r\n 1.0,\r\n {\r\n height: referencesControl.clientHeight\r\n },\r\n {\r\n ease: Power2.easeOut,\r\n height: referencesControl.clientHeight + referencesContent.clientHeight\r\n },\r\n 0);\r\n\r\n timeline.fromTo(\r\n referencesContent,\r\n 0.5,\r\n {\r\n opacity: 0\r\n },\r\n {\r\n ease: Power2.easeOut,\r\n opacity: 1\r\n },\r\n 0);\r\n\r\n timeline.add(function () {\r\n // Remove the hard-coded height once the animation is finished;\r\n // the
    will determine the height at this point\r\n Utilities.resetStyles(referencesContainer);\r\n });\r\n\r\n timeline.add(\"end\");\r\n\r\n // Scroll to the references\r\n let scrollPosition = calculateTargetScrollPosition(referencesContainer);\r\n Utilities.scrollWindowToPosition(scrollPosition);\r\n }\r\n });\r\n\r\n window.addEventListener('resize', function () {\r\n // Close the mobile menu if it's open\r\n if (WindowMetrics.isMobile()) {\r\n if (t.header.isOpen)\r\n t.header.close();\r\n }\r\n });\r\n\r\n var calculateTargetScrollPosition = function (targetElement) {\r\n let targetScrollPosition = targetElement.getBoundingClientRect().top;\r\n\r\n // Incorporate current scroll offset\r\n targetScrollPosition += window.pageYOffset;\r\n\r\n // Check if we're in mobile\r\n //if (WindowMetrics.isMobile()) {\r\n // targetScrollPosition -= document.querySelector('header').clientHeight;\r\n //} else {\r\n targetScrollPosition -= document.querySelector('header').clientHeight;\r\n //}\r\n\r\n return targetScrollPosition;\r\n };\r\n // jumplinks \r\n var jumplinks = document.querySelectorAll('#jumplinks li a'),\r\n hdr = document.querySelector('header');\r\n\r\n for (var j = 0; j < jumplinks.length; j++) {\r\n let jumplink = jumplinks[j];\r\n\r\n jumplink.addEventListener('click', function (event) {\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n var id = this.getAttribute('href'),\r\n loc = id.replace(/#/, ''),\r\n targetElement = document.getElementById(loc);\r\n\r\n let targetScrollPosition = calculateTargetScrollPosition(targetElement);\r\n Utilities.scrollWindowToPosition(targetScrollPosition);\r\n\r\n // Close the mobile menu if it's open\r\n if (WindowMetrics.isMobile()) {\r\n if (t.header.isOpen)\r\n t.header.close();\r\n }\r\n\r\n });\r\n\r\n }\r\n // end of page callouts linkage \r\n var eopCallouts = document.querySelectorAll('#eop-callouts > div > .flex-row > div');\r\n if (typeof (eopCallouts) != 'undefined' && eopCallouts != null) {\r\n for (var c = 0; c < eopCallouts.length; c++) {\r\n let callout = eopCallouts[c];\r\n callout.addEventListener('click', function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n var ctaEl = this.querySelector('a'),\r\n myHref = ctaEl.getAttribute('href');\r\n\r\n if (ctaEl.hasAttribute('target')) {\r\n window.open(myHref);\r\n }\r\n else {\r\n document.location.href = myHref;\r\n };\r\n //console.table([[\"event\", \"gtm.click\"], [\"gtm.elementUrl\", myHref], [\"Class\", this.parentNode.parentNode.parentNode.getAttribute('id') ] ]);\r\n\r\n // IF WE ADD GTM, USE THIS TO SEND DATA TO \r\n // GTM ON CLICKS THAT AREN'T ACTUAL TAGS\r\n //dataLayer.push({\r\n // 'event': 'gtm.click',\r\n // 'gtm.elementClasses': this.parentNode.parentNode.parentNode.getAttribute('id'),\r\n // 'gtm.elementUrl': myHref\r\n //})\r\n\r\n });\r\n }\r\n }\r\n\r\n // leaving site modal\r\n var\r\n modalTemplate = `\r\n
    \r\n
    \r\n

    You are now leaving the aHUSSource.com website.

    \r\n

    Alexion is not responsible for content included on third-party websites. Do you want to proceed?

    \r\n \r\n \r\n \r\n
    \r\n
    `;\r\n\r\n let externalLinks = document.querySelectorAll('a[target=\"_blank\"]:not(.internal-link)');\r\n for (let i = 0; i < externalLinks.length; i++) {\r\n let externalLink = externalLinks[i],\r\n link = externalLink.getAttribute('href');\r\n //if (link == null)\r\n // continue;\r\n\r\n externalLink.addEventListener('click', function (event) {\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (this.getAttribute(\"target\") == \"_blank\") {\r\n Modal.show(\r\n modalTemplate,\r\n 'leaving-site',\r\n Modal.presentationTypes.fade,\r\n Modal.presentationTypes.fade,\r\n false,\r\n {\r\n preShow: function () {\r\n let modal = this;\r\n modal.container.querySelector('.ok-button').addEventListener('click', function () {\r\n // Close the modal with a confirmation animation\r\n window.open(link);\r\n modal.close(false, Modal.presentationTypes.fade);\r\n });\r\n\r\n modal.container.querySelector('.cancel-button').addEventListener('click', function () {\r\n // Close the modal with a dismissal animation\r\n modal.close(false, Modal.presentationTypes.fade);\r\n });\r\n\r\n // add back close event listener on backdrop\r\n modal.backdrop.addEventListener('click', function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n modal.close(false, Modal.presentationTypes.fade);\r\n });\r\n }\r\n },\r\n event);\r\n }\r\n else {\r\n window.location.href = link;\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n // Setup Alexion Connect banner\r\n //new AlexionConnectBanner();\r\n\r\n // Welcome interstitial \r\n var\r\n welcomeTemplate = `\r\n
    \r\n
    \r\n

    The information contained on this site is intended for healthcare professionals in the United States only.
    \r\n It is not intended for the general public.

    \r\n \r\n \r\n \r\n
    \r\n
    `,\r\n welcomeKey = 'entering-site';\r\n\r\n document.addEventListener(\"DOMContentLoaded\", function (e) {\r\n // check if visitor has confirmed HCP cookie\r\n if (localStorage.getItem(welcomeKey) !== 'hcp') {\r\n Modal.show(\r\n welcomeTemplate,\r\n welcomeKey,\r\n Modal.presentationTypes.fade,\r\n Modal.presentationTypes.fade,\r\n false,\r\n {\r\n preShow: function () {\r\n let modal = this;\r\n modal.container.querySelector('.ok-button').addEventListener('click', function () {\r\n // Close the modal with a confirmation animation\r\n modal.close(false, Modal.presentationTypes.fade);\r\n // set HCP cookie so they don't see modal again\r\n localStorage.setItem(welcomeKey, 'hcp');\r\n });\r\n\r\n modal.container.querySelector('.cancel-button').addEventListener('click', function () {\r\n // go to patient site\r\n window.location.assign('http://ahussource.com/');\r\n });\r\n }\r\n },\r\n event);\r\n }\r\n \r\n\r\n });\r\n\r\n }\r\n}\r\n\r\nwindow.AhusHcpSource = AhusHcpSource;\r\nexport default AhusHcpSource;"],"sourceRoot":""}