");vwo_$('head').append(_vwo_sel);return vwo_$('head')[0] && vwo_$('head')[0].lastChild;})("HEAD")}}, C_940895_39_1_2_0:{ fn:function(log,nonce=''){return (function(x) { try{ var _vwo_sel = vwo_$("`); !vwo_$("head").find('#1740425171461').length && vwo_$('head').append(_vwo_sel);}catch(e) {console.error(e)} try{}catch(e) {console.error(e)} try{const getCurrentDate = (d = new Date()) => d.toISOString().split('T')[0]; function vwoCustomEvent (labelValue) { window.VWO = window.VWO || []; VWO.event = VWO.event || function () {VWO.push(["event"].concat([].slice.call(arguments)))}; VWO.event("customEvent", { "label": labelValue.toString() }); } class RadioButtonComponent { constructor (element) { this.radio = element.querySelector('input[type="radio"]'); this.label = element.querySelector('label'); } get value () { let value = this.radio.value; if (Number.isNaN(parseFloat(value))) return value; if (parseFloat(value) % 1 == 0) return parseInt(value); return parseFloat(value); } set value (newValue) { this.radio.value = newValue; } get text () { return this.label.textContent; } set text (newText) { if (this.label.querySelector('.form-required')) { const labelTextNode = [...this.label.childNodes].filter(({ nodeType }) => nodeType === Node.TEXT_NODE)[0]; labelTextNode.nodeValue = newText; } else { this.label.textContent = newText; } } get checked () { return this.radio.checked; } set checked (bool) { this.click(), bool === true && this.radio.checked === true; } click () { this.label.click(); } select () { this.click(); } addEventListener (eventType, callbackFunction) { switch (eventType) { case 'click': this.label.addEventListener(eventType, callbackFunction); case 'change': default: this.radio.addEventListener(eventType, callbackFunction); } } } class TextFieldComponent { constructor (element) { this.input = element.querySelector('input[type="text"]'); this.label = element.querySelector('label'); } get value () { return this.input.value; } set value (newValue) { this.input.dispatchEvent(new Event('focus')); this.input.value = newValue; this.input.dispatchEvent(new Event('keyup')); this.input.dispatchEvent(new Event('change')); this.input.dispatchEvent(new Event('blur')); } get text () { return this.input.placeholder; } set text (newText) { this.input.placeholder = newText; } addEventListener (eventType, callbackFunction) { this.input.addEventListener(eventType, callbackFunction); } } class GiftArrayButton extends RadioButtonComponent { constructor (element) { super(element); } get amount () { return this.value; } set amount (newAmount) { if (Number.isNaN(parseInt(newAmount)) || parseInt(newAmount) <= 0) throw new Error("New amount must be a valid number greater than 0."); newAmount = parseInt(newAmount); this.text = '$' + newAmount; this.value = newAmount; } } class GiftArrayOtherAmount extends TextFieldComponent { constructor (element) { super(element); } get amount () { return parseFloat(this.value); } set amount (newAmount) { if (Number.isNaN(parseInt(newAmount)) || parseInt(newAmount) <= 0) throw new Error("New amount must be a valid number greater than 0."); newAmount = parseFloat(newAmount); this.value = newAmount; this.input.dispatchEvent(new Event('updateSummary')); } } class GiftArray extends Array { constructor (items) { if (!Array.isArray(items) && items.length === 0) { throw new Error("GiftArray: Arugment 1 is not an instance of Array with a length greater than 0:" + items.join(', ')); } if (items.every((item) => item instanceof GiftArrayButton || item instanceof GiftArrayOtherAmount)) { if (items.find((item) => item instanceof GiftArrayOtherAmount)) { let temp = items.find((item) => item instanceof GiftArrayOtherAmount); items = items.filter((item) => item instanceof GiftArrayButton); items.push(temp); } } else if (items.every((item) => item instanceof HTMLElement)) { items = items.map((item) => item.matches(".webform-component-textfield") ? new GiftArrayOtherAmount(item) : new GiftArrayButton(item)); } else { throw new Error("GiftArray: Arugment 1 is not of type HTMLElement, HTMLElement[], or GiftArrayButton|GiftArrayButton[]:" + items.join(', ')); } super(...items); this.Buttons = items.filter((item) => item instanceof GiftArrayButton); this.OtherAmountInput = items.find((item) => item instanceof GiftArrayOtherAmount); } get amount () { const activeButton = this.Buttons.find((item) => item.checked); if (activeButton.value === "other") { const otherButton = activeButton; if (!otherButton) { throw new Error("GiftArray.amount: Other Button was not defined."); } otherButton.click(); return this.OtherAmountInput.value; } else { return activeButton.value; } } set amount (newAmount) { if (Number.isNaN(parseInt(newAmount)) || parseInt(newAmount) <= 0) throw new Error("New amount must be a valid number greater than 0."); newAmount = parseFloat(newAmount); const matchingButton = this.find((item) => item.value === newAmount); if (matchingButton) { matchingButton.click(); } else { const otherButton = this.Buttons.find((item) => item.value === "other"); otherButton.click(); this.OtherAmountInput.amount = newAmount; } } addEventListeners (eventType, callbackFunction, filter = undefined) { if (filter && typeof filter === 'function') { const filteredItems = this.filter((item) => filter.call(this, item)); filteredItems.forEach((item) => item.addEventListener(eventType, callbackFunction)); } else if (filter && typeof filter === 'string') { if (filter.match(/buttons/gmi)) this.Buttons.forEach((item) => item.addEventListener(eventType, callbackFunction)); if (filter.match(/other/gmi)) this.OtherAmountInput.addEventListener(eventType, callbackFunction); } else { this.forEach((item) => item.addEventListener(eventType, callbackFunction)); } } } class FrequencyButton extends RadioButtonComponent { constructor (element) { super(element); } get frequency () { return this.text.match(/Monthly/gmi) ? "Monthly" : "One-Time"; } set freqency (newAmount) { if (Number.isNaN(parseInt(newAmount)) || parseInt(newAmount) <= 0) throw new Error("New amount must be a valid number greater than 0."); newAmount = parseInt(newAmount); this.text = '$' + newAmount; this.value = newAmount; } } class FrequencyArray extends Array { constructor (items) { if (!Array.isArray(items) && items.length === 0) { throw new Error("FrequencyArray: Arugment 1 is not an instance of Array with a length greater than 0:" + items.join(', ')); } /*if (items.every((item) => item instanceof GiftArrayButton || item instanceof GiftArrayOtherAmount)) { if (items.find((item) => item instanceof GiftArrayOtherAmount)) { let temp = items.find((item) => item instanceof GiftArrayOtherAmount); items = items.filter((item) => item instanceof GiftArrayButton); items.push(temp); } } else*/ if (items.every((item) => item instanceof HTMLElement)) { items = items.map((item) => item.matches(".webform-component-textfield") ? new GiftArrayOtherAmount(item) : new GiftArrayButton(item)); } else { throw new Error("FrequencyArray: Arugment 1 is not of type HTMLElement or HTMLElement[]:" + items.join(', ')); } super(...items); this.Buttons = items.filter((item) => item instanceof GiftArrayButton); } get frequency () { const activeButton = this.Buttons.find((item) => item.checked); if (activeButton.value === "recurs") return "monthly"; if (activeButton.value === "NO_RECURR") return "one-time"; return activeButton.value; } set frequency (newFrequency) { const reNewFrequencyValue = new RegExp(newFrequency, 'gmi'); const matchingButton = this.find((item) => item.value.match(reNewFrequencyValue) || item.text.match(reNewFrequencyValue)); matchingButton.click(); } get recurring () { return this.frequency === "monthly" ? true : false; } set recurring (bool) { this.frequency = bool === true ? "monthly" : "one-time"; } addEventListeners (eventType, callbackFunction, filter = undefined) { if (filter && typeof filter === 'function') { const filteredItems = this.filter((item) => filter.call(this, item)); filteredItems.forEach((item) => item.addEventListener(eventType, callbackFunction)); } else if (filter && typeof filter === 'string') { if (filter.match(/buttons/gmi)) this.Buttons.forEach((item) => item.addEventListener(eventType, callbackFunction)); if (filter.match(/other/gmi)) this.OtherAmountInput.addEventListener(eventType, callbackFunction); } else { this.forEach((item) => item.addEventListener(eventType, callbackFunction)); } } } // const lockedProperty = { writable: false, configurable: false, enumerable: true }; function DonationFormAPI (elements, options = {}) { const defaultOptions = { min: 1.00, max: 999999.99, makeTabbed: false, fakeSubmit: true, overrideGiftArrayValues: false, }; options = { ...defaultOptions, ...options }; // const { frequencyRadios, submitButton, root } = elements; const [ amountRadiosOnetime, amountRadiosMonthly ] = elements.amountRadios; const oneTimeOtherAmountWrapper = amountRadiosOnetime.find((div) => !div.matches('.webform-component-textfield') || div.querySelector('input[type="text"]')); const oneTimeRadioButtons = amountRadiosOnetime.filter((div) => div !== oneTimeOtherAmountWrapper); const monthlyOtherAmountWrapper = amountRadiosMonthly.find((div) => !div.matches('.webform-component-textfield') || div.querySelector('input[type="text"]')); const monthlyRadioButtons = amountRadiosMonthly.filter((div) => div !== monthlyOtherAmountWrapper); const debug = { log: (...args) => window.NA.DonationForm.DEBUG_MODE && console.log(...args), info: (...args) => window.NA.DonationForm.DEBUG_MODE && console.log(...args), warn: (...args) => window.NA.DonationForm.DEBUG_MODE && console.log(...args), error: (...args) => window.NA.DonationForm.DEBUG_MODE && console.log(...args), }; // const api = new Object(); Object.defineProperty(api, 'root', { value: root, writable: false, configurable: true, enumerable: true, }); Object.defineProperties(api, { 'FORM_MINIMUM': { value: options.min || 0, ...lockedProperty }, 'FORM_MAXIMUM': { value: options.max || Infinity, ...lockedProperty }, }); Object.defineProperties(api, { GiftArrays: { value: { "one-time": new GiftArray([ ...oneTimeRadioButtons, oneTimeOtherAmountWrapper ]), "monthly": new GiftArray([ ...monthlyRadioButtons, monthlyOtherAmountWrapper ]), }, writable: false, configurable: true, enumerable: true, }, Frequencies: { value: new FrequencyArray(frequencyRadios), writable: false, configurable: true, enumerable: true, }, SubmitButton: { value: submitButton, writable: false, configurable: false, enumerable: true, } }); Object.defineProperties(api, { 'getFrequency': { value: async function () { if (!this || this === null) throw new Error("validate: Unable to read API context."); return new Promise((resolve, reject) => { try { resolve(this.Frequencies.frequency); } catch (error) { reject(error); } }); }, ...lockedProperty }, 'setFrequency': { value: async function (frequency) { if (!this || this === null) throw new Error("validate: Unable to read API context."); return new Promise(async (resolve, reject) => { try { this.Frequencies.frequency = frequency; if (await this.getFrequency() === frequency) resolve(frequency); } catch (error) { reject(error); } }); }, ...lockedProperty }, 'getAmount': { value: async function (frequency = undefined) { if (!this || this === null) throw new Error("validate: Unable to read API context."); return new Promise(async (resolve, reject) => { try { frequency = frequency || await this.getFrequency(); if (frequency && this.GiftArrays.hasOwnProperty(frequency)) { const activeGiftArray = this.GiftArrays[frequency]; resolve(activeGiftArray.amount); } else { throw new Error("getAmount: Invalid frequency: " + frequency); } } catch (error) { reject(error); } }); }, ...lockedProperty }, 'setAmount': { value: async function (amount, frequency = undefined) { if (!this || this === null) throw new Error("validate: Unable to read API context."); return new Promise(async (resolve, reject) => { try { const currentFrequency = await this.getFrequency(); if (!frequency) { frequency = currentFrequency; } else if (frequency !== currentFrequency) { frequency = await this.setFrequency(frequency); } if (frequency && this.GiftArrays.hasOwnProperty(frequency)) { const activeGiftArray = this.GiftArrays[frequency]; activeGiftArray.amount = amount; } else { throw new Error("setAmount: Invalid frequency: " + frequency); } if (await this.getAmount() === amount) resolve(amount); } catch (error) { reject(error); } }); }, ...lockedProperty }, 'getRecurring': { value: async function () { if (!this || this === null) throw new Error("validate: Unable to read API context."); return new Promise((resolve, reject) => { try { resolve(this.Frequencies.recurring); } catch (error) { reject(error); } }); }, ...lockedProperty }, 'setRecurring': { value: async function (bool) { if (!this || this === null) throw new Error("validate: Unable to read API context."); return new Promise(async (resolve, reject) => { try { this.Frequencies.frequency = bool ? true : false; if (await this.getRecurring() === bool) resolve(bool); } catch (error) { reject(error); } }); }, ...lockedProperty }, freqency: { get () { return this.getFrequency() }, set (value) { this.setFrequency(value) }, enumerable: true, configurable: true, }, amount: { get () { return this.getAmount() }, set (value) { this.setAmount(value) }, enumerable: true, configurable: true, }, recurring: { get () { return this.getRecurring() }, set (value) { this.setRecurring(value) }, enumerable: true, configurable: true, }, }); Object.defineProperties(api, { 'submit': { value: async function (condition = this.validate||function(){return true}) { //this.hooks['onBeforeSubmit'].forEach((callback) => callback.call(this)); let result; const isAsyncFunction = (func) => func.constructor.name === "AsyncFunction"; if (Array.isArray(condition)) { if (condition.every((c) => typeof c === 'function' && isAsyncFunction(c))) { result = await Promise.all(condition.map(async (c) => await c.call(this))); } else if (condition.every((c) => typeof c === 'function')) { result = condition.every((c) => c.call(this)); } else if (condition.every((c) => c === true || c === false)) { result = condition.every((c) => c); } } else if (typeof condition === 'function' && isAsyncFunction(condition)) { result = await condition.call(this); } else if (typeof condition === 'function') { result = condition.call(this); } else if (condition === true || condition === false) { result = condition; } else { console.error("Unknown error."); debugger; } // if (result === true) { if (window.NA.DonationForm.hasOwnProperty("DEBUG_MODE") && window.NA.DonationForm["DEBUG_MODE"] == true) return console.log("Submit aborted (debug mode is enabled)."); this.SubmitButton.click(), this.hooks['onSubmit'].forEach((callback) => callback.call(this)); //this.hooks['onAfterSubmit'].forEach((callback) => callback.call(this)); } else { return console.log("Submit failed (conditions did not evaluate to true)."); } }, ...lockedProperty }, 'interceptSubmit': { value: function (handleInterceptedSubmit = () => { return new Promise((resolve) => resolve(undefined)) }) { try { window.NA.DonationForm.SubmitButtonCopy = window.NA.DonationForm.SubmitButtonCopy || createNewSubmitButton(window.NA.DonationForm.SubmitButton, { cloneOriginal: false, hideOriginal: true, observeOriginal: false }); window.NA.DonationForm.SubmitButtonCopy.addEventListener('click', async (event) => { event.preventDefault(), event.stopPropagation(); const shouldFormSubmit = await handleInterceptedSubmit.call(this, event); if (shouldFormSubmit) { console.info("Submit allowed by initial interceptSubmit callback function resulting in a truthy evaluation."); const formIsValid = await window.NA.DonationForm.validate(); if (!formIsValid) { // if submit allowed but there are known errors in the form console.warn("Form has known errors. Attempting to submit to show errors then retrying."); console.log("Submitting..."); window.NA.DonationForm.submit(true); // submit anyway to trigger the error to be shown window.NA.DonationForm.SubmitButton.style.setProperty("display", "none"), debug.info("SubmitButton hidden."), // hide the original submit button again window.NA.DonationForm.SubmitButtonCopy.style.setProperty("display", "none"), debug.info("SubmitButtonCopy hidden."); // hide the copy of the submit button again window.NA.DonationForm.SubmitButtonCopy.style.removeProperty("display"), debug.info("SubmitButtonCopy unhidden."); // show the copy of the submit button } else { console.log("Submitting..."); window.NA.DonationForm.submit(true); } } else { console.log("Submit prevented."); console.info("Next submit will be allowed."); window.NA.DonationForm.SubmitButton.style.removeProperty("display"), debug.info("SubmitButton unhidden."); // show the original submit button so that if something goes wrong the user can still click the submit button window.NA.DonationForm.SubmitButtonCopy.style.setProperty("display", "none"), debug.info("SubmitButtonCopy hidden."); // hide the copy of the submit button that intercepts submit attempts so that there aren't two buttons } }); console.log("Submit intercept added.\nButton:", window.NA.DonationForm.SubmitButtonCopy); } catch (error) { console.error("Failed to add submit intercept:", error); } }, ...lockedProperty }, 'validate': { value: async function (root = undefined) { if (!this || this === null) throw new Error("validate: Unable to read API context."); root = root || this.root; const flattenArray = (array) => array.reduce((flat, toFlatten) => flat.concat(Array.isArray(toFlatten) ? flattenArray(toFlatten) : toFlatten), []); try { const freqency = await this.getFrequency(), amount = await this.getAmount(); if (!freqency || !amount) return false; if (amount < this.FORM_MINIMUM || amount > this.FORM_MAXIMUM) return console.error("validate:", "Gift amount is invalid:", amount), false; let requiredFields = Array.from(root.querySelectorAll('label:has(.form-required)')) .map((label) => document.getElementById(label.htmlFor) || (label.nextElementSibling || label.previousElementSibling)) .filter((_) => !!_) // remove blanks .filter((field) => { if (field.name && field.name.includes('[payment_information]')) return false; return true; }) .map((field) => { if (field.matches("div")) return [...field.querySelectorAll('input')]; return field; }) requiredFields = flattenArray(requiredFields); const valid = requiredFields.every((input) => { const type = input.tagName.toLowerCase() === 'select' ? 'select' : input.type; const { name, value, id } = input; //console.log(type, name, value); if (name === 'submitted[payment_information][payment_fields][credit][card_number]') { if (value && value.length === 16) return true; return console.error("validate:", name+':', "CC is invalid."), false; } if (name === 'submitted[leadership_circle]') return true; if (name === 'submitted[donation][other_amount]' || name === 'submitted[donation][recurring_other_amount]') if (amount) return true; switch (type) { case 'email': const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; if (!emailRegex.test(value)) return console.error("validate:", name+':', "Email address is invalid.\n", input, value), false; return true; case 'tel': if (!value || value.length < 10) return console.error("validate:", name+':', "Phone number is invalid.\n", input, value), false; return true; case 'select': case 'radio': case 'text': if (!value || value.length === 0) return console.error("validate:", name+':', "Field is invalid.\n", input, value), false; return true; default: debug.log("default"); return true; } /*if (!value || value.length === 0) return false;*/ }); return valid; } catch (error) { console.error(error); return false; } }, ...lockedProperty }, //'makeTabbed': { value: function(){} }, 'DonationInterrupter': { value: { init: initDonationInterrupter.bind(api) }, enumerable: true, configurable: true, writable: true, } }); initHooks(api, ['onFrequencyChange', 'onAmountChange', 'onTrySubmit', 'onSubmit']); api.Frequencies.addEventListeners('change', (event) => { if (event.target.checked) { api.hooks['onFrequencyChange'].forEach((callback) => { callback.call(api, event.target.value); }); } }); Object.entries(api.GiftArrays).forEach(([ key, GiftArray ]) => { GiftArray.addEventListeners('change', (event) => { if (event.target.checked) { api.hooks['onAmountChange'].forEach((callback) => { callback.call(api, event.target.value); }); } }); }); api.SubmitButton.addEventListener('click', (event) => { api.hooks['onTrySubmit'].forEach((callback) => callback.call(api, event)); }); api.root.addEventListener('submit', (event) => { api.hooks['onSubmit'].forEach((callback) => callback.call(api, event)); }); if (options.makeTabbed) api.makeTabbed(); /*if (options.fakeSubmit) window.NA.DonationForm.SubmitButtonCopy = window.NA.DonationForm.SubmitButtonCopy || createNewSubmitButton(window.NA.DonationForm.SubmitButton, { cloneOriginal: false, hideOriginal: true, observeOriginal: false });*/ return api; } function createNewSubmitButton (originalSubmitButton = window.NA.DonationForm.SubmitButton, options = {}) { const defaultOptions = { cloneOriginal: true, hideOriginal: true, observeOriginal: true, }; options = { ...defaultOptions, ...options }; const newSubmitButton = document.createElement('button'); //newSubmitButton.id = "submit-button-copy"; newSubmitButton.classList.add("btn"); newSubmitButton.textContent = originalSubmitButton.value; originalSubmitButton.after(newSubmitButton); options.hideOriginal && originalSubmitButton.style.setProperty("display", "none"); return newSubmitButton; } function initHooks (api, hookNames = []) { const hooks = Object.fromEntries(hookNames.map((hookName) => ([hookName, new Array()]))); Object.defineProperty(api, 'hooks', { value: hooks, ...lockedProperty }); } function initDonationInterrupter (options = {}) { const getExpId = () => { let experiments = window._vwo_exp; experiments = Object.entries(window._vwo_exp); let id = experiments.find(([id, data]) => { const name = data.name; return name.match(/Donation Interrupter/); })[1]?.id; return id; }; const getExpVariation = (id) => { let experiment = window._vwo_exp[id]; return experiment.combination_chosen || experiment.combination_selected; }; const defaultOptions = { id: [ 'VWO', getExpId(), getExpVariation(getExpId()) ].join('-'), tokenName: ("NA__MPR_DonationInterrupter:" + [ 'VWO', getExpId(), getExpVariation(getExpId()) ].join('-')), min: 10, max: 100, askAmount: (originalAmount) => { if (originalAmount > 500) // $500+ return false; // don't show if (originalAmount >= 400) // $400-$500 return 50; if (originalAmount >= 300) // $300-$399 return 40; if (originalAmount >= 200) // $200-$299 return 30; if (originalAmount >= 100) // $100-$199 return 15; if (originalAmount < 100) // $100- return 10; return false; }, askFrequency: (originalFrequency) => { return "monthly"; }, popupHTML: { headingHTML: (` `), bodyHTML: (` `), }, }; options = { ...defaultOptions, ...options }; console.log("Initializing donation interrupter."); return new Promise((resolve, reject) => { try { const dialogElement = document.createElement('dialog'); dialogElement.id = options.id; dialogElement.classList.add("popup", "donation-interrupter", "NA"); dialogElement.innerHTML = `
${options.popupHTML.headingHTML} ${options.popupHTML.bodyHTML}
`; document.body.appendChild(dialogElement); // // const api = new Object({ askAmount: options.askAmount, askFrequency: options.askFrequency, }); Object.defineProperties(api, { id: { value: options.id, writable: false, enumerable: true, configurable: false, }, tokenName: { value: options.tokenName, writable: false, enumerable: true, configurable: false, }, Dialog: { value: dialogElement, writable: false, enumerable: true, configurable: true, }, show: { value: function () { this.update(), this.Dialog.showModal(), vwoCustomEvent(`${this.id}:shown`); this.storedState.updateTokenProperty("lastShown", getCurrentDate()); this.hooks['onShow'].forEach((callback) => callback.call(this)); }, ...lockedProperty }, hide: { value: function () { this.Dialog.close(), this.hooks['onHide'].forEach((callback) => callback.call(this)); }, ...lockedProperty }, update: { value: function () { this.Dialog.dispatchEvent(new CustomEvent('update'), { bubbles: false }); }, ...lockedProperty } }); Object.defineProperty(api, 'storedState', { value: { storageApi: localStorage, getToken: (function () { const tokenName = this.tokenName, storageApi = this.storedState.storageApi; return JSON.parse(storageApi.getItem(tokenName)) || null; }).bind(api), setToken: (function (tokenValue) { const tokenName = this.tokenName, storageApi = this.storedState.storageApi; return storageApi.setItem(tokenName, JSON.stringify(tokenValue)); }).bind(api), updateTokenProperty: (function (tokenPropertyName, tokenPropertyValue) { let state = this.storedState.getToken() || {}; state[tokenPropertyName] = tokenPropertyValue; this.storedState.setToken(state); return (this.storedState.getToken() || {})[tokenPropertyName] || undefined; }).bind(api), } }); initHooks(api, ['onShow', 'onHide', 'onUpdate', 'onYes', 'onNo']); function handleDialogUpdate (event) { // update dynamic text in the dialog Array.from(this.Dialog.querySelectorAll('[data-value]')).forEach(async (el) => { const attributeValue = el.getAttribute('data-value'); const currentAmount = await window.NA.DonationForm.getAmount(), currentFrequency = await window.NA.DonationForm.getFrequency(); if (attributeValue.match("askAmount")) { el.textContent = this.askAmount(currentAmount); } else if (attributeValue.match("askFrequency")) { el.textContent = this.askFrequency(currentFrequency); } else if (attributeValue.match("originalAmount") || attributeValue.match("amount")) { el.textContent = currentAmount; } else if (attributeValue.match("originalFrequency") || attributeValue.match("frequency")) { el.textContent = currentFrequency; } }); this.hooks['onUpdate'].forEach((callback) => callback.call(this)); } api.Dialog.addEventListener('update', handleDialogUpdate.bind(api)); // const handleYes = (async function () { vwoCustomEvent(`${this.id}:DonationInterrupter:yes`); const currentAmount = await window.NA.DonationForm.getAmount(), currentFrequency = await window.NA.DonationForm.getFrequency(); const catchAsyncError = (error) => { console.error("An error occured:", error); debugger; this.hide(); }; window.NA.DonationForm.setFrequency(this.askFrequency(currentFrequency)).then((frequency) => { console.log("Updated frequency:", frequency); window.NA.DonationForm.setAmount(this.askAmount(currentAmount)).then((amount) => { console.log("Updated amount:", amount); setTimeout(() => { console.log("Submitting..."); try { window.NA.DonationForm.submit(); } catch (error) { console.error("Error when submitting."); } finally { this.hide(); } }, 100); }).catch(catchAsyncError); }).catch(catchAsyncError); this.storedState.updateTokenProperty("lastConverted", getCurrentDate()); }).bind(api); const handleNo = (function () { vwoCustomEvent(`${this.id}:DonationInterrupter:no`); setTimeout(() => { console.log("Submitting..."); try { window.NA.DonationForm.submit(); } catch (error) { console.error("Error when submitting."); } finally { this.hide(); } }, 100); this.storedState.updateTokenProperty("lastDismissed", getCurrentDate()); }).bind(api); const handleCancel = (function () { this.hide(); this.storedState.updateTokenProperty("lastDismissed", getCurrentDate()); }).bind(api); async function handleDialogButtonClick (event) { event.preventDefault(); if (event.target.hasAttribute('data-action')) { if (event.target.getAttribute('data-action').match("yes")) { await handleYes.call(this); this.hooks['onYes'].forEach((callback) => callback.call(this)); } if (event.target.getAttribute('data-action').match("no")) { await handleNo.call(this); this.hooks['onNo'].forEach((callback) => callback.call(this)); } } } Array.from(api.Dialog.querySelectorAll('.popup__footer button')).forEach((button) => button.addEventListener('click', handleDialogButtonClick.bind(api))); if (api.Dialog.querySelector('.btn-dismiss')) api.Dialog.querySelector('.btn-dismiss').onclick = handleCancel; window.NA.DonationForm.DonationInterrupter = api; async function shouldDonationInterrupterShow () { return new Promise(async (resolve, reject) => { const shouldSubmit = true, shouldNotSubmit = false; const shouldShow = () => { this.show(), resolve(shouldNotSubmit) }, shouldNotShow = () => resolve(shouldSubmit); try { const formIsValid = await window.NA.DonationForm.validate(); if (!formIsValid) return console.log("One or more donation form fields are invalid; donation interrupter will not be shown."), shouldNotShow(); const currentFrequency = await window.NA.DonationForm.getFrequency(), currentAmount = await window.NA.DonationForm.getAmount(), askFrequency = this.askFrequency(currentFrequency), askAmount = this.askAmount(currentAmount); if (!currentFrequency || askFrequency == currentFrequency) return console.log("Ask frequency returned false or invalid; donation interrupter will not be shown."), shouldNotShow(); if (askAmount == false || askAmount <= 0) return console.log("Ask amount returned false or invalid; donation interrupter will not be shown."), shouldNotShow(); } catch (error) { return console.error(error), shouldNotShow(); } try { /// Summary: shows when not seen before at all, or if seen and dismissed on a day that is not the current day (e.g. yesterday) const storedState = this.storedState.getToken(); if (!storedState || !storedState.hasOwnProperty("lastShown")) { // has not been seen before; first time return console.log("Donation interrupter not seen yet; donation interrupter will be shown."), shouldShow(); } else { // returning visitors if (storedState.hasOwnProperty("lastConverted")) { // the user has converted from the popup before return console.log("Already converted; donation interrupter will not be shown."), shouldNotShow(); } else if (storedState.hasOwnProperty("lastDismissed") && storedState['lastDismissed'] !== getCurrentDate()) { // if the popup has been dismissed before but the last time it was dismissed is NOT today return console.log("Donation interrupter dismissed, but not today; donation interrupter will be shown."), shouldShow(); } else { return console.log("Donation interrupter already seen and/or dismissed today; donation interrupter will not be shown."), shouldNotShow(); } } } catch (error) { return console.error(error), shouldNotShow(); } }); } window.NA.DonationForm.interceptSubmit(shouldDonationInterrupterShow.bind(api)); resolve(api); } catch (error) { console.error(error); } }); } window.NA = window.NA || {}; window.NA.DonationForm = window.NA.DonationForm || {}; window.NA.DonationForm.init = async function init () { console.log("Initializing donation form API. Waiting for required elements...."); return new Promise((resolve, reject) => { const asyncWaitForElement=async function(e,r=100,t=1e4){r=Number.isInteger(r)&&r>0&&r<=100?r:parseInt(r);let n="Array";if("NaN"==r)return console.error("Invalid refresh interval:",r);Array.isArray(e)||"string"!=typeof e||(n="string",e=[e]);let l=e=>document.querySelector(e),i=e=>e.every(e=>!!l(e));return new Promise((R,a)=>{let m=(e,r=null)=>(r&&clearInterval(r),R("Array"==n||e.length>1?e.map(e=>l(e)):l(e[0]))),o=n=>{console.error(`${n.name}: ${n.message}`);let l=()=>asyncWaitForElement(e,r=100,t=1e4);return a(n,l)};try{if(i(e))return m(e);let s=setInterval(()=>{if(i(e))return m(e,s)},1e3/r);setTimeout(()=>{try{if(!i(e)){clearInterval(s);let r=Error(`Failed to find matching elements within ${t}ms`);throw r.name="Timed Out",r}}catch(n){return o(n)}},t)}catch(u){return o(u)}})}; asyncWaitForElement([ 'form.webform-client-form', '#webform-component-donation--recurs-monthly', '#webform-component-donation--amount', '#webform-component-donation--recurring-amount', '.form-actions input[type="submit"]' ]).then(([ componentDonationForm, componentFrequency, componentAmountOnetime, componentAmountMonthly, formSubmitButton ]) => { const api = DonationFormAPI({ root: componentDonationForm, frequencyRadios: [...componentFrequency.querySelectorAll('.form-type-radio')], amountRadios: [ [...componentAmountOnetime.querySelectorAll('div > .form-type-radio, div > .webform-component-textfield')], [...componentAmountMonthly.querySelectorAll('div > .form-type-radio, div > .webform-component-textfield')], ], submitButton: formSubmitButton, // }); window.NA.DonationForm = { ...window.NA.DonationForm, ...api }; resolve(window.NA.DonationForm); }).catch((error) => reject(error)); }); }; }catch(e) {console.error(e)} return vwo_$('head')[0] && vwo_$('head')[0].lastChild;})("head")}}, C_940895_64_1_2_0:{ fn:function(log,nonce=''){return (function(x) {var el,ctx=vwo_$(x); /*vwo_debug log("content","#tfa_134-L > b:nth-of-type(1)"); vwo_debug*/el=vwo_$("#tfa_134-L > b:nth-of-type(1)"),vwo_$("#tfa_134-L > b:nth-of-type(1)").each((function(){this.__vwoControlOuterHTML=this.__vwoControlOuterHTML||this.outerHTML,vwo_$(this).vwoAttr("class",""),!vwo_$(this).find('[vwo-op-1742933835357-1=""]').length&&vwo_$(this).append('(Optional)'),vwo_$(this).nonEmptyContents().eq(0).replaceWith2(document.createTextNode("In your own words, why would an Marketplace listener choose to become an donor? "))})),el=vwo_$("#tfa_134-L > b:nth-of-type(1)");})("#tfa_134-L > b:nth-of-type(1)")}}, R_940895_64_1_2_0:{ fn:function(log,nonce=''){return (function(x) { if(!vwo_$.fn.vwoRevertHtml){ return; }; var el,ctx=vwo_$(x); /*vwo_debug log("Revert","content","#tfa_134-L > b:nth-of-type(1)"); vwo_debug*/(el=vwo_$("#tfa_134-L > b:nth-of-type(1)")).revertContentOp(),el=vwo_$("#tfa_134-L > b:nth-of-type(1)");})("#tfa_134-L > b:nth-of-type(1)")}}},rules:[{"triggers":["8536412"],"tags":[{"metricId":959030,"id":"metric","data":{"type":"m","campaigns":[{"g":2,"c":62}]}},{"metricId":959030,"id":"metric","data":{"type":"m","campaigns":[{"g":3,"c":63}]}},{"metricId":959030,"id":"metric","data":{"type":"m","campaigns":[{"g":3,"c":65}]}},{"metricId":959030,"id":"metric","data":{"type":"m","campaigns":[{"g":3,"c":64}]}},{"metricId":959030,"id":"metric","data":{"type":"m","campaigns":[{"g":1,"c":39}]}},{"metricId":959030,"id":"metric","data":{"type":"m","campaigns":[{"g":4,"c":48}]}}]},{"triggers":["12454056"],"tags":[{"metricId":0,"id":"metric","data":{"type":"g","campaigns":[{"g":5,"c":39}]}}]},{"triggers":["8536409"],"tags":[{"metricId":959027,"id":"metric","data":{"type":"m","campaigns":[{"g":3,"c":62}]}},{"metricId":959027,"id":"metric","data":{"type":"m","campaigns":[{"g":4,"c":63}]}},{"metricId":959027,"id":"metric","data":{"type":"m","campaigns":[{"g":4,"c":65}]}},{"metricId":959027,"id":"metric","data":{"type":"m","campaigns":[{"g":4,"c":64}]}},{"metricId":959027,"id":"metric","data":{"type":"m","campaigns":[{"g":3,"c":39}]}},{"metricId":959027,"id":"metric","data":{"type":"m","campaigns":[{"g":5,"c":48}]}}]},{"triggers":["8536415"],"tags":[{"metricId":959033,"id":"metric","data":{"type":"m","campaigns":[{"g":1,"c":62}]}},{"metricId":959033,"id":"metric","data":{"type":"m","campaigns":[{"g":2,"c":63}]}},{"metricId":959033,"id":"metric","data":{"type":"m","campaigns":[{"g":2,"c":65}]}},{"metricId":959033,"id":"metric","data":{"type":"m","campaigns":[{"g":2,"c":64}]}},{"metricId":959033,"id":"metric","data":{"type":"m","campaigns":[{"g":2,"c":39}]}},{"metricId":959033,"id":"metric","data":{"type":"m","campaigns":[{"g":3,"c":48}]}}]},{"triggers":["12454059"],"tags":[{"metricId":0,"id":"metric","data":{"type":"g","campaigns":[{"g":6,"c":39}]}}]},{"triggers":["8639604"],"tags":[{"metricId":951908,"id":"metric","data":{"type":"m","campaigns":[{"g":4,"c":62}]}},{"metricId":951908,"id":"metric","data":{"type":"m","campaigns":[{"g":1,"c":63}]}},{"metricId":951908,"id":"metric","data":{"type":"m","campaigns":[{"g":1,"c":65}]}},{"metricId":951908,"id":"metric","data":{"type":"m","campaigns":[{"g":1,"c":64}]}},{"metricId":951908,"id":"metric","data":{"type":"m","campaigns":[{"g":1,"c":48}]}}]},{"triggers":["12454053"],"tags":[{"priority":4,"data":"campaigns.39","id":"runCampaign"}]},{"triggers":["12928443"],"tags":[{"priority":0,"data":"campaigns.65","id":"runCampaign"}]},{"triggers":["12454062"],"tags":[{"metricId":0,"id":"metric","data":{"type":"g","campaigns":[{"g":7,"c":39}]}}]},{"triggers":["8459768"],"tags":[{"metricId":951905,"id":"metric","data":{"type":"m","campaigns":[{"g":5,"c":62}]}},{"metricId":951905,"id":"metric","data":{"type":"m","campaigns":[{"g":5,"c":63}]}},{"metricId":951905,"id":"metric","data":{"type":"m","campaigns":[{"g":5,"c":65}]}},{"metricId":951905,"id":"metric","data":{"type":"m","campaigns":[{"g":5,"c":64}]}},{"metricId":951905,"id":"metric","data":{"type":"m","campaigns":[{"g":4,"c":39}]}},{"metricId":951905,"id":"metric","data":{"type":"m","campaigns":[{"g":2,"c":48}]}}]},{"triggers":["10589191"],"tags":[{"priority":4,"data":"campaigns.62","id":"runCampaign"},{"priority":4,"data":"campaigns.63","id":"runCampaign"},{"priority":4,"data":"campaigns.64","id":"runCampaign"},{"priority":4,"data":"campaigns.48","id":"runCampaign"}]},{"triggers":["8"],"tags":[{"priority":2,"id":"groupCampaigns"},{"priority":3,"id":"prePostMutation"}]},{"triggers":["9"],"tags":[{"priority":2,"id":"visibilityService"}]},{"triggers":["2"],"tags":[{"id":"runTestCampaign"}]},{"triggers":["75"],"tags":[{"id":"urlChange"}]},{"triggers":["5"],"tags":[{"id":"checkEnvironment"}]}],pages:{"ec":[{"1625289":{"inc":["o",["url","urlReg","(?i).*"]]}}]},pagesEval:{"ec":[1625289]},stags:{}}})(); ;;var commonWrapper=function(argument){if(!argument){argument={valuesGetter:function(){return{}},valuesSetter:function(){},verifyData:function(){return{}}}}const getVisitorUuid=function(){if(window._vwo_acc_id>=1037725){return window.VWO&&window.VWO.get("visitor.id")}else{return window.VWO._&&window.VWO._.cookies&&window.VWO._.cookies.get("_vwo_uuid")}};var pollInterval=100;var timeout=6e4;return function(){var accountIntegrationSettings={};var _interval=null;function waitForAnalyticsVariables(){try{accountIntegrationSettings=argument.valuesGetter();accountIntegrationSettings.visitorUuid=getVisitorUuid()}catch(error){accountIntegrationSettings=undefined}if(accountIntegrationSettings&&argument.verifyData(accountIntegrationSettings)){argument.valuesSetter(accountIntegrationSettings);return 1}return 0}var currentTime=0;_interval=setInterval((function(){currentTime=currentTime||performance.now();var result=waitForAnalyticsVariables();if(result||performance.now()-currentTime>=timeout){clearInterval(_interval)}}),pollInterval)}}; var pushBasedCommonWrapper=function(argument){var firedCamp={};if(!argument){argument={integrationName:"",getExperimentList:function(){},accountSettings:function(){},pushData:function(){}}}return function(){window.VWO=window.VWO||[];const getVisitorUuid=function(){if(window._vwo_acc_id>=1037725){return window.VWO&&window.VWO.get("visitor.id")}else{return window.VWO._&&window.VWO._.cookies&&window.VWO._.cookies.get("_vwo_uuid")}};var sendDebugLogsOld=function(expId,variationId,errorType,user_type,data){try{var errorPayload={f:argument["integrationName"]||"",a:window._vwo_acc_id,url:window.location.href,exp:expId,v:variationId,vwo_uuid:getVisitorUuid(),user_type:user_type};if(errorType=="initIntegrationCallback"){errorPayload["log_type"]="initIntegrationCallback";errorPayload["data"]=JSON.stringify(data||"")}else if(errorType=="timeout"){errorPayload["timeout"]=true}if(window.VWO._.customError){window.VWO._.customError({msg:"integration debug",url:window.location.href,lineno:"",colno:"",source:JSON.stringify(errorPayload)})}}catch(e){window.VWO._.customError&&window.VWO._.customError({msg:"integration debug failed",url:"",lineno:"",colno:"",source:""})}};var sendDebugLogs=function(expId,variationId,errorType,user_type){var eventName="vwo_debugLogs";var eventPayload={};try{eventPayload={intName:argument["integrationName"]||"",varId:variationId,expId:expId,type:errorType,vwo_uuid:getVisitorUuid(),user_type:user_type};if(window.VWO._.event){window.VWO._.event(eventName,eventPayload,{enableLogs:1})}}catch(e){eventPayload={msg:"integration event log failed",url:window.location.href};window.VWO._.event&&window.VWO._.event(eventName,eventPayload)}};const callbackFn=function(data){if(!data)return;var expId=data[1],variationId=data[2],repeated=data[0],singleCall=0,debug=0;var experimentList=argument.getExperimentList();var integrationName=argument["integrationName"]||"vwo";if(typeof argument.accountSettings==="function"){var accountSettings=argument.accountSettings();if(accountSettings){singleCall=accountSettings["singleCall"];debug=accountSettings["debug"]}}if(debug){sendDebugLogs(expId,variationId,"intCallTriggered",repeated)}if(singleCall&&(repeated==="vS"||repeated==="vSS")||firedCamp[expId]){return}window.expList=window.expList||{};var expList=window.expList[integrationName]=window.expList[integrationName]||[];if(expId&&variationId&&["VISUAL_AB","VISUAL","SPLIT_URL"].indexOf(_vwo_exp[expId].type)>-1){if(experimentList.indexOf(+expId)!==-1){firedCamp[expId]=variationId;var visitorUuid=getVisitorUuid();var pollInterval=100;var currentTime=0;var timeout=6e4;var user_type=_vwo_exp[expId].exec?"vwo-retry":"vwo-new";var interval=setInterval((function(){if(expList.indexOf(expId)!==-1){clearInterval(interval);return}currentTime=currentTime||performance.now();var toClearInterval=argument.pushData(expId,variationId,visitorUuid);if(debug&&toClearInterval){sendDebugLogsOld(expId,variationId,"",user_type);sendDebugLogs(expId,variationId,"intDataPushed",user_type)}var isTimeout=performance.now()-currentTime>=timeout;if(isTimeout&&debug){sendDebugLogsOld(expId,variationId,"timeout",user_type);sendDebugLogs(expId,variationId,"intTimeout",user_type)}if(toClearInterval||isTimeout){clearInterval(interval)}if(toClearInterval){window.expList[integrationName].push(expId)}}),pollInterval||100)}}};window.VWO.push(["onVariationApplied",callbackFn]);window.VWO.push(["onVariationShownSent",callbackFn])}}; var surveyDataCommonWrapper=function(argument){if(!argument){argument={getCampaignList:function(){return[]},surveyStatusChange:function(){},answerSubmitted:function(){}}}return function(){window.VWO=window.VWO||[];function getValuesFromAnswers(answers){var values=[];for(var i=0;i=timeout;if(toClearInterval||isTimeout){clearInterval(interval)}}),pollInterval)}}window.VWO.push(["onSurveyShown",function(data){commonSurveyCallback(data,argument.surveyStatusChange,"surveyShown")}]);window.VWO.push(["onSurveyCompleted",function(data){commonSurveyCallback(data,argument.surveyStatusChange,"surveyCompleted")}]);window.VWO.push(["onSurveyAnswerSubmitted",function(data){commonSurveyCallback(data,argument.answerSubmitted,"surveySubmitted")}])}}; (function(){var VWOOmniTemp={};window.VWOOmni=window.VWOOmni||{};for(var key in VWOOmniTemp)Object.prototype.hasOwnProperty.call(VWOOmniTemp,key)&&(window.VWOOmni[key]=VWOOmniTemp[key]);;})();(function(){window.VWO=window.VWO||[];var pollInterval=100;var _vis_data={};var intervalObj={};var analyticsTimerObj={};var experimentListObj={};window.VWO.push(["onVariationApplied",function(data){if(!data){return}var expId=data[1],variationId=data[2];if(expId&&variationId&&["VISUAL_AB","VISUAL","SPLIT_URL"].indexOf(window._vwo_exp[expId].type)>-1){}}])})();; ;var vD=VWO.data||{};VWO.data={content:{"fns":{"list":{"vn":1,"args":{"1":{}}}}},as:"r5.visualwebsiteoptimizer.com",dacdnUrl:"https://dev.visualwebsiteoptimizer.com",accountJSInfo:{"ts":1744202177,"noSS":false,"pc":{"t":0,"a":0},"rp":30}};for(var k in vD){VWO.data[k]=vD[k]};;var gcpfb=function(a,loadFunc,status,err,success){function vwoErr() {_vwo_err({message:"Google_Cdn failing for " + a + ". Trying Fallback..",code:"cloudcdnerr",status:status});} if(a.indexOf("/cdn/")!==-1){loadFunc(a.replace("cdn/",""),err,success); vwoErr(); return true;} else if(a.indexOf("/dcdn/")!==-1&&a.indexOf("evad.js") !== -1){loadFunc(a.replace("dcdn/",""),err,success); vwoErr(); return true;}};window.VWO=window.VWO || [];window.VWO._= window.VWO._ || {};window.VWO._.gcpfb=gcpfb;;var d={cookie:document.cookie,URL:document.URL,referrer:document.referrer};var w={VWO:{_:{}},location:{href:window.location.href,search:window.location.search},_vwoCc:window._vwoCc};;window._vwo_cdn="https://dev.visualwebsiteoptimizer.com/cdn/";window._vwo_apm_debug_cdn="https://dev.visualwebsiteoptimizer.com/cdn/";window.VWO._.useCdn=true;window.vwo_eT="br";window._VWO=window._VWO||{};window._VWO.fSeg={};window._VWO.dcdnUrl="/dcdn/settings.js";window.VWO.sTs=1744143119;window._VWO._vis_nc_lib=window._vwo_cdn+"edrv/nc-065d3f05fe213fcfa27fbdcaac81338bbr.js";var loadWorker=function(url){_vwo_code.load(url, { dSC: true, onloadCb: function(xhr,a){window._vwo_wt_l=true;if(xhr.status===200 ||xhr.status===304){var code="var window="+JSON.stringify(w)+",document="+JSON.stringify(d)+";window.document=document;"+xhr.responseText;var blob=new Blob([code||"throw new Error('code not found!');"],{type:"application/javascript"}),url=URL.createObjectURL(blob);window.mainThread={webWorker:new Worker(url)};window.vwoChannelFW=new MessageChannel();window.vwoChannelToW=new MessageChannel();window.mainThread.webWorker.postMessage({vwoChannelToW:vwoChannelToW.port1,vwoChannelFW:vwoChannelFW.port2},[vwoChannelToW.port1, vwoChannelFW.port2]);if(!window._vwo_mt_f)return window._vwo_wt_f=true;_vwo_code.addScript({text:window._vwo_mt_f});delete window._vwo_mt_f}else{if(gcpfb(a,loadWorker,xhr.status)){return;}_vwo_code.finish("&e=loading_failure:"+a)}}, onerrorCb: function(a){if(gcpfb(a,loadWorker)){return;}window._vwo_wt_l=true;_vwo_code.finish("&e=loading_failure:"+a);}})};loadWorker("https://dev.visualwebsiteoptimizer.com/cdn/edrv/worker-1c9fee42429b92a40520b9e729427a4cbr.js");;var _vis_opt_file;var _vis_opt_lib;if(window.VWO._.allSettings.dataStore.previewExtraSettings!=undefined&&window.VWO._.allSettings.dataStore.previewExtraSettings.isSurveyPreviewMode){var surveyHash=window.VWO._.allSettings.dataStore.plugins.LIBINFO.SURVEY_DEBUG_EVENTS.HASH;var param1="evad.js?va=";var param2="&d=debugger_new";var param3="&sp=1&a=940895&sh="+surveyHash;_vis_opt_file=vwoCode.use_existing_jquery&&typeof vwoCode.use_existing_jquery()!=="undefined"?vwoCode.use_existing_jquery()?param1+"vanj"+param2:param1+"va_gq"+param2:param1+"edrv/va_gq-1b71f70004771740c842714f98dd257abr.js"+param2;_vis_opt_file=_vis_opt_file+param3;_vis_opt_lib="https://dev.visualwebsiteoptimizer.com/dcdn/"+_vis_opt_file}else if(window.VWO._.allSettings.dataStore.mode!=undefined&&window.VWO._.allSettings.dataStore.mode=="PREVIEW"){ var path1 = 'edrv/pd_'; var path2 = window.VWO._.allSettings.dataStore.plugins.LIBINFO.EVAD.HASH + ".js"; ;_vis_opt_file=vwoCode.use_existing_jquery&&typeof vwoCode.use_existing_jquery()!=="undefined"?vwoCode.use_existing_jquery()?path1+"vanj"+path2:path1+"va_gq"+path2:path1+"edrv/va_gq-1b71f70004771740c842714f98dd257abr.js"+path2;_vis_opt_lib="https://dev.visualwebsiteoptimizer.com/cdn/"+_vis_opt_file}else{_vis_opt_file=vwoCode.use_existing_jquery&&typeof vwoCode.use_existing_jquery()!=="undefined"?vwoCode.use_existing_jquery()?"edrv/vanj-9556ee20f78ed4cbea841a8762fe78b1br.js":"edrv/va_gq-1b71f70004771740c842714f98dd257abr.js":"edrv/va_gq-1b71f70004771740c842714f98dd257abr.js"}window._vwo_library_timer=setTimeout((function(){vwoCode.removeLoaderAndOverlay&&vwoCode.removeLoaderAndOverlay();vwoCode.finish()}),vwoCode.library_tolerance&&typeof vwoCode.library_tolerance()!=="undefined"?vwoCode.library_tolerance():2500),_vis_opt_lib=typeof _vis_opt_lib=="undefined"?window._vwo_cdn+_vis_opt_file:_vis_opt_lib;var loadLib=function(url){_vwo_code.load(url, { dSC: true, onloadCb:function(xhr,a){window._vwo_mt_l=true;if(xhr.status===200 || xhr.status===304){if(!window._vwo_wt_f)return window._vwo_mt_f=xhr.responseText;_vwo_code.addScript({text:xhr.responseText});delete window._vwo_wt_f;}else{if(gcpfb(a,loadLib,xhr.status)){return;}_vwo_code.finish("&e=loading_failure:"+a);}}, onerrorCb: function(a){if(gcpfb(a,loadLib)){return;}window._vwo_mt_l=true;_vwo_code.finish("&e=loading_failure:"+a);}})};loadLib(_vis_opt_lib);VWO.load_co=function(u,opts){return window._vwo_code.load(u,opts);};;;}}catch(e){_vwo_code.finish();_vwo_code.removeLoaderAndOverlay&&_vwo_code.removeLoaderAndOverlay();_vwo_err(e);window.VWO.caE=1}})();

Minnesota officials say they will press ahead with new health care system

Supreme Court protests
Obamacare supporters and protesters gather in front of the U.S. Supreme Court to find out the ruling on the Affordable Health Act June 28, 2012 in front of the U.S. Supreme Court in Washington, DC. The Supreme Court has upheld the whole healthcare law of the Obama Administration.
Alex Wong/Getty Images

Gov. Mark Dayton's administration and state lawmakers have been preparing for life under President Barack Obama's health care law for some time. But their efforts got a new push Thursday when the U.S. Supreme Court upheld virtually all of the federal law.

Several Republicans, however, are holding out hope the law can still be abolished.

Minnesota's efforts to implement the Affordable Care Act have been a political tug-of-war so far, with Dayton aiming to enact its provisions while Republicans in the Legislature push back against him.

Now that the Supreme Court has ruled, the constitutionality of the law is settled, Human Services Commissioner Lucinda Jesson said.

"This clarity provides us an opportunity for a fresh start to reach out to others who have been skeptical about the good things in the affordable care act," Jesson said. "And I hope they'll join us in trying to implement it for all Minnesotans."

Supreme Court Ruling
Health care law upheld, with Roberts' help
Medical businesses ready to follow law
Minn.'s health care left largely intact
Bachmann leads critics of ruling
Read the Supreme Court opinion in full
Poll: Agree with the Supreme Court?

Minnesota and the other states are responsible for delivering a large part of the health insurance coverage created under the law. The first piece, an expansion of Medicaid, was initially delayed by former Republican Gov. Tim Pawlenty. But Dayton, a Democrat, put it in place in early 2011.

Rallying for health care
David Walls-Kaufman yells outside the U.S. Supreme Court on June 28, 2012 in Washington, DC. The Court found the Affordable Healthcare Act to be constitutional and did not strike down any part of it.
Kris Connor/Getty Images

About 85,000 Minnesotans have since been enrolled in the government program for people with low incomes. The other cornerstone of the federal law is a state-based health insurance exchange.

State Commerce Commissioner Mike Rothman has been working to create an exchange that would allow businesses and consumers to shop for health insurance. Expecting the court to reject the law, the Republican majority in the Legislature balked at providing ideas for an exchange and argued the governor cannot create the exchange without legislative input.

Rothman said he hopes to submit the state's plan for federal approval by Jan. 1.

"With the decision of the Supreme Court today, it makes it all the more important that we are focused on the choice to make and design our exchange in Minnesota, or the federal government option will be made for us," he said.

If Minnesota doesn't submit a plan, the federal government will create an exchange on the state's behalf. Several groups, including the Minnesota Chamber of Commerce and Minnesota Citizens Concerned for Life, have urged state lawmakers to create a state-based exchange, rather than submit to federal control.

State Rep. Jim Abeler, chairman of the House Health and Human Services Finance Committee, said he doesn't like the federal health care law but said the court's decision means it's time to start implementing one.

"We're going to have to move along and do our best to implement what the demand has been from the federal government whether we like it or not," said Abeler, R-Anoka. "Or worse things are going to happen."

Health care ruling reaction
A supporter holds a sign of President Barack Obama in front of the U.S. Supreme Court, on June 28, 2012 in Washington, DC. Today the high court let stand President Obama's health care overhaul, in a victory for the president and Congressional Democrats.
Mark Wilson/Getty Images

Republican Sen. David Hann, chairman of the Senate Health and Human Services Committee, is willing to wait a few more months. Like many other Republicans nationally, Hann of Eden Prairie, hopes Republicans will win the White House, the U.S. Senate and the U.S. House in November.

Hann said he won't offer any legislation to create an exchange until he sees the outcome of the election.

"If the political response to this is what I believe it will be, the law will be overturned in the next session, and we will be remiss to go too far down the path of implementing something that would get repealed," Hann said.

House Minority Leader Paul Thissen said Hann's approach is bad for Minnesota. He said failing to create a Minnesota based-exchange means the state will run the risk of weakening its nation-leading health care system.

"Sen. Hann's approach to this bill is always finding another excuse to not go along with the direction that that country is going," said Thissen, DFL-Minneapolis. "To find another excuse to become the no, the gridlock, the block as opposed to working together to solve problems, and that certainly is going to be something that will be at the heart of the next election."

The Legislature won't be able to take up any health care legislation until it returns in January for the 2013 session. By that time, voters will have chosen which party will decide the health care debate.

Volume Button
Volume
Now Listening To Livestream
Cathy Wurzer
On Air
Morning Edition with Cathy Wurzer