From bae08a537620ce1837cbdfd661de55700a146257 Mon Sep 17 00:00:00 2001 From: Fernando Santos Date: Wed, 13 May 2026 02:45:59 -0400 Subject: [PATCH 1/5] iFrame Queue Fix for GDCP --- dist/engrid.css | 6 +- dist/engrid.js | 52251 +++++++++++++++++++++-------- dist/engrid.min.css | 6 +- dist/engrid.min.js | 73 +- package-lock.json | 6 +- src/index.ts | 19 +- src/scripts/bequest-lightbox.ts | 116 +- src/scripts/gdcp/gdcp-manager.ts | 240 +- src/scripts/tracking.js | 20 +- 9 files changed, 37813 insertions(+), 14924 deletions(-) diff --git a/dist/engrid.css b/dist/engrid.css index e809c312..2f727086 100644 --- a/dist/engrid.css +++ b/dist/engrid.css @@ -19,10 +19,10 @@ * * ENGRID PAGE TEMPLATE ASSETS * - * Date: Tuesday, May 12, 2026 @ 12:04:29 ET - * By: michael + * Date: Wednesday, May 13, 2026 @ 02:45:23 ET + * By: fernando * ENGrid styles: v0.25.0 - * ENGrid scripts: v0.25.1 + * ENGrid scripts: v0.25.2 * * Created by 4Site Studios * Come work with us or join our team, we would love to hear from you diff --git a/dist/engrid.js b/dist/engrid.js index 073f779e..7632bdfb 100644 --- a/dist/engrid.js +++ b/dist/engrid.js @@ -17,10 +17,10 @@ * * ENGRID PAGE TEMPLATE ASSETS * - * Date: Tuesday, May 12, 2026 @ 12:04:29 ET - * By: michael + * Date: Wednesday, May 13, 2026 @ 02:45:23 ET + * By: fernando * ENGrid styles: v0.25.0 - * ENGrid scripts: v0.25.1 + * ENGrid scripts: v0.25.2 * * Created by 4Site Studios * Come work with us or join our team, we would love to hear from you @@ -10957,4392 +10957,12742 @@ tippy.setDefaultProps({ /***/ }), -/***/ 1234: -/***/ (() => { +/***/ 716: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -/* (ignored) */ +"use strict"; -/***/ }) +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + Ay: () => (/* binding */ tippy_esm) +}); -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ id: moduleId, -/******/ loaded: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/amd define */ -/******/ (() => { -/******/ __webpack_require__.amdD = function () { -/******/ throw new Error('define cannot be used indirect'); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/amd options */ -/******/ (() => { -/******/ __webpack_require__.amdO = {}; -/******/ })(); -/******/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/node module decorator */ -/******/ (() => { -/******/ __webpack_require__.nmd = (module) => { -/******/ module.paths = []; -/******/ if (!module.children) module.children = []; -/******/ return module; -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be in strict mode. -(() => { -"use strict"; +// UNUSED EXPORTS: animateFill, createSingleton, delegate, followCursor, hideAll, inlinePositioning, roundArrow, sticky -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/deprecated.js -// A way to gracefully handle deprecation. -// Find and replace HTML Elements, Classes, and more after the DOM is loaded but before any other Javascript fires. +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getWindow.js +function getWindow(node) { + if (node == null) { + return window; + } -class Deprecated { - constructor() { - let deprecated; - let replacement; - // Checks for body-side class - deprecated = document.querySelector(".body-side"); - if (deprecated) { - this.warning(deprecated); - } - // Checks for backgroundImage class - deprecated = document.querySelector(".backgroundImage"); - if (deprecated) { - replacement = "background-image"; - this.replace(deprecated, replacement); - } - // Checks for backgroundImageOverlay class - deprecated = document.querySelector(".backgroundImageOverlay"); - if (deprecated) { - replacement = "background-image-overlay"; - this.replace(deprecated, replacement); - } - } - warning(deprecated) { - if (ENGrid.debug) - console.log("Deprecated: '" + deprecated + "' was detected and nothing was done."); - } - replace(deprecated, replacement) { - if (ENGrid.debug) - console.log("Deprecated: '" + - deprecated + - "' was detected and replaced with '" + - replacement + - "'."); - deprecated.classList.add(replacement); - deprecated.classList.remove(deprecated); - } -} + if (node.toString() !== '[object Window]') { + var ownerDocument = node.ownerDocument; + return ownerDocument ? ownerDocument.defaultView || window : window; + } -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/interfaces/options.js -const OptionsDefaults = { - backgroundImage: "", - MediaAttribution: true, - applePay: false, - CapitalizeFields: false, - ClickToExpand: true, - CurrencySymbol: "$", - CurrencyCode: "USD", - AddCurrencySymbol: true, - ThousandsSeparator: "", - DecimalSeparator: ".", - DecimalPlaces: 2, - MinAmount: 1, - MaxAmount: 100000, - MinAmountMessage: "Amount must be at least $1", - MaxAmountMessage: "Amount must be less than $100,000", - UseAmountValidatorFromEN: false, - SkipToMainContentLink: true, - SrcDefer: true, - SuppressPurchaseEcard: false, - NeverBounceAPI: null, - NeverBounceDateField: null, - NeverBounceStatusField: null, - NeverBounceDateFormat: "MM/DD/YYYY", - NeverBounceTimeout: 10000, - FreshAddress: false, - ProgressBar: false, - AutoYear: false, - TranslateFields: true, - Debug: false, - RememberMe: false, - TidyContact: false, - RegionLongFormat: "", - CountryDisable: [], - Placeholders: false, - ENValidators: false, - MobileCTA: false, - CustomCurrency: false, - CustomPremium: false, - VGS: false, - PostalCodeValidator: false, - CountryRedirect: false, - WelcomeBack: false, - OptInLadder: false, - StickyNSG: false, - StickyPrepopulation: false, - PreferredPaymentMethod: false, - PageLayouts: [ - "leftleft1col", - "centerleft1col", - "centercenter1col", - "centercenter2col", - "centerright1col", - "rightright1col", - "none", - ], -}; + return node; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/instanceOf.js -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/interfaces/upsell-options.js -const UpsellOptionsDefaults = { - image: "https://picsum.photos/480/650", - imagePosition: "left", - title: "Will you change your gift to just {new-amount} a month to boost your impact?", - paragraph: "Make a monthly pledge today to support us with consistent, reliable resources during emergency moments.", - yesLabel: "Yes! Process My
{new-amount} monthly gift", - noLabel: "No, thanks. Continue with my
{old-amount} one-time gift", - otherAmount: true, - otherLabel: "Or enter a different monthly amount:", - upsellOriginalGiftAmountFieldName: "", - amountRange: [ - { max: 10, suggestion: 5 }, - { max: 15, suggestion: 7 }, - { max: 20, suggestion: 8 }, - { max: 25, suggestion: 9 }, - { max: 30, suggestion: 10 }, - { max: 35, suggestion: 11 }, - { max: 40, suggestion: 12 }, - { max: 50, suggestion: 14 }, - { max: 100, suggestion: 15 }, - { max: 200, suggestion: 19 }, - { max: 300, suggestion: 29 }, - { max: 500, suggestion: "Math.ceil((amount / 12)/5)*5" }, - ], - minAmount: 0, - canClose: true, - submitOnClose: false, - oneTime: true, - annual: false, - disablePaymentMethods: [], - skipUpsell: false, - conversionField: "", - upsellCheckbox: false, -}; -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/interfaces/translate-options.js -const ptbrTranslation = [ - { field: "supporter.firstName", translation: "Nome" }, - { field: "supporter.lastName", translation: "Sobrenome" }, - { field: "supporter.phoneNumber", translation: "Celular" }, - { field: "supporter.address1", translation: "Endereço" }, - { field: "supporter.address2", translation: "Complemento" }, - { field: "supporter.postcode", translation: "CEP" }, - { field: "supporter.city", translation: "Cidade" }, - { field: "supporter.region", translation: "Estado" }, - { field: "supporter.country", translation: "País" }, -]; -const deTranslation = [ - { field: "supporter.address1", translation: "Straße, Hausnummer" }, - { field: "supporter.postcode", translation: "Postleitzahl" }, - { field: "supporter.city", translation: "Ort" }, - { field: "supporter.region", translation: "Bundesland" }, - { field: "supporter.country", translation: "Land" }, -]; -const frTranslation = [ - { field: "supporter.address1", translation: "Adresse" }, - { field: "supporter.postcode", translation: "Code Postal" }, - { field: "supporter.city", translation: "Ville" }, - { field: "supporter.region", translation: "Région" }, - { field: "supporter.country", translation: "Country" }, -]; -const nlTranslation = [ - { field: "supporter.address1", translation: "Adres" }, - { field: "supporter.postcode", translation: "Postcode" }, - { field: "supporter.city", translation: "Woonplaats" }, - { field: "supporter.region", translation: "Provincie" }, - { field: "supporter.country", translation: "Country" }, -]; -const TranslateOptionsDefaults = { - BR: ptbrTranslation, - BRA: ptbrTranslation, - DE: deTranslation, - DEU: deTranslation, - FR: frTranslation, - FRA: frTranslation, - NL: nlTranslation, - NLD: nlTranslation, -}; +function isElement(node) { + var OwnElement = getWindow(node).Element; + return node instanceof OwnElement || node instanceof Element; +} -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/interfaces/exit-intent-options.js -const ExitIntentOptionsDefaults = { - enabled: false, - title: "We are sad that you are leaving", - text: "Would you mind telling us why you are leaving this page?", - buttonText: "Send us your comments", - buttonLink: "https://www.4sitestudios.com/", - cookieName: "engrid-exit-intent-lightbox", - cookieDuration: 30, - triggers: { - visibilityState: true, - mousePosition: true, - }, -}; +function isHTMLElement(node) { + var OwnElement = getWindow(node).HTMLElement; + return node instanceof OwnElement || node instanceof HTMLElement; +} -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/interfaces/frequency-upsell-options.js -const FrequencyUpsellOptionsDefaults = { - title: "Before we process your donation...", - paragraph: "Would you like to make it an annual gift?", - yesButton: "YES! Process my gift as an annual gift of ${upsell_amount}", - noButton: "NO! Process my gift as a one-time gift of ${current_amount}", - upsellFrequency: "annual", - upsellFromFrequency: ["onetime"], - customClass: "", - upsellAmount: (currentAmount) => currentAmount, - onOpen: () => { }, - onAccept: () => { }, - onDecline: () => { }, -}; +function isShadowRoot(node) { + // IE 11 has no ShadowRoot + if (typeof ShadowRoot === 'undefined') { + return false; + } -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/loader.js -// Ref: https://app.getguru.com/card/iMgx968T/ENgrid-Loader + var OwnElement = getWindow(node).ShadowRoot; + return node instanceof OwnElement || node instanceof ShadowRoot; +} -class Loader { - constructor() { - this.logger = new logger_EngridLogger("Loader", "gold", "black", "🔁"); - this.cssElement = document.querySelector('link[href*="engrid."][rel="stylesheet"]'); - this.jsElement = document.querySelector('script[src*="engrid."]'); - } - // Returns true if ENgrid should reload (that means the current ENgrid is not the right one) - // Returns false if ENgrid should not reload (that means the current ENgrid is the right one) - reload() { - var _a, _b, _c; - const assets = this.getOption("assets"); - const isLoaded = engrid_ENGrid.getBodyData("loaded"); - let shouldSkipCss = this.getOption("engridcss") === "false"; - let shouldSkipJs = this.getOption("engridjs") === "false"; - if (isLoaded || !assets) { - if (shouldSkipCss && this.cssElement) { - this.logger.log("engridcss=false | Removing original stylesheet:", this.cssElement); - this.cssElement.remove(); - } - if (shouldSkipJs && this.jsElement) { - this.logger.log("engridjs=false | Removing original script:", this.jsElement); - this.jsElement.remove(); - } - if (shouldSkipCss) { - this.logger.log("engridcss=false | adding top banner CSS"); - this.addENgridCSSUnloadedCSS(); - } - if (shouldSkipJs) { - this.logger.log("engridjs=false | Skipping JS load."); - this.logger.success("LOADED"); - return true; - } - this.logger.success("LOADED"); - return false; - } - // Load the right ENgrid - this.logger.log("RELOADING"); - engrid_ENGrid.setBodyData("loaded", "true"); // Set the loaded flag, so the next time we don't reload - // Fetch the desired repo, assets location, and override JS/CSS - const theme = engrid_ENGrid.getBodyData("theme"); - const engrid_repo = (_a = this.getOption("repo-name")) !== null && _a !== void 0 ? _a : `engrid-${theme}`; - let engrid_js_url = ""; - let engrid_css_url = ""; - switch (assets) { - case "local": - this.logger.log("LOADING LOCAL"); - engrid_ENGrid.setBodyData("assets", "local"); - engrid_js_url = `https://${engrid_repo}.test/dist/engrid.js`; - engrid_css_url = `https://${engrid_repo}.test/dist/engrid.css`; - break; - case "flush": - this.logger.log("FLUSHING CACHE"); - const timestamp = Date.now(); - const jsCurrentURL = new URL(((_b = this.jsElement) === null || _b === void 0 ? void 0 : _b.getAttribute("src")) || ""); - jsCurrentURL.searchParams.set("v", timestamp.toString()); - engrid_js_url = jsCurrentURL.toString(); - const cssCurrentURL = new URL(((_c = this.cssElement) === null || _c === void 0 ? void 0 : _c.getAttribute("href")) || ""); - cssCurrentURL.searchParams.set("v", timestamp.toString()); - engrid_css_url = cssCurrentURL.toString(); - break; - default: - this.logger.log("LOADING EXTERNAL"); - engrid_js_url = `https://s3.amazonaws.com/engrid-dev.4sitestudios.com/${engrid_repo}/${assets}/engrid.js`; - engrid_css_url = `https://s3.amazonaws.com/engrid-dev.4sitestudios.com/${engrid_repo}/${assets}/engrid.css`; - } - if (shouldSkipCss && this.cssElement) { - this.logger.log("engridcss=false | Removing original stylesheet:", this.cssElement); - this.cssElement.remove(); - } - if (shouldSkipCss && engrid_css_url && engrid_css_url !== "") { - this.logger.log("engridcss=false | Skipping injection of stylesheet:", engrid_css_url); - } - if (shouldSkipCss) { - this.logger.log("engridcss=false | adding top banner CSS"); - this.addENgridCSSUnloadedCSS(); - } - else { - this.setCssFile(engrid_css_url); - } - if (shouldSkipJs && this.jsElement) { - this.logger.log("engridjs=false | Removing original script:", this.jsElement); - this.jsElement.remove(); - } - if (shouldSkipJs && engrid_js_url && engrid_js_url !== "") { - this.logger.log("engridjs=false | Skipping injection of script:", engrid_js_url); - } - if (!shouldSkipJs) { - this.setJsFile(engrid_js_url); - } - // If custom assets aren't defined, we don't need to reload. - if (!assets) { - return false; - } - return true; - } - getOption(key) { - const urlParam = engrid_ENGrid.getUrlParameter(key); - if (urlParam && ["assets", "engridcss", "engridjs"].includes(key)) { - return urlParam; - } - else if (window.EngridLoader && window.EngridLoader.hasOwnProperty(key)) { - return window.EngridLoader[key]; - } - else if (this.jsElement && this.jsElement.hasAttribute("data-" + key)) { - return this.jsElement.getAttribute("data-" + key); - } - return null; - } - setCssFile(url) { - if (url === "") { - return; - } - if (this.cssElement) { - this.logger.log("Replacing stylesheet:", url); - this.cssElement.setAttribute("href", url); - } - else { - this.logger.log("Injecting stylesheet:", url); - const link = document.createElement("link"); - link.setAttribute("rel", "stylesheet"); - link.setAttribute("type", "text/css"); - link.setAttribute("media", "all"); - link.setAttribute("href", url); - document.head.appendChild(link); - } - } - setJsFile(url) { - if (url === "") { - return; - } - this.logger.log("Injecting script:", url); - const script = document.createElement("script"); - script.setAttribute("src", url); - document.head.appendChild(script); - } - addENgridCSSUnloadedCSS() { - document.body.insertAdjacentHTML("beforeend", ``); - } +function isLayoutViewport() { + return !/^((?!chrome|android).)*safari/i.test(getUAString()); } +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js -// EXTERNAL MODULE: ./node_modules/@4site/engrid-scripts/node_modules/strongly-typed-events/dist/index.js -var dist = __webpack_require__(3199); -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/events/en-form.js -class en_form_EnForm { - constructor() { - this.logger = new logger_EngridLogger("EnForm"); - this._onIntentSubmit = new dist/* SignalDispatcher */.UD(); - this._onSubmit = new dist/* SignalDispatcher */.UD(); - this._onValidate = new dist/* SignalDispatcher */.UD(); - this._onError = new dist/* SignalDispatcher */.UD(); - this.submit = true; - this.submitPromise = false; - this.validate = true; - this.validatePromise = false; - } - static getInstance() { - if (!en_form_EnForm.instance) { - en_form_EnForm.instance = new en_form_EnForm(); - } - return en_form_EnForm.instance; - } - dispatchIntentSubmit() { - this._onIntentSubmit.dispatch(); - this.logger.log("dispatchIntentSubmit"); - } - dispatchSubmit() { - this._onSubmit.dispatch(); - this.logger.log("dispatchSubmit"); - } - dispatchValidate() { - this._onValidate.dispatch(); - this.logger.log("dispatchValidate"); - } - dispatchError() { - this._onError.dispatch(); - this.logger.log("dispatchError"); - } - submitForm() { - const enForm = document.querySelector("form .en__submit button"); - if (enForm) { - // Add submitting class to modal - const enModal = document.getElementById("enModal"); - if (enModal) - enModal.classList.add("is-submitting"); - enForm.click(); - this.logger.log("submitForm"); - } - } - /** - * onIntentSubmit is dispatched when a submit button is clicked, - * or a digital wallet submission is initiated, - * but before server-side validation or the actual submit event. - * This allows you to run code at the moment the user intends to submit, - * such as triggering data formatting, analytics events, or other pre-submit actions. - * Actions that rely on fully processed form data or validation results should use the onSubmit event instead. - * Note: onSubmit will also dispatch onIntentSubmit, so do not repeat actions in both events. - */ - get onIntentSubmit() { - return this._onIntentSubmit.asEvent(); + +function getBoundingClientRect(element, includeScale, isFixedStrategy) { + if (includeScale === void 0) { + includeScale = false; + } + + if (isFixedStrategy === void 0) { + isFixedStrategy = false; + } + + var clientRect = element.getBoundingClientRect(); + var scaleX = 1; + var scaleY = 1; + + if (includeScale && isHTMLElement(element)) { + scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1; + scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1; + } + + var _ref = isElement(element) ? getWindow(element) : window, + visualViewport = _ref.visualViewport; + + var addVisualOffsets = !isLayoutViewport() && isFixedStrategy; + var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX; + var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY; + var width = clientRect.width / scaleX; + var height = clientRect.height / scaleY; + return { + width: width, + height: height, + top: y, + right: x + width, + bottom: y + height, + left: x, + x: x, + y: y + }; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js + +function getWindowScroll(node) { + var win = getWindow(node); + var scrollLeft = win.pageXOffset; + var scrollTop = win.pageYOffset; + return { + scrollLeft: scrollLeft, + scrollTop: scrollTop + }; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js +function getHTMLElementScroll(element) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js + + + + +function getNodeScroll(node) { + if (node === getWindow(node) || !isHTMLElement(node)) { + return getWindowScroll(node); + } else { + return getHTMLElementScroll(node); + } +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getNodeName.js +function getNodeName(element) { + return element ? (element.nodeName || '').toLowerCase() : null; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js + +function getDocumentElement(element) { + // $FlowFixMe[incompatible-return]: assume body is always available + return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing] + element.document) || window.document).documentElement; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js + + + +function getWindowScrollBarX(element) { + // If has a CSS width greater than the viewport, then this will be + // incorrect for RTL. + // Popper 1 is broken in this case and never had a bug report so let's assume + // it's not an issue. I don't think anyone ever specifies width on + // anyway. + // Browsers where the left scrollbar doesn't cause an issue report `0` for + // this (e.g. Edge 2019, IE11, Safari) + return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js + +function getComputedStyle(element) { + return getWindow(element).getComputedStyle(element); +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js + +function isScrollParent(element) { + // Firefox wants us to check `-x` and `-y` variations as well + var _getComputedStyle = getComputedStyle(element), + overflow = _getComputedStyle.overflow, + overflowX = _getComputedStyle.overflowX, + overflowY = _getComputedStyle.overflowY; + + return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js + + + + + + + + + +function isElementScaled(element) { + var rect = element.getBoundingClientRect(); + var scaleX = round(rect.width) / element.offsetWidth || 1; + var scaleY = round(rect.height) / element.offsetHeight || 1; + return scaleX !== 1 || scaleY !== 1; +} // Returns the composite rect of an element relative to its offsetParent. +// Composite means it takes into account transforms as well as layout. + + +function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { + if (isFixed === void 0) { + isFixed = false; + } + + var isOffsetParentAnElement = isHTMLElement(offsetParent); + var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); + var documentElement = getDocumentElement(offsetParent); + var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed); + var scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + var offsets = { + x: 0, + y: 0 + }; + + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078 + isScrollParent(documentElement)) { + scroll = getNodeScroll(offsetParent); } - /** - * onSubmit is dispatched when the form is submitted, after validation has passed. - * This is the main event to listen to for form submissions, as it indicates that the user has successfully submitted the form and all validation checks have been passed. - * This event uses window.enOnSubmit, which is called by Engaging Networks' JavaScript when the form is submitted. - * At the time of writing, enOnSubmit does not trigger when a user submits via a digital wallet, use onIntentSubmit to listen for those submission attempts. - * Note: onSubmit will also dispatch onIntentSubmit, so do not repeat actions in both events. - */ - get onSubmit() { - return this._onSubmit.asEvent(); + + if (isHTMLElement(offsetParent)) { + offsets = getBoundingClientRect(offsetParent, true); + offsets.x += offsetParent.clientLeft; + offsets.y += offsetParent.clientTop; + } else if (documentElement) { + offsets.x = getWindowScrollBarX(documentElement); } - /** - * onValidate is dispatched using window.enOnValidate, which is called by Engaging Networks' JavaScript - * when the form is being validated, before submission. This only occurs after ENgrid's client-side validation has passed, but before server-side validation. - */ - get onValidate() { - return this._onValidate.asEvent(); + } + + return { + x: rect.left + scroll.scrollLeft - offsets.x, + y: rect.top + scroll.scrollTop - offsets.y, + width: rect.width, + height: rect.height + }; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js + // Returns the layout rect of an element relative to its offsetParent. Layout +// means it doesn't take into account transforms. + +function getLayoutRect(element) { + var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed. + // Fixes https://github.com/popperjs/popper-core/issues/1223 + + var width = element.offsetWidth; + var height = element.offsetHeight; + + if (Math.abs(clientRect.width - width) <= 1) { + width = clientRect.width; + } + + if (Math.abs(clientRect.height - height) <= 1) { + height = clientRect.height; + } + + return { + x: element.offsetLeft, + y: element.offsetTop, + width: width, + height: height + }; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getParentNode.js + + + +function getParentNode(element) { + if (getNodeName(element) === 'html') { + return element; + } + + return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle + // $FlowFixMe[incompatible-return] + // $FlowFixMe[prop-missing] + element.assignedSlot || // step into the shadow DOM of the parent of a slotted node + element.parentNode || ( // DOM Element detected + isShadowRoot(element) ? element.host : null) || // ShadowRoot detected + // $FlowFixMe[incompatible-call]: HTMLElement is a Node + getDocumentElement(element) // fallback + + ); +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js + + + + +function getScrollParent(node) { + if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) { + // $FlowFixMe[incompatible-return]: assume body is always available + return node.ownerDocument.body; + } + + if (isHTMLElement(node) && isScrollParent(node)) { + return node; + } + + return getScrollParent(getParentNode(node)); +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js + + + + +/* +given a DOM element, return the list of all scroll parents, up the list of ancesors +until we get to the top window object. This list is what we attach scroll listeners +to, because if any of these parent elements scroll, we'll need to re-calculate the +reference element's position. +*/ + +function listScrollParents(element, list) { + var _element$ownerDocumen; + + if (list === void 0) { + list = []; + } + + var scrollParent = getScrollParent(element); + var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); + var win = getWindow(scrollParent); + var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; + var updatedList = list.concat(target); + return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here + updatedList.concat(listScrollParents(getParentNode(target))); +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/isTableElement.js + +function isTableElement(element) { + return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js + + + + + + + + +function getTrueOffsetParent(element) { + if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 + getComputedStyle(element).position === 'fixed') { + return null; + } + + return element.offsetParent; +} // `.offsetParent` reports `null` for fixed elements, while absolute elements +// return the containing block + + +function getContainingBlock(element) { + var isFirefox = /firefox/i.test(getUAString()); + var isIE = /Trident/i.test(getUAString()); + + if (isIE && isHTMLElement(element)) { + // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport + var elementCss = getComputedStyle(element); + + if (elementCss.position === 'fixed') { + return null; } - /** - * onError is dispatched using window.enOnError, which is called by Engaging Networks' JavaScript when a server-side validation error occurs on form submission. - * This allows you to listen for validation errors and respond accordingly, such as displaying custom error messages or triggering analytics events. - */ - get onError() { - return this._onError.asEvent(); + } + + var currentNode = getParentNode(element); + + if (isShadowRoot(currentNode)) { + currentNode = currentNode.host; + } + + while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) { + var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that + // create a containing block. + // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block + + if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') { + return currentNode; + } else { + currentNode = currentNode.parentNode; } + } + + return null; +} // Gets the closest ancestor positioned element. Handles some edge cases, +// such as table ancestors and cross browser bugs. + + +function getOffsetParent(element) { + var window = getWindow(element); + var offsetParent = getTrueOffsetParent(element); + + while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') { + offsetParent = getTrueOffsetParent(offsetParent); + } + + if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) { + return window; + } + + return offsetParent || getContainingBlock(element) || window; } +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/enums.js +var enums_top = 'top'; +var bottom = 'bottom'; +var right = 'right'; +var left = 'left'; +var auto = 'auto'; +var basePlacements = [enums_top, bottom, right, left]; +var start = 'start'; +var end = 'end'; +var clippingParents = 'clippingParents'; +var viewport = 'viewport'; +var popper = 'popper'; +var reference = 'reference'; +var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) { + return acc.concat([placement + "-" + start, placement + "-" + end]); +}, []); +var enums_placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) { + return acc.concat([placement, placement + "-" + start, placement + "-" + end]); +}, []); // modifiers that need to read the DOM -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/events/donation-amount.js +var beforeRead = 'beforeRead'; +var read = 'read'; +var afterRead = 'afterRead'; // pure-logic modifiers +var beforeMain = 'beforeMain'; +var main = 'main'; +var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state) -class DonationAmount { - constructor(radios = "transaction.donationAmt", other = "transaction.donationAmt.other") { - this._onAmountChange = new dist/* SimpleEventDispatcher */.IL(); - this._amount = 0; - this._radios = ""; - this._other = ""; - this._dispatch = true; - this._other = other; - this._radios = radios; - // Watch Radios Inputs for Changes - document.addEventListener("change", (e) => { - const element = e.target; - if (element) { - if (element.name == radios) { - this.amount = parseFloat(element.value); - } - else if (element.name == other) { - const cleanedAmount = engrid_ENGrid.cleanAmount(element.value); - element.value = - cleanedAmount % 1 != 0 - ? cleanedAmount.toFixed(2) - : cleanedAmount.toString(); - this.amount = cleanedAmount; - } - } - }); - // Watch Other Amount Field - const otherField = document.querySelector(`[name='${this._other}']`); - if (otherField) { - otherField.addEventListener("keyup", (e) => { - this.amount = engrid_ENGrid.cleanAmount(otherField.value); - }); +var beforeWrite = 'beforeWrite'; +var write = 'write'; +var afterWrite = 'afterWrite'; +var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/orderModifiers.js + // source: https://stackoverflow.com/questions/49875255 + +function order(modifiers) { + var map = new Map(); + var visited = new Set(); + var result = []; + modifiers.forEach(function (modifier) { + map.set(modifier.name, modifier); + }); // On visiting object, check for its dependencies and visit them recursively + + function sort(modifier) { + visited.add(modifier.name); + var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); + requires.forEach(function (dep) { + if (!visited.has(dep)) { + var depModifier = map.get(dep); + + if (depModifier) { + sort(depModifier); } - // Load the current amount - this.load(); + } + }); + result.push(modifier); + } + + modifiers.forEach(function (modifier) { + if (!visited.has(modifier.name)) { + // check for visited object + sort(modifier); } - static getInstance(radios = "transaction.donationAmt", other = "transaction.donationAmt.other") { - if (!DonationAmount.instance) { - DonationAmount.instance = new DonationAmount(radios, other); - } - return DonationAmount.instance; - } - get amount() { - return this._amount; - } - // Every time we set an amount, trigger the onAmountChange event - set amount(value) { - this._amount = value || 0; - if (this._dispatch) - this._onAmountChange.dispatch(this._amount); - } - get onAmountChange() { - return this._onAmountChange.asEvent(); - } - // Set amount var with currently selected amount - load() { - const currentAmountField = document.querySelector('input[name="' + this._radios + '"]:checked'); - if (currentAmountField) { - let currentAmountValue = parseFloat(currentAmountField.value || ""); - if (currentAmountValue > 0) { - this.amount = parseFloat(currentAmountField.value); - } - else { - const otherField = document.querySelector('input[name="' + this._other + '"]'); - currentAmountValue = engrid_ENGrid.cleanAmount(otherField.value); - this.amount = currentAmountValue; - } - } - else if (engrid_ENGrid.checkNested(window.EngagingNetworks, "require", "_defined", "enjs", "getDonationTotal") && - engrid_ENGrid.checkNested(window.EngagingNetworks, "require", "_defined", "enjs", "getDonationFee")) { - const total = window.EngagingNetworks.require._defined.enjs.getDonationTotal() - - window.EngagingNetworks.require._defined.enjs.getDonationFee(); - if (total) { - this.amount = total; - } - } - } - // Force a new amount - setAmount(amount, dispatch = true) { - // Run only if it is a Donation Page with a Donation Amount field - if (!document.getElementsByName(this._radios).length) { - return; - } - // Set dispatch to be checked by the SET method - this._dispatch = dispatch; - // Search for the current amount on radio boxes - let found = Array.from(document.querySelectorAll('input[name="' + this._radios + '"]')).filter((el) => el instanceof HTMLInputElement && parseInt(el.value) == amount); - // We found the amount on the radio boxes, so check it - if (found.length) { - const amountField = found[0]; - amountField.checked = true; - // Change Event - const event = new Event("change", { - bubbles: true, - cancelable: true, - }); - amountField.dispatchEvent(event); - // Clear OTHER text field - this.clearOther(); - } - else { - const otherField = document.querySelector('input[name="' + this._other + '"]'); - if (otherField) { - const enFieldOtherAmountRadio = document.querySelector(`.en__field--donationAmt.en__field--withOther .en__field__item:nth-last-child(2) input[name="${this._radios}"]`); - if (enFieldOtherAmountRadio) { - enFieldOtherAmountRadio.checked = true; - } - otherField.value = parseFloat(amount.toString()).toFixed(2); - // Change Event - const event = new Event("change", { - bubbles: true, - cancelable: true, - }); - otherField.dispatchEvent(event); - const otherWrapper = otherField.parentNode; - otherWrapper.classList.remove("en__field__item--hidden"); - } - } - // Set the new amount and trigger all live variables - this.amount = amount; - // Revert dispatch to default value (true) - this._dispatch = true; - } - // Clear Other Field - clearOther() { - const otherField = document.querySelector('input[name="' + this._other + '"]'); - otherField.value = ""; - const otherWrapper = otherField.parentNode; - otherWrapper.classList.add("en__field__item--hidden"); + }); + return result; +} + +function orderModifiers(modifiers) { + // order based on dependencies + var orderedModifiers = order(modifiers); // order based on phase + + return modifierPhases.reduce(function (acc, phase) { + return acc.concat(orderedModifiers.filter(function (modifier) { + return modifier.phase === phase; + })); + }, []); +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/debounce.js +function debounce(fn) { + var pending; + return function () { + if (!pending) { + pending = new Promise(function (resolve) { + Promise.resolve().then(function () { + pending = undefined; + resolve(fn()); + }); + }); } + + return pending; + }; } +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/mergeByName.js +function mergeByName(modifiers) { + var merged = modifiers.reduce(function (merged, current) { + var existing = merged[current.name]; + merged[current.name] = existing ? Object.assign({}, existing, current, { + options: Object.assign({}, existing.options, current.options), + data: Object.assign({}, existing.data, current.data) + }) : current; + return merged; + }, {}); // IE11 does not support Object.values -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/engrid.js -class engrid_ENGrid { - constructor() { - if (!engrid_ENGrid.enForm) { - throw new Error("Engaging Networks Form Not Found!"); - } - } - static get enForm() { - return document.querySelector("form.en__component"); - } - static get debug() { - return !!this.getOption("Debug"); - } - static get demo() { - return this.getUrlParameter("mode") === "DEMO"; - } - // Return any parameter from the URL - static getUrlParameter(name) { - const searchParams = new URLSearchParams(window.location.search); - // Add support for array on the name ending with [] - if (name.endsWith("[]")) { - let values = []; - searchParams.forEach((value, key) => { - if (key.startsWith(name.replace("[]", ""))) { - values.push(new Object({ [key]: value })); - } - }); - return values.length > 0 ? values : null; - } - if (searchParams.has(name)) { - return searchParams.get(name) || true; - } - return null; - } - static getField(name) { - // Get the field by name - return document.querySelector(`[name="${name}"]`); - } - // Return the field value from its name. It works on any field type. - // Multiple values (from checkboxes or multi-select) are returned as single string - // Separated by , - static getFieldValue(name) { - return new FormData(this.enForm).getAll(name).join(","); + return Object.keys(merged).map(function (key) { + return merged[key]; + }); +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/createPopper.js + + + + + + + + + +var DEFAULT_OPTIONS = { + placement: 'bottom', + modifiers: [], + strategy: 'absolute' +}; + +function areValidElements() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return !args.some(function (element) { + return !(element && typeof element.getBoundingClientRect === 'function'); + }); +} + +function popperGenerator(generatorOptions) { + if (generatorOptions === void 0) { + generatorOptions = {}; + } + + var _generatorOptions = generatorOptions, + _generatorOptions$def = _generatorOptions.defaultModifiers, + defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, + _generatorOptions$def2 = _generatorOptions.defaultOptions, + defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; + return function createPopper(reference, popper, options) { + if (options === void 0) { + options = defaultOptions; } - // Set a value to any field. If it's a dropdown, radio or checkbox, it selects the proper option matching the value - static setFieldValue(name, value, parseENDependencies = true, dispatchEvents = false) { - if (value === engrid_ENGrid.getFieldValue(name)) - return; - document.getElementsByName(name).forEach((field) => { - if ("type" in field) { - switch (field.type) { - case "select-one": - case "select-multiple": - for (const option of field.options) { - if (option.value == value) { - option.selected = true; - if (dispatchEvents) { - field.dispatchEvent(new Event("change", { bubbles: true })); - } - } - } - break; - case "checkbox": - case "radio": - if (field.value == value) { - field.checked = true; - if (dispatchEvents) { - field.dispatchEvent(new Event("change", { bubbles: true })); - } - } - break; - case "textarea": - case "text": - default: - field.value = value; - if (dispatchEvents) { - field.dispatchEvent(new Event("change", { bubbles: true })); - field.dispatchEvent(new Event("blur", { bubbles: true })); - } - } - field.setAttribute("engrid-value-changed", ""); - } + + var state = { + placement: 'bottom', + orderedModifiers: [], + options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), + modifiersData: {}, + elements: { + reference: reference, + popper: popper + }, + attributes: {}, + styles: {} + }; + var effectCleanupFns = []; + var isDestroyed = false; + var instance = { + state: state, + setOptions: function setOptions(setOptionsAction) { + var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction; + cleanupModifierEffects(); + state.options = Object.assign({}, defaultOptions, state.options, options); + state.scrollParents = { + reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [], + popper: listScrollParents(popper) + }; // Orders the modifiers based on their dependencies and `phase` + // properties + + var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers + + state.orderedModifiers = orderedModifiers.filter(function (m) { + return m.enabled; }); - if (parseENDependencies) - this.enParseDependencies(); - return; - } - // Create a hidden input field - static createHiddenInput(name, value = "") { - var _a; - const formBlock = document.createElement("div"); - formBlock.classList.add("en__component", "en__component--formblock", "hide"); - const textField = document.createElement("div"); - textField.classList.add("en__field", "en__field--text"); - const textElement = document.createElement("div"); - textElement.classList.add("en__field__element", "en__field__element--text"); - const inputField = document.createElement("input"); - inputField.classList.add("en__field__input", "en__field__input--text", "engrid-added-input"); - inputField.setAttribute("name", name); - inputField.setAttribute("type", "hidden"); - inputField.setAttribute("value", value); - textElement.appendChild(inputField); - textField.appendChild(textElement); - formBlock.appendChild(textField); - const submitElement = document.querySelector(".en__submit"); - if (submitElement) { - const lastFormComponent = submitElement.closest(".en__component"); - if (lastFormComponent) { - // Insert the new field after the submit button - (_a = lastFormComponent.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(formBlock, lastFormComponent.nextSibling); - } + runModifierEffects(); + return instance.update(); + }, + // Sync update – it will always be executed, even if not necessary. This + // is useful for low frequency updates where sync behavior simplifies the + // logic. + // For high frequency updates (e.g. `resize` and `scroll` events), always + // prefer the async Popper#update method + forceUpdate: function forceUpdate() { + if (isDestroyed) { + return; } - else { - engrid_ENGrid.enForm.appendChild(formBlock); + + var _state$elements = state.elements, + reference = _state$elements.reference, + popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements + // anymore + + if (!areValidElements(reference, popper)) { + return; + } // Store the reference and popper rects to be read by modifiers + + + state.rects = { + reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'), + popper: getLayoutRect(popper) + }; // Modifiers have the ability to reset the current update cycle. The + // most common use case for this is the `flip` modifier changing the + // placement, which then needs to re-run all the modifiers, because the + // logic was previously ran for the previous placement and is therefore + // stale/incorrect + + state.reset = false; + state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier + // is filled with the initial data specified by the modifier. This means + // it doesn't persist and is fresh on each update. + // To ensure persistent data, use `${name}#persistent` + + state.orderedModifiers.forEach(function (modifier) { + return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); + }); + + for (var index = 0; index < state.orderedModifiers.length; index++) { + if (state.reset === true) { + state.reset = false; + index = -1; + continue; + } + + var _state$orderedModifie = state.orderedModifiers[index], + fn = _state$orderedModifie.fn, + _state$orderedModifie2 = _state$orderedModifie.options, + _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, + name = _state$orderedModifie.name; + + if (typeof fn === 'function') { + state = fn({ + state: state, + options: _options, + name: name, + instance: instance + }) || state; + } } - return inputField; + }, + // Async and optimistically optimized update – it will not be executed if + // not necessary (debounced to run at most once-per-tick) + update: debounce(function () { + return new Promise(function (resolve) { + instance.forceUpdate(); + resolve(state); + }); + }), + destroy: function destroy() { + cleanupModifierEffects(); + isDestroyed = true; + } + }; + + if (!areValidElements(reference, popper)) { + return instance; } - // Trigger EN Dependencies - static enParseDependencies() { - var _a, _b, _c, _d, _e, _f; - if (window.EngagingNetworks && - typeof ((_e = (_d = (_c = (_b = (_a = window.EngagingNetworks) === null || _a === void 0 ? void 0 : _a.require) === null || _b === void 0 ? void 0 : _b._defined) === null || _c === void 0 ? void 0 : _c.enDependencies) === null || _d === void 0 ? void 0 : _d.dependencies) === null || _e === void 0 ? void 0 : _e.parseDependencies) === "function") { - const customDependencies = []; - if ("dependencies" in window.EngagingNetworks) { - const amountContainer = document.querySelector(".en__field--donationAmt"); - if (amountContainer) { - let amountID = ((_f = [...amountContainer.classList.values()] - .filter((v) => v.startsWith("en__field--") && Number(v.substring(11)) > 0) - .toString() - .match(/\d/g)) === null || _f === void 0 ? void 0 : _f.join("")) || ""; - if (amountID) { - window.EngagingNetworks.dependencies.forEach((dependency) => { - if ("actions" in dependency && dependency.actions.length > 0) { - let amountIdFound = false; - dependency.actions.forEach((action) => { - if ("target" in action && action.target == amountID) { - amountIdFound = true; - } - }); - if (!amountIdFound) { - customDependencies.push(dependency); - } - } - }); - if (customDependencies.length > 0) { - window.EngagingNetworks.require._defined.enDependencies.dependencies.parseDependencies(customDependencies); - if (engrid_ENGrid.getOption("Debug")) - console.log("EN Dependencies Triggered", customDependencies); - } - } - } - } + + instance.setOptions(options).then(function (state) { + if (!isDestroyed && options.onFirstUpdate) { + options.onFirstUpdate(state); + } + }); // Modifiers have the ability to execute arbitrary code before the first + // update cycle runs. They will be executed in the same order as the update + // cycle. This is useful when a modifier adds some persistent data that + // other modifiers need to use, but the modifier is run after the dependent + // one. + + function runModifierEffects() { + state.orderedModifiers.forEach(function (_ref) { + var name = _ref.name, + _ref$options = _ref.options, + options = _ref$options === void 0 ? {} : _ref$options, + effect = _ref.effect; + + if (typeof effect === 'function') { + var cleanupFn = effect({ + state: state, + name: name, + instance: instance, + options: options + }); + + var noopFn = function noopFn() {}; + + effectCleanupFns.push(cleanupFn || noopFn); } + }); } - // Return the status of the gift process (true if a donation has been made, otherwise false) - static getGiftProcess() { - if ("pageJson" in window) - return window.pageJson.giftProcess; - return null; - } - // Return the page count - static getPageCount() { - if ("pageJson" in window) - return window.pageJson.pageCount; - return null; - } - // Return the current page number - static getPageNumber() { - if ("pageJson" in window) - return window.pageJson.pageNumber; - return null; - } - static isThankYouPage() { - return this.getPageNumber() === this.getPageCount(); - } - // Return the current page ID - static getPageID() { - if ("pageJson" in window) - return window.pageJson.campaignPageId; - return 0; + + function cleanupModifierEffects() { + effectCleanupFns.forEach(function (fn) { + return fn(); + }); + effectCleanupFns = []; } - // Return the client ID - static getClientID() { - if ("pageJson" in window) - return window.pageJson.clientId; - return 0; + + return instance; + }; +} +var createPopper = /*#__PURE__*/(/* unused pure expression or super */ null && (popperGenerator())); // eslint-disable-next-line import/no-unused-modules + + +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/modifiers/eventListeners.js + // eslint-disable-next-line import/no-unused-modules + +var passive = { + passive: true +}; + +function effect(_ref) { + var state = _ref.state, + instance = _ref.instance, + options = _ref.options; + var _options$scroll = options.scroll, + scroll = _options$scroll === void 0 ? true : _options$scroll, + _options$resize = options.resize, + resize = _options$resize === void 0 ? true : _options$resize; + var window = getWindow(state.elements.popper); + var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); + + if (scroll) { + scrollParents.forEach(function (scrollParent) { + scrollParent.addEventListener('scroll', instance.update, passive); + }); + } + + if (resize) { + window.addEventListener('resize', instance.update, passive); + } + + return function () { + if (scroll) { + scrollParents.forEach(function (scrollParent) { + scrollParent.removeEventListener('scroll', instance.update, passive); + }); } - //returns 'us or 'ca' based on the client ID - static getDataCenter() { - return engrid_ENGrid.getClientID() >= 10000 ? "us" : "ca"; + + if (resize) { + window.removeEventListener('resize', instance.update, passive); } - // Return the current page type - static getPageType() { - if ("pageJson" in window && "pageType" in window.pageJson) { - switch (window.pageJson.pageType) { - case "p2pcheckout": - case "p2pdonation": - case "donation": - case "premiumgift": - return "DONATION"; - break; - case "e-card": - return "ECARD"; - break; - case "otherdatacapture": - case "survey": - return "SURVEY"; - break; - case "emailtotarget": - return "EMAILTOTARGET"; - break; - case "advocacypetition": - return "ADVOCACY"; - break; - case "emailsubscribeform": - return "SUBSCRIBEFORM"; - break; - case "event": - return "EVENT"; - break; - case "supporterhub": - return "SUPPORTERHUB"; - break; - case "unsubscribe": - return "UNSUBSCRIBE"; - break; - case "tweetpage": - return "TWEETPAGE"; - break; - default: - return "UNKNOWN"; - } - } - else { - return "UNKNOWN"; - } - } - // Set body engrid data attributes - static setBodyData(dataName, value) { - const body = document.querySelector("body"); - // If value is boolean - if (typeof value === "boolean" && value === false) { - body.removeAttribute(`data-engrid-${dataName}`); - return; - } - body.setAttribute(`data-engrid-${dataName}`, value.toString()); - } - // Get body engrid data attributes - static getBodyData(dataName) { - const body = document.querySelector("body"); - return body.getAttribute(`data-engrid-${dataName}`); - } - // Check if body has engrid data attributes - static hasBodyData(dataName) { - const body = document.querySelector("body"); - return body.hasAttribute(`data-engrid-${dataName}`); - } - // Return the option value - static getOption(key) { - return window.EngridOptions[key] || null; - } - // Load an external script - static loadJS(url, onload = null, head = true) { - const scriptTag = document.createElement("script"); - scriptTag.src = url; - scriptTag.onload = onload; - if (head) { - document.head.appendChild(scriptTag); - return; - } - document.body.appendChild(scriptTag); - return; - } - // Format a number - static formatNumber(number, decimals = 2, dec_point = ".", thousands_sep = ",") { - // Strip all characters but numerical ones. - number = (number + "").replace(/[^0-9+\-Ee.]/g, ""); - const n = !isFinite(+number) ? 0 : +number; - const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals); - const sep = typeof thousands_sep === "undefined" ? "," : thousands_sep; - const dec = typeof dec_point === "undefined" ? "." : dec_point; - let s = []; - const toFixedFix = function (n, prec) { - const k = Math.pow(10, prec); - return "" + Math.round(n * k) / k; - }; - // Fix for IE parseFloat(0.55).toFixed(0) = 0; - s = (prec ? toFixedFix(n, prec) : "" + Math.round(n)).split("."); - if (s[0].length > 3) { - s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep); - } - if ((s[1] || "").length < prec) { - s[1] = s[1] || ""; - s[1] += new Array(prec - s[1].length + 1).join("0"); - } - return s.join(dec); - } - // Clean an Amount - static cleanAmount(amount) { - // Split the number - const valueArray = amount.replace(/[^0-9,\.]/g, "").split(/[,.]+/); - const delimArray = amount.replace(/[^.,]/g, "").split(""); - // Handle values with no decimal places and non-numeric values - if (valueArray.length === 1) { - return parseInt(valueArray[0]) || 0; - } - // Ignore invalid numbers - if (valueArray - .map((x, index) => { - return index > 0 && index + 1 !== valueArray.length && x.length !== 3 - ? true - : false; - }) - .includes(true)) { - return 0; - } - // Multiple commas is a bad thing? So edgy. - if (delimArray.length > 1 && !delimArray.includes(".")) { - return 0; - } - // Handle invalid decimal and comma formatting - if ([...new Set(delimArray.slice(0, -1))].length > 1) { - return 0; - } - // If there are cents - if (valueArray[valueArray.length - 1].length <= 2) { - const cents = valueArray.pop() || "00"; - return parseInt(cents) > 0 - ? parseFloat(Number(parseInt(valueArray.join("")) + "." + cents).toFixed(2)) - : parseInt(valueArray.join("")); - } - return parseInt(valueArray.join("")); - } - static disableSubmit(label = "") { - const submit = document.querySelector(".en__submit button"); - if (!submit) - return false; - let submitButtonProcessingHTML = `${label}`; - if (submit.innerHTML.includes("loader-wrapper")) { - // If we are already processing, don't override the originalText again - return false; - } - submit.dataset.originalText = submit.innerHTML; - submit.disabled = true; - submit.innerHTML = submitButtonProcessingHTML; - return true; - } - static enableSubmit() { - const submit = document.querySelector(".en__submit button"); - if (!submit) - return false; - if (submit.dataset.originalText) { - submit.disabled = false; - submit.innerHTML = submit.dataset.originalText; - delete submit.dataset.originalText; - return true; - } - return false; - } - static formatDate(date, format = "MM/DD/YYYY") { - const dateAray = date - .toLocaleDateString("en-US", { - year: "numeric", - month: "2-digit", - day: "2-digit", - }) - .split("/"); - const dateString = format - .replace(/YYYY/g, dateAray[2]) - .replace(/MM/g, dateAray[0]) - .replace(/DD/g, dateAray[1]) - .replace(/YY/g, dateAray[2].substr(2, 2)); - return dateString; - } - /** - * Check if the provided object has ALL the provided properties - * Example: checkNested(EngagingNetworks, 'require', '_defined', 'enjs', 'checkSubmissionFailed') - * will return true if EngagingNetworks.require._defined.enjs.checkSubmissionFailed is defined - */ - static checkNested(obj, ...args) { - for (let i = 0; i < args.length; i++) { - if (!obj || !obj.hasOwnProperty(args[i])) { - return false; - } - obj = obj[args[i]]; - } - return true; - } - // Deep merge two objects - static deepMerge(target, source) { - for (const key in source) { - if (source[key] instanceof Object) - Object.assign(source[key], engrid_ENGrid.deepMerge(target[key], source[key])); - } - Object.assign(target || {}, source); - return target; - } - static setError(element, errorMessage) { - const errorElement = typeof element === "string" ? document.querySelector(element) : element; - if (errorElement) { - errorElement.classList.add("en__field--validationFailed"); - let errorMessageElement = errorElement.querySelector(".en__field__error"); - if (!errorMessageElement) { - errorMessageElement = document.createElement("div"); - errorMessageElement.classList.add("en__field__error"); - errorMessageElement.innerHTML = errorMessage; - errorElement.insertBefore(errorMessageElement, errorElement.firstChild); - } - else { - errorMessageElement.innerHTML = errorMessage; - } - } - } - static removeError(element) { - const errorElement = typeof element === "string" ? document.querySelector(element) : element; - if (errorElement) { - errorElement.classList.remove("en__field--validationFailed"); - const errorMessageElement = errorElement.querySelector(".en__field__error"); - if (errorMessageElement) { - errorElement.removeChild(errorMessageElement); - } - } - } - static isVisible(element) { - if (!element) { - return false; - } - return !!(element.offsetWidth || - element.offsetHeight || - element.getClientRects().length); - } - static getCurrencySymbol() { - const currencyField = engrid_ENGrid.getField("transaction.paycurrency"); - if (currencyField) { - // Check if the selected currency field option have a data-currency-symbol attribute - const selectedOption = currencyField.tagName === "SELECT" - ? currencyField.options[currencyField.selectedIndex] - : currencyField; - if (selectedOption.dataset.currencySymbol) { - return selectedOption.dataset.currencySymbol; - } - const currencyArray = { - USD: "$", - EUR: "€", - GBP: "£", - AUD: "$", - CAD: "$", - JPY: "¥", - }; - return currencyArray[currencyField.value] || "$"; - } - return engrid_ENGrid.getOption("CurrencySymbol") || "$"; - } - static getCurrencyCode() { - const currencyField = engrid_ENGrid.getField("transaction.paycurrency"); - if (currencyField) { - return currencyField.value || "USD"; - } - return engrid_ENGrid.getOption("CurrencyCode") || "USD"; - } - static addHtml(html, target = "body", position = "before") { - var _a, _b; - const targetElement = document.querySelector(target); - if (typeof html === "object") { - html = html.outerHTML; - } - if (targetElement) { - const htmlElement = document.createRange().createContextualFragment(html); - if (position === "before") { - (_a = targetElement.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(htmlElement, targetElement); - } - else { - (_b = targetElement.parentNode) === null || _b === void 0 ? void 0 : _b.insertBefore(htmlElement, targetElement.nextSibling); - } - } - } - static removeHtml(target) { - const targetElement = document.querySelector(target); - if (targetElement) { - targetElement.remove(); - } - } - static slugify(text) { - return text - .toString() - .toLowerCase() - .replace(/\s+/g, "-") // Replace spaces with - - .replace(/[^\w\-]+/g, "") // Remove all non-word chars - .replace(/\-\-+/g, "-") // Replace multiple - with single - - .replace(/^-+/, "") // Trim - from start of text - .replace(/-+$/, ""); // Trim - from end of text - } - // This function is used to run a callback function when an error is displayed on the page - static watchForError(callback) { - const errorElement = document.querySelector(".en__errorList"); - const capitalize = (word) => word.charAt(0).toUpperCase() + word.slice(1); - // Avoid duplicate callbacks - let callbackType = callback.toString(); - if (callbackType.indexOf("function") === 0) { - callbackType = callbackType.replace("function ", ""); - } - if (callbackType.indexOf("(") > 0) { - callbackType = callbackType.substring(0, callbackType.indexOf("(")); - } - // Remove invalid characters - callbackType = callbackType.replace(/[^a-zA-Z0-9]/g, ""); - // Limit to 20 characters and add prefix - callbackType = callbackType.substring(0, 20); - callbackType = "engrid" + capitalize(callbackType); - if (errorElement && !errorElement.dataset[callbackType]) { - errorElement.dataset[callbackType] = "true"; - const observer = new MutationObserver(function (mutations) { - mutations.forEach(function (mutation) { - if (mutation.type === "childList" && mutation.addedNodes.length > 0) { - callback(); - } - }); - }); - observer.observe(errorElement, { childList: true }); - } - } - // Get the Payment Type - static getPaymentType() { - return engrid_ENGrid.getFieldValue("transaction.paymenttype"); - } - // Set the Payment Type - static setPaymentType(paymentType) { - const enFieldPaymentType = engrid_ENGrid.getField("transaction.paymenttype"); - if (enFieldPaymentType) { - const paymentTypeOption = Array.from(enFieldPaymentType.options).find((option) => paymentType.toLowerCase() === "card" - ? ["card", "visa", "vi"].includes(option.value.toLowerCase()) - : paymentType.toLowerCase() === option.value.toLowerCase()); - if (paymentTypeOption) { - paymentTypeOption.selected = true; - enFieldPaymentType.value = paymentTypeOption.value; - } - else { - enFieldPaymentType.value = paymentType; - } - const event = new Event("change", { - bubbles: true, - cancelable: true, - }); - enFieldPaymentType.dispatchEvent(event); - } - } - static isInViewport(element) { - const rect = element.getBoundingClientRect(); - return (rect.top >= 0 && - rect.left >= 0 && - rect.bottom <= - (window.innerHeight || - document.documentElement.clientHeight) /* or $(window).height() */ && - rect.right <= - (window.innerWidth || - document.documentElement.clientWidth) /* or $(window).width() */); - } -} + }; +} // eslint-disable-next-line import/no-unused-modules -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/events/donation-frequency.js +/* harmony default export */ const eventListeners = ({ + name: 'eventListeners', + enabled: true, + phase: 'write', + fn: function fn() {}, + effect: effect, + data: {} +}); +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/getBasePlacement.js -class DonationFrequency { - constructor() { - this._onFrequencyChange = new dist/* SimpleEventDispatcher */.IL(); - this._frequency = "onetime"; - this._recurring = "n"; - this._dispatch = true; - // Watch the Radios for Changes - document.addEventListener("change", (e) => { - const element = e.target; - if (element && element.name == "transaction.recurrpay") { - this.recurring = element.value; - // When this element is a radio, that means you're between onetime and monthly only - if (element.type == "radio") { - this.frequency = - element.value.toLowerCase() == "n" ? "onetime" : "monthly"; - // This field is hidden when transaction.recurrpay is radio - engrid_ENGrid.setFieldValue("transaction.recurrfreq", this.frequency.toUpperCase()); - } - } - if (element && element.name == "transaction.recurrfreq") { - this.frequency = element.value; - } - }); - //Thank you page handling for utility classes - if (engrid_ENGrid.getGiftProcess()) { - engrid_ENGrid.setBodyData("transaction-recurring-frequency", sessionStorage.getItem("engrid-transaction-recurring-frequency") || - "onetime"); - engrid_ENGrid.setBodyData("transaction-recurring", window.pageJson.recurring ? "y" : "n"); - } - } - static getInstance() { - if (!DonationFrequency.instance) { - DonationFrequency.instance = new DonationFrequency(); - } - return DonationFrequency.instance; - } - get frequency() { - return this._frequency; - } - // Every time we set a frequency, trigger the onFrequencyChange event - set frequency(value) { - this._frequency = value.toLowerCase() || "onetime"; - if (this._dispatch) - this._onFrequencyChange.dispatch(this._frequency); - engrid_ENGrid.setBodyData("transaction-recurring-frequency", this._frequency); - sessionStorage.setItem("engrid-transaction-recurring-frequency", this._frequency); - } - get recurring() { - return this._recurring; - } - set recurring(value) { - this._recurring = value.toLowerCase() || "n"; - engrid_ENGrid.setBodyData("transaction-recurring", this._recurring); - } - get onFrequencyChange() { - return this._onFrequencyChange.asEvent(); - } - // Set amount var with currently selected amount - load() { - var _a; - this.frequency = - engrid_ENGrid.getFieldValue("transaction.recurrfreq") || - sessionStorage.getItem("engrid-transaction-recurring-frequency") || - "onetime"; - const recurrField = engrid_ENGrid.getField("transaction.recurrpay"); - if (recurrField) { - this.recurring = engrid_ENGrid.getFieldValue("transaction.recurrpay"); - } - else if (engrid_ENGrid.checkNested(window.EngagingNetworks, "require", "_defined", "enjs", "getSupporterData")) { - this.recurring = - ((_a = window.EngagingNetworks.require._defined.enjs - .getSupporterData("recurrpay")) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || "n"; - } - // ENGrid.enParseDependencies(); - } - // Force a new recurrency - setRecurrency(recurr, dispatch = true) { - // Run only if it is a Donation Page with a Recurrency - if (!document.getElementsByName("transaction.recurrpay").length) { - return; - } - // Set dispatch to be checked by the SET method - this._dispatch = dispatch; - engrid_ENGrid.setFieldValue("transaction.recurrpay", recurr.toUpperCase()); - // Revert dispatch to default value (true) - this._dispatch = true; - } - // Force a new frequency - setFrequency(freq, dispatch = true) { - // Run only if it is a Donation Page with a Frequency - if (!document.getElementsByName("transaction.recurrfreq").length) { - return; - } - // Set dispatch to be checked by the SET method - this._dispatch = dispatch; - // Search for the current amount on radio boxes - let found = Array.from(document.querySelectorAll('input[name="transaction.recurrfreq"]')).filter((el) => el instanceof HTMLInputElement && el.value == freq.toUpperCase()); - // We found the amount on the radio boxes, so check it - if (found.length) { - const freqField = found[0]; - freqField.checked = true; - this.frequency = freq.toLowerCase(); - if (this.frequency === "onetime") { - this.setRecurrency("N", dispatch); - } - else { - this.setRecurrency("Y", dispatch); - } - } - // Revert dispatch to default value (true) - this._dispatch = true; - } +function getBasePlacement(placement) { + return placement.split('-')[0]; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/getVariation.js +function getVariation(placement) { + return placement.split('-')[1]; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js +function getMainAxisFromPlacement(placement) { + return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y'; } +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/computeOffsets.js -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/events/processing-fees.js -class ProcessingFees { - constructor() { - this._onFeeChange = new dist/* SimpleEventDispatcher */.IL(); - this._amount = DonationAmount.getInstance(); - this._form = en_form_EnForm.getInstance(); - this._fee = 0; - this._field = null; - // console.log('%c Processing Fees Constructor', 'font-size: 30px; background-color: #000; color: #FF0'); - // Run only if it is a Donation Page with a Donation Amount field - if (!document.getElementsByName("transaction.donationAmt").length) { - return; - } - this._field = this.isENfeeCover() - ? document.querySelector("#en__field_transaction_feeCover") - : document.querySelector('input[name="supporter.processing_fees"]'); - // Watch the Radios for Changes - if (this._field instanceof HTMLInputElement) { - // console.log('%c Processing Fees Start', 'font-size: 30px; background-color: #000; color: #FF0'); - this._field.addEventListener("change", (e) => { - if (this._field instanceof HTMLInputElement && - this._field.checked && - !this._subscribe) { - this._subscribe = this._form.onSubmit.subscribe(() => this.addFees()); - } - this._onFeeChange.dispatch(this.fee); - // // console.log('%c Processing Fees Script Applied', 'font-size: 30px; background-color: #000; color: #FF0'); - }); - } - // this._amount = amount; - } - static getInstance() { - if (!ProcessingFees.instance) { - ProcessingFees.instance = new ProcessingFees(); - } - return ProcessingFees.instance; - } - get onFeeChange() { - return this._onFeeChange.asEvent(); - } - get fee() { - return this.calculateFees(); - } - // Every time we set a frequency, trigger the onFrequencyChange event - set fee(value) { - this._fee = value; - this._onFeeChange.dispatch(this._fee); - } - calculateFees(amount = 0) { - var _a; - if (this._field instanceof HTMLInputElement && this._field.checked) { - if (this.isENfeeCover()) { - return amount > 0 - ? window.EngagingNetworks.require._defined.enjs.feeCover.fee(amount) - : window.EngagingNetworks.require._defined.enjs.getDonationFee(); - } - const fees = Object.assign({ - processingfeepercentadded: "0", - processingfeefixedamountadded: "0", - }, (_a = this._field) === null || _a === void 0 ? void 0 : _a.dataset); - const amountToFee = amount > 0 ? amount : this._amount.amount; - const processing_fee = (parseFloat(fees.processingfeepercentadded) / 100) * amountToFee + - parseFloat(fees.processingfeefixedamountadded); - return Math.round(processing_fee * 100) / 100; - } - return 0; - } - // Add Fees to Amount - addFees() { - if (this._form.submit && !this.isENfeeCover()) { - this._amount.setAmount(this._amount.amount + this.fee, false); - } - } - // Remove Fees From Amount - removeFees() { - if (!this.isENfeeCover()) - this._amount.setAmount(this._amount.amount - this.fee); - } - // Check if this is a Processing Fee from EN - isENfeeCover() { - if ("feeCover" in window.EngagingNetworks) { - for (const key in window.EngagingNetworks.feeCover) { - if (window.EngagingNetworks.feeCover.hasOwnProperty(key)) { - return true; - } - } - } - return false; +function computeOffsets(_ref) { + var reference = _ref.reference, + element = _ref.element, + placement = _ref.placement; + var basePlacement = placement ? getBasePlacement(placement) : null; + var variation = placement ? getVariation(placement) : null; + var commonX = reference.x + reference.width / 2 - element.width / 2; + var commonY = reference.y + reference.height / 2 - element.height / 2; + var offsets; + + switch (basePlacement) { + case enums_top: + offsets = { + x: commonX, + y: reference.y - element.height + }; + break; + + case bottom: + offsets = { + x: commonX, + y: reference.y + reference.height + }; + break; + + case right: + offsets = { + x: reference.x + reference.width, + y: commonY + }; + break; + + case left: + offsets = { + x: reference.x - element.width, + y: commonY + }; + break; + + default: + offsets = { + x: reference.x, + y: reference.y + }; + } + + var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; + + if (mainAxis != null) { + var len = mainAxis === 'y' ? 'height' : 'width'; + + switch (variation) { + case start: + offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2); + break; + + case end: + offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2); + break; + + default: } + } + + return offsets; } +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/modifiers/popperOffsets.js -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/events/remember-me-events.js -/** - * This class is responsible for managing events related to the "Remember Me" functionality. - * It uses the Singleton design pattern to ensure only one instance of this class exists. - * It provides methods for dispatching load and clear events, and getters for accessing these events. - */ +function popperOffsets(_ref) { + var state = _ref.state, + name = _ref.name; + // Offsets are the actual position the popper needs to have to be + // properly positioned near its reference element + // This is the most basic placement, and will be adjusted by + // the modifiers in the next step + state.modifiersData[name] = computeOffsets({ + reference: state.rects.reference, + element: state.rects.popper, + strategy: 'absolute', + placement: state.placement + }); +} // eslint-disable-next-line import/no-unused-modules -class RememberMeEvents { - constructor() { - this.logger = new logger_EngridLogger("RememberMeEvents"); - this._onLoad = new dist/* SimpleEventDispatcher */.IL(); - this._onClear = new dist/* SignalDispatcher */.UD(); - this.hasData = false; - } - static getInstance() { - if (!RememberMeEvents.instance) { - RememberMeEvents.instance = new RememberMeEvents(); - } - return RememberMeEvents.instance; - } - dispatchLoad(hasData) { - this.hasData = hasData; - this._onLoad.dispatch(hasData); - this.logger.log(`dispatchLoad: ${hasData}`); - } - dispatchClear() { - this._onClear.dispatch(); - this.logger.log("dispatchClear"); - } - get onLoad() { - return this._onLoad.asEvent(); - } - get onClear() { - return this._onClear.asEvent(); - } + +/* harmony default export */ const modifiers_popperOffsets = ({ + name: 'popperOffsets', + enabled: true, + phase: 'read', + fn: popperOffsets, + data: {} +}); +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/modifiers/computeStyles.js + + + + + + + + // eslint-disable-next-line import/no-unused-modules + +var unsetSides = { + top: 'auto', + right: 'auto', + bottom: 'auto', + left: 'auto' +}; // Round the offsets to the nearest suitable subpixel based on the DPR. +// Zooming can change the DPR, but it seems to report a value that will +// cleanly divide the values into the appropriate subpixels. + +function roundOffsetsByDPR(_ref, win) { + var x = _ref.x, + y = _ref.y; + var dpr = win.devicePixelRatio || 1; + return { + x: round(x * dpr) / dpr || 0, + y: round(y * dpr) / dpr || 0 + }; } -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/events/country.js +function mapToStyles(_ref2) { + var _Object$assign2; + var popper = _ref2.popper, + popperRect = _ref2.popperRect, + placement = _ref2.placement, + variation = _ref2.variation, + offsets = _ref2.offsets, + position = _ref2.position, + gpuAcceleration = _ref2.gpuAcceleration, + adaptive = _ref2.adaptive, + roundOffsets = _ref2.roundOffsets, + isFixed = _ref2.isFixed; + var _offsets$x = offsets.x, + x = _offsets$x === void 0 ? 0 : _offsets$x, + _offsets$y = offsets.y, + y = _offsets$y === void 0 ? 0 : _offsets$y; -class Country { - constructor() { - this._onCountryChange = new dist/* SimpleEventDispatcher */.IL(); - this._country = ""; - this._field = null; - // Run only if it is a Page with a Country field - this._field = document.getElementById("en__field_supporter_country"); - if (!this._field) { - return; - } - document.addEventListener("change", (e) => { - const element = e.target; - if (element && element.name == "supporter.country") { - this.country = element.value; - } - }); - // Set the country to the current value on the field - this.country = engrid_ENGrid.getFieldValue("supporter.country"); - } - static getInstance() { - if (!Country.instance) { - Country.instance = new Country(); - } - return Country.instance; - } - get countryField() { - return this._field; - } - get onCountryChange() { - return this._onCountryChange.asEvent(); - } - get country() { - return this._country; + var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({ + x: x, + y: y + }) : { + x: x, + y: y + }; + + x = _ref3.x; + y = _ref3.y; + var hasX = offsets.hasOwnProperty('x'); + var hasY = offsets.hasOwnProperty('y'); + var sideX = left; + var sideY = enums_top; + var win = window; + + if (adaptive) { + var offsetParent = getOffsetParent(popper); + var heightProp = 'clientHeight'; + var widthProp = 'clientWidth'; + + if (offsetParent === getWindow(popper)) { + offsetParent = getDocumentElement(popper); + + if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') { + heightProp = 'scrollHeight'; + widthProp = 'scrollWidth'; + } + } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it + + + offsetParent = offsetParent; + + if (placement === enums_top || (placement === left || placement === right) && variation === end) { + sideY = bottom; + var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing] + offsetParent[heightProp]; + y -= offsetY - popperRect.height; + y *= gpuAcceleration ? 1 : -1; } - // Every time we set a country, trigger the onCountryChange event - set country(value) { - this._country = value; - this._onCountryChange.dispatch(this._country); + + if (placement === left || (placement === enums_top || placement === bottom) && variation === end) { + sideX = right; + var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing] + offsetParent[widthProp]; + x -= offsetX - popperRect.width; + x *= gpuAcceleration ? 1 : -1; } + } + + var commonStyles = Object.assign({ + position: position + }, adaptive && unsetSides); + + var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ + x: x, + y: y + }, getWindow(popper)) : { + x: x, + y: y + }; + + x = _ref4.x; + y = _ref4.y; + + if (gpuAcceleration) { + var _Object$assign; + + return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); + } + + return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2)); } -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/events/index.js +function computeStyles(_ref5) { + var state = _ref5.state, + options = _ref5.options; + var _options$gpuAccelerat = options.gpuAcceleration, + gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, + _options$adaptive = options.adaptive, + adaptive = _options$adaptive === void 0 ? true : _options$adaptive, + _options$roundOffsets = options.roundOffsets, + roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; + var commonStyles = { + placement: getBasePlacement(state.placement), + variation: getVariation(state.placement), + popper: state.elements.popper, + popperRect: state.rects.popper, + gpuAcceleration: gpuAcceleration, + isFixed: state.options.strategy === 'fixed' + }; + if (state.modifiersData.popperOffsets != null) { + state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.popperOffsets, + position: state.options.strategy, + adaptive: adaptive, + roundOffsets: roundOffsets + }))); + } + if (state.modifiersData.arrow != null) { + state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.arrow, + position: 'absolute', + adaptive: false, + roundOffsets: roundOffsets + }))); + } + state.attributes.popper = Object.assign({}, state.attributes.popper, { + 'data-popper-placement': state.placement + }); +} // eslint-disable-next-line import/no-unused-modules +/* harmony default export */ const modifiers_computeStyles = ({ + name: 'computeStyles', + enabled: true, + phase: 'beforeWrite', + fn: computeStyles, + data: {} +}); +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/modifiers/applyStyles.js + // This modifier takes the styles prepared by the `computeStyles` modifier +// and applies them to the HTMLElements such as popper and arrow -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/app.js +function applyStyles(_ref) { + var state = _ref.state; + Object.keys(state.elements).forEach(function (name) { + var style = state.styles[name] || {}; + var attributes = state.attributes[name] || {}; + var element = state.elements[name]; // arrow is optional + virtual elements + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } // Flow doesn't support to extend this property, but it's the most + // effective way to apply styles to an HTMLElement + // $FlowFixMe[cannot-write] -class App extends engrid_ENGrid { - constructor(options) { - super(); - // Events - this._form = en_form_EnForm.getInstance(); - this._fees = ProcessingFees.getInstance(); - this._amount = DonationAmount.getInstance("transaction.donationAmt", "transaction.donationAmt.other"); - this._frequency = DonationFrequency.getInstance(); - this._country = Country.getInstance(); - this.logger = new logger_EngridLogger("App", "black", "white", "🍏"); - const loader = new Loader(); - this.options = Object.assign(Object.assign({}, OptionsDefaults), options); - // Add Options to window - window.EngridOptions = this.options; - this._dataLayer = DataLayer.getInstance(); - // If there's a ?pbedit query string, redirect to the page builder to edit on EN - if (engrid_ENGrid.getUrlParameter("pbedit") === true || - engrid_ENGrid.getUrlParameter("pbedit") === "true") { - window.location.href = `https://${engrid_ENGrid.getDataCenter()}.engagingnetworks.app/index.html#pages/${engrid_ENGrid.getPageID()}/edit`; - return; - } - if (loader.reload()) - return; - // Turn Debug ON if you use local assets - if (engrid_ENGrid.getBodyData("assets") === "local" && - engrid_ENGrid.getUrlParameter("debug") !== "false" && - engrid_ENGrid.getUrlParameter("debug") !== "log") { - window.EngridOptions.Debug = true; - } - // Document Load - if (document.readyState !== "loading") { - this.run(); - } - else { - document.addEventListener("DOMContentLoaded", () => { - this.run(); - }); - } - // Window Resize - window.onresize = () => { - this.onResize(); - }; - } - run() { - if (!engrid_ENGrid.checkNested(window.EngagingNetworks, "require", "_defined", "enjs")) { - this.logger.danger("Engaging Networks JS Framework NOT FOUND"); - setTimeout(() => { - this.run(); - }, 100); - return; - } - // If there's an option object on the page, override the defaults - if (window.hasOwnProperty("EngridPageOptions")) { - this.options = Object.assign(Object.assign({}, this.options), window.EngridPageOptions); - // Add Options to window - window.EngridOptions = this.options; - } - // If there's no pageJson.pageType, add a big red warning to the console - if (!engrid_ENGrid.checkNested(window, "pageJson", "pageType")) { - window.setTimeout(() => { - console.log("%c ⛔️ pageJson.pageType NOT FOUND - Go to the Account Settings and Expose the Transaction Details %s", "background-color: red; color: white; font-size: 22px; font-weight: bold;", "https://knowledge.engagingnetworks.net/datareports/expose-transaction-details-pagejson"); - }, 2000); - } - if (this.options.Debug || App.getUrlParameter("debug") == "true") - // Enable debug if available is the first thing - App.setBodyData("debug", ""); - new Advocacy(); - new InputPlaceholders(); - new InputHasValueAndFocus(); - // Give By Select - new GiveBySelect(); - new ShowHideRadioCheckboxes("transaction.giveBySelect", "giveBySelect-"); - new ShowHideRadioCheckboxes("transaction.inmem", "inmem-"); - new ShowHideRadioCheckboxes("transaction.recurrpay", "recurrpay-"); - new ShowHideRadioCheckboxes("transaction.shipenabled", "shipenabled-"); - // Automatically show/hide all radios - let radioFields = []; - const allRadios = document.querySelectorAll("input[type=radio]"); - allRadios.forEach((radio) => { - if ("name" in radio && radioFields.includes(radio.name) === false) { - radioFields.push(radio.name); - } - }); - radioFields.forEach((field) => { - new ShowHideRadioCheckboxes(field, "engrid__" + field.replace(/\./g, "") + "-"); - }); - // Automatically show/hide all checkboxes - const allCheckboxes = document.querySelectorAll("input[type=checkbox]"); - allCheckboxes.forEach((checkbox) => { - if ("name" in checkbox) { - new ShowHideRadioCheckboxes(checkbox.name, "engrid__" + checkbox.name.replace(/\./g, "") + "-"); - } - }); - // Client onSubmit and onError functions - this._form.onIntentSubmit.subscribe(() => this.onIntentSubmit()); - this._form.onSubmit.subscribe(() => this.onSubmit()); - this._form.onError.subscribe(() => this.onError()); - this._form.onValidate.subscribe(() => this.onValidate()); - // Event Listener Examples - this._amount.onAmountChange.subscribe((s) => this.logger.success(`Live Amount: ${s}`)); - this._frequency.onFrequencyChange.subscribe((s) => { - this.logger.success(`Live Frequency: ${s}`); - setTimeout(() => { - this._amount.load(); - }, 150); - }); - this._form.onSubmit.subscribe((s) => this.logger.success("Submit: " + JSON.stringify(s))); - this._form.onError.subscribe((s) => this.logger.danger("Error: " + JSON.stringify(s))); - this._country.onCountryChange.subscribe((s) => this.logger.success(`Country: ${s}`)); - window.enOnSubmit = () => { - this._form.submit = true; - this._form.submitPromise = false; - this._form.dispatchIntentSubmit(); - this._form.dispatchSubmit(); - engrid_ENGrid.watchForError(engrid_ENGrid.enableSubmit); - if (!this._form.submit) - return false; - if (this._form.submitPromise) - return this._form.submitPromise; - this.logger.success("enOnSubmit Success"); - // If all validation passes, we'll watch for Digital Wallets Errors, which - // will not reload the page (thanks EN), so we will enable the submit button if - // an error is programmatically thrown by the Digital Wallets - return true; - }; - window.enOnError = () => { - this._form.dispatchError(); - }; - window.enOnValidate = () => { - this._form.validate = true; - this._form.validatePromise = false; - this._form.dispatchValidate(); - if (!this._form.validate) - return false; - if (this._form.validatePromise) - return this._form.validatePromise; - this.logger.success("Validation Passed"); - return true; - }; - new DataAttributes(); - // Country Redirect - new CountryRedirect(); - // iFrame Logic - new iFrame(); - // Live Variables - new LiveVariables(this.options); - // Dynamically set Recurrency Frequency - new setRecurrFreq(); - // Upsell Checkbox - new UpsellCheckbox(); - // Upsell Lightbox - new UpsellLightbox(); - // Amount Labels - new AmountLabel(); - // Engrid Data Replacement - new DataReplace(); - // ENgrid Hide Script - new DataHide(); - // Autosubmit script - new Autosubmit(); - // Adjust display of event tickets. - new EventTickets(); - // StickyNSG - Must load before SwapAmounts - new StickyNSG(); - // Swap Amounts - new SwapAmounts(); - // On the end of the script, after all subscribers defined, let's load the current frequency - // The amount will be loaded by the frequency change event - // This timeout is needed because when you have alternative amounts, EN is slower than Engrid - // about 20% of the time and we get a race condition if the client is also using the SwapAmounts feature - window.setTimeout(() => { - this._frequency.load(); - }, 1000); - // Fast Form Fill - new FastFormFill(); - // Currency Related Components - new LiveCurrency(); - new CustomCurrency(); - // Auto Country Select - new AutoCountrySelect(); - // Add Image Attribution - if (this.options.MediaAttribution) - new MediaAttribution(); - // Apple Pay - if (this.options.applePay) - new ApplePay(); - // Capitalize Fields - if (this.options.CapitalizeFields) - new CapitalizeFields(); - // Auto Year Class - if (this.options.AutoYear) - new AutoYear(); - // Autocomplete Class - new Autocomplete(); - // Ecard Class - new Ecard(); - // Click To Expand - if (this.options.ClickToExpand) - new ClickToExpand(); - if (this.options.SkipToMainContentLink) - new SkipToMainContentLink(); - if (this.options.SrcDefer) - new SrcDefer(); - // Progress Bar - if (this.options.ProgressBar) - new ProgressBar(); - // RememberMe - try { - // Accessing window.localStorage will throw an exception if it isn't permitted due to security reasons - // For example, this happens in Firefox when cookies are disabled. If it isn't available, we shouldn't - // bother with enabling RememberMe - if (this.options.RememberMe && - typeof this.options.RememberMe === "object" && - window.localStorage) { - new RememberMe(this.options.RememberMe); - } - } - catch (e) { } - if (this.options.NeverBounceAPI) - new NeverBounce(this.options.NeverBounceAPI, this.options.NeverBounceDateField, this.options.NeverBounceStatusField, this.options.NeverBounceDateFormat); - // FreshAddress - if (this.options.FreshAddress) - new FreshAddress(); - new ShowIfAmount(); - new OtherAmount(); - new MinMaxAmount(); - new Ticker(); - new A11y(); - new AddNameToMessage(); - new ExpandRegionName(); - // Page Background - new PageBackground(); - // Url Params to Form Fields - new UrlToForm(); - // Required if Visible Fields - new RequiredIfVisible(); - // EN Custom Validators (behind a feature flag, off by default) - new ENValidators(); - //Debug hidden fields - if (this.options.Debug) - new DebugHiddenFields(); - // TidyContact - if (this.options.TidyContact) - new TidyContact(); - // Translate Fields - if (this.options.TranslateFields) - new TranslateFields(); - // Country Disable - new CountryDisable(); - // Premium Gift Features - new PremiumGift(); - // Custom Premium filtering (frequency/amount-based visibility) - new CustomPremium(); - // Supporter Hub Features - new SupporterHub(); - // Digital Wallets Features - if (engrid_ENGrid.getPageType() === "DONATION") { - new DigitalWallets(); - new PreferredPaymentMethod(); - } - // Mobile CTA - new MobileCTA(); - // Live Frequency - new LiveFrequency(); - // Universal Opt In - new UniversalOptIn(); - new StripeFinancialConnections(); - //Exit Intent Lightbox - new ExitIntentLightbox(); - new UrlParamsToBodyAttrs(); - new SetAttr(); - new ShowIfPresent(); - new PostalCodeValidator(); - // Very Good Security - new VGS(); - new WelcomeBack(); - new EcardToTarget(); - new UsOnlyForm(); - new ThankYouPageConditionalContent(); - new EmbeddedEcard(); - new CheckboxLabel(); - new PostDonationEmbed(); - new FrequencyUpsell(); - new StickyPrepopulation(); - //Debug panel - let showDebugPanel = this.options.Debug; - try { - // accessing storage can throw an exception if it isn't available in Firefox - if (!showDebugPanel && - window.sessionStorage.hasOwnProperty(DebugPanel.debugSessionStorageKey)) { - showDebugPanel = true; - } - } - catch (e) { } - if (showDebugPanel) { - new DebugPanel(this.options.PageLayouts); - } - if (engrid_ENGrid.getUrlParameter("development") === "branding") { - new BrandingHtml().show(); - } - engrid_ENGrid.setBodyData("js-loading", "finished"); - window.EngridVersion = AppVersion; - this.logger.success(`VERSION: ${AppVersion}`); - // Window Load - let onLoad = typeof window.onload === "function" ? window.onload : null; - if (document.readyState !== "loading") { - this.onLoad(); - } - else { - window.onload = (e) => { - this.onLoad(); - if (onLoad) { - onLoad.bind(window, e); - } - }; - } - } - onLoad() { - if (this.options.onLoad) { - this.options.onLoad(); - } - } - onResize() { - if (this.options.onResize) { - this.options.onResize(); - } - } - onValidate() { - if (this.options.onValidate) { - this.logger.log("Client onValidate Triggered"); - this.options.onValidate(); - } - } - onIntentSubmit() { - if (this.options.onIntentSubmit) { - this.logger.log("Client onIntentSubmit Triggered"); - this.options.onIntentSubmit(); - } - } - onSubmit() { - if (this.options.onSubmit) { - this.logger.log("Client onSubmit Triggered"); - this.options.onSubmit(); - } - } - onError() { - if (this.options.onError) { - this.logger.danger("Client onError Triggered"); - this.options.onError(); - } - } - static log(message) { - const logger = new logger_EngridLogger("Client", "brown", "aliceblue", "🍪"); - logger.log(message); - } -} -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/amount-label.js -// This script checks if the donations amounts are numbers and if they are, appends the correct currency symbol + Object.assign(element.style, style); + Object.keys(attributes).forEach(function (name) { + var value = attributes[name]; -class AmountLabel { - constructor() { - this._frequency = DonationFrequency.getInstance(); - if (!this.shouldRun()) { - // If we're not on a Donation Page, get out - return; - } - this._frequency.onFrequencyChange.subscribe((s) => window.setTimeout(this.fixAmountLabels.bind(this), 100)); - // Run the main function on page load so we can analyze the amounts of the current frequency - window.setTimeout(this.fixAmountLabels.bind(this), 300); - } - // Should we run the script? - shouldRun() { - return !!(engrid_ENGrid.getPageType() === "DONATION" && - engrid_ENGrid.getOption("AddCurrencySymbol")); - } - // Fix Amount Labels - fixAmountLabels() { - let amounts = document.querySelectorAll(".en__field--donationAmt label"); - const currencySymbol = engrid_ENGrid.getCurrencySymbol() || ""; - amounts.forEach((element) => { - const amountText = element.innerText.replace(/,/g, "").replace(/\./g, ""); - if (!isNaN(amountText)) { - element.innerText = currencySymbol + element.innerText; - } - }); - } + if (value === false) { + element.removeAttribute(name); + } else { + element.setAttribute(name, value === true ? '' : value); + } + }); + }); } -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/apple-pay.js -var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); +function applyStyles_effect(_ref2) { + var state = _ref2.state; + var initialStyles = { + popper: { + position: state.options.strategy, + left: '0', + top: '0', + margin: '0' + }, + arrow: { + position: 'absolute' + }, + reference: {} + }; + Object.assign(state.elements.popper.style, initialStyles.popper); + state.styles = initialStyles; + + if (state.elements.arrow) { + Object.assign(state.elements.arrow.style, initialStyles.arrow); + } + + return function () { + Object.keys(state.elements).forEach(function (name) { + var element = state.elements[name]; + var attributes = state.attributes[name] || {}; + var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them + + var style = styleProperties.reduce(function (style, property) { + style[property] = ''; + return style; + }, {}); // arrow is optional + virtual elements + + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } + + Object.assign(element.style, style); + Object.keys(attributes).forEach(function (attribute) { + element.removeAttribute(attribute); + }); }); + }; +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ const modifiers_applyStyles = ({ + name: 'applyStyles', + enabled: true, + phase: 'write', + fn: applyStyles, + effect: applyStyles_effect, + requires: ['computeStyles'] +}); +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/modifiers/offset.js + + // eslint-disable-next-line import/no-unused-modules + +function distanceAndSkiddingToXY(placement, rects, offset) { + var basePlacement = getBasePlacement(placement); + var invertDistance = [left, enums_top].indexOf(basePlacement) >= 0 ? -1 : 1; + + var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, { + placement: placement + })) : offset, + skidding = _ref[0], + distance = _ref[1]; + + skidding = skidding || 0; + distance = (distance || 0) * invertDistance; + return [left, right].indexOf(basePlacement) >= 0 ? { + x: distance, + y: skidding + } : { + x: skidding, + y: distance + }; +} + +function offset(_ref2) { + var state = _ref2.state, + options = _ref2.options, + name = _ref2.name; + var _options$offset = options.offset, + offset = _options$offset === void 0 ? [0, 0] : _options$offset; + var data = enums_placements.reduce(function (acc, placement) { + acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset); + return acc; + }, {}); + var _data$state$placement = data[state.placement], + x = _data$state$placement.x, + y = _data$state$placement.y; + + if (state.modifiersData.popperOffsets != null) { + state.modifiersData.popperOffsets.x += x; + state.modifiersData.popperOffsets.y += y; + } + + state.modifiersData[name] = data; +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ const modifiers_offset = ({ + name: 'offset', + enabled: true, + phase: 'main', + requires: ['popperOffsets'], + fn: offset +}); +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js +var hash = { + left: 'right', + right: 'left', + bottom: 'top', + top: 'bottom' +}; +function getOppositePlacement(placement) { + return placement.replace(/left|right|bottom|top/g, function (matched) { + return hash[matched]; + }); +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js +var getOppositeVariationPlacement_hash = { + start: 'end', + end: 'start' }; +function getOppositeVariationPlacement(placement) { + return placement.replace(/start|end/g, function (matched) { + return getOppositeVariationPlacement_hash[matched]; + }); +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js -/*global window */ -const ApplePaySession = window.ApplePaySession; -const merchantIdentifier = window.merchantIdentifier; -const merchantDomainName = window.merchantDomainName; -const merchantDisplayName = window.merchantDisplayName; -const merchantSessionIdentifier = window.merchantSessionIdentifier; -const merchantNonce = window.merchantNonce; -const merchantEpochTimestamp = window.merchantEpochTimestamp; -const merchantSignature = window.merchantSignature; -const merchantCountryCode = window.merchantCountryCode; -const merchantCurrencyCode = window.merchantCurrencyCode; -const merchantSupportedNetworks = window.merchantSupportedNetworks; -const merchantCapabilities = window.merchantCapabilities; -const merchantTotalLabel = window.merchantTotalLabel; -class ApplePay { - constructor() { - this.applePay = document.querySelector('.en__field__input.en__field__input--radio[value="applepay"]'); - this._amount = DonationAmount.getInstance(); - this._fees = ProcessingFees.getInstance(); - this._form = en_form_EnForm.getInstance(); - this.checkApplePay(); - } - checkApplePay() { - return __awaiter(this, void 0, void 0, function* () { - const pageform = document.querySelector("form.en__component--page"); - if (!this.applePay || !window.hasOwnProperty("ApplePaySession")) { - const applePayContainer = document.querySelector(".en__field__item.applepay"); - if (applePayContainer) - applePayContainer.remove(); - if (engrid_ENGrid.debug) - console.log("Apple Pay DISABLED"); - return false; - } - const promise = ApplePaySession.canMakePaymentsWithActiveCard(merchantIdentifier); - let applePayEnabled = false; - yield promise.then((canMakePayments) => { - applePayEnabled = canMakePayments; - if (canMakePayments) { - let input = document.createElement("input"); - input.setAttribute("type", "hidden"); - input.setAttribute("name", "PkPaymentToken"); - input.setAttribute("id", "applePayToken"); - pageform.appendChild(input); - this._form.onSubmit.subscribe(() => this.onPayClicked()); - } - }); - if (engrid_ENGrid.debug) - console.log("applePayEnabled", applePayEnabled); - let applePayWrapper = this.applePay.closest(".en__field__item"); - if (applePayEnabled) { - // Set Apple Pay Class - applePayWrapper === null || applePayWrapper === void 0 ? void 0 : applePayWrapper.classList.add("applePayWrapper"); - } - else { - // Hide Apple Pay Wrapper - if (applePayWrapper) - applePayWrapper.style.display = "none"; - } - return applePayEnabled; - }); + + + +function getViewportRect(element, strategy) { + var win = getWindow(element); + var html = getDocumentElement(element); + var visualViewport = win.visualViewport; + var width = html.clientWidth; + var height = html.clientHeight; + var x = 0; + var y = 0; + + if (visualViewport) { + width = visualViewport.width; + height = visualViewport.height; + var layoutViewport = isLayoutViewport(); + + if (layoutViewport || !layoutViewport && strategy === 'fixed') { + x = visualViewport.offsetLeft; + y = visualViewport.offsetTop; } - performValidation(url) { - return new Promise(function (resolve, reject) { - var merchantSession = {}; - merchantSession.merchantIdentifier = merchantIdentifier; - merchantSession.merchantSessionIdentifier = merchantSessionIdentifier; - merchantSession.nonce = merchantNonce; - merchantSession.domainName = merchantDomainName; - merchantSession.epochTimestamp = merchantEpochTimestamp; - merchantSession.signature = merchantSignature; - var validationData = "&merchantIdentifier=" + - merchantIdentifier + - "&merchantDomain=" + - merchantDomainName + - "&displayName=" + - merchantDisplayName; - var validationUrl = "/ea-dataservice/rest/applepay/validateurl?url=" + url + validationData; - var xhr = new XMLHttpRequest(); - xhr.onload = function () { - var data = JSON.parse(this.responseText); - if (engrid_ENGrid.debug) - console.log("Apple Pay Validation", data); - resolve(data); - }; - xhr.onerror = reject; - xhr.open("GET", validationUrl); - xhr.send(); - }); - } - log(name, msg) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", "/ea-dataservice/rest/applepay/log?name=" + name + "&msg=" + msg); - xhr.send(); - } - sendPaymentToken(token) { - return new Promise(function (resolve, reject) { - resolve(true); - }); - } - onPayClicked() { - if (!this._form.submit) - return; - const enFieldPaymentType = document.querySelector("#en__field_transaction_paymenttype"); - const applePayToken = document.getElementById("applePayToken"); - const formClass = this._form; - // Only work if Payment Type is Apple Pay - if (enFieldPaymentType.value == "applepay" && applePayToken.value == "") { - try { - let donationAmount = this._amount.amount + this._fees.fee; - var request = { - supportedNetworks: merchantSupportedNetworks, - merchantCapabilities: merchantCapabilities, - countryCode: merchantCountryCode, - currencyCode: merchantCurrencyCode, - total: { - label: merchantTotalLabel, - amount: donationAmount, - }, - }; - var session = new ApplePaySession(1, request); - var thisClass = this; - session.onvalidatemerchant = function (event) { - thisClass - .performValidation(event.validationURL) - .then(function (merchantSession) { - if (engrid_ENGrid.debug) - console.log("Apple Pay merchantSession", merchantSession); - session.completeMerchantValidation(merchantSession); - }); - }; - session.onpaymentauthorized = function (event) { - thisClass - .sendPaymentToken(event.payment.token) - .then(function (success) { - if (engrid_ENGrid.debug) - console.log("Apple Pay Token", event.payment.token); - document.getElementById("applePayToken").value = JSON.stringify(event.payment.token); - formClass.submitForm(); - }); - }; - session.oncancel = function (event) { - if (engrid_ENGrid.debug) - console.log("Cancelled", event); - alert("You cancelled. Sorry it didn't work out."); - formClass.dispatchError(); - }; - session.begin(); - this._form.submit = false; - return false; - } - catch (e) { - alert("Developer mistake: '" + e.message + "'"); - formClass.dispatchError(); - } - } - this._form.submit = true; - return true; - } -} + } -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/a11y.js -// a11y means accessibility -// This Component is supposed to be used as a helper for Aria Attributes & Other Accessibility Features -class A11y { - constructor() { - this.addRequired(); - this.addLabel(); - this.addGroupRole(); - this.updateFrequencyLabel(); - const ecardImages = document.querySelectorAll('.en__ecarditems__list img'); - this.setAutoGeneratedAltTags(ecardImages); - this.manageErrorListAlertRole(); - } - addGroupRole() { - // Add role="group" to all EN Radio fields - const radioFields = document.querySelectorAll(".en__field--radio"); - radioFields.forEach((field) => { - field.setAttribute("role", "group"); - // Add random ID to the label - const label = field.querySelector("label"); - if (label) { - label.setAttribute("id", `en__field__label--${Math.random().toString(36).slice(2, 7)}`); - field.setAttribute("aria-labelledby", label.id); - } - }); - } - addRequired() { - const mandatoryFields = document.querySelectorAll(".en__mandatory .en__field__input"); - mandatoryFields.forEach((field) => { - field.setAttribute("aria-required", "true"); - }); - } - addLabel() { - const otherAmount = document.querySelector(".en__field__input--otheramount"); - if (otherAmount) { - otherAmount.setAttribute("aria-label", "Enter your custom donation amount"); - } - // Split selects usually don't have a label, so let's make the first option the label - const splitSelects = document.querySelectorAll(".en__field__input--splitselect"); - splitSelects.forEach((select) => { - var _a, _b, _c, _d; - const firstOption = select.querySelector("option"); - if (firstOption && - firstOption.value === "" && - !((_b = (_a = firstOption.textContent) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === null || _b === void 0 ? void 0 : _b.includes("select")) && - !((_d = (_c = firstOption.textContent) === null || _c === void 0 ? void 0 : _c.toLowerCase()) === null || _d === void 0 ? void 0 : _d.includes("choose"))) { - select.setAttribute("aria-label", firstOption.textContent || ""); - } - }); - } - // Update the label for the frequency field based on the selected radio button - updateFrequencyLabel() { - const frequencyLabels = document.querySelectorAll('div.en__field__item input[id^="en__field_transaction_recurrfreq"]'); - const frequencyMainLabel = document.querySelector('label[for="en__field_transaction_recurrfreq"]'); - frequencyLabels.forEach((item) => { - if (item) { - // Set the label for the checked item on load - if (item.checked) { - frequencyMainLabel === null || frequencyMainLabel === void 0 ? void 0 : frequencyMainLabel.setAttribute('for', item.id); - } - // Then, detect if it changes with the click event - item.addEventListener('click', () => { - let frequencyId = item.id; - frequencyMainLabel === null || frequencyMainLabel === void 0 ? void 0 : frequencyMainLabel.setAttribute('for', frequencyId); - }); - } - }); - } - setAutoGeneratedAltTags(images) { - images.forEach((img) => { - var _a; - // Skip if the alt tag is already set - if (img.alt) - return; - try { - // Extract the filename from the `src` attribute - const src = img.src; - if (!src) - throw new Error("Image src is null or undefined"); - const url = new URL(src); - const fileNameWithExtension = url.pathname.split('/').pop(); - if (!fileNameWithExtension) - throw new Error("No filename found in src"); - // Remove the file extension and replace `-` and `_` with spaces - let altText = ((_a = fileNameWithExtension.split('.').shift()) === null || _a === void 0 ? void 0 : _a.replace(/[-_]/g, ' ')) || ''; - // Remove dimensions (#x#) and anything that follows - altText = altText.replace(/\d+x\d+.*$/, '').trim(); - // Wrap in the disclaimer - altText = `This is an auto-generated alt tag from the filename: ${altText}`; - // Set the generated alt text on the image - img.alt = altText; - } - catch (error) { - console.error(`Error processing image: ${img.src}`, error); - } - }); - } - manageErrorListAlertRole() { - const errorList = document.querySelector('ul.en__errorList'); - if (!errorList) - return; - const hasErrorItems = () => Boolean(errorList.querySelector('li')); - const enableAlert = () => { - if (!errorList.hasAttribute('role')) { - errorList.setAttribute('role', 'alert'); - } - }; - const disableAlert = () => { - if (errorList.hasAttribute('role')) { - errorList.removeAttribute('role'); - } - }; - hasErrorItems() ? enableAlert() : disableAlert(); - new MutationObserver(records => { - for (const record of records) { - if (record.type === 'childList') { - hasErrorItems() ? enableAlert() : disableAlert(); - break; - } - } - }).observe(errorList, { childList: true }); - } + return { + width: width, + height: height, + x: x + getWindowScrollBarX(element), + y: y + }; } +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/capitalize-fields.js -// CapitalizeFields is a class that capitalizes the first letter of the fields passed to it. -// It subscribes to the onSubmit event of the EnForm class and capitalizes the fields on submit. -class CapitalizeFields { - constructor() { - this._form = en_form_EnForm.getInstance(); - this._form.onSubmit.subscribe(() => this.capitalizeFields("en__field_supporter_firstName", "en__field_supporter_lastName", "en__field_supporter_address1", "en__field_supporter_city")); - } - capitalizeFields(...fields) { - fields.forEach((f) => this.capitalize(f)); - } - capitalize(f) { - let field = document.getElementById(f); - if (field) { - field.value = field.value.replace(/\w\S*/g, (w) => w.replace(/^\w/, (c) => c.toUpperCase())); - if (engrid_ENGrid.debug) - console.log("Capitalized", field.value); - } - return true; - } -} -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/auto-year.js -// This class changes the Credit Card Expiration Year Field Options to -// include the current year and the next 19 years. -class AutoYear { - constructor() { - this.yearField = document.querySelector("select[name='transaction.ccexpire']:not(#en__field_transaction_ccexpire)"); - this.years = 20; - this.yearLength = 2; - if (this.yearField) { - this.clearFieldOptions(); - for (let i = 0; i < this.years; i++) { - const year = new Date().getFullYear() + i; - const newOption = document.createElement("option"); - const optionText = document.createTextNode(year.toString()); - newOption.appendChild(optionText); - newOption.value = - this.yearLength == 2 ? year.toString().substr(-2) : year.toString(); - this.yearField.appendChild(newOption); - } - } - } - clearFieldOptions() { - if (this.yearField) { - this.yearLength = - this.yearField.options[this.yearField.options.length - 1].value.length; - [...this.yearField.options].forEach((option) => { - var _a; - if (option.value !== "" && !isNaN(Number(option.value))) { - // @ts-ignore - const index = [...this.yearField.options].findIndex((i) => i.value === option.value); - (_a = this.yearField) === null || _a === void 0 ? void 0 : _a.remove(index); - } - }); - } - } -} + // Gets the entire size of the scrollable document area, even extending outside +// of the `` and `` rect bounds if horizontally scrollable -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/autocomplete.js -// This class adds the autocomplete attribute to -// the most common input elements +function getDocumentRect(element) { + var _element$ownerDocumen; -class Autocomplete { - constructor() { - this.logger = new logger_EngridLogger("Autocomplete", "#330033", "#f0f0f0", "📇"); - this.autoCompleteField('[name="supporter.firstName"]', "given-name"); - this.autoCompleteField('[name="supporter.lastName"]', "family-name"); - this.autoCompleteField("#en__field_transaction_ccexpire", "cc-exp-month"); - this.autoCompleteField('[name="transaction.ccexpire"]:not(#en__field_transaction_ccexpire)', "cc-exp-year"); - this.autoCompleteField('[name="supporter.emailAddress"]', "email"); - this.autoCompleteField('[name="supporter.phoneNumber"]', "tel"); - this.autoCompleteField('[name="supporter.country"]', "country"); - this.autoCompleteField('[name="supporter.address1"]', "address-line1"); - this.autoCompleteField('[name="supporter.address2"]', "address-line2"); - this.autoCompleteField('[name="supporter.city"]', "address-level2"); - this.autoCompleteField('[name="supporter.region"]', "address-level1"); - this.autoCompleteField('[name="supporter.postcode"]', "postal-code"); - // Ignore Autocomplete on the Recipient Email Field & Address ("none" is intentional because "off" doesn't work) - this.autoCompleteField('[name="transaction.honname"]', "none"); - this.autoCompleteField('[name="transaction.infemail"]', "none"); - this.autoCompleteField('[name="transaction.infname"]', "none"); - this.autoCompleteField('[name="transaction.infadd1"]', "none"); - this.autoCompleteField('[name="transaction.infadd2"]', "none"); - this.autoCompleteField('[name="transaction.infcity"]', "none"); - this.autoCompleteField('[name="transaction.infpostcd"]', "none"); - } - autoCompleteField(querySelector, autoCompleteValue) { - let field = document.querySelector(querySelector); - if (field) { - field.autocomplete = autoCompleteValue; - return true; - } - if (autoCompleteValue !== "none") - this.logger.log("Field Not Found", querySelector); - return false; - } -} + var html = getDocumentElement(element); + var winScroll = getWindowScroll(element); + var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; + var width = math_max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); + var height = math_max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); + var x = -winScroll.scrollLeft + getWindowScrollBarX(element); + var y = -winScroll.scrollTop; -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/ecard.js + if (getComputedStyle(body || html).direction === 'rtl') { + x += math_max(html.clientWidth, body ? body.clientWidth : 0) - width; + } -class Ecard { - constructor() { - this._form = en_form_EnForm.getInstance(); - this.logger = new logger_EngridLogger("Ecard", "red", "#f5f5f5", "🪪"); - if (!this.shouldRun()) - return; - this._form.onValidate.subscribe(() => this.checkRecipientFields()); - const schedule = engrid_ENGrid.getUrlParameter("engrid_ecard.schedule"); - const scheduleField = engrid_ENGrid.getField("ecard.schedule"); - const name = engrid_ENGrid.getUrlParameter("engrid_ecard.name"); - const nameField = document.querySelector(".en__ecardrecipients__name input"); - const email = engrid_ENGrid.getUrlParameter("engrid_ecard.email"); - const emailField = document.querySelector(".en__ecardrecipients__email input"); - if (schedule && scheduleField) { - // Check if chedule date is in the past - const scheduleDate = new Date(schedule.toString()); - const today = new Date(); - if (scheduleDate.setHours(0, 0, 0, 0) < today.setHours(0, 0, 0, 0)) { - // If it is, set the schedule to today - scheduleField.value = engrid_ENGrid.formatDate(today, "YYYY-MM-DD"); - } - else { - // Otherwise, set the schedule to the date provided - scheduleField.value = schedule.toString(); - } - this.logger.log("Schedule set to " + scheduleField.value); - } - if (name && nameField) { - nameField.value = name.toString(); - this.logger.log("Name set to " + nameField.value); - } - if (email && emailField) { - emailField.value = email.toString(); - this.logger.log("Email set to " + emailField.value); - } - // Replace the Future Delivery Label with a H2 - const futureDeliveryLabel = document.querySelector(".en__ecardrecipients__futureDelivery label"); - if (futureDeliveryLabel) { - const futureDeliveryH2 = document.createElement("h2"); - futureDeliveryH2.innerText = futureDeliveryLabel.innerText; - futureDeliveryLabel.replaceWith(futureDeliveryH2); - } - if (emailField) { - emailField.setAttribute("type", "email"); - emailField.setAttribute("autocomplete", "off"); - } - } - shouldRun() { - return engrid_ENGrid.getPageType() === "ECARD"; - } - checkRecipientFields() { - const addRecipientButton = document.querySelector(".en__ecarditems__addrecipient"); - // If we find the "+" button and there's no hidden recipient field, click on the button - if (addRecipientButton && - !document.querySelector(".ecardrecipient__email")) { - addRecipientButton.click(); - } - return true; - } + return { + width: width, + height: height, + x: x, + y: y + }; } +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/contains.js -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/click-to-expand.js -// This class is used to expand content when a user clicks on a div with the class "click-to-expand". -// The content is shortened by default and will expand when clicked. +function contains(parent, child) { + var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method -// Works when the user has adds ".click-to-expand" as a class to any field -class ClickToExpand { - constructor() { - this.clickToExpandWrapper = document.querySelectorAll("div.click-to-expand"); - if (this.clickToExpandWrapper.length) { - this.clickToExpandWrapper.forEach((element) => { - const content = element.innerHTML; - const wrapper_html = '
' + - content + - "
"; - element.innerHTML = wrapper_html; - element.addEventListener("click", (event) => { - if (event) { - if (engrid_ENGrid.debug) - console.log("A click-to-expand div was clicked"); - element.classList.add("expanded"); - } - }); - element.addEventListener("keydown", (event) => { - if (event.key === "Enter") { - if (engrid_ENGrid.debug) - console.log("A click-to-expand div had the 'Enter' key pressed on it"); - element.classList.add("expanded"); - } - else if (event.key === " ") { - if (engrid_ENGrid.debug) - console.log("A click-to-expand div had the 'Spacebar' key pressed on it"); - element.classList.add("expanded"); - event.preventDefault(); // Prevents the page from scrolling - event.stopPropagation(); // Prevent a console error generated by LastPass https://github.com/KillerCodeMonkey/ngx-quill/issues/351#issuecomment-476017960 - } - }); - }); - } - } -} + if (parent.contains(child)) { + return true; + } // then fallback to custom implementation with Shadow DOM support + else if (rootNode && isShadowRoot(rootNode)) { + var next = child; -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/advocacy.js -// Component to handle advocacy features -// 1 - Adds EN Polyfill to support "label" clicking on Advocacy Recipient "labels" + do { + if (next && parent.isSameNode(next)) { + return true; + } // $FlowFixMe[prop-missing]: need a better way to handle this... -class Advocacy { - constructor() { - this.logger = new logger_EngridLogger("Advocacy", "#232323", "#f7b500", "👨‍⚖️"); - if (!this.shoudRun()) - return; - this.setClickableLabels(); - } - shoudRun() { - return ["ADVOCACY", "EMAILTOTARGET"].includes(engrid_ENGrid.getPageType()); - } - setClickableLabels() { - const contactItems = document.querySelectorAll(".en__contactDetails__rows"); - if (!contactItems) - return; - contactItems.forEach((contact) => { - contact.addEventListener("click", (e) => { - this.toggleCheckbox(contact); - }); - }); - } - toggleCheckbox(contact) { - const wrapper = contact.closest(".en__contactDetails"); - if (!wrapper) - return; - const checkbox = wrapper.querySelector("input[type='checkbox']"); - if (!checkbox) - return; - this.logger.log("toggleCheckbox", checkbox.checked); - checkbox.checked = !checkbox.checked; - } + + next = next.parentNode || next.host; + } while (next); + } // Give up, the result is false + + + return false; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/rectToClientRect.js +function rectToClientRect(rect) { + return Object.assign({}, rect, { + left: rect.x, + top: rect.y, + right: rect.x + rect.width, + bottom: rect.y + rect.height + }); } +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/data-attributes.js -// Component that adds data attributes to the Body -class DataAttributes { - constructor() { - this.logger = new logger_EngridLogger("Data Attribute Changed", "#FFFFFF", "#4d9068", "🛠️"); - this._country = Country.getInstance(); - this._frequency = DonationFrequency.getInstance(); - this.setDataAttributes(); - } - setDataAttributes() { - // Apple Pay Availability - if (window.hasOwnProperty("ApplePaySession")) { - engrid_ENGrid.setBodyData("apple-pay-available", "true"); - } - else { - engrid_ENGrid.setBodyData("apple-pay-available", "false"); - } - // Add the Page Type as a Data Attribute on the Body Tag - if (engrid_ENGrid.checkNested(window, "pageJson", "pageType")) { - engrid_ENGrid.setBodyData("page-type", window.pageJson.pageType); - } - // Add the currency code as a Data Attribute on the Body Tag - engrid_ENGrid.setBodyData("currency-code", engrid_ENGrid.getCurrencyCode()); - // Add a body banner data attribute if the banner contains no image or video - if (!document.querySelector(".body-banner img, .body-banner video")) { - engrid_ENGrid.setBodyData("body-banner", "empty"); - } - // Add a page-alert data attribute if it is empty - if (!document.querySelector(".page-alert *")) { - engrid_ENGrid.setBodyData("no-page-alert", ""); - } - // Add a content-header data attribute if it is empty - if (!document.querySelector(".content-header *")) { - engrid_ENGrid.setBodyData("no-content-header", ""); - } - // Add a body-headerOutside data attribute if it is empty - if (!document.querySelector(".body-headerOutside *")) { - engrid_ENGrid.setBodyData("no-body-headerOutside", ""); - } - // Add a body-header data attribute if it is empty - if (!document.querySelector(".body-header *")) { - engrid_ENGrid.setBodyData("no-body-header", ""); - } - // Add a body-title data attribute if it is empty - if (!document.querySelector(".body-title *")) { - engrid_ENGrid.setBodyData("no-body-title", ""); - } - // Add a body-banner data attribute if it is empty - if (!document.querySelector(".body-banner *")) { - engrid_ENGrid.setBodyData("no-body-banner", ""); - } - // Add a body-bannerOverlay data attribute if it is empty - if (!document.querySelector(".body-bannerOverlay *")) { - engrid_ENGrid.setBodyData("no-body-bannerOverlay", ""); - } - // Add a body-top data attribute if it is empty - if (!document.querySelector(".body-top *")) { - engrid_ENGrid.setBodyData("no-body-top", ""); - } - // Add a body-main data attribute if it is empty - if (!document.querySelector(".body-main *")) { - engrid_ENGrid.setBodyData("no-body-main", ""); - } - // Add a body-bottom data attribute if it is empty - if (!document.querySelector(".body-bottom *")) { - engrid_ENGrid.setBodyData("no-body-bottom", ""); - } - // Add a body-footer data attribute if it is empty - if (!document.querySelector(".body-footer *")) { - engrid_ENGrid.setBodyData("no-body-footer", ""); - } - // Add a body-footerOutside data attribute if it is empty - if (!document.querySelector(".body-footerOutside *")) { - engrid_ENGrid.setBodyData("no-body-footerOutside", ""); - } - // Add a content-footerSpacer data attribute if it is empty - if (!document.querySelector(".content-footerSpacer *")) { - engrid_ENGrid.setBodyData("no-content-footerSpacer", ""); - } - // Add a content-preFooter data attribute if it is empty - if (!document.querySelector(".content-preFooter *")) { - engrid_ENGrid.setBodyData("no-content-preFooter", ""); - } - // Add a content-footer data attribute if it is empty - if (!document.querySelector(".content-footer *")) { - engrid_ENGrid.setBodyData("no-content-footer", ""); - } - // Add a page-backgroundImage banner data attribute if the page background image contains no image or video - if (!document.querySelector(".page-backgroundImage img, .page-backgroundImage video")) { - engrid_ENGrid.setBodyData("no-page-backgroundImage", ""); - } - // Add a page-backgroundImageOverlay data attribute if it is empty - if (!document.querySelector(".page-backgroundImageOverlay *")) { - engrid_ENGrid.setBodyData("no-page-backgroundImageOverlay", ""); - } - // Add a page-customCode data attribute if it is empty - if (!document.querySelector(".page-customCode *")) { - engrid_ENGrid.setBodyData("no-page-customCode", ""); - } - // Add a country data attribute - if (this._country.country) { - engrid_ENGrid.setBodyData("country", this._country.country); - this._country.onCountryChange.subscribe((country) => { - engrid_ENGrid.setBodyData("country", country); - }); - } - const otherAmountDiv = document.querySelector(".en__field--donationAmt .en__field__item--other"); - if (otherAmountDiv) { - otherAmountDiv.setAttribute("data-currency-symbol", engrid_ENGrid.getCurrencySymbol()); - } - // Add a payment type data attribute - const paymentTypeSelect = engrid_ENGrid.getField("transaction.paymenttype"); - if (paymentTypeSelect) { - engrid_ENGrid.setBodyData("payment-type", paymentTypeSelect.value); - paymentTypeSelect.addEventListener("change", () => { - engrid_ENGrid.setBodyData("payment-type", paymentTypeSelect.value); - }); - } - // Footer in Viewport Check - const contentFooter = document.querySelector(".content-footer"); - if (contentFooter && engrid_ENGrid.isInViewport(contentFooter)) { - engrid_ENGrid.setBodyData("footer-above-fold", ""); - } - else { - engrid_ENGrid.setBodyData("footer-below-fold", ""); - } - // Add demo data attribute - if (engrid_ENGrid.demo) - engrid_ENGrid.setBodyData("demo", ""); - // Add data-first-page and data-last-page - if (engrid_ENGrid.getPageNumber() === 1) { - engrid_ENGrid.setBodyData("first-page", ""); - } - if (engrid_ENGrid.getPageNumber() === engrid_ENGrid.getPageCount()) { - engrid_ENGrid.setBodyData("last-page", ""); - } - // "Temporary solutions are forever, you know..." - // - Fernando Santos - // "I know, but what if we just..." - // - Bryan Casler - // Add data attribute if browser does not support :has selector - if (!CSS.supports("selector(:has(*))")) { - engrid_ENGrid.setBodyData("css-has-selector", "false"); - } - if (engrid_ENGrid.getPageType() === "DONATION") { - this.addFrequencyDataAttribute(); - this.addGiftAmountDataAttribute(); - } + + + + + + + + + + + + + +function getInnerBoundingClientRect(element, strategy) { + var rect = getBoundingClientRect(element, false, strategy === 'fixed'); + rect.top = rect.top + element.clientTop; + rect.left = rect.left + element.clientLeft; + rect.bottom = rect.top + element.clientHeight; + rect.right = rect.left + element.clientWidth; + rect.width = element.clientWidth; + rect.height = element.clientHeight; + rect.x = rect.left; + rect.y = rect.top; + return rect; +} + +function getClientRectFromMixedType(element, clippingParent, strategy) { + return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element))); +} // A "clipping parent" is an overflowable container with the characteristic of +// clipping (or hiding) overflowing elements with a position different from +// `initial` + + +function getClippingParents(element) { + var clippingParents = listScrollParents(getParentNode(element)); + var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0; + var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; + + if (!isElement(clipperElement)) { + return []; + } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414 + + + return clippingParents.filter(function (clippingParent) { + return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body'; + }); +} // Gets the maximum area that the element is visible in due to any number of +// clipping parents + + +function getClippingRect(element, boundary, rootBoundary, strategy) { + var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary); + var clippingParents = [].concat(mainClippingParents, [rootBoundary]); + var firstClippingParent = clippingParents[0]; + var clippingRect = clippingParents.reduce(function (accRect, clippingParent) { + var rect = getClientRectFromMixedType(element, clippingParent, strategy); + accRect.top = math_max(rect.top, accRect.top); + accRect.right = math_min(rect.right, accRect.right); + accRect.bottom = math_min(rect.bottom, accRect.bottom); + accRect.left = math_max(rect.left, accRect.left); + return accRect; + }, getClientRectFromMixedType(element, firstClippingParent, strategy)); + clippingRect.width = clippingRect.right - clippingRect.left; + clippingRect.height = clippingRect.bottom - clippingRect.top; + clippingRect.x = clippingRect.left; + clippingRect.y = clippingRect.top; + return clippingRect; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/getFreshSideObject.js +function getFreshSideObject() { + return { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/mergePaddingObject.js + +function mergePaddingObject(paddingObject) { + return Object.assign({}, getFreshSideObject(), paddingObject); +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/expandToHashMap.js +function expandToHashMap(value, keys) { + return keys.reduce(function (hashMap, key) { + hashMap[key] = value; + return hashMap; + }, {}); +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/detectOverflow.js + + + + + + + + + // eslint-disable-next-line import/no-unused-modules + +function detectOverflow(state, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + _options$placement = _options.placement, + placement = _options$placement === void 0 ? state.placement : _options$placement, + _options$strategy = _options.strategy, + strategy = _options$strategy === void 0 ? state.strategy : _options$strategy, + _options$boundary = _options.boundary, + boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, + _options$rootBoundary = _options.rootBoundary, + rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, + _options$elementConte = _options.elementContext, + elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, + _options$altBoundary = _options.altBoundary, + altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, + _options$padding = _options.padding, + padding = _options$padding === void 0 ? 0 : _options$padding; + var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); + var altContext = elementContext === popper ? reference : popper; + var popperRect = state.rects.popper; + var element = state.elements[altBoundary ? altContext : elementContext]; + var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy); + var referenceClientRect = getBoundingClientRect(state.elements.reference); + var popperOffsets = computeOffsets({ + reference: referenceClientRect, + element: popperRect, + strategy: 'absolute', + placement: placement + }); + var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets)); + var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect + // 0 or negative = within the clipping rect + + var overflowOffsets = { + top: clippingClientRect.top - elementClientRect.top + paddingObject.top, + bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, + left: clippingClientRect.left - elementClientRect.left + paddingObject.left, + right: elementClientRect.right - clippingClientRect.right + paddingObject.right + }; + var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element + + if (elementContext === popper && offsetData) { + var offset = offsetData[placement]; + Object.keys(overflowOffsets).forEach(function (key) { + var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; + var axis = [enums_top, bottom].indexOf(key) >= 0 ? 'y' : 'x'; + overflowOffsets[key] += offset[axis] * multiply; + }); + } + + return overflowOffsets; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js + + + + +function computeAutoPlacement(state, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + placement = _options.placement, + boundary = _options.boundary, + rootBoundary = _options.rootBoundary, + padding = _options.padding, + flipVariations = _options.flipVariations, + _options$allowedAutoP = _options.allowedAutoPlacements, + allowedAutoPlacements = _options$allowedAutoP === void 0 ? enums_placements : _options$allowedAutoP; + var variation = getVariation(placement); + var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) { + return getVariation(placement) === variation; + }) : basePlacements; + var allowedPlacements = placements.filter(function (placement) { + return allowedAutoPlacements.indexOf(placement) >= 0; + }); + + if (allowedPlacements.length === 0) { + allowedPlacements = placements; + } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions... + + + var overflows = allowedPlacements.reduce(function (acc, placement) { + acc[placement] = detectOverflow(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding + })[getBasePlacement(placement)]; + return acc; + }, {}); + return Object.keys(overflows).sort(function (a, b) { + return overflows[a] - overflows[b]; + }); +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/modifiers/flip.js + + + + + + + // eslint-disable-next-line import/no-unused-modules + +function getExpandedFallbackPlacements(placement) { + if (getBasePlacement(placement) === auto) { + return []; + } + + var oppositePlacement = getOppositePlacement(placement); + return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; +} + +function flip(_ref) { + var state = _ref.state, + options = _ref.options, + name = _ref.name; + + if (state.modifiersData[name]._skip) { + return; + } + + var _options$mainAxis = options.mainAxis, + checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, + _options$altAxis = options.altAxis, + checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, + specifiedFallbackPlacements = options.fallbackPlacements, + padding = options.padding, + boundary = options.boundary, + rootBoundary = options.rootBoundary, + altBoundary = options.altBoundary, + _options$flipVariatio = options.flipVariations, + flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, + allowedAutoPlacements = options.allowedAutoPlacements; + var preferredPlacement = state.options.placement; + var basePlacement = getBasePlacement(preferredPlacement); + var isBasePlacement = basePlacement === preferredPlacement; + var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); + var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) { + return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding, + flipVariations: flipVariations, + allowedAutoPlacements: allowedAutoPlacements + }) : placement); + }, []); + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var checksMap = new Map(); + var makeFallbackChecks = true; + var firstFittingPlacement = placements[0]; + + for (var i = 0; i < placements.length; i++) { + var placement = placements[i]; + + var _basePlacement = getBasePlacement(placement); + + var isStartVariation = getVariation(placement) === start; + var isVertical = [enums_top, bottom].indexOf(_basePlacement) >= 0; + var len = isVertical ? 'width' : 'height'; + var overflow = detectOverflow(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + altBoundary: altBoundary, + padding: padding + }); + var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : enums_top; + + if (referenceRect[len] > popperRect[len]) { + mainVariationSide = getOppositePlacement(mainVariationSide); } - // Add a data attribute to the body tag with how many visible frequency options there are - addFrequencyDataAttribute() { - const frequencyOptions = document.querySelectorAll(".en__field--recurrfreq .en__field__item label.en__field__label"); - let visibleFrequencyOptions = 0; - frequencyOptions.forEach((option) => { - if (engrid_ENGrid.isVisible(option)) { - visibleFrequencyOptions++; - } - }); - engrid_ENGrid.setBodyData("visible-frequency", visibleFrequencyOptions.toString()); + + var altVariationSide = getOppositePlacement(mainVariationSide); + var checks = []; + + if (checkMainAxis) { + checks.push(overflow[_basePlacement] <= 0); } - // Add a data attribute to the body tag with how many visible gift amount options there are - addGiftAmountDataAttribute() { - const updateGiftAmountData = () => { - const giftAmountOptions = document.querySelectorAll(".en__field--donationAmt .en__field__element .en__field__item"); - let visibleGiftAmountOptions = 0; - giftAmountOptions.forEach((option) => { - if (engrid_ENGrid.isVisible(option)) { - visibleGiftAmountOptions++; - } - }); - engrid_ENGrid.setBodyData("visible-gift-amount", visibleGiftAmountOptions.toString()); - this.logger.log("Visible Gift Amount Changed to: " + visibleGiftAmountOptions.toString()); - }; - // Initial update - updateGiftAmountData(); - // Observe changes in the donation amount section - const observer = new MutationObserver(updateGiftAmountData); - const targetNode = document.querySelector(".en__field--donationAmt"); - if (targetNode) { - observer.observe(targetNode, { - childList: true, - subtree: true, - attributes: true, - }); + + if (checkAltAxis) { + checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); + } + + if (checks.every(function (check) { + return check; + })) { + firstFittingPlacement = placement; + makeFallbackChecks = false; + break; + } + + checksMap.set(placement, checks); + } + + if (makeFallbackChecks) { + // `2` may be desired in some cases – research later + var numberOfChecks = flipVariations ? 3 : 1; + + var _loop = function _loop(_i) { + var fittingPlacement = placements.find(function (placement) { + var checks = checksMap.get(placement); + + if (checks) { + return checks.slice(0, _i).every(function (check) { + return check; + }); } - // Run update updateGiftAmountData when frequency changes - this._frequency.onFrequencyChange.subscribe(() => { - setTimeout(() => { - updateGiftAmountData(); - }, 10); - }); + }); + + if (fittingPlacement) { + firstFittingPlacement = fittingPlacement; + return "break"; + } + }; + + for (var _i = numberOfChecks; _i > 0; _i--) { + var _ret = _loop(_i); + + if (_ret === "break") break; } + } + + if (state.placement !== firstFittingPlacement) { + state.modifiersData[name]._skip = true; + state.placement = firstFittingPlacement; + state.reset = true; + } +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ const modifiers_flip = ({ + name: 'flip', + enabled: true, + phase: 'main', + fn: flip, + requiresIfExists: ['offset'], + data: { + _skip: false + } +}); +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/getAltAxis.js +function getAltAxis(axis) { + return axis === 'x' ? 'y' : 'x'; } +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/utils/within.js -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/iframe.js +function within(min, value, max) { + return math_max(min, math_min(value, max)); +} +function withinMaxClamp(min, value, max) { + var v = within(min, value, max); + return v > max ? max : v; +} +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/modifiers/preventOverflow.js -class iFrame { - constructor() { - this._form = en_form_EnForm.getInstance(); - this.logger = new logger_EngridLogger("iFrame", "brown", "gray", "📡"); - if (this.inIframe()) { - // Add the data-engrid-embedded attribute when inside an iFrame if it wasn't already added by a script in the Page Template - engrid_ENGrid.setBodyData("embedded", ""); - // Check if the parent page URL matches the criteria for a thank you page donation - const getParentUrl = () => { - try { - return window.parent.location.href; - } - catch (e) { - // If we can't access parent location due to same-origin policy, fall back to referrer - return document.referrer; - } - }; - const parentUrl = getParentUrl(); - const thankYouPageRegex = /\/page\/\d+\/[^\/]+\/(\d+)(\?|$)/; - const match = parentUrl.match(thankYouPageRegex); - if (match) { - const pageNumber = parseInt(match[1], 10); - if (pageNumber > 1) { - engrid_ENGrid.setBodyData("embedded", "thank-you-page-donation"); - this.hideFormComponents(); - this.logger.log("iFrame Event - Set embedded attribute to thank-you-page-donation"); - } - } - // Fire the resize event - this.logger.log("iFrame Event - Begin Resizing"); - // Run onLoaded function - console.log("document.readyState", document.readyState); - // Document Load - if (document.readyState !== "loading") { - this.onLoaded(); - } - else { - document.addEventListener("DOMContentLoaded", () => { - this.onLoaded(); - }); - } - window.setTimeout(() => { - this.sendIframeHeight(); - }, 300); - window.addEventListener("resize", this.debounceWithImmediate(() => { - this.logger.log("iFrame Event - window resized"); - this.sendIframeHeight(); - })); - // Listen for the form submit event - this._form.onSubmit.subscribe((e) => { - this.logger.log("iFrame Event - onSubmit"); - this.sendIframeFormStatus("submit"); - }); - // If the iFrame is Chained, check if the form has data - if (this.isChained() && engrid_ENGrid.getPaymentType()) { - this.logger.log("iFrame Event - Chained iFrame"); - this.sendIframeFormStatus("chained"); - // this.addChainedBanner(); - } - // Remove the skip link markup when inside an iFrame - const skipLink = document.querySelector(".skip-link"); - if (skipLink) { - skipLink.remove(); - } - this._form.onError.subscribe(() => { - // Get the first .en__field--validationFailed element - const firstError = document.querySelector(".en__field--validationFailed"); - // Send scrollTo message - // Parent pages listens for this message and scrolls to the correct position - const scrollTo = firstError - ? firstError.getBoundingClientRect().top - : 0; - this.logger.log(`iFrame Event 'scrollTo' - Position of top of first error ${scrollTo} px`); // check the message is being sent correctly - window.parent.postMessage({ scrollTo }, "*"); - // Send the height of the iFrame - window.setTimeout(() => { - this.sendIframeHeight(); - }, 100); - }); - } - else { - // When not in iframe, default behaviour, smooth scroll to first error - this._form.onError.subscribe(() => { - // Smooth Scroll to the first .en__field--validationFailed element - const firstError = document.querySelector(".en__field--validationFailed"); - if (firstError) { - firstError.scrollIntoView({ behavior: "smooth" }); - } - }); - // Parent Page Logic (when an ENgrid form is embedded in an ENgrid page) - window.addEventListener("message", (event) => { - const iframe = this.getIFrameByEvent(event); - if (iframe) { - if (event.data.hasOwnProperty("frameHeight")) { - iframe.style.height = event.data.frameHeight + "px"; - if (event.data.frameHeight > 0) { - iframe.classList.add("loaded"); - } - else { - iframe.classList.remove("loaded"); - } - } - // Old scroll event logic "scroll", scrolls to correct iframe? - else if (event.data.hasOwnProperty("scroll") && - event.data.scroll > 0) { - const elDistanceToTop = window.pageYOffset + iframe.getBoundingClientRect().top; - let scrollTo = elDistanceToTop + event.data.scroll; - window.scrollTo({ - top: scrollTo, - left: 0, - behavior: "smooth", - }); - this.logger.log("iFrame Event - Scrolling Window to " + scrollTo); - } - // New scroll event logic "scrollTo", scrolls to the first error - else if (event.data.hasOwnProperty("scrollTo")) { - const scrollToPosition = event.data.scrollTo + - window.scrollY + - iframe.getBoundingClientRect().top; - window.scrollTo({ - top: scrollToPosition, - left: 0, - behavior: "smooth", - }); - this.logger.log("iFrame Event - Scrolling Window to " + scrollToPosition); - } - } - }); - } - } - onLoaded() { - // Scroll to top of iFrame - this.logger.log("iFrame Event - window.onload"); - this.sendIframeHeight(); - window.parent.postMessage({ - scroll: this.shouldScroll(), - }, "*"); - // On click fire the resize event - document.addEventListener("click", (e) => { - this.logger.log("iFrame Event - click"); - setTimeout(() => { - this.sendIframeHeight(); - }, 100); - }); - // Watch for errors and send the height - engrid_ENGrid.watchForError(this.sendIframeHeight.bind(this)); - } - sendIframeHeight() { - let height = document.body.offsetHeight; - this.logger.log("iFrame Event - Sending iFrame height of: " + height + "px"); // check the message is being sent correctly - window.parent.postMessage({ - frameHeight: height, - pageNumber: engrid_ENGrid.getPageNumber(), - pageCount: engrid_ENGrid.getPageCount(), - giftProcess: engrid_ENGrid.getGiftProcess(), - }, "*"); - } - sendIframeFormStatus(status) { - window.parent.postMessage({ - status: status, - pageNumber: engrid_ENGrid.getPageNumber(), - pageCount: engrid_ENGrid.getPageCount(), - giftProcess: engrid_ENGrid.getGiftProcess(), - }, "*"); - } - getIFrameByEvent(event) { - return [].slice - .call(document.getElementsByTagName("iframe")) - .filter((iframe) => { - return iframe.contentWindow === event.source; - })[0]; - } - shouldScroll() { - // If you find a error, scroll - if (document.querySelector(".en__errorHeader")) { - return true; - } - // If it's a chained iFrame, don't scroll - if (this.isChained()) { - return false; - } - // Try to match the iframe referrer URL by testing valid EN Page URLs - let referrer = document.referrer; - let enURLPattern = new RegExp(/^(.*)\/(page)\/(\d+.*)/); - // Scroll if the Regex matches, don't scroll otherwise - return enURLPattern.test(referrer); - } - inIframe() { - try { - return window.self !== window.top; - } - catch (e) { - return true; - } - } - // This method checks if the URL has a parameter named "chain" and returns true if it exists, otherwise false. - isChained() { - return !!engrid_ENGrid.getUrlParameter("chain"); - } - hideFormComponents() { - this.logger.log("iFrame Event - Hiding Form Components"); - const excludeClasses = [ - "giveBySelect-Card", - "en__field--ccnumber", - "en__field--survey", - "en__component--ecardblock", - "give-by-select", - "give-by-select-header", - "en__submit", - "en__captcha", - "force-visibility", - "hide", - "hide-iframe", - "radio-to-buttons_donationAmt", - ]; - const excludeIds = ["en__digitalWallet"]; - const components = Array.from(document.querySelectorAll(".body-main:not(.force-visibility) > div:not(:last-child)")); - components.forEach((component) => { - const shouldExclude = excludeClasses.some((cls) => component.classList.contains(cls) || - component.querySelector(`:scope > .${cls}`)) || excludeIds.some((id) => component.querySelector(`#${id}`)); - if (!shouldExclude) { - component.classList.add("hide-iframe", "hide-chained"); - } - }); - this.sendIframeHeight(); - } - showFormComponents() { - this.logger.log("iFrame Event - Showing Form Components"); - const en__component = document.querySelectorAll(".body-main > div.hide-chained"); - en__component.forEach((component) => { - component.classList.remove("hide-iframe"); - component.classList.remove("hide-chained"); - }); - this.sendIframeHeight(); - } - // private addChainedBanner() { - // this.logger.log("iFrame Event - Adding Chained Banner"); - // const banner = document.createElement("div"); - // const lastComponent = document.querySelector( - // ".body-main > div:last-of-type" - // ) as HTMLDivElement; - // banner.classList.add("en__component"); - // banner.classList.add("en__component--banner"); - // banner.classList.add("en__component--banner--chained"); - // banner.innerHTML = `

- // ${ENGrid.getFieldValue("supporter.firstName") ? `Giving as ${ENGrid.getFieldValue("supporter.firstName")} ${ENGrid.getFieldValue("supporter.lastName")}` : "Testing as "} - // with ${ENGrid.getFieldValue( - // "transaction.paymenttype" - // ).toUpperCase()} - // (change)

`; - // lastComponent?.parentNode?.insertBefore(banner, lastComponent); - // banner - // .querySelector(".en__component__content__link") - // ?.addEventListener("click", (e) => { - // e.preventDefault(); - // this.showFormComponents(); - // banner.remove(); - // }); - // } - debounceWithImmediate(func, timeout = 1000) { - let timer; - let firstEvent = true; - return (...args) => { - clearTimeout(timer); - if (firstEvent) { - func.apply(this, args); - firstEvent = false; - } - timer = setTimeout(() => { - func.apply(this, args); - firstEvent = true; - }, timeout); - }; - } -} - -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/input-has-value-and-focus.js -// Component that adds has-value and has-focus classes to form inputs - -class InputHasValueAndFocus { - constructor() { - this.logger = new logger_EngridLogger("InputHasValueAndFocus", "yellow", "#333", "🌈"); - this.formInputs = document.querySelectorAll(".en__field--text, .en__field--email:not(.en__field--checkbox), .en__field--telephone, .en__field--number, .en__field--textarea, .en__field--select, .en__field--checkbox"); - if (this.shouldRun()) { - this.run(); - } - } - shouldRun() { - return this.formInputs.length > 0; - } - run() { - this.formInputs.forEach((el) => { - const input = el.querySelector("input, textarea, select"); - if (input && input.value) { - el.classList.add("has-value"); - } - this.bindEvents(el); - }); - } - bindEvents(el) { - const input = el.querySelector("input, textarea, select"); - if (!input) { - return; - } - input.addEventListener("focus", () => { - this.log("Focus added", input); - el.classList.add("has-focus"); - }); - input.addEventListener("blur", () => { - this.log("Focus removed", input); - el.classList.remove("has-focus"); - }); - input.addEventListener("input", () => { - if (input.value) { - this.log("Value added", input); - el.classList.add("has-value"); - } - else { - this.log("Value removed", input); - el.classList.remove("has-value"); - } - }); - } - log(message, input) { - this.logger.log(`${message} on ${input.name}: ${input.value}`); - } -} -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/input-placeholders.js -// Component that adds input placeholders -// You can override the default placeholders by adding a Placeholders option to the EngridOptions on the client theme. -// You can also add an EngridPageOptions override to the page, if you want to override the placeholders on a specific page. Example: -// -class InputPlaceholders { - constructor() { - this.defaultPlaceholders = { - "input#en__field_supporter_firstName": "First Name", - "input#en__field_supporter_lastName": "Last Name", - "input#en__field_supporter_emailAddress": "Email Address", - "input#en__field_supporter_phoneNumber": "Phone Number (Optional)", - ".en__mandatory input#en__field_supporter_phoneNumber": "Phone Number", - ".i-required input#en__field_supporter_phoneNumber": "Phone Number", - "input#en__field_supporter_phoneNumber2": "000-000-0000 (Optional)", - ".en__mandatory input#en__field_supporter_phoneNumber2": "000-000-0000", - ".i-required input#en__field_supporter_phoneNumber2": "000-000-0000", - "input#en__field_supporter_country": "Country", - "input#en__field_supporter_address1": "Street Address", - "input#en__field_supporter_address2": "Apt., Ste., Bldg.", - "input#en__field_supporter_city": "City", - "input#en__field_supporter_region": "Region", - "input#en__field_supporter_postcode": "ZIP Code", - ".en__field--donationAmt.en__field--withOther .en__field__input--other": "Other", - "input#en__field_transaction_ccexpire": "MM / YY", - "input#en__field_supporter_bankAccountNumber": "Bank Account Number", - "input#en__field_supporter_bankRoutingNumber": "Bank Routing Number", - "input#en__field_transaction_honname": "Honoree Name", - "input#en__field_transaction_infname": "Recipient Name", - "input#en__field_transaction_infemail": "Recipient Email Address", - "input#en__field_transaction_infcountry": "Country", - "input#en__field_transaction_infadd1": "Recipient Street Address", - "input#en__field_transaction_infadd2": "Recipient Apt., Ste., Bldg.", - "input#en__field_transaction_infcity": "Recipient City", - "input#en__field_transaction_infpostcd": "Recipient Postal Code", - "input#en__field_transaction_gftrsn": "Reason for your gift", - "input#en__field_transaction_shipfname": "Shipping First Name", - "input#en__field_transaction_shiplname": "Shipping Last Name", - "input#en__field_transaction_shipemail": "Shipping Email Address", - "input#en__field_transaction_shipcountry": "Shipping Country", - "input#en__field_transaction_shipadd1": "Shipping Street Address", - "input#en__field_transaction_shipadd2": "Shipping Apt., Ste., Bldg.", - "input#en__field_transaction_shipcity": "Shipping City", - "input#en__field_transaction_shipregion": "Shipping Region", - "input#en__field_transaction_shippostcode": "Shipping Postal Code", - "input#en__field_supporter_billingCountry": "Billing Country", - "input#en__field_supporter_billingAddress1": "Billing Street Address", - "input#en__field_supporter_billingAddress2": "Billing Apt., Ste., Bldg.", - "input#en__field_supporter_billingCity": "Billing City", - "input#en__field_supporter_billingRegion": "Billing Region", - "input#en__field_supporter_billingPostcode": "Billing Postal Code", - }; - if (this.shouldRun()) { - // If there's a Placeholders option, merge it with the default placeholders - const placeholders = engrid_ENGrid.getOption("Placeholders"); - if (placeholders) { - this.defaultPlaceholders = Object.assign(Object.assign({}, this.defaultPlaceholders), placeholders); - } - this.run(); - } - } - shouldRun() { - return engrid_ENGrid.hasBodyData("add-input-placeholders"); - } - run() { - Object.keys(this.defaultPlaceholders).forEach((selector) => { - if (selector in this.defaultPlaceholders) - this.addPlaceholder(selector, this.defaultPlaceholders[selector]); - }); - } - addPlaceholder(selector, placeholder) { - const fieldEl = document.querySelector(selector); - if (fieldEl) { - fieldEl.placeholder = placeholder; - } - } -} -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/media-attribution.js -/* - Looks for specially crafted links and will transform its markup to display an attribution overlay on top of the image - Depends on "_engrid-media-attribution.scss" for styling - Example Image Input - - - - Example Video Input (Doesn't currently visually display) - @TODO Video tags are processed but their
is not visually displayed. Need to update "_engrid-media-attribution.scss" - - Example Image Output -
Jane Doe 1
-*/ -const tippy = (__webpack_require__(9244)/* ["default"] */ .Ay); -class MediaAttribution { - constructor() { - // Find all images with attribution but not with the "data-attribution-hide-overlay" attribute - this.mediaWithAttribution = document.querySelectorAll("img[data-attribution-source]:not([data-attribution-hide-overlay]), video[data-attribution-source]:not([data-attribution-hide-overlay])"); - this.mediaWithAttribution.forEach((element) => { - if (engrid_ENGrid.debug) - console.log("The following image was found with data attribution fields on it. It's markup will be changed to add caption support.", element); - // Creates the wapping
element - let figure = document.createElement("figure"); - figure.classList.add("media-with-attribution"); - // Moves the inside its
element - let mediaWithAttributionParent = element.parentNode; - if (mediaWithAttributionParent) { - mediaWithAttributionParent.insertBefore(figure, element); - figure.appendChild(element); - let mediaWithAttributionElement = element; - // Append the
element after the and conditionally add the Source's Link to it - let attributionSource = mediaWithAttributionElement.dataset.attributionSource; - if (attributionSource) { - let attributionSourceLink = mediaWithAttributionElement.dataset.attributionSourceLink; - if (attributionSourceLink) { - mediaWithAttributionElement.insertAdjacentHTML("afterend", '' + - attributionSource + - "
"); - } - else { - mediaWithAttributionElement.insertAdjacentHTML("afterend", "" + attributionSource + "
"); - } - const attributionSourceTooltip = "attributionSourceTooltip" in mediaWithAttributionElement.dataset - ? mediaWithAttributionElement.dataset.attributionSourceTooltip - : false; - if (attributionSourceTooltip) { - tippy(mediaWithAttributionElement.nextSibling, { - content: attributionSourceTooltip, - arrow: true, - arrowType: "default", - placement: "left", - trigger: "click mouseenter focus", - interactive: true, - }); - } - } - } - }); - } -} -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/live-variables.js -class LiveVariables { - constructor(options) { - var _a; - this._amount = DonationAmount.getInstance(); - this._fees = ProcessingFees.getInstance(); - this._frequency = DonationFrequency.getInstance(); - this._form = en_form_EnForm.getInstance(); - this.multiplier = 1 / 12; - this.options = Object.assign(Object.assign({}, OptionsDefaults), options); - this.submitLabel = - ((_a = document.querySelector(".en__submit button")) === null || _a === void 0 ? void 0 : _a.innerHTML) || "Donate"; - this._amount.onAmountChange.subscribe(() => this.changeSubmitButton()); - this._amount.onAmountChange.subscribe(() => this.changeLiveAmount()); - this._amount.onAmountChange.subscribe(() => this.changeLiveUpsellAmount()); - this._fees.onFeeChange.subscribe(() => this.changeLiveAmount()); - this._fees.onFeeChange.subscribe(() => this.changeLiveUpsellAmount()); - this._fees.onFeeChange.subscribe(() => this.changeSubmitButton()); - this._frequency.onFrequencyChange.subscribe(() => this.changeLiveFrequency()); - this._frequency.onFrequencyChange.subscribe(() => this.changeRecurrency()); - this._frequency.onFrequencyChange.subscribe(() => this.changeSubmitButton()); - this._form.onSubmit.subscribe(() => { - if (engrid_ENGrid.getPageType() !== "SUPPORTERHUB") - engrid_ENGrid.disableSubmit("Processing..."); - }); - this._form.onError.subscribe(() => engrid_ENGrid.enableSubmit()); - // Watch the monthly-upsell links - document.addEventListener("click", (e) => { - const element = e.target; - if (element) { - if (element.classList.contains("monthly-upsell")) { - this.upsold(e); - } - else if (element.classList.contains("form-submit")) { - e.preventDefault(); - this._form.submitForm(); - } - } - }); - } - getAmountTxt(amount = 0) { - var _a, _b, _c, _d; - const symbol = (_a = engrid_ENGrid.getCurrencySymbol()) !== null && _a !== void 0 ? _a : "$"; - const dec_separator = (_b = this.options.DecimalSeparator) !== null && _b !== void 0 ? _b : "."; - const thousands_separator = (_c = this.options.ThousandsSeparator) !== null && _c !== void 0 ? _c : ""; - const dec_places = amount % 1 == 0 ? 0 : (_d = this.options.DecimalPlaces) !== null && _d !== void 0 ? _d : 2; - const amountTxt = engrid_ENGrid.formatNumber(amount, dec_places, dec_separator, thousands_separator); - return amount > 0 - ? (`${symbol}${amountTxt}`) - : ""; - } - getUpsellAmountTxt(amount = 0) { - var _a, _b, _c, _d; - const symbol = (_a = engrid_ENGrid.getCurrencySymbol()) !== null && _a !== void 0 ? _a : "$"; - const dec_separator = (_b = this.options.DecimalSeparator) !== null && _b !== void 0 ? _b : "."; - const thousands_separator = (_c = this.options.ThousandsSeparator) !== null && _c !== void 0 ? _c : ""; - const dec_places = amount % 1 == 0 ? 0 : (_d = this.options.DecimalPlaces) !== null && _d !== void 0 ? _d : 2; - const amountTxt = engrid_ENGrid.formatNumber(Math.ceil(amount / 5) * 5, dec_places, dec_separator, thousands_separator); - return amount > 0 ? symbol + amountTxt : ""; - } - getUpsellAmountRaw(amount = 0) { - const amountRaw = Math.ceil(amount / 5) * 5; - return amount > 0 ? amountRaw.toString() : ""; - } - changeSubmitButton() { - const submit = document.querySelector(".en__submit button"); - const amount = this.getAmountTxt(this._amount.amount + this._fees.fee); - const frequency = this._frequency.frequency == "onetime" - ? "" - : this._frequency.frequency == "annual" - ? "annually" - : this._frequency.frequency; - let label = this.submitLabel; - if (amount) { - label = label.replace("$AMOUNT", amount); - label = label.replace("$FREQUENCY", `${frequency}`); - } - else { - label = label.replace("$AMOUNT", ""); - label = label.replace("$FREQUENCY", ""); - } - if (submit && label) { - submit.innerHTML = label; - } - } - changeLiveAmount() { - const value = this._amount.amount + this._fees.fee; - const live_amount = document.querySelectorAll(".live-giving-amount"); - live_amount.forEach((elem) => (elem.innerHTML = this.getAmountTxt(value))); - } - changeLiveUpsellAmount() { - const value = (this._amount.amount + this._fees.fee) * this.multiplier; - const live_upsell_amount = document.querySelectorAll(".live-giving-upsell-amount"); - live_upsell_amount.forEach((elem) => (elem.innerHTML = this.getUpsellAmountTxt(value))); - const live_upsell_amount_raw = document.querySelectorAll(".live-giving-upsell-amount-raw"); - live_upsell_amount_raw.forEach((elem) => (elem.innerHTML = this.getUpsellAmountRaw(value))); - } - changeLiveFrequency() { - const live_frequency = document.querySelectorAll(".live-giving-frequency"); - live_frequency.forEach((elem) => (elem.innerHTML = - this._frequency.frequency == "onetime" - ? "" - : this._frequency.frequency)); - } - changeRecurrency() { - const recurrpay = document.querySelector("[name='transaction.recurrpay']"); - if (recurrpay && recurrpay.type != "radio") { - recurrpay.value = this._frequency.frequency == "onetime" ? "N" : "Y"; - this._frequency.recurring = recurrpay.value; - if (engrid_ENGrid.getOption("Debug")) - console.log("Recurpay Changed!"); - // Trigger the onChange event for the field - const event = new Event("change", { bubbles: true }); - recurrpay.dispatchEvent(event); - } - } - // Watch for a clicks on monthly-upsell link - upsold(e) { - // Find and select monthly giving - const enFieldRecurrpay = document.querySelector(".en__field--recurrpay input[value='Y']"); - if (enFieldRecurrpay) { - enFieldRecurrpay.checked = true; - } - // Find the hidden radio select that needs to be selected when entering an "Other" amount - const enFieldOtherAmountRadio = document.querySelector(".en__field--donationAmt input[value='other']"); - if (enFieldOtherAmountRadio) { - enFieldOtherAmountRadio.checked = true; - } - // Enter the other amount and remove the "en__field__item--hidden" class from the input's parent - const enFieldOtherAmount = document.querySelector("input[name='transaction.donationAmt.other']"); - if (enFieldOtherAmount) { - enFieldOtherAmount.value = this.getUpsellAmountRaw(this._amount.amount * this.multiplier); - this._amount.load(); - this._frequency.load(); - if (enFieldOtherAmount.parentElement) { - enFieldOtherAmount.parentElement.classList.remove("en__field__item--hidden"); - } - } - const target = e.target; - if (target && target.classList.contains("form-submit")) { - e.preventDefault(); - // Form submit - this._form.submitForm(); - } - } +function preventOverflow(_ref) { + var state = _ref.state, + options = _ref.options, + name = _ref.name; + var _options$mainAxis = options.mainAxis, + checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, + _options$altAxis = options.altAxis, + checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, + boundary = options.boundary, + rootBoundary = options.rootBoundary, + altBoundary = options.altBoundary, + padding = options.padding, + _options$tether = options.tether, + tether = _options$tether === void 0 ? true : _options$tether, + _options$tetherOffset = options.tetherOffset, + tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; + var overflow = detectOverflow(state, { + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding, + altBoundary: altBoundary + }); + var basePlacement = getBasePlacement(state.placement); + var variation = getVariation(state.placement); + var isBasePlacement = !variation; + var mainAxis = getMainAxisFromPlacement(basePlacement); + var altAxis = getAltAxis(mainAxis); + var popperOffsets = state.modifiersData.popperOffsets; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, { + placement: state.placement + })) : tetherOffset; + var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? { + mainAxis: tetherOffsetValue, + altAxis: tetherOffsetValue + } : Object.assign({ + mainAxis: 0, + altAxis: 0 + }, tetherOffsetValue); + var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; + var data = { + x: 0, + y: 0 + }; + + if (!popperOffsets) { + return; + } + + if (checkMainAxis) { + var _offsetModifierState$; + + var mainSide = mainAxis === 'y' ? enums_top : left; + var altSide = mainAxis === 'y' ? bottom : right; + var len = mainAxis === 'y' ? 'height' : 'width'; + var offset = popperOffsets[mainAxis]; + var min = offset + overflow[mainSide]; + var max = offset - overflow[altSide]; + var additive = tether ? -popperRect[len] / 2 : 0; + var minLen = variation === start ? referenceRect[len] : popperRect[len]; + var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go + // outside the reference bounds + + var arrowElement = state.elements.arrow; + var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { + width: 0, + height: 0 + }; + var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject(); + var arrowPaddingMin = arrowPaddingObject[mainSide]; + var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want + // to include its full size in the calculation. If the reference is small + // and near the edge of a boundary, the popper can overflow even if the + // reference is not overflowing as well (e.g. virtual elements with no + // width or height) + + var arrowLen = within(0, referenceRect[len], arrowRect[len]); + var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; + var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; + var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); + var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; + var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; + var tetherMin = offset + minOffset - offsetModifierValue - clientOffset; + var tetherMax = offset + maxOffset - offsetModifierValue; + var preventedOffset = within(tether ? math_min(min, tetherMin) : min, offset, tether ? math_max(max, tetherMax) : max); + popperOffsets[mainAxis] = preventedOffset; + data[mainAxis] = preventedOffset - offset; + } + + if (checkAltAxis) { + var _offsetModifierState$2; + + var _mainSide = mainAxis === 'x' ? enums_top : left; + + var _altSide = mainAxis === 'x' ? bottom : right; + + var _offset = popperOffsets[altAxis]; + + var _len = altAxis === 'y' ? 'height' : 'width'; + + var _min = _offset + overflow[_mainSide]; + + var _max = _offset - overflow[_altSide]; + + var isOriginSide = [enums_top, left].indexOf(basePlacement) !== -1; + + var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; + + var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; + + var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; + + var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); + + popperOffsets[altAxis] = _preventedOffset; + data[altAxis] = _preventedOffset - _offset; + } + + state.modifiersData[name] = data; +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ const modifiers_preventOverflow = ({ + name: 'preventOverflow', + enabled: true, + phase: 'main', + fn: preventOverflow, + requiresIfExists: ['offset'] +}); +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/modifiers/arrow.js + + + + + + + + + // eslint-disable-next-line import/no-unused-modules + +var toPaddingObject = function toPaddingObject(padding, state) { + padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, { + placement: state.placement + })) : padding; + return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); +}; + +function arrow(_ref) { + var _state$modifiersData$; + + var state = _ref.state, + name = _ref.name, + options = _ref.options; + var arrowElement = state.elements.arrow; + var popperOffsets = state.modifiersData.popperOffsets; + var basePlacement = getBasePlacement(state.placement); + var axis = getMainAxisFromPlacement(basePlacement); + var isVertical = [left, right].indexOf(basePlacement) >= 0; + var len = isVertical ? 'height' : 'width'; + + if (!arrowElement || !popperOffsets) { + return; + } + + var paddingObject = toPaddingObject(options.padding, state); + var arrowRect = getLayoutRect(arrowElement); + var minProp = axis === 'y' ? enums_top : left; + var maxProp = axis === 'y' ? bottom : right; + var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len]; + var startDiff = popperOffsets[axis] - state.rects.reference[axis]; + var arrowOffsetParent = getOffsetParent(arrowElement); + var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; + var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is + // outside of the popper bounds + + var min = paddingObject[minProp]; + var max = clientSize - arrowRect[len] - paddingObject[maxProp]; + var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; + var offset = within(min, center, max); // Prevents breaking syntax highlighting... + + var axisProp = axis; + state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$); } -;// CONCATENATED MODULE: ./node_modules/@4site/engrid-scripts/dist/upsell-lightbox.js +function arrow_effect(_ref2) { + var state = _ref2.state, + options = _ref2.options; + var _options$element = options.element, + arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element; + if (arrowElement == null) { + return; + } // CSS selector -class UpsellLightbox { - constructor() { - this.overlay = document.createElement("div"); - this._form = en_form_EnForm.getInstance(); - this._amount = DonationAmount.getInstance(); - this._fees = ProcessingFees.getInstance(); - this._frequency = DonationFrequency.getInstance(); - this._dataLayer = DataLayer.getInstance(); - this._suggestAmount = 0; - this.logger = new logger_EngridLogger("UpsellLightbox", "black", "pink", "🪟"); - let options = "EngridUpsell" in window ? window.EngridUpsell : {}; - this.options = Object.assign(Object.assign({}, UpsellOptionsDefaults), options); - //Disable for "applepay" via Vantiv payment method. Adding it to the array like this so it persists - //even if the client provides custom options. - this.options.disablePaymentMethods.push("applepay"); - if (!this.shouldRun()) { - this.logger.log("Upsell script should NOT run"); - // If we're not on a Donation Page, get out - return; - } - this.overlay.id = "enModal"; - this.overlay.classList.add("is-hidden"); - this.overlay.classList.add("image-" + this.options.imagePosition); - this.renderLightbox(); - this._form.onSubmit.subscribe(() => this.open()); - } - renderLightbox() { - const title = this.options.title - .replace("{new-amount}", "") - .replace("{old-amount}", "") - .replace("{old-frequency}", ""); - const paragraph = this.options.paragraph - .replace("{new-amount}", "") - .replace("{old-amount}", "") - .replace("{old-frequency}", ""); - const yes = this.options.yesLabel - .replace("{new-amount}", "") - .replace("{old-amount}", "") - .replace("{old-frequency}", ""); - const no = this.options.noLabel - .replace("{new-amount}", "") - .replace("{old-amount}", "") - .replace("{old-frequency}", ""); - const markup = ` -
- -
-
- ${this.options.canClose ? `` : ``} -

- ${title} -

- ${this.options.otherAmount - ? ` -
-
-

- ${this.options.otherLabel} -

-
-
- - Minimum ${this.getAmountTxt(this.options.minAmount)} -
-
- ` - : ``} -

- ${paragraph} -

- - - -
- -
-
-
- `; - this.overlay.innerHTML = markup; - const closeButton = this.overlay.querySelector("#goMonthlyClose"); - const yesButton = this.overlay.querySelector("#upsellYesButton a"); - const noButton = this.overlay.querySelector("#upsellNoButton button"); - yesButton.addEventListener("click", this.continue.bind(this)); - noButton.addEventListener("click", this.continue.bind(this)); - if (closeButton) - closeButton.addEventListener("click", this.close.bind(this)); - this.overlay.addEventListener("click", (e) => { - if (e.target instanceof Element && - e.target.id == this.overlay.id && - this.options.canClose) { - this.close(e); - } - }); - document.addEventListener("keyup", (e) => { - if (e.key === "Escape" && closeButton) { - closeButton.click(); - } - }); - document.body.appendChild(this.overlay); - const otherField = document.querySelector("#secondOtherField"); - if (otherField) { - otherField.addEventListener("keyup", this.popupOtherField.bind(this)); - } - this.logger.log("Upsell script rendered"); - } - // Should we run the script? - shouldRun() { - // if it's a first page of a Donation page - return ( - // !hideModal && - !this.shouldSkip() && - "EngridUpsell" in window && - !!window.pageJson && - window.pageJson.pageNumber == 1 && - ["donation", "premiumgift"].includes(window.pageJson.pageType)); - } - shouldSkip() { - if ("EngridUpsell" in window && window.EngridUpsell.skipUpsell) { - return true; - } - return this.options.skipUpsell; - } - popupOtherField() { - var _a, _b; - const value = parseFloat((_b = (_a = this.overlay.querySelector("#secondOtherField")) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : ""); - const live_upsell_amount = document.querySelectorAll("#upsellYesButton .upsell_suggestion"); - const upsellAmount = this.getUpsellAmount(); - if (!isNaN(value) && value > 0) { - this.checkOtherAmount(value); - } - else { - this.checkOtherAmount(upsellAmount); - } - live_upsell_amount.forEach((elem) => (elem.innerHTML = this.getAmountTxt(upsellAmount + this._fees.calculateFees(upsellAmount)))); - } - liveAmounts() { - const live_upsell_amount = document.querySelectorAll(".upsell_suggestion"); - const live_amount = document.querySelectorAll(".upsell_amount"); - const upsellAmount = this.getUpsellAmount(); - const suggestedAmount = upsellAmount + this._fees.calculateFees(upsellAmount); - live_upsell_amount.forEach((elem) => (elem.innerHTML = this.getAmountTxt(suggestedAmount))); - live_amount.forEach((elem) => (elem.innerHTML = this.getAmountTxt(this._amount.amount + this._fees.fee))); - } - liveFrequency() { - const live_upsell_frequency = document.querySelectorAll(".upsell_frequency"); - live_upsell_frequency.forEach((elem) => (elem.innerHTML = this.getFrequencyTxt())); - } - // Return the Suggested Upsell Amount - getUpsellAmount() { - var _a, _b; - const amount = this._amount.amount; - const otherAmount = parseFloat((_b = (_a = this.overlay.querySelector("#secondOtherField")) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : ""); - if (otherAmount > 0) { - return otherAmount > this.options.minAmount - ? otherAmount - : this.options.minAmount; - } - let upsellAmount = 0; - for (let i = 0; i < this.options.amountRange.length; i++) { - let val = this.options.amountRange[i]; - if (upsellAmount == 0 && amount <= val.max) { - upsellAmount = val.suggestion; - if (upsellAmount === 0) - return 0; - if (typeof upsellAmount !== "number") { - const suggestionMath = upsellAmount.replace("amount", amount.toFixed(2)); - upsellAmount = parseFloat(Function('"use strict";return (' + suggestionMath + ")")()); - } - break; - } - } - return upsellAmount > this.options.minAmount - ? upsellAmount - : this.options.minAmount; - } - shouldOpen() { - const upsellAmount = this.getUpsellAmount(); - const paymenttype = engrid_ENGrid.getFieldValue("transaction.paymenttype") || ""; - this._suggestAmount = upsellAmount; - // If frequency is not onetime or - // the modal is already opened or - // there's no suggestion for this donation amount, - // we should not open - if (this.freqAllowed() && - !this.shouldSkip() && - !this.options.disablePaymentMethods.includes(paymenttype.toLowerCase()) && - !this.overlay.classList.contains("is-submitting") && - upsellAmount > 0) { - this.logger.log("Upsell Frequency " + this._frequency.frequency); - this.logger.log("Upsell Amount " + this._amount.amount); - this.logger.log("Upsell Suggested Amount " + upsellAmount); - return true; - } - return false; + if (typeof arrowElement === 'string') { + arrowElement = state.elements.popper.querySelector(arrowElement); + + if (!arrowElement) { + return; } - // Return true if the current frequency is allowed by the options - freqAllowed() { - const freq = this._frequency.frequency; - const allowed = []; - if (this.options.oneTime) - allowed.push("onetime"); - if (this.options.annual) - allowed.push("annual"); - return allowed.includes(freq); - } - open() { - this.logger.log("Upsell script opened"); - if (!this.shouldOpen()) { - // In the circumstance when the form fails to validate via server-side validation, the page will reload - // When that happens, we should place the original amount saved in sessionStorage into the upsell original amount field - let original = window.sessionStorage.getItem("original"); - if (original && - document.querySelectorAll(".en__errorList .en__error").length > 0) { - this.setOriginalAmount(original); - } - // Returning true will give the "go ahead" to submit the form - this._form.submit = true; - return true; - } - this.liveAmounts(); - this.liveFrequency(); - this.overlay.classList.remove("is-hidden"); - this._form.submit = false; - engrid_ENGrid.setBodyData("has-lightbox", ""); - return false; - } - // Set the original amount into a hidden field using the upsellOriginalGiftAmountFieldName, if provided - setOriginalAmount(original) { - if (this.options.upsellOriginalGiftAmountFieldName) { - let enFieldUpsellOriginalAmount = document.querySelector(".en__field__input.en__field__input--hidden[name='" + - this.options.upsellOriginalGiftAmountFieldName + - "']"); - if (!enFieldUpsellOriginalAmount) { - let pageform = document.querySelector("form.en__component--page"); - if (pageform) { - let input = document.createElement("input"); - input.setAttribute("type", "hidden"); - input.setAttribute("name", this.options.upsellOriginalGiftAmountFieldName); - input.classList.add("en__field__input", "en__field__input--hidden"); - pageform.appendChild(input); - enFieldUpsellOriginalAmount = document.querySelector('.en__field__input.en__field__input--hidden[name="' + - this.options.upsellOriginalGiftAmountFieldName + - '"]'); - } - } - if (enFieldUpsellOriginalAmount) { - // save it to a session variable just in case this page reloaded due to server-side validation error - window.sessionStorage.setItem("original", original); - enFieldUpsellOriginalAmount.setAttribute("value", original); - } - } - } - // Proceed to the next page (upsold or not) - continue(e) { - var _a; - e.preventDefault(); - if (e.target instanceof Element && - ((_a = document.querySelector("#upsellYesButton")) === null || _a === void 0 ? void 0 : _a.contains(e.target))) { - this.logger.success("Upsold"); - this.setOriginalAmount(this._amount.amount.toString()); - const upsoldAmount = this.getUpsellAmount(); - const originalAmount = this._amount.amount; - this._frequency.setFrequency("monthly"); - this._amount.setAmount(upsoldAmount); - this._dataLayer.addEndOfGiftProcessEvent("ENGRID_UPSELL", { - eventValue: true, - originalAmount: originalAmount, - upsoldAmount: upsoldAmount, - frequency: "monthly", - }); - this._dataLayer.addEndOfGiftProcessVariable("ENGRID_UPSELL", true); - this._dataLayer.addEndOfGiftProcessVariable("ENGRID_UPSELL_ORIGINAL_AMOUNT", originalAmount); - this._dataLayer.addEndOfGiftProcessVariable("ENGRID_UPSELL_DONATION_FREQUENCY", "MONTHLY"); - this.renderConversionField("upsellSuccess", "onetime", originalAmount, "monthly", this._suggestAmount, "monthly", upsoldAmount); - } - else { - this.setOriginalAmount(""); - window.sessionStorage.removeItem("original"); - this._dataLayer.addEndOfGiftProcessVariable("ENGRID_UPSELL", false); - this._dataLayer.addEndOfGiftProcessVariable("ENGRID_UPSELL_DONATION_FREQUENCY", "ONE-TIME"); - this.renderConversionField("upsellFail", this._frequency.frequency, this._amount.amount, "monthly", this._suggestAmount, this._frequency.frequency, this._amount.amount); - } - this._form.submitForm(); + } + + if (!contains(state.elements.popper, arrowElement)) { + return; + } + + state.elements.arrow = arrowElement; +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ const modifiers_arrow = ({ + name: 'arrow', + enabled: true, + phase: 'main', + fn: arrow, + effect: arrow_effect, + requires: ['popperOffsets'], + requiresIfExists: ['preventOverflow'] +}); +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/modifiers/hide.js + + + +function getSideOffsets(overflow, rect, preventedOffsets) { + if (preventedOffsets === void 0) { + preventedOffsets = { + x: 0, + y: 0 + }; + } + + return { + top: overflow.top - rect.height - preventedOffsets.y, + right: overflow.right - rect.width + preventedOffsets.x, + bottom: overflow.bottom - rect.height + preventedOffsets.y, + left: overflow.left - rect.width - preventedOffsets.x + }; +} + +function isAnySideFullyClipped(overflow) { + return [enums_top, right, bottom, left].some(function (side) { + return overflow[side] >= 0; + }); +} + +function hide(_ref) { + var state = _ref.state, + name = _ref.name; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var preventedOffsets = state.modifiersData.preventOverflow; + var referenceOverflow = detectOverflow(state, { + elementContext: 'reference' + }); + var popperAltOverflow = detectOverflow(state, { + altBoundary: true + }); + var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); + var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); + var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); + var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); + state.modifiersData[name] = { + referenceClippingOffsets: referenceClippingOffsets, + popperEscapeOffsets: popperEscapeOffsets, + isReferenceHidden: isReferenceHidden, + hasPopperEscaped: hasPopperEscaped + }; + state.attributes.popper = Object.assign({}, state.attributes.popper, { + 'data-popper-reference-hidden': isReferenceHidden, + 'data-popper-escaped': hasPopperEscaped + }); +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ const modifiers_hide = ({ + name: 'hide', + enabled: true, + phase: 'main', + requiresIfExists: ['preventOverflow'], + fn: hide +}); +;// CONCATENATED MODULE: ../engrid/node_modules/@popperjs/core/lib/popper.js + + + + + + + + + + +var defaultModifiers = [eventListeners, modifiers_popperOffsets, modifiers_computeStyles, modifiers_applyStyles, modifiers_offset, modifiers_flip, modifiers_preventOverflow, modifiers_arrow, modifiers_hide]; +var popper_createPopper = /*#__PURE__*/popperGenerator({ + defaultModifiers: defaultModifiers +}); // eslint-disable-next-line import/no-unused-modules + + // eslint-disable-next-line import/no-unused-modules + + // eslint-disable-next-line import/no-unused-modules + + +;// CONCATENATED MODULE: ../engrid/node_modules/tippy.js/dist/tippy.esm.js +/**! +* tippy.js v6.3.7 +* (c) 2017-2021 atomiks +* MIT License +*/ + + +var ROUND_ARROW = ''; +var BOX_CLASS = "tippy-box"; +var CONTENT_CLASS = "tippy-content"; +var BACKDROP_CLASS = "tippy-backdrop"; +var ARROW_CLASS = "tippy-arrow"; +var SVG_ARROW_CLASS = "tippy-svg-arrow"; +var TOUCH_OPTIONS = { + passive: true, + capture: true +}; +var TIPPY_DEFAULT_APPEND_TO = function TIPPY_DEFAULT_APPEND_TO() { + return document.body; +}; + +function tippy_esm_hasOwnProperty(obj, key) { + return {}.hasOwnProperty.call(obj, key); +} +function getValueAtIndexOrReturn(value, index, defaultValue) { + if (Array.isArray(value)) { + var v = value[index]; + return v == null ? Array.isArray(defaultValue) ? defaultValue[index] : defaultValue : v; + } + + return value; +} +function isType(value, type) { + var str = {}.toString.call(value); + return str.indexOf('[object') === 0 && str.indexOf(type + "]") > -1; +} +function invokeWithArgsOrReturn(value, args) { + return typeof value === 'function' ? value.apply(void 0, args) : value; +} +function tippy_esm_debounce(fn, ms) { + // Avoid wrapping in `setTimeout` if ms is 0 anyway + if (ms === 0) { + return fn; + } + + var timeout; + return function (arg) { + clearTimeout(timeout); + timeout = setTimeout(function () { + fn(arg); + }, ms); + }; +} +function removeProperties(obj, keys) { + var clone = Object.assign({}, obj); + keys.forEach(function (key) { + delete clone[key]; + }); + return clone; +} +function splitBySpaces(value) { + return value.split(/\s+/).filter(Boolean); +} +function normalizeToArray(value) { + return [].concat(value); +} +function pushIfUnique(arr, value) { + if (arr.indexOf(value) === -1) { + arr.push(value); + } +} +function unique(arr) { + return arr.filter(function (item, index) { + return arr.indexOf(item) === index; + }); +} +function tippy_esm_getBasePlacement(placement) { + return placement.split('-')[0]; +} +function arrayFrom(value) { + return [].slice.call(value); +} +function removeUndefinedProps(obj) { + return Object.keys(obj).reduce(function (acc, key) { + if (obj[key] !== undefined) { + acc[key] = obj[key]; } - // Close the lightbox - close(e) { - e.preventDefault(); - this.overlay.classList.add("is-hidden"); - engrid_ENGrid.setBodyData("has-lightbox", false); - if (this.options.submitOnClose) { - this.renderConversionField("upsellFail", this._frequency.frequency, this._amount.amount, "monthly", this._suggestAmount, this._frequency.frequency, this._amount.amount); - this._form.submitForm(); - } - else { - this._form.dispatchError(); - } + + return acc; + }, {}); +} + +function div() { + return document.createElement('div'); +} +function tippy_esm_isElement(value) { + return ['Element', 'Fragment'].some(function (type) { + return isType(value, type); + }); +} +function isNodeList(value) { + return isType(value, 'NodeList'); +} +function isMouseEvent(value) { + return isType(value, 'MouseEvent'); +} +function isReferenceElement(value) { + return !!(value && value._tippy && value._tippy.reference === value); +} +function getArrayOfElements(value) { + if (tippy_esm_isElement(value)) { + return [value]; + } + + if (isNodeList(value)) { + return arrayFrom(value); + } + + if (Array.isArray(value)) { + return value; + } + + return arrayFrom(document.querySelectorAll(value)); +} +function setTransitionDuration(els, value) { + els.forEach(function (el) { + if (el) { + el.style.transitionDuration = value + "ms"; } - getAmountTxt(amount = 0) { - var _a, _b, _c, _d; - const symbol = (_a = engrid_ENGrid.getCurrencySymbol()) !== null && _a !== void 0 ? _a : "$"; - const dec_separator = (_b = engrid_ENGrid.getOption("DecimalSeparator")) !== null && _b !== void 0 ? _b : "."; - const thousands_separator = (_c = engrid_ENGrid.getOption("ThousandsSeparator")) !== null && _c !== void 0 ? _c : ""; - const dec_places = amount % 1 == 0 ? 0 : (_d = engrid_ENGrid.getOption("DecimalPlaces")) !== null && _d !== void 0 ? _d : 2; - const amountTxt = engrid_ENGrid.formatNumber(amount, dec_places, dec_separator, thousands_separator); - return amount > 0 ? symbol + amountTxt : ""; + }); +} +function setVisibilityState(els, state) { + els.forEach(function (el) { + if (el) { + el.setAttribute('data-state', state); } - getFrequencyTxt() { - const freqTxt = { - onetime: "one-time", - monthly: "monthly", - annual: "annual", - }; - const frequency = this._frequency.frequency; - return frequency in freqTxt ? freqTxt[frequency] : frequency; + }); +} +function getOwnerDocument(elementOrElements) { + var _element$ownerDocumen; + + var _normalizeToArray = normalizeToArray(elementOrElements), + element = _normalizeToArray[0]; // Elements created via a