\nYou can be the difference in a child making a decision to follow Jesus at camp this summer. Will you help a kid get to Eagle Lake Camps of The Navigators this summer? Give here ยป\n
',position:"append"});})("body")}}, R_722072_157_1_2_1:{ fn:function(log,nonce=''){return (function(x) {
if(!vwo_$.fn.vwoRevertHtml){
return;
};
var el,ctx=vwo_$(x);
/*vwo_debug log("Revert","addElement","body"); vwo_debug*/(el=vwo_$('[vwo-element-id="1744048814304"]')).remove();})("body")}}, C_722072_157_1_2_2:{ fn:function(log,nonce=''){return (function(x) {var el,ctx=vwo_$(x);
/*vwo_debug log("content",".pushdown-copy > p:nth-of-type(1)"); vwo_debug*/el=vwo_$(".pushdown-copy > p:nth-of-type(1)"),vwo_$(".pushdown-copy > p:nth-of-type(1)").each((function(){this.__vwoControlOuterHTML=this.__vwoControlOuterHTML||this.outerHTML,!vwo_$(this).find('[vwo-op-1744062807509-0=""]').length&&vwo_$(this).append('Will you help a kid get to Eagle Lake Camps of The Navigators this summer?'),vwo_$(this).nonEmptyContents().eq(0).replaceWith2(document.createTextNode("You can be the difference in a child making a decision to follow Jesus at camp this summer. "))})),el=vwo_$(".pushdown-copy > p:nth-of-type(1)");})(".pushdown-copy > p:nth-of-type(1)")}}, R_722072_157_1_2_2:{ fn:function(log,nonce=''){return (function(x) {
if(!vwo_$.fn.vwoRevertHtml){
return;
};
var el,ctx=vwo_$(x);
/*vwo_debug log("Revert","content",".pushdown-copy > p:nth-of-type(1)"); vwo_debug*/(el=vwo_$(".pushdown-copy > p:nth-of-type(1)")).revertContentOp(),el=vwo_$(".pushdown-copy > p:nth-of-type(1)");})(".pushdown-copy > p:nth-of-type(1)")}}, C_722072_157_1_2_3:{ fn:function(log,nonce=''){return (function(x) {})(".na-pushdown-wrapper,.mw-w-button,input.mw-w-button,#page,.pushdownbar,.div-block-16,.pushdownheadline,.pushdown,.div-block-7,.div-block-8,.paragraph-2,.div-block-15,.mw-btn,.mw-btn:visited,.mw-white,.mw-btn.mw-white,.mw-btn.mw-whitemw-btn:link,.na-pushdown-wrapper .close span,.na-pushdown-wrapper .close,.fa-angle-down:before,/*#donate-menu,.close-wrapper,.btn-dismiss,#masthead .close-menu,.pushdown .pushdown__row,.pushdown .pushdown__col,.pushdown .pushdown__content,.pushdown .pushdown-copy > *:last-child,.pushdown .grid-area,.pushdown .grid-card,.pushdown .grid-card div > p,.pushdown .grid-card div > p > span,.pushdown .grid-card .flex-col,.pushdown .grid-card div > p > b,.pushdown .grid-card button,.pushdown div div.centered,.pushdown div a.other-link,.pushdown .pushdown__close,.pushdown .grid-card p:nth-of-type(3),.pushdown .grid-card p > b")}}, R_722072_157_1_2_3:{ fn:function(log,nonce=''){return (function(x) {
if(!vwo_$.fn.vwoRevertHtml){
return;
};
})(".na-pushdown-wrapper,.mw-w-button,input.mw-w-button,#page,.pushdownbar,.div-block-16,.pushdownheadline,.pushdown,.div-block-7,.div-block-8,.paragraph-2,.div-block-15,.mw-btn,.mw-btn:visited,.mw-white,.mw-btn.mw-white,.mw-btn.mw-whitemw-btn:link,.na-pushdown-wrapper .close span,.na-pushdown-wrapper .close,.fa-angle-down:before,/*#donate-menu,.close-wrapper,.btn-dismiss,#masthead .close-menu,.pushdown .pushdown__row,.pushdown .pushdown__col,.pushdown .pushdown__content,.pushdown .pushdown-copy > *:last-child,.pushdown .grid-area,.pushdown .grid-card,.pushdown .grid-card div > p,.pushdown .grid-card div > p > span,.pushdown .grid-card .flex-col,.pushdown .grid-card div > p > b,.pushdown .grid-card button,.pushdown div div.centered,.pushdown div a.other-link,.pushdown .pushdown__close,.pushdown .grid-card p:nth-of-type(3),.pushdown .grid-card p > b")}}, C_722072_157_1_3_0:{ fn:function(log,nonce=''){return (function(x) {;var _vwo_sel=vwo_$("");vwo_$('head').append(_vwo_sel);return vwo_$('head')[0] && vwo_$('head')[0].lastChild;})("HEAD")}}, R_722072_157_1_3_0:{ fn:function(log,nonce=''){return (function(x) {
if(!vwo_$.fn.vwoRevertHtml){
return;
};
var ctx=vwo_$(x),el;
/*vwo_debug log("Revert","content",""); vwo_debug*/;
el=vwo_$('[vwo-element-id="1744062807520"]');
el.revertContentOp().remove();})("HEAD")}}, C_722072_157_1_3_1:{ fn:function(log,nonce=''){return (function(x) {var el,ctx=vwo_$(x);
/*vwo_debug log("addElement","body"); vwo_debug*/!(el=vwo_$("body")).find('[vwo-op-1744062806872=""]').length&&el.vwoElement({html:'
\n \x3c!--
\n
\n \n
\n
--\x3e\n
\n
\n \n
\n
\n
\n
\n \n \x3c!--
\n If you have a moment...\n
--\x3e\n
\n You can be the difference in a child making a decision to follow Jesus at camp this summer. Will you help a kid get to Eagle Lake Camps of The Navigators this summer? Give here ยป\n
',position:"append"});})("body")}}, R_722072_157_1_3_1:{ fn:function(log,nonce=''){return (function(x) {
if(!vwo_$.fn.vwoRevertHtml){
return;
};
var el,ctx=vwo_$(x);
/*vwo_debug log("Revert","addElement","body"); vwo_debug*/(el=vwo_$('[vwo-element-id="1744062806843"]')).remove();})("body")}}, C_722072_157_1_3_2:{ fn:function(log,nonce=''){return (function(x) {var el,ctx=vwo_$(x);
/*vwo_debug log("content",".pushdown-copy > p:nth-of-type(1)"); vwo_debug*/el=vwo_$(".pushdown-copy > p:nth-of-type(1)"),vwo_$(".pushdown-copy > p:nth-of-type(1)").each((function(){this.__vwoControlOuterHTML=this.__vwoControlOuterHTML||this.outerHTML,!vwo_$(this).find('[vwo-op-1744062807520-0=""]').length&&vwo_$(this).append('Will you help a kid get to Eagle Lake Camps of The Navigators this summer?'),vwo_$(this).nonEmptyContents().eq(0).replaceWith2(document.createTextNode("You can be the difference in a child making a decision to follow Jesus at camp this summer. "))})),el=vwo_$(".pushdown-copy > p:nth-of-type(1)");})(".pushdown-copy > p:nth-of-type(1)")}}, R_722072_157_1_3_2:{ fn:function(log,nonce=''){return (function(x) {
if(!vwo_$.fn.vwoRevertHtml){
return;
};
var el,ctx=vwo_$(x);
/*vwo_debug log("Revert","content",".pushdown-copy > p:nth-of-type(1)"); vwo_debug*/(el=vwo_$(".pushdown-copy > p:nth-of-type(1)")).revertContentOp(),el=vwo_$(".pushdown-copy > p:nth-of-type(1)");})(".pushdown-copy > p:nth-of-type(1)")}}, C_722072_157_1_3_3:{ fn:function(log,nonce=''){return (function(x) {})(".na-pushdown-wrapper,.mw-w-button,input.mw-w-button,#page,.pushdownbar,.div-block-16,.pushdownheadline,.pushdown,.div-block-7,.div-block-8,.paragraph-2,.div-block-15,.mw-btn,.mw-btn:visited,.mw-white,.mw-btn.mw-white,.mw-btn.mw-whitemw-btn:link,.na-pushdown-wrapper .close span,.na-pushdown-wrapper .close,.fa-angle-down:before,/*#donate-menu,.close-wrapper,.btn-dismiss,#masthead .close-menu,.pushdown .pushdown__row,.pushdown .pushdown__col,.pushdown .pushdown__content,.pushdown .pushdown-copy > *:last-child,.pushdown .grid-area,.pushdown .grid-card,.pushdown .grid-card div > p,.pushdown .grid-card div > p > span,.pushdown .grid-card .flex-col,.pushdown .grid-card div > p > b,.pushdown .grid-card button,.pushdown div div.centered,.pushdown div a.other-link,.pushdown .pushdown__close,.pushdown .grid-card p:nth-of-type(3),.pushdown .grid-card p > b")}}, R_722072_157_1_3_3:{ fn:function(log,nonce=''){return (function(x) {
if(!vwo_$.fn.vwoRevertHtml){
return;
};
})(".na-pushdown-wrapper,.mw-w-button,input.mw-w-button,#page,.pushdownbar,.div-block-16,.pushdownheadline,.pushdown,.div-block-7,.div-block-8,.paragraph-2,.div-block-15,.mw-btn,.mw-btn:visited,.mw-white,.mw-btn.mw-white,.mw-btn.mw-whitemw-btn:link,.na-pushdown-wrapper .close span,.na-pushdown-wrapper .close,.fa-angle-down:before,/*#donate-menu,.close-wrapper,.btn-dismiss,#masthead .close-menu,.pushdown .pushdown__row,.pushdown .pushdown__col,.pushdown .pushdown__content,.pushdown .pushdown-copy > *:last-child,.pushdown .grid-area,.pushdown .grid-card,.pushdown .grid-card div > p,.pushdown .grid-card div > p > span,.pushdown .grid-card .flex-col,.pushdown .grid-card div > p > b,.pushdown .grid-card button,.pushdown div div.centered,.pushdown div a.other-link,.pushdown .pushdown__close,.pushdown .grid-card p:nth-of-type(3),.pushdown .grid-card p > b")}}, C_722072_161_1_3_1:{ fn:function(log,nonce=''){return (function(x) {
try{
var _vwo_sel = vwo_$("`);
!vwo_$("head").find('#1746117915368').length && vwo_$('head').append(_vwo_sel);}catch(e) {VWO._.vAEH(e);}
try{}catch(e) {VWO._.vAEH(e);}
try{const config = {
donationForm: {
defaultRecurring: false, // true for "Recurring" default, false for "One-Time" default
giftArrayAmounts: [], // an array of numbers (like [ 5, 10, 15, 25 ]) or `null` or `[]` for default gift array amounts
defaultAmount: null, // a number or `null` for no default
anonymousDefault: null, // true/false or null for no default
tributeDefault: null, // true/false or null for no default
hideCheckboxesAll: true, // true/false to hide the checkboxes button
hideCheckboxFreqeuncy: false,
hideCheckboxAnonymous: false,
hideCheckboxTribute: false,
hideCartButton: false, // true/false to hide the "Add to Basket" button
},
tabs: {
"one-time": {
text: "One-Time Gift",
giftArrayAmounts: [], // changing the gift array here overrides the one set above for the donationForm
},
"recurring": {
text: "Recurring Gift",
giftArrayAmounts: [], // changing the gift array here overrides the one set above for the donationForm
}
}
};
const configDonationInterrupter = {
enabled: true,
uniqueName: "NA__NAV-DonationInterrupterV2",
content: {
headingSection: `
Before you go, would you consider becoming a monthly partner?
`,
bodySection: `
Your monthly partnership will:
provide the funds needed to bring Eagle Lake Camp to places where many kids donโt get the opportunity to experience camp
ensure supplies are ready and counselors are properly trained and equipped to preach the gospel
allow camp to be accessible to kids despite any financial barriers their families may face
Most importantly, you will play an active role in this ongoing work of bringing campers to meet Jesus and grow in their walks with Him. Would you consider becoming a monthly partner today?โ
`,
ctaButtons: {
"Yes": ``,
"No": ``,
},
closeButton: false,
theme: "NAV",
},
memoryMode: 'session', // "session" or "forever"; indicates how long the last interacted state should be remembered
minAmount: 5.00, // gift under this amount will be processed (if above the form minimum) and not shown the donation interrupter
maxAmount: 100.00, // gifts equal to and above this amount will be processed and not shown the donation interrupter
askConditions: function (originalAmount, originalFrequency, state) {
const conditions = [
originalFrequency === "One-Time", // "One-Time" or "Recurring"
originalAmount > this.minAmount,
originalAmount < this.maxAmount,
state && state.status !== "shown" && state.status !== "dismissed" && state.status !== "converted", // do not show if the user has already seen the donation interrupter, dismissed the donation interrupter, or converted from the donation interrupter
];
return conditions.every((condition) => typeof condition === 'function' ? !!condition.call(null) : !!condition); // return true if every condition in the array evaluates to true
},
askAmount: function (originalAmount) {
let askAmount;
if (originalAmount >= 400 && originalAmount < 500) { // $400.00 - $499.99
askAmount = 50;
} else if (originalAmount >= 300 && originalAmount < 400) { // $300.00 - $399.99
askAmount = 40;
} else if (originalAmount >= 200 && originalAmount < 300) { // $200.00 - $299.99
askAmount = 30;
} else if (originalAmount >= 100 && originalAmount < 200) { // $100.00 - $199.99
askAmount = 15;
} else { // $ 0.01 - $ 99.99
askAmount = 10;
}
return parseFloat(askAmount);
},
};
//
//
//
//
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//
//
//
//
// Run code with configuration from above
(function(){
console.log("init");
window.NA.DonationForm.init(config).then((donationFormApi) => {
console.log("initialized:", donationFormApi);
if (configDonationInterrupter && configDonationInterrupter.enabled === true) {
donationFormApi.DonationInterrupter(configDonationInterrupter);
console.log("initialized:", donationFormApi.DonationInterrupter);
donationFormApi.interceptSubmit(function (capturedEvent) {
try {
const donationInterrupterApi = this.DonationInterrupter;
if (donationFormApi && donationInterrupterApi) {
if (donationInterrupterApi.evaluateConditions()) {
console.log(donationFormApi);
donationInterrupterApi.show();
return false; // do not submit
} else {
console.warn("Condtions check failed: Donation Interrupter will not be shown.");
return true; // submit
}
} else {
throw new ReferenceError("DonationFormApi or DonationInterrupterApi is not defined.");
}
} catch (error) {
console.error("An error occured when handling submit:", error);
window.NA?.DonationForm && window.NA.DonationForm.submit(); // retry submit
} finally {
return false;
}
});
}
}).catch((error) => {
console.error("Error creating donation form API:", error);
});
})();
}catch(e) {VWO._.vAEH(e);}
return vwo_$('head')[0] && vwo_$('head')[0].lastChild;})("head")}}, R_722072_161_1_3_0:{ fn:function(log,nonce=''){return (function(x) {
try{
var ctx=vwo_$(x),el;
/*vwo_debug log("Revert","content",""); vwo_debug*/;
el=vwo_$('[vwo-element-id="1746117915366"]');
el.revertContentOp().remove();
} catch(e) {VWO._.vAEH(e);}
try{
var el,ctx=vwo_$(x);
/*vwo_debug log("Revert","addElement","body"); vwo_debug*/(el=vwo_$('[vwo-element-id="1746117915367"]')).remove();
} catch(e) {VWO._.vAEH(e);}
return vwo_$('head')[0] && vwo_$('head')[0].lastChild;})("head")}}, C_722072_161_1_3_0:{ fn:function(log,nonce=''){return (function(x) {
try{
var _vwo_sel = vwo_$("`);
!vwo_$("head").find('#1746117915366').length && vwo_$('head').append(_vwo_sel);}catch(e) {VWO._.vAEH(e);}
try{}catch(e) {VWO._.vAEH(e);}
try{/* ===== Complicated Code Below ===== */
window.HTMLElement.prototype.getSlot = window.HTMLElement.prototype.getSlot || function () { return this.querySelector('slot') || this.shadowRoot.querySelector('slot'); };
window.HTMLElement.prototype.getSlotNodes = window.HTMLElement.prototype.getSlotNodes || function (n) { return (parseInt(n) !== 'NaN' && n >= 0) ? Array.from(this.getSlot().assignedNodes({ flatten: true }))[n] : Array.from(this.getSlot().assignedNodes({ flatten: true })); };
window.HTMLElement.prototype.shadowChildren = window.HTMLElement.prototype.shadowChildren || function (n) { return (parseInt(n) !== 'NaN' && n >= 0) ? Array.from(this.shadowRoot.children)[n] : Array.from(this.shadowRoot.children); };
function shadowQuerySelectorAll (selector) {
let matches = [];
const isSlot = (element) => element.tagName.toLowerCase() === 'slot';
function traverse(element) { // Helper function to recursively traverse elements
if (element instanceof HTMLElement && element.matches(selector) /*&& element !== this*/) // Check if element matches the selector
matches.push(element);
if (customElements.get(element.tagName.toLowerCase())) { // Traverse through shadow DOM children if element is a custom element with shadow DOM
const children = element.shadowRoot ? Array.from(element.shadowRoot.children) : [];
children.forEach((child) => traverse(child));
} else {
Array.from(element.children).forEach((child) => traverse(child)); // traverse through regular element children
}
if (isSlot(element)) { // handle traversing slot nodes
const slotNodes = element.assignedNodes({ flatten: true });
slotNodes.forEach((slotNode) => {
if (slotNode.nodeType === Node.ELEMENT_NODE)
traverse(slotNode);
});
}
}
this instanceof Document ? traverse(this.documentElement) : traverse(this); // Start traversal from the root element as long as it's not the Document
return matches.length > 0 ? matches : undefined;
}
function shadowQuerySelector (selector) {
let matches = this.shadowQuerySelectorAll(selector) || [];
return matches.length > 0 ? matches[0] : undefined;
}
Object.defineProperties(HTMLElement.prototype, {
shadowQuerySelectorAll: {
value: shadowQuerySelectorAll,
writable: false,
configurable: false,
enumerable: true,
},
shadowQuerySelector: {
value: shadowQuerySelector,
writable: false,
configurable: false,
enumerable: true,
}
});
Object.defineProperties(Document.prototype, {
shadowQuerySelectorAll: {
value: shadowQuerySelectorAll,
writable: false,
configurable: false,
enumerable: true,
},
shadowQuerySelector: {
value: shadowQuerySelector,
writable: false,
configurable: false,
enumerable: true,
}
});
Object.defineProperties(Document, {
shadowQuerySelectorAll: {
value: shadowQuerySelectorAll,
writable: false,
configurable: false,
enumerable: true,
},
shadowQuerySelector: {
value: shadowQuerySelector,
writable: false,
configurable: false,
enumerable: true,
}
});
Object.defineProperty(JSON, 'isValid', {
value: function (jsonString) {
try {
JSON.parse(jsonString);
return true;
} catch (error) {
return false;
}
},
writable: false,
configurable: true,
enumerable: true,
});
async function asyncWaitForCustomElements (customElementsArray, onCustomElementsDefined = () => {}) { customElementsArray.length === 0 ? onCustomElementsDefined() : customElements.whenDefined(customElementsArray.shift()).then(() => asyncWaitForCustomElements(customElementsArray, onCustomElementsDefined)); }
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() });
}
const getToken = (key, api = localStorage) => (JSON.isValid(api.getItem(key)) ? JSON.parse(api.getItem(key)) : api.getItem(key)) || null;
const setToken = (key, value, api = localStorage) => api.setItem(key, JSON.stringify(value));
const getCurrentDate = (d = new Date()) => d.toISOString().split('T')[0];
const reOneTime = new RegExp(/(one-?time|once|single)/gi),
reRecurring = new RegExp(/(recurring|monthly)/gi);
window.NA = window.NA || {};
window.NA.DonationPage = window.NA.DonationPage || {};
window.NA.DonationForm = window.NA.DonationForm || {};
async function init (userConfig) {
return new Promise((resolve, reject) => {
const defaultConfig = {
donationForm: {
defaultRecurring: false, // true for "Recurring" default, false for "One-Time" default
giftArrayAmounts: [], // an array of numbers (like [ 5, 10, 15, 25 ]) or `null` or `[]` for default gift array amounts
defaultAmount: null, // a number or `null` for no default
anonymousDefault: null, // true/false or null for no default
tributeDefault: null, // true/false or null for no default
hideCheckboxesAll: false, // true/false to hide the checkboxes button
hideCheckboxFreqeuncy: false,
hideCheckboxAnonymous: false,
hideCheckboxTribute: false,
hideCartButton: false, // true/false to hide the "Add to Basket" button
}
};
userConfig = { ...defaultConfig, ...userConfig };
Object.defineProperty(window.NA, '_config', {
value: userConfig,
writable: false,
configurable: true,
enumerable: false,
});
const config = { ...window.NA._config };
//
//
//
//
//
//
//
function main () {
const c_donate_community_staff_information = document.shadowQuerySelector('c-donate-community-staff-information');
const c_donate_community_donate_buttons = document.shadowQuerySelector('c-donate-community-donate-buttons');
//
const donationPage = c_donate_community_staff_information.parentElement;
const donationPageImage = donationPage.shadowQuerySelectorAll('c-donate-community-staff-information > div > .slds-col')[0];
const donationPageContent = donationPage.shadowQuerySelectorAll('c-donate-community-staff-information > div > .slds-col')[1];
const donationPageTitle = donationPageContent.children[0];
const donationPageSubtitle = donationPageContent.children[1];
const donationFormWidget = donationPageContent.children[2] || c_donate_community_donate_buttons.parentElement;
const donationPageAboutTitle = donationPageContent.children[3];
const donationPageCopySection = donationPageContent.children[4] || donationPageContent.shadowQuerySelector('lightning-formatted-text, lightning-formatted-rich-text');
const donationFormGiftArrayButtons = donationFormWidget.shadowQuerySelectorAll('button[value]');
const donationFormGiftArrayOtherAmountInput = donationFormWidget.shadowQuerySelector('lightning-input lightning-primitive-input-simple input[type]');
const donationFormCheckboxes = [...donationPageContent.shadowQuerySelector('c-donate-community-donate-buttons > div').children].find((child) => child.matches('div:has(div lightning-primitive-input-checkbox)'));
const donationFormButtons = [...donationFormWidget.shadowQuerySelectorAll('button')].filter((button) => !donationFormGiftArrayButtons.includes(button));
const donationFormButton = {
"Donate Now": donationFormButtons[0],
"Add to Basket": donationFormButtons[1],
};
//
//
//
// Add legacy classes
donationPageImage.classList.add("page-image");
donationPageContent.classList.add("donation-form-content");
donationPageTitle.classList.add("page-title");
donationPageSubtitle.classList.add("page-action-text");
donationFormWidget.classList.add("donation-form");
donationPageAboutTitle.classList.add("bottom-title");
donationPageCopySection.classList.add("page-text");
donationFormCheckboxes.classList.add("donation-form-checkboxes");
donationFormButton["Donate Now"].classList.add("donate-action-button");
donationFormButton["Donate Now"].id = "donate-now";
donationFormButton["Add to Basket"].classList.add("donate-action-button");
donationFormButton["Add to Basket"].id = "add-to-basket";
//
if (config.donationForm.hideCheckboxesAll === true) {
donationFormCheckboxes.style.setProperty("display", "none");
}
if (config.donationForm.hideCheckboxFreqeuncy === true) {
[...donationFormCheckboxes.children][1]?.style.setProperty("display", "none");
}
if (config.donationForm.hideCheckboxAnonymous === true) {
[...donationFormCheckboxes.children][2]?.style.setProperty("display", "none");
}
if (config.donationForm.hideCheckboxTribute === true) {
[...donationFormCheckboxes.children][2]?.style.setProperty("display", "none");
}
if (config.donationForm.hideCartButton === true) {
donationFormButton["Add to Basket"]?.style.setProperty("display", "none");
donationFormButton["Add to Basket"]?.parentElement?.style.setProperty("display", "none");
donationFormButton["Donate Now"].parentElement.classList = donationFormButton["Donate Now"].parentElement.classList.toString().replaceAll("1-of-2", "2-of-2");
}
//
//
//
//
//
//
//
//
(function donationFormApi () {
window.NA.DonationForm = window.NA.DonationForm || {};
Object.defineProperty(window.NA.DonationForm, 'root', {
value: donationFormWidget,
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'elements', {
value: {
Tabs: undefined,
GiftArrayButtons: donationFormGiftArrayButtons,
GiftArrayOtherAmount: donationFormGiftArrayOtherAmountInput,
CheckboxRecurring: donationFormCheckboxes.shadowQuerySelectorAll('lightning-primitive-input-checkbox input[type="checkbox"]')[0],
CheckboxAnonymous: donationFormCheckboxes.shadowQuerySelectorAll('lightning-primitive-input-checkbox input[type="checkbox"]')[1],
CheckboxTribute: donationFormCheckboxes.shadowQuerySelectorAll('lightning-primitive-input-checkbox input[type="checkbox"]')[2],
SubmitButton: donationFormButton["Donate Now"],
},
writable: false,
configurable: true,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'submit', {
value: function doSubmit () {
this.elements.SubmitButton?.click();
},
configurable: false,
writable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'interceptSubmit', {
value: function interceptSubmit (callbackFn, submitButton = this.elements.SubmitButton, hideOriginal = true, maxIntercepts = 1) {
const hide = (element) => element?.style.setProperty("display", "none");
const unhide = (element) => element?.style.removeProperty("display");
const submitButtonCopy = submitButton.cloneNode(true);
if (!submitButton.id) submitButton.id = "submit-button";
submitButtonCopy.id = submitButton.id ? submitButton.id + "-copy" : "submit-button-copy";
submitButton.after(submitButtonCopy);
if (hideOriginal === true)
hide(submitButton);
const submitButtonMutationObserver = new MutationObserver((mutations, observe) => {
for (const mutation of mutations) {
const { type, target } = mutation;
if (target === submitButton) {
switch (type) {
case 'attributes':
const { attributeName } = mutation;
const attributeValue = target.hasAttribute(attributeName) ? target.getAttribute(attributeName) : null;
if (!attributeValue) {
submitButtonCopy.removeAttribute(attributeName);
} else {
submitButtonCopy.setAttribute(attributeName, attributeValue);
}
break;
case 'characterData':
submitButtonCopy.innerHTML = target.innerHTML;
break;
default:
break;
}
}
}
});
submitButtonMutationObserver.observe(submitButton, { childList: true, attributes: true, attributeOldValue: true, characterData: true, characterDataOldValue: true });
if (maxIntercepts && maxIntercepts > 0) {
submitButtonCopy.setAttribute("intercepts", "0"); // initialize intercept counter to 0
function interceptCounter (event) {
let interceptCount = parseInt(this.getAttribute("intercepts"));
this.setAttribute("intercepts", ++interceptCount);
if (interceptCount >= maxIntercepts) // reached max number of submit intercepts
console.info("Max intercepts reached: original submit button unhidden."),
submitButtonMutationObserver?.disconnect(), // disconnect the observer so the following changes don't apply to both buttons
unhide(submitButton), // unhide the original submit button so the user won't be prevented from submitting the next time they click it
hide(submitButtonCopy), // hide the copy of the submit button that was intercepting
this.removeEventListener('click', interceptCounter);
}
submitButtonCopy.addEventListener('click', interceptCounter);
}
submitButtonCopy.addEventListener('click', (event) => {
const callbackResult = callbackFn.call(this, event);
if (callbackResult && callbackResult !== false) { // if callback function result evaluates to true, then submit after the callback
window.NA.DonationForm.submit();
}
});
},
configurable: false,
writable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'getFrequency', {
value: function getFrequency () {
const recurringCheckbox = this.root.shadowQuerySelectorAll('lightning-primitive-input-checkbox input[type="checkbox"]')[0];
if (recurringCheckbox.checked === true) {
return "Recurring";
} else {
return "One-Time";
}
},
configurable: false,
writable: false,
enumerable: false,
});
Object.defineProperty(window.NA.DonationForm, 'setFrequency', {
value: function setFrequency (value) {
let toFrequency;
if (typeof value === 'boolean') {
toFrequency = value ? true : false;
} else if (typeof value === 'string') {
if (reOneTime.test(value.toLowerCase())) {
toFrequency = false;
} else if (reRecurring.test(value.toLowerCase())) {
toFrequency = true;
} else {
throw new TypeError(`Argument 0 must be a boolean or string. If string, it must match either "One-Time" or "Recurring".`);
}
} else {
throw new TypeError(`Argument 0 must be a boolean or string.`);
}
if (this.elements.Tabs && this.elements.Tabs.length === 2)
this.elements.Tabs[toFrequency ? 1 : 0]?.click();
const recurringCheckbox = this.root.shadowQuerySelectorAll('lightning-primitive-input-checkbox input[type="checkbox"]')[0];
if (toFrequency === true) { // set frequency to recurring
if (!recurringCheckbox.checked) {
recurringCheckbox.click();
} else {
console.warn("Frequency is already set to recurring:", recurringCheckbox);
}
} else { // set frequency to one-time
if (recurringCheckbox.checked) {
recurringCheckbox.click();
} else {
console.warn("Frequency is already set to one-time:", recurringCheckbox);
}
}
},
configurable: false,
writable: false,
enumerable: false,
});
Object.defineProperty(window.NA.DonationForm, 'recurring', {
get () {
return this.getFrequency() === "Recurring" ? true : false;
},
set (value) {
this.setFrequency(value);
}
});
Object.defineProperty(window.NA.DonationForm, 'isRecurring', {
get () {
return this.recurring;
}
});
Object.defineProperty(window.NA.DonationForm, 'getAmount', {
value: function getAmount () {
let matchingButton = this.elements.GiftArrayButtons.find((button) => button.classList.contains("donate-selected"));
if (matchingButton) {
return parseInt(matchingButton.value);
}
else if (this.elements.GiftArrayOtherAmount?.value.length > 0) {
let value = this.elements.GiftArrayOtherAmount.value;
value = value.replace(/[^\d\.]/, '');
return parseFloat(value);
}
else {
return undefined;
}
},
configurable: false,
writable: false,
enumerable: false,
});
Object.defineProperty(window.NA.DonationForm, 'setAmount', {
value: function setAmount (value) {
if (value === "unset") {
this.elements.GiftArrayButtons.forEach((button) => {
button.classList.remove("donate-selected", "donate-not-selected");
});
}
if (!value || Number.isNaN(parseFloat(value)))
throw new TypeError(`Argument 0 must be a boolean or string. If string, it must match either "One-Time" or "Recurring".`);
value = parseFloat(value);
let matchingButton = this.elements.GiftArrayButtons.find((button) => parseFloat(button.value) === value);
if (matchingButton) {
return matchingButton.click();
}
else {
const giftArrayOtherAmountField = this.elements.GiftArrayOtherAmount;
giftArrayOtherAmountField.value = parseFloat(value); // form doesn't like the formatted string, so number it is.
//giftArrayOtherAmountField.value = parseFloat(value).toLocaleString('en-US', { style: 'currency', currency: 'USD', currencySign: '$', minimumFractionDigits: 2, maximumFractionDigits: 2 });
giftArrayOtherAmountField.dispatchEvent(new Event('change'));
giftArrayOtherAmountField.dispatchEvent(new Event('blur'));
}
},
configurable: false,
writable: false,
enumerable: false,
});
Object.defineProperty(window.NA.DonationForm, 'amount', {
get () {
return this.getAmount();
},
set (value) {
this.setAmount(value);
}
});
Object.defineProperty(window.NA.DonationForm, 'getGiftArrayValues', {
value: function getGiftArrayValues () {
return this.elements.GiftArrayButtons.map((button) => parseInt(button.value));
},
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'setGiftArrayValues', {
value: function setGiftArrayValues (valueArray) {
if (!Array.isArray(valueArray) || valueArray.some(value => value <= 0))
throw new TypeError("Argument 0 must be an array of positive integers.");
if (valueArray.length !== this.elements.GiftArrayButtons.length)
throw new RangeError("Argument 0 must be an array of the same length as the number of gift array button elements.");
this.elements.GiftArrayButtons.forEach((button, i, buttons) => {
button.value = valueArray[i];
button.textContent = button.textContent.replace(/(\d+)/gi, valueArray[i]);
});
console.info("Updated gift array values:", ...valueArray);
},
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'onFrequencyChange', {
value: new Array(),
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'onAmountChange', {
value: new Array(),
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'onSubmit', {
value: new Array(),
writable: false,
configurable: false,
enumerablele: true,
});
const frequencyChangeEventListener = (event) => {
const newFrequency = window.NA.DonationForm.getFrequency();
window.NA.DonationForm.onFrequencyChange.forEach((callback) => {
callback.call(window.NA.DonationForm, newFrequency);
});
};
const frequencyMutationHandler = new MutationObserver ((mutations, observer) => {
for (const mutation of mutations) {
switch (mutation.type) {
case 'attributes':
if (mutation.attributeName === 'checked') {
}
break;
default:
break;
}
}
});
//window.NA.DonationForm.elements.CheckboxRecurring && frequencyMutationHandler.observe(window.NA.DonationForm.elements.CheckboxRecurring, { childList: true, attributes: true, attributeFilter: [ 'checked' ] });
window.NA.DonationForm.elements.CheckboxRecurring && window.NA.DonationForm.elements.CheckboxRecurring.addEventListener('change', frequencyChangeEventListener);
})();
//
//
//
//
//
//
//
//
(function donationPageApi () {
Object.defineProperty(window.NA.DonationPage, 'root', {
value: null, //document.shadowQuerySelector('c-donate-community-staff-information > div'),
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationPage, 'elements', {
value: {
CopySection: donationPageCopySection,
},
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationPage, 'getCopyHTML', {
value: function getCopyHTML () {
return this.elements.CopySection.innerHTML;
},
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationPage, 'setCopyHTML', {
value: function setCopyHTML (newCopyHTML) {
this.elements.CopySection.innerHTML = newCopyHTML;
},
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationPage, 'copy', {
get () {
return this.getCopyHTML();
},
set (newCopyHTML) {
this.setCopyHTML(newCopyHTML);
}
});
})();
//
//
//
//
//
//
//
//
(function cartApi () {
const Cart = new Object();
Object.defineProperty(Cart, 'Cart', {
value: function addItem (cartItem) {
//
},
configurable: false,
writable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'Cart', {
value: Cart,
configurable: false,
writable: false,
enumerable: true,
});
})();
//
//
//
//
//
//
//
//
function moveDonationForm () {
try {
donationPageSubtitle.before(donationPageCopySection); // move the subtitle above the tcopy section, below the main page title
donationPageAboutTitle.style.setProperty("display", "none"); // hide the bottom heading (for the About section)
} catch (error) {
console.error(error);
}
}
moveDonationForm();
//
//
//
//
//
//
//
//
function makeTabbed () {
function createTabs (tabTexts, defaultRecurring = false) {
defaultRecurring = defaultRecurring ? true : false;
const tabs = document.createElement('div');
tabs.classList.add("tabs");
tabTexts.forEach((tabText, i) => {
const tab = document.createElement('div');
let tabClassList = [ "tab" ];
tabClassList.push(reOneTime.test(tabText) ? "onetime" : "recurring");
((tabClassList.includes("onetime") && defaultRecurring === false) || (tabClassList.includes("recurring") && defaultRecurring === true)) && tabClassList.push('selected');
tab.classList.add(...tabClassList);
tab.textContent = tabText;
tabs.appendChild(tab);
});
return tabs;
}
const donationFormTabs = createTabs([ config.tabs["one-time"].text, config.tabs["recurring"].text ], config.donationForm.defaultRecurring);
donationFormWidget.before(donationFormTabs);
window.NA.DonationForm.elements.Tabs = Array.from(donationFormTabs.children);
window.NA.DonationForm.elements.Tabs.forEach((tab, i ,tabs) => {
tab.addEventListener('click', function (e) {
this.classList.add('selected');
if (this.classList.contains('recurring')) { // if "Recurring" tab clicked
tabs.find((tab) => tab !== this)?.classList.remove('selected');
window.NA.DonationForm.recurring = true;
} else { // if "One-Time" tab clicked
tabs.find((tab) => tab !== this)?.classList.remove('selected');
window.NA.DonationForm.recurring = false;
}
});
});
Object.defineProperty(window.NA.DonationForm, 'onTabClick', {
value: new Array(),
writable: false,
configurable: false,
enumerable: true,
});
window.NA.DonationForm.elements.Tabs.forEach((tab) => {
tab.addEventListener('click', function (e) {
window.NA.DonationForm.onTabClick.forEach((callback) => {
callback.call(window.NA.DonationForm, this.textContent.trim());
});
});
});
const splitGiftArrayAmounts = {
"one-time": config.tabs["one-time"].giftArrayAmounts,
"recurring": config.tabs["recurring"].giftArrayAmounts,
};
if (((Array.isArray(config.tabs["one-time"].giftArrayAmounts) && config.tabs["one-time"].giftArrayAmounts.length > 0) || (Array.isArray(config.tabs["recurring"].giftArrayAmounts) && config.tabs["recurring"].giftArrayAmounts.length > 0)) // if either one-time or recurring gift array is set,
&& !(Array.isArray(config.tabs["one-time"].giftArrayAmounts) && config.tabs["one-time"].giftArrayAmounts.length > 0) && (Array.isArray(config.tabs["recurring"].giftArrayAmounts) && config.tabs["recurring"].giftArrayAmounts.length > 0)) { // but not both (unforntuantely no JS XOR).
if (!config.tabs["one-time"].giftArrayAmounts)
config.tabs["one-time"].giftArrayAmounts = window.NA.DonationForm.getGiftArrayValues();
if (!splitGiftArrayAmounts["recurring"])
config.tabs["recurring"].giftArrayAmounts = window.NA.DonationForm.getGiftArrayValues();
}
if ((Array.isArray(config.tabs["one-time"].giftArrayAmounts) && config.tabs["one-time"].giftArrayAmounts.length > 0) || (Array.isArray(config.tabs["recurring"].giftArrayAmounts) && config.tabs["recurring"].giftArrayAmounts.length > 0)) {
window.NA.DonationForm.onFrequencyChange.push(function updateGiftArrayAmounts (newFrequency) {
let tabKeyName;
switch (newFrequency) {
case "One-Time":
tabKeyName = "one-time";
if (config.hasOwnProperty("tabs") && config.tabs.hasOwnProperty(tabKeyName) && config.tabs[tabKeyName].hasOwnProperty("giftArrayAmounts") && Array.isArray(config.tabs[tabKeyName].giftArrayAmounts)) // if tabs are enabled and configured and gift array values are provided,
this.setGiftArrayValues(config.tabs[tabKeyName].giftArrayAmounts); // update the gift array values
this.setAmount('unset'); // unselect gift array options whenever frequency changes
break;
case "Recurring":
tabKeyName = "recurring";
if (config.hasOwnProperty("tabs") && config.tabs.hasOwnProperty(tabKeyName) && config.tabs[tabKeyName].hasOwnProperty("giftArrayAmounts") && Array.isArray(config.tabs[tabKeyName].giftArrayAmounts)) // if tabs are enabled and configured and gift array values are provided,
this.setGiftArrayValues(config.tabs[tabKeyName].giftArrayAmounts); // update the gift array values
this.setAmount('unset'); // unselect gift array options whenever frequency changes
break;
default:
throw new Error("Failed to updated gift array for frequency " + newFrequency + '.');
}
});
}
window.NA.DonationForm.elements.Tabs?.find((tab) => tab.classList.contains('selected'))?.click(); // apply default selected tab to the form's checkbox
}
if (config.hasOwnProperty("tabs") && (Object.keys(config.tabs)).length == 2) { // if tabs are enabled and configured
makeTabbed();
}
//
//
//
//
//
//
//
//
function configureDonationFormFromURL (searchParams) {
const GIFT_ARRAY_VALUE_DELIMITER = ',',
MULTIPLE_GIFT_ARRAY_DELIMETER = ';';
if (searchParams.get('amounts') || searchParams.get('array-amounts')) {
let amountsParamValue = searchParams.get('amounts') || searchParams.get('array-amounts') || '';
amountsParamValue = decodeURIComponent(amountsParamValue); // convert URI encoded string to normal characters before parsing
if (amountsParamValue.includes(MULTIPLE_GIFT_ARRAY_DELIMETER)) { // multiple gift array provided with gift arrays separated by ';' and values separated by ','
const amountArrays = amountsParamValue.split(MULTIPLE_GIFT_ARRAY_DELIMETER).map((amountArrayString) => amountArrayString.includes(GIFT_ARRAY_VALUE_DELIMITER) ? amountArrayString.split(GIFT_ARRAY_VALUE_DELIMITER).map((amount) => parseInt(amount)) : undefined) // convert string to array of arrays of numbers split by ',' and gift arrays separated by ';'
if (amountArrays && Array.isArray(amountArrays) && amountArrays.length === 2 && amountArrays.every((amountArray) => amountArray.every((amount) => !Number.isNaN(amount) && Number.isInteger(amount) && amount > 0))) { // if amount arrays is defined as an array with 2 arrays, where every item in EACH of the array is an integer greater than 0
if ((Array.isArray(config.tabs["one-time"].giftArrayAmounts) && config.tabs["one-time"].giftArrayAmounts.length > 0) || (Array.isArray(config.tabs["recurring"].giftArrayAmounts && config.tabs["recurring"].giftArrayAmounts.length > 0))) // if either of the split gift array options are configured
console.warn("Split gift array values were configured but the URL contains parameters to set the gift array. The gifty array values from the URL will override the split gift array values configured.");
config.tabs["one-time"].giftArrayAmounts = amountArrays[0]; // set configuration one-time gift array values to the first array of values from amountArrays
config.tabs["recurring"].giftArrayAmounts = amountArrays[1]; // set configuration recurring gift array values to the second array of values from amountArrays
const isRecurring = window.NA.DonationForm.isRecurring; // get the current frequency,
window.NA.DonationForm.setGiftArrayValues(amountArrays[isRecurring ? 1 : 0]); // set the gift array values to the new values assigned for that frequency
}
} else { // single gift array provided with values separated by ','
const amountArray = amountsParamValue.includes(GIFT_ARRAY_VALUE_DELIMITER) ? amountsParamValue.split(GIFT_ARRAY_VALUE_DELIMITER).map((amount) => parseInt(amount)) : undefined; // convert string to array of numbers split by ','
if (amountArray && Array.isArray(amountArray) && amountArray.every((amount) => !Number.isNaN(amount) && Number.isInteger(amount) && amount > 0)) { // if amount array is defined as an array where every item in EACH of the array is an integer greater than 0
if ((Array.isArray(config.tabs["one-time"].giftArrayAmounts) && config.tabs["one-time"].giftArrayAmounts.length > 0) || (Array.isArray(config.tabs["recurring"].giftArrayAmounts && config.tabs["recurring"].giftArrayAmounts.length > 0))) // if either of the split gift array options are configured
console.warn("Split gift array values were configured but the URL contains parameters to set the gift array. The gifty array values from the URL will override the split gift array values configured.");
config.tabs["one-time"].giftArrayAmounts = amountArray; // set configuration one-time gift array values to the array of values from amountArray
config.tabs["recurring"].giftArrayAmounts = amountArray; // set configuration of recurring gift array values to the array of values from amountArray
window.NA.DonationForm.setGiftArrayValues(amountArray); // set the gift array values to the new values from the amountArray
}
}
}
if (searchParams.get('frequency') || searchParams.get('freq')) {
const frequencyParamValue = searchParams.get('frequency') || searchParams.get('freq') || undefined;
const frequency = decodeURIComponent(frequencyParamValue);
if (frequency) {
if (config.defaultRecurring !== undefined && config.defaultRecurring !== null)
console.warn("Default frequency is configured but the URL contains parameters to set the default frequency. The frequency from the URL will override the default frequency configured.");
window.NA.DonationForm.recurring = reRecurring.test(frequency);
}
}
if (searchParams.get('amount') || searchParams.get('amt')) {
const amountParamValue = decodeURIComponent(searchParams.get('amount') || searchParams.get('amt') || undefined);
const amount = !Number.isNaN(parseFloat(amountParamValue)) ? parseFloat(amountParamValue) : undefined;
if (amount) {
if (config.defaultAmount !== undefined && config.defaultAmount !== null)
console.warn("Default amount is configured but the URL contains parameters to set the default amount. The amount from the URL will override the default amount configured.");
window.NA.DonationForm.setAmount(amount);
}
}
}
if (window.location.search.length > 1) {
configureDonationFormFromURL(new URLSearchParams(window.location.search));
}
//
//
//
//
//
//
//
//
function addDonationInterrupter (config) {
const { content } = config;
const DONATION_INTERRUPTER_HTML = ``;
document.body.insertAdjacentHTML('beforeend', DONATION_INTERRUPTER_HTML);
const dialog = config.uniqueName ? document.getElementById(config.uniqueName) : document.querySelector('dialog.donation-interrupter');
//
//
//
const calculateAskAmount = config.askAmount;
const evaluateConditions = config.askConditions;
function getMemoryModeStorageApi (memoryMode) {
if (memoryMode === 'forever')
return localStorage;
if (memoryMode === 'session')
return sessionStorage;
if (memoryMode === 'none')
return null;
}
const DonationInterrupterApi = {};
Object.defineProperties(DonationInterrupterApi, {
id: {
value: config.uniqueName,
writable: false,
configurable: true,
enumerable: true,
},
element: {
value: dialog,
writable: true,
configurable: true,
enumerable: true,
},
getCTAButtons: {
value: function () {
const dialog = this.element;
const ctaButtons = Array.from(dialog.querySelectorAll('.donation-interrupter--cta button'));
return ctaButtons;
},
writable: false,
configurable: false,
enumerable: false,
},
memoryMode: {
value: config.memoryMode ?? 'none',
writable: false,
configurable: false,
enumerable: false,
},
getStoredState: {
value: function () {
const storageApi = getMemoryModeStorageApi(this.memoryMode);
if ( !storageApi ) {
return console.error("Failed to read Donation Interrupter status. `memoryMode` is not set."), null;
} else {
return getToken(this.id, storageApi);
}
},
writable: false,
configurable: false,
enumerable: false,
},
setStoredState: {
value: function (newState) {
const storageApi = getMemoryModeStorageApi(this.memoryMode);
if ( !storageApi ) {
throw new Error("Failed to store Donation Interrupter status. `memoryMode` is not set.");
} else {
setToken(this.id, newState, storageApi);
}
},
writable: false,
configurable: false,
enumerable: false,
},
storedState: {
get () {
return this.getStoredState();
},
set (newStatus) {
this.setStoredState(newStatus);
}
},
getStatus: {
value: function () {
const state = this.storedState;
if (state && state.hasOwnProperty('status')) {
return state.status;
} else {
return state || null;
}
},
writable: false,
configurable: false,
enumerable: false,
},
setStatus: {
value: function (newStatus) {
const state = this.storedState;
if (state && state.hasOwnProperty('status')) {
this.storedState = { ...this.storedState, state: newStatus };
} else if (!state) {
this.storedState = { status: newStatus };
} else {
this.storedState = newStatus;
}
},
writable: false,
configurable: false,
enumerable: false,
},
status: {
get () {
return this.getStatus() || {};
},
set (newStatus) {
this.setStatus(newStatus);
}
},
hide: {
value: function hide () {
const dialog = this.element;
const close = () => {
dialog.close();
this.onHide?.forEach((callback) => {
callback.call(this, dialog);
});
this.status = "dismissed";
};
close();
},
writable: false,
configurable: true,
enumerable: true,
},
show: {
value: function show (force = false) {
const dialog = this.element;
const show = () => {
this.update();
dialog.showModal();
this.onShow?.forEach((callback) => {
callback.call(this, dialog);
});
};
if (this.evaluateConditions) {
if (typeof this.evaluateConditions === 'function') { // function that returns a boolean or truthy/falsy value
if (this.evaluateConditions() ? true : false) // call the function with this context to be evalutated
show();
} else if (Array.isArray(this.evaluateConditions)) { // array of conditions -- each item is evaluated to ensure all are truthy
if (this.evaluateConditions.every((condition) => condition ? true : false)) // evaluate each item in teh array
show();
} else { // booleans, string, numbers, etc.
if (this.evaluateConditions) // any other truthy value
show();
}
} else {
show();
}
if (force) {
show();
}
},
writable: false,
configurable: true,
enumerable: true,
},
evaluateConditions: {
value: function () {
return evaluateConditions.call(config, window.NA.DonationForm.getAmount(), window.NA.DonationForm.getFrequency(), window.NA.DonationForm.DonationInterrupter?.getStoredState()) ? true : false;
},
writable: false,
configurable: true,
enumerable: false,
},
onHide: {
value: new Array(),
writable: false,
configurable: false,
enumerable: false,
},
onShow: {
value: new Array(),
writable: false,
configurable: false,
enumerable: false,
},
onCTAButtonClick: {
value: new Array(),
writable: false,
configurable: false,
enumerable: false,
},
update: {
value: function updateData () {
const dialog = this.element;
if (dialog) {
const originalAmount = window.NA.DonationForm.amount,
suggestedAmount = calculateAskAmount(originalAmount);
[...dialog.querySelectorAll('span[data="amount_original"]')].forEach((span) => span.textContent = originalAmount.toLocaleString('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 2 }));
[...dialog.querySelectorAll('span[data="amount_suggested"]')].forEach((span) => span.textContent = suggestedAmount.toLocaleString('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 2 }));
}
},
writable: false,
configurable: false,
enumerable: true,
},
handleYesClick: {
value: function (e) {
const suggestedAmount = calculateAskAmount(window.NA.DonationForm.amount);
window.NA.DonationForm.recurring = true;
window.NA.DonationForm.amount = suggestedAmount;
//vwoCustomEvent("yes");
this.hide();
this.status = "converted";
setTimeout(() => {
window.NA.DonationForm.submit();
}, 200);
},
writable: true,
configurable: true,
enumerable: false,
},
handleNoClick: {
value: function (e) {
//vwoCustomEvent("no");
this.hide();
window.NA.DonationForm.submit();
},
writable: true,
configurable: true,
enumerable: false,
},
handleOtherClick: {
value: function (e) {},
writable: true,
configurable: true,
enumerable: false,
},
});
if (Array.isArray(DonationInterrupterApi.onShow)) {
DonationInterrupterApi.onShow.push(function updateState () {
const newState = {
...this.getStoredState(),
status: "shown",
lastSeenDate: getCurrentDate(),
};
this.setStoredState(newState);
});
DonationInterrupterApi.onShow.push(function sendVWOConversionEvent () {
vwoCustomEvent("donationInterrupterShown");
});
}
const ctaButtons = DonationInterrupterApi.getCTAButtons();
DonationInterrupterApi.hasOwnProperty('handleYesClick') && ctaButtons.find((ctaButton) => ctaButton.value.match(/yes/gi))?.addEventListener('click', DonationInterrupterApi.handleYesClick.bind(DonationInterrupterApi));
DonationInterrupterApi.hasOwnProperty('handleNoClick') && ctaButtons.find((ctaButton) => ctaButton.value.match(/no/gi))?.addEventListener('click', DonationInterrupterApi.handleNoClick.bind(DonationInterrupterApi));
DonationInterrupterApi.hasOwnProperty('handleOtherClick') && ctaButtons.find((ctaButton) => ctaButton.value.match(/other/gi))?.addEventListener('click', DonationInterrupterApi.handleOtherClick.bind(DonationInterrupterApi));
ctaButtons.forEach((ctaButton, ctaButtonIndex) => {
ctaButton.addEventListener('click', (e) => {
DonationInterrupterApi.onCTAButtonClick?.forEach((callback) => callback.call(DonationInterrupterApi, e.target, e.target.value));
});
});
if (!DonationInterrupterApi.getStoredState() || !DonationInterrupterApi.getStatus()) // if no state already found on browser storage
DonationInterrupterApi.setStoredState({ status: "initialized" });
window.NA.DonationForm.DonationInterrupter = DonationInterrupterApi; // assign the function that initialized the donation interrupter to the DonationInterrupterApi
return DonationInterrupterApi;
}
Object.defineProperty(window.NA.DonationForm, 'DonationInterrupter', {
value: addDonationInterrupter,
writable: true,
configurable: true,
enumerable: true,
});
//
//
//
//
//
//
//
//
resolve(window.NA.DonationForm); // resolves the Promise of the init function with the DonationForm API object
}
//
//
//
//
// Initialize only after required custom elements are defined in the custom element registry and appear on the page
try {
console.group("Donation Form: Init");
asyncWaitForCustomElements(['c-donate-community-staff-information', 'c-donate-community-donate-buttons', 'lightning-input', 'lightning-primitive-input-simple', 'lightning-primitive-input-checkbox', 'lightning-formatted-text'], main);
asyncWaitForCustomElements(['c-donate-community-staff-information', 'c-donate-community-donate-buttons', 'lightning-input', 'lightning-primitive-input-simple', 'lightning-primitive-input-checkbox', 'lightning-formatted-rich-text'], main);
} catch (error) {
console.error(error);
reject(error);
} finally {
console.groupEnd();
}
});
}
(function(){
window.NA.DonationForm.init = window.NA.DonationForm.init || init;
})();
}catch(e) {VWO._.vAEH(e);}
return vwo_$('head')[0] && vwo_$('head')[0].lastChild;})("head")}}, C_722072_161_1_2_1:{ fn:function(log,nonce=''){return (function(x) {
try{
var _vwo_sel = vwo_$("`);
!vwo_$("head").find('#1746117915359').length && vwo_$('head').append(_vwo_sel);}catch(e) {VWO._.vAEH(e);}
try{}catch(e) {VWO._.vAEH(e);}
try{const config = {
donationForm: {
defaultRecurring: false, // true for "Recurring" default, false for "One-Time" default
giftArrayAmounts: [], // an array of numbers (like [ 5, 10, 15, 25 ]) or `null` or `[]` for default gift array amounts
defaultAmount: null, // a number or `null` for no default
anonymousDefault: null, // true/false or null for no default
tributeDefault: null, // true/false or null for no default
hideCheckboxesAll: true, // true/false to hide the checkboxes button
hideCheckboxFreqeuncy: false,
hideCheckboxAnonymous: false,
hideCheckboxTribute: false,
hideCartButton: false, // true/false to hide the "Add to Basket" button
},
tabs: {
"one-time": {
text: "One-Time Gift",
giftArrayAmounts: [], // changing the gift array here overrides the one set above for the donationForm
},
"recurring": {
text: "Recurring Gift",
giftArrayAmounts: [], // changing the gift array here overrides the one set above for the donationForm
}
}
};
const configDonationInterrupter = {
enabled: true,
uniqueName: "NA__NAV-DonationInterrupterV2",
content: {
headingSection: `
Before you go, would you consider becoming a monthly partner?
`,
bodySection: `
Your monthly partnership will:
provide the funds needed to bring Eagle Lake Camp to places where many kids donโt get the opportunity to experience camp
ensure supplies are ready and counselors are properly trained and equipped to preach the gospel
allow camp to be accessible to kids despite any financial barriers their families may face
Most importantly, you will play an active role in this ongoing work of bringing campers to meet Jesus and grow in their walks with Him. Would you consider becoming a monthly partner today?โ
`,
ctaButtons: {
"Yes": ``,
"No": ``,
},
closeButton: false,
theme: "NAV",
},
memoryMode: 'session', // "session" or "forever"; indicates how long the last interacted state should be remembered
minAmount: 5.00, // gift under this amount will be processed (if above the form minimum) and not shown the donation interrupter
maxAmount: 100.00, // gifts equal to and above this amount will be processed and not shown the donation interrupter
askConditions: function (originalAmount, originalFrequency, state) {
const conditions = [
originalFrequency === "One-Time", // "One-Time" or "Recurring"
originalAmount > this.minAmount,
originalAmount < this.maxAmount,
state && state.status !== "shown" && state.status !== "dismissed" && state.status !== "converted", // do not show if the user has already seen the donation interrupter, dismissed the donation interrupter, or converted from the donation interrupter
];
return conditions.every((condition) => typeof condition === 'function' ? !!condition.call(null) : !!condition); // return true if every condition in the array evaluates to true
},
askAmount: function (originalAmount) {
let askAmount;
if (originalAmount >= 400 && originalAmount < 500) { // $400.00 - $499.99
askAmount = 50;
} else if (originalAmount >= 300 && originalAmount < 400) { // $300.00 - $399.99
askAmount = 40;
} else if (originalAmount >= 200 && originalAmount < 300) { // $200.00 - $299.99
askAmount = 30;
} else if (originalAmount >= 100 && originalAmount < 200) { // $100.00 - $199.99
askAmount = 15;
} else { // $ 0.01 - $ 99.99
askAmount = 10;
}
return parseFloat(askAmount);
},
};
//
//
//
//
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//
//
//
//
// Run code with configuration from above
(function(){
console.log("init");
window.NA.DonationForm.init(config).then((donationFormApi) => {
console.log("initialized:", donationFormApi);
if (configDonationInterrupter && configDonationInterrupter.enabled === true) {
donationFormApi.DonationInterrupter(configDonationInterrupter);
console.log("initialized:", donationFormApi.DonationInterrupter);
donationFormApi.interceptSubmit(function (capturedEvent) {
try {
const donationInterrupterApi = this.DonationInterrupter;
if (donationFormApi && donationInterrupterApi) {
if (donationInterrupterApi.evaluateConditions()) {
console.log(donationFormApi);
donationInterrupterApi.show();
return false; // do not submit
} else {
console.warn("Condtions check failed: Donation Interrupter will not be shown.");
return true; // submit
}
} else {
throw new ReferenceError("DonationFormApi or DonationInterrupterApi is not defined.");
}
} catch (error) {
console.error("An error occured when handling submit:", error);
window.NA?.DonationForm && window.NA.DonationForm.submit(); // retry submit
} finally {
return false;
}
});
}
}).catch((error) => {
console.error("Error creating donation form API:", error);
});
})();
}catch(e) {VWO._.vAEH(e);}
return vwo_$('head')[0] && vwo_$('head')[0].lastChild;})("head")}}, R_722072_161_1_2_0:{ fn:function(log,nonce=''){return (function(x) {
try{
var ctx=vwo_$(x),el;
/*vwo_debug log("Revert","content",""); vwo_debug*/;
el=vwo_$('[vwo-element-id="1746117915357"]');
el.revertContentOp().remove();
} catch(e) {VWO._.vAEH(e);}
try{
var el,ctx=vwo_$(x);
/*vwo_debug log("Revert","addElement","body"); vwo_debug*/(el=vwo_$('[vwo-element-id="1746117915358"]')).remove();
} catch(e) {VWO._.vAEH(e);}
return vwo_$('head')[0] && vwo_$('head')[0].lastChild;})("head")}}, C_722072_161_1_2_0:{ fn:function(log,nonce=''){return (function(x) {
try{
var _vwo_sel = vwo_$("`);
!vwo_$("head").find('#1746117915357').length && vwo_$('head').append(_vwo_sel);}catch(e) {VWO._.vAEH(e);}
try{}catch(e) {VWO._.vAEH(e);}
try{/* ===== Complicated Code Below ===== */
window.HTMLElement.prototype.getSlot = window.HTMLElement.prototype.getSlot || function () { return this.querySelector('slot') || this.shadowRoot.querySelector('slot'); };
window.HTMLElement.prototype.getSlotNodes = window.HTMLElement.prototype.getSlotNodes || function (n) { return (parseInt(n) !== 'NaN' && n >= 0) ? Array.from(this.getSlot().assignedNodes({ flatten: true }))[n] : Array.from(this.getSlot().assignedNodes({ flatten: true })); };
window.HTMLElement.prototype.shadowChildren = window.HTMLElement.prototype.shadowChildren || function (n) { return (parseInt(n) !== 'NaN' && n >= 0) ? Array.from(this.shadowRoot.children)[n] : Array.from(this.shadowRoot.children); };
function shadowQuerySelectorAll (selector) {
let matches = [];
const isSlot = (element) => element.tagName.toLowerCase() === 'slot';
function traverse(element) { // Helper function to recursively traverse elements
if (element instanceof HTMLElement && element.matches(selector) /*&& element !== this*/) // Check if element matches the selector
matches.push(element);
if (customElements.get(element.tagName.toLowerCase())) { // Traverse through shadow DOM children if element is a custom element with shadow DOM
const children = element.shadowRoot ? Array.from(element.shadowRoot.children) : [];
children.forEach((child) => traverse(child));
} else {
Array.from(element.children).forEach((child) => traverse(child)); // traverse through regular element children
}
if (isSlot(element)) { // handle traversing slot nodes
const slotNodes = element.assignedNodes({ flatten: true });
slotNodes.forEach((slotNode) => {
if (slotNode.nodeType === Node.ELEMENT_NODE)
traverse(slotNode);
});
}
}
this instanceof Document ? traverse(this.documentElement) : traverse(this); // Start traversal from the root element as long as it's not the Document
return matches.length > 0 ? matches : undefined;
}
function shadowQuerySelector (selector) {
let matches = this.shadowQuerySelectorAll(selector) || [];
return matches.length > 0 ? matches[0] : undefined;
}
Object.defineProperties(HTMLElement.prototype, {
shadowQuerySelectorAll: {
value: shadowQuerySelectorAll,
writable: false,
configurable: false,
enumerable: true,
},
shadowQuerySelector: {
value: shadowQuerySelector,
writable: false,
configurable: false,
enumerable: true,
}
});
Object.defineProperties(Document.prototype, {
shadowQuerySelectorAll: {
value: shadowQuerySelectorAll,
writable: false,
configurable: false,
enumerable: true,
},
shadowQuerySelector: {
value: shadowQuerySelector,
writable: false,
configurable: false,
enumerable: true,
}
});
Object.defineProperties(Document, {
shadowQuerySelectorAll: {
value: shadowQuerySelectorAll,
writable: false,
configurable: false,
enumerable: true,
},
shadowQuerySelector: {
value: shadowQuerySelector,
writable: false,
configurable: false,
enumerable: true,
}
});
Object.defineProperty(JSON, 'isValid', {
value: function (jsonString) {
try {
JSON.parse(jsonString);
return true;
} catch (error) {
return false;
}
},
writable: false,
configurable: true,
enumerable: true,
});
async function asyncWaitForCustomElements (customElementsArray, onCustomElementsDefined = () => {}) { customElementsArray.length === 0 ? onCustomElementsDefined() : customElements.whenDefined(customElementsArray.shift()).then(() => asyncWaitForCustomElements(customElementsArray, onCustomElementsDefined)); }
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() });
}
const getToken = (key, api = localStorage) => (JSON.isValid(api.getItem(key)) ? JSON.parse(api.getItem(key)) : api.getItem(key)) || null;
const setToken = (key, value, api = localStorage) => api.setItem(key, JSON.stringify(value));
const getCurrentDate = (d = new Date()) => d.toISOString().split('T')[0];
const reOneTime = new RegExp(/(one-?time|once|single)/gi),
reRecurring = new RegExp(/(recurring|monthly)/gi);
window.NA = window.NA || {};
window.NA.DonationPage = window.NA.DonationPage || {};
window.NA.DonationForm = window.NA.DonationForm || {};
async function init (userConfig) {
return new Promise((resolve, reject) => {
const defaultConfig = {
donationForm: {
defaultRecurring: false, // true for "Recurring" default, false for "One-Time" default
giftArrayAmounts: [], // an array of numbers (like [ 5, 10, 15, 25 ]) or `null` or `[]` for default gift array amounts
defaultAmount: null, // a number or `null` for no default
anonymousDefault: null, // true/false or null for no default
tributeDefault: null, // true/false or null for no default
hideCheckboxesAll: false, // true/false to hide the checkboxes button
hideCheckboxFreqeuncy: false,
hideCheckboxAnonymous: false,
hideCheckboxTribute: false,
hideCartButton: false, // true/false to hide the "Add to Basket" button
}
};
userConfig = { ...defaultConfig, ...userConfig };
Object.defineProperty(window.NA, '_config', {
value: userConfig,
writable: false,
configurable: true,
enumerable: false,
});
const config = { ...window.NA._config };
//
//
//
//
//
//
//
function main () {
const c_donate_community_staff_information = document.shadowQuerySelector('c-donate-community-staff-information');
const c_donate_community_donate_buttons = document.shadowQuerySelector('c-donate-community-donate-buttons');
//
const donationPage = c_donate_community_staff_information.parentElement;
const donationPageImage = donationPage.shadowQuerySelectorAll('c-donate-community-staff-information > div > .slds-col')[0];
const donationPageContent = donationPage.shadowQuerySelectorAll('c-donate-community-staff-information > div > .slds-col')[1];
const donationPageTitle = donationPageContent.children[0];
const donationPageSubtitle = donationPageContent.children[1];
const donationFormWidget = donationPageContent.children[2] || c_donate_community_donate_buttons.parentElement;
const donationPageAboutTitle = donationPageContent.children[3];
const donationPageCopySection = donationPageContent.children[4] || donationPageContent.shadowQuerySelector('lightning-formatted-text, lightning-formatted-rich-text');
const donationFormGiftArrayButtons = donationFormWidget.shadowQuerySelectorAll('button[value]');
const donationFormGiftArrayOtherAmountInput = donationFormWidget.shadowQuerySelector('lightning-input lightning-primitive-input-simple input[type]');
const donationFormCheckboxes = [...donationPageContent.shadowQuerySelector('c-donate-community-donate-buttons > div').children].find((child) => child.matches('div:has(div lightning-primitive-input-checkbox)'));
const donationFormButtons = [...donationFormWidget.shadowQuerySelectorAll('button')].filter((button) => !donationFormGiftArrayButtons.includes(button));
const donationFormButton = {
"Donate Now": donationFormButtons[0],
"Add to Basket": donationFormButtons[1],
};
//
//
//
// Add legacy classes
donationPageImage.classList.add("page-image");
donationPageContent.classList.add("donation-form-content");
donationPageTitle.classList.add("page-title");
donationPageSubtitle.classList.add("page-action-text");
donationFormWidget.classList.add("donation-form");
donationPageAboutTitle.classList.add("bottom-title");
donationPageCopySection.classList.add("page-text");
donationFormCheckboxes.classList.add("donation-form-checkboxes");
donationFormButton["Donate Now"].classList.add("donate-action-button");
donationFormButton["Donate Now"].id = "donate-now";
donationFormButton["Add to Basket"].classList.add("donate-action-button");
donationFormButton["Add to Basket"].id = "add-to-basket";
//
if (config.donationForm.hideCheckboxesAll === true) {
donationFormCheckboxes.style.setProperty("display", "none");
}
if (config.donationForm.hideCheckboxFreqeuncy === true) {
[...donationFormCheckboxes.children][1]?.style.setProperty("display", "none");
}
if (config.donationForm.hideCheckboxAnonymous === true) {
[...donationFormCheckboxes.children][2]?.style.setProperty("display", "none");
}
if (config.donationForm.hideCheckboxTribute === true) {
[...donationFormCheckboxes.children][2]?.style.setProperty("display", "none");
}
if (config.donationForm.hideCartButton === true) {
donationFormButton["Add to Basket"]?.style.setProperty("display", "none");
donationFormButton["Add to Basket"]?.parentElement?.style.setProperty("display", "none");
donationFormButton["Donate Now"].parentElement.classList = donationFormButton["Donate Now"].parentElement.classList.toString().replaceAll("1-of-2", "2-of-2");
}
//
//
//
//
//
//
//
//
(function donationFormApi () {
window.NA.DonationForm = window.NA.DonationForm || {};
Object.defineProperty(window.NA.DonationForm, 'root', {
value: donationFormWidget,
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'elements', {
value: {
Tabs: undefined,
GiftArrayButtons: donationFormGiftArrayButtons,
GiftArrayOtherAmount: donationFormGiftArrayOtherAmountInput,
CheckboxRecurring: donationFormCheckboxes.shadowQuerySelectorAll('lightning-primitive-input-checkbox input[type="checkbox"]')[0],
CheckboxAnonymous: donationFormCheckboxes.shadowQuerySelectorAll('lightning-primitive-input-checkbox input[type="checkbox"]')[1],
CheckboxTribute: donationFormCheckboxes.shadowQuerySelectorAll('lightning-primitive-input-checkbox input[type="checkbox"]')[2],
SubmitButton: donationFormButton["Donate Now"],
},
writable: false,
configurable: true,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'submit', {
value: function doSubmit () {
this.elements.SubmitButton?.click();
},
configurable: false,
writable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'interceptSubmit', {
value: function interceptSubmit (callbackFn, submitButton = this.elements.SubmitButton, hideOriginal = true, maxIntercepts = 1) {
const hide = (element) => element?.style.setProperty("display", "none");
const unhide = (element) => element?.style.removeProperty("display");
const submitButtonCopy = submitButton.cloneNode(true);
if (!submitButton.id) submitButton.id = "submit-button";
submitButtonCopy.id = submitButton.id ? submitButton.id + "-copy" : "submit-button-copy";
submitButton.after(submitButtonCopy);
if (hideOriginal === true)
hide(submitButton);
const submitButtonMutationObserver = new MutationObserver((mutations, observe) => {
for (const mutation of mutations) {
const { type, target } = mutation;
if (target === submitButton) {
switch (type) {
case 'attributes':
const { attributeName } = mutation;
const attributeValue = target.hasAttribute(attributeName) ? target.getAttribute(attributeName) : null;
if (!attributeValue) {
submitButtonCopy.removeAttribute(attributeName);
} else {
submitButtonCopy.setAttribute(attributeName, attributeValue);
}
break;
case 'characterData':
submitButtonCopy.innerHTML = target.innerHTML;
break;
default:
break;
}
}
}
});
submitButtonMutationObserver.observe(submitButton, { childList: true, attributes: true, attributeOldValue: true, characterData: true, characterDataOldValue: true });
if (maxIntercepts && maxIntercepts > 0) {
submitButtonCopy.setAttribute("intercepts", "0"); // initialize intercept counter to 0
function interceptCounter (event) {
let interceptCount = parseInt(this.getAttribute("intercepts"));
this.setAttribute("intercepts", ++interceptCount);
if (interceptCount >= maxIntercepts) // reached max number of submit intercepts
console.info("Max intercepts reached: original submit button unhidden."),
submitButtonMutationObserver?.disconnect(), // disconnect the observer so the following changes don't apply to both buttons
unhide(submitButton), // unhide the original submit button so the user won't be prevented from submitting the next time they click it
hide(submitButtonCopy), // hide the copy of the submit button that was intercepting
this.removeEventListener('click', interceptCounter);
}
submitButtonCopy.addEventListener('click', interceptCounter);
}
submitButtonCopy.addEventListener('click', (event) => {
const callbackResult = callbackFn.call(this, event);
if (callbackResult && callbackResult !== false) { // if callback function result evaluates to true, then submit after the callback
window.NA.DonationForm.submit();
}
});
},
configurable: false,
writable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'getFrequency', {
value: function getFrequency () {
const recurringCheckbox = this.root.shadowQuerySelectorAll('lightning-primitive-input-checkbox input[type="checkbox"]')[0];
if (recurringCheckbox.checked === true) {
return "Recurring";
} else {
return "One-Time";
}
},
configurable: false,
writable: false,
enumerable: false,
});
Object.defineProperty(window.NA.DonationForm, 'setFrequency', {
value: function setFrequency (value) {
let toFrequency;
if (typeof value === 'boolean') {
toFrequency = value ? true : false;
} else if (typeof value === 'string') {
if (reOneTime.test(value.toLowerCase())) {
toFrequency = false;
} else if (reRecurring.test(value.toLowerCase())) {
toFrequency = true;
} else {
throw new TypeError(`Argument 0 must be a boolean or string. If string, it must match either "One-Time" or "Recurring".`);
}
} else {
throw new TypeError(`Argument 0 must be a boolean or string.`);
}
if (this.elements.Tabs && this.elements.Tabs.length === 2)
this.elements.Tabs[toFrequency ? 1 : 0]?.click();
const recurringCheckbox = this.root.shadowQuerySelectorAll('lightning-primitive-input-checkbox input[type="checkbox"]')[0];
if (toFrequency === true) { // set frequency to recurring
if (!recurringCheckbox.checked) {
recurringCheckbox.click();
} else {
console.warn("Frequency is already set to recurring:", recurringCheckbox);
}
} else { // set frequency to one-time
if (recurringCheckbox.checked) {
recurringCheckbox.click();
} else {
console.warn("Frequency is already set to one-time:", recurringCheckbox);
}
}
},
configurable: false,
writable: false,
enumerable: false,
});
Object.defineProperty(window.NA.DonationForm, 'recurring', {
get () {
return this.getFrequency() === "Recurring" ? true : false;
},
set (value) {
this.setFrequency(value);
}
});
Object.defineProperty(window.NA.DonationForm, 'isRecurring', {
get () {
return this.recurring;
}
});
Object.defineProperty(window.NA.DonationForm, 'getAmount', {
value: function getAmount () {
let matchingButton = this.elements.GiftArrayButtons.find((button) => button.classList.contains("donate-selected"));
if (matchingButton) {
return parseInt(matchingButton.value);
}
else if (this.elements.GiftArrayOtherAmount?.value.length > 0) {
let value = this.elements.GiftArrayOtherAmount.value;
value = value.replace(/[^\d\.]/, '');
return parseFloat(value);
}
else {
return undefined;
}
},
configurable: false,
writable: false,
enumerable: false,
});
Object.defineProperty(window.NA.DonationForm, 'setAmount', {
value: function setAmount (value) {
if (value === "unset") {
this.elements.GiftArrayButtons.forEach((button) => {
button.classList.remove("donate-selected", "donate-not-selected");
});
}
if (!value || Number.isNaN(parseFloat(value)))
throw new TypeError(`Argument 0 must be a boolean or string. If string, it must match either "One-Time" or "Recurring".`);
value = parseFloat(value);
let matchingButton = this.elements.GiftArrayButtons.find((button) => parseFloat(button.value) === value);
if (matchingButton) {
return matchingButton.click();
}
else {
const giftArrayOtherAmountField = this.elements.GiftArrayOtherAmount;
giftArrayOtherAmountField.value = parseFloat(value); // form doesn't like the formatted string, so number it is.
//giftArrayOtherAmountField.value = parseFloat(value).toLocaleString('en-US', { style: 'currency', currency: 'USD', currencySign: '$', minimumFractionDigits: 2, maximumFractionDigits: 2 });
giftArrayOtherAmountField.dispatchEvent(new Event('change'));
giftArrayOtherAmountField.dispatchEvent(new Event('blur'));
}
},
configurable: false,
writable: false,
enumerable: false,
});
Object.defineProperty(window.NA.DonationForm, 'amount', {
get () {
return this.getAmount();
},
set (value) {
this.setAmount(value);
}
});
Object.defineProperty(window.NA.DonationForm, 'getGiftArrayValues', {
value: function getGiftArrayValues () {
return this.elements.GiftArrayButtons.map((button) => parseInt(button.value));
},
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'setGiftArrayValues', {
value: function setGiftArrayValues (valueArray) {
if (!Array.isArray(valueArray) || valueArray.some(value => value <= 0))
throw new TypeError("Argument 0 must be an array of positive integers.");
if (valueArray.length !== this.elements.GiftArrayButtons.length)
throw new RangeError("Argument 0 must be an array of the same length as the number of gift array button elements.");
this.elements.GiftArrayButtons.forEach((button, i, buttons) => {
button.value = valueArray[i];
button.textContent = button.textContent.replace(/(\d+)/gi, valueArray[i]);
});
console.info("Updated gift array values:", ...valueArray);
},
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'onFrequencyChange', {
value: new Array(),
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'onAmountChange', {
value: new Array(),
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'onSubmit', {
value: new Array(),
writable: false,
configurable: false,
enumerablele: true,
});
const frequencyChangeEventListener = (event) => {
const newFrequency = window.NA.DonationForm.getFrequency();
window.NA.DonationForm.onFrequencyChange.forEach((callback) => {
callback.call(window.NA.DonationForm, newFrequency);
});
};
const frequencyMutationHandler = new MutationObserver ((mutations, observer) => {
for (const mutation of mutations) {
switch (mutation.type) {
case 'attributes':
if (mutation.attributeName === 'checked') {
}
break;
default:
break;
}
}
});
//window.NA.DonationForm.elements.CheckboxRecurring && frequencyMutationHandler.observe(window.NA.DonationForm.elements.CheckboxRecurring, { childList: true, attributes: true, attributeFilter: [ 'checked' ] });
window.NA.DonationForm.elements.CheckboxRecurring && window.NA.DonationForm.elements.CheckboxRecurring.addEventListener('change', frequencyChangeEventListener);
})();
//
//
//
//
//
//
//
//
(function donationPageApi () {
Object.defineProperty(window.NA.DonationPage, 'root', {
value: null, //document.shadowQuerySelector('c-donate-community-staff-information > div'),
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationPage, 'elements', {
value: {
CopySection: donationPageCopySection,
},
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationPage, 'getCopyHTML', {
value: function getCopyHTML () {
return this.elements.CopySection.innerHTML;
},
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationPage, 'setCopyHTML', {
value: function setCopyHTML (newCopyHTML) {
this.elements.CopySection.innerHTML = newCopyHTML;
},
writable: false,
configurable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationPage, 'copy', {
get () {
return this.getCopyHTML();
},
set (newCopyHTML) {
this.setCopyHTML(newCopyHTML);
}
});
})();
//
//
//
//
//
//
//
//
(function cartApi () {
const Cart = new Object();
Object.defineProperty(Cart, 'Cart', {
value: function addItem (cartItem) {
//
},
configurable: false,
writable: false,
enumerable: true,
});
Object.defineProperty(window.NA.DonationForm, 'Cart', {
value: Cart,
configurable: false,
writable: false,
enumerable: true,
});
})();
//
//
//
//
//
//
//
//
function moveDonationForm () {
try {
donationPageSubtitle.before(donationPageCopySection); // move the subtitle above the tcopy section, below the main page title
donationPageAboutTitle.style.setProperty("display", "none"); // hide the bottom heading (for the About section)
} catch (error) {
console.error(error);
}
}
moveDonationForm();
//
//
//
//
//
//
//
//
function makeTabbed () {
function createTabs (tabTexts, defaultRecurring = false) {
defaultRecurring = defaultRecurring ? true : false;
const tabs = document.createElement('div');
tabs.classList.add("tabs");
tabTexts.forEach((tabText, i) => {
const tab = document.createElement('div');
let tabClassList = [ "tab" ];
tabClassList.push(reOneTime.test(tabText) ? "onetime" : "recurring");
((tabClassList.includes("onetime") && defaultRecurring === false) || (tabClassList.includes("recurring") && defaultRecurring === true)) && tabClassList.push('selected');
tab.classList.add(...tabClassList);
tab.textContent = tabText;
tabs.appendChild(tab);
});
return tabs;
}
const donationFormTabs = createTabs([ config.tabs["one-time"].text, config.tabs["recurring"].text ], config.donationForm.defaultRecurring);
donationFormWidget.before(donationFormTabs);
window.NA.DonationForm.elements.Tabs = Array.from(donationFormTabs.children);
window.NA.DonationForm.elements.Tabs.forEach((tab, i ,tabs) => {
tab.addEventListener('click', function (e) {
this.classList.add('selected');
if (this.classList.contains('recurring')) { // if "Recurring" tab clicked
tabs.find((tab) => tab !== this)?.classList.remove('selected');
window.NA.DonationForm.recurring = true;
} else { // if "One-Time" tab clicked
tabs.find((tab) => tab !== this)?.classList.remove('selected');
window.NA.DonationForm.recurring = false;
}
});
});
Object.defineProperty(window.NA.DonationForm, 'onTabClick', {
value: new Array(),
writable: false,
configurable: false,
enumerable: true,
});
window.NA.DonationForm.elements.Tabs.forEach((tab) => {
tab.addEventListener('click', function (e) {
window.NA.DonationForm.onTabClick.forEach((callback) => {
callback.call(window.NA.DonationForm, this.textContent.trim());
});
});
});
const splitGiftArrayAmounts = {
"one-time": config.tabs["one-time"].giftArrayAmounts,
"recurring": config.tabs["recurring"].giftArrayAmounts,
};
if (((Array.isArray(config.tabs["one-time"].giftArrayAmounts) && config.tabs["one-time"].giftArrayAmounts.length > 0) || (Array.isArray(config.tabs["recurring"].giftArrayAmounts) && config.tabs["recurring"].giftArrayAmounts.length > 0)) // if either one-time or recurring gift array is set,
&& !(Array.isArray(config.tabs["one-time"].giftArrayAmounts) && config.tabs["one-time"].giftArrayAmounts.length > 0) && (Array.isArray(config.tabs["recurring"].giftArrayAmounts) && config.tabs["recurring"].giftArrayAmounts.length > 0)) { // but not both (unforntuantely no JS XOR).
if (!config.tabs["one-time"].giftArrayAmounts)
config.tabs["one-time"].giftArrayAmounts = window.NA.DonationForm.getGiftArrayValues();
if (!splitGiftArrayAmounts["recurring"])
config.tabs["recurring"].giftArrayAmounts = window.NA.DonationForm.getGiftArrayValues();
}
if ((Array.isArray(config.tabs["one-time"].giftArrayAmounts) && config.tabs["one-time"].giftArrayAmounts.length > 0) || (Array.isArray(config.tabs["recurring"].giftArrayAmounts) && config.tabs["recurring"].giftArrayAmounts.length > 0)) {
window.NA.DonationForm.onFrequencyChange.push(function updateGiftArrayAmounts (newFrequency) {
let tabKeyName;
switch (newFrequency) {
case "One-Time":
tabKeyName = "one-time";
if (config.hasOwnProperty("tabs") && config.tabs.hasOwnProperty(tabKeyName) && config.tabs[tabKeyName].hasOwnProperty("giftArrayAmounts") && Array.isArray(config.tabs[tabKeyName].giftArrayAmounts)) // if tabs are enabled and configured and gift array values are provided,
this.setGiftArrayValues(config.tabs[tabKeyName].giftArrayAmounts); // update the gift array values
this.setAmount('unset'); // unselect gift array options whenever frequency changes
break;
case "Recurring":
tabKeyName = "recurring";
if (config.hasOwnProperty("tabs") && config.tabs.hasOwnProperty(tabKeyName) && config.tabs[tabKeyName].hasOwnProperty("giftArrayAmounts") && Array.isArray(config.tabs[tabKeyName].giftArrayAmounts)) // if tabs are enabled and configured and gift array values are provided,
this.setGiftArrayValues(config.tabs[tabKeyName].giftArrayAmounts); // update the gift array values
this.setAmount('unset'); // unselect gift array options whenever frequency changes
break;
default:
throw new Error("Failed to updated gift array for frequency " + newFrequency + '.');
}
});
}
window.NA.DonationForm.elements.Tabs?.find((tab) => tab.classList.contains('selected'))?.click(); // apply default selected tab to the form's checkbox
}
if (config.hasOwnProperty("tabs") && (Object.keys(config.tabs)).length == 2) { // if tabs are enabled and configured
makeTabbed();
}
//
//
//
//
//
//
//
//
function configureDonationFormFromURL (searchParams) {
const GIFT_ARRAY_VALUE_DELIMITER = ',',
MULTIPLE_GIFT_ARRAY_DELIMETER = ';';
if (searchParams.get('amounts') || searchParams.get('array-amounts')) {
let amountsParamValue = searchParams.get('amounts') || searchParams.get('array-amounts') || '';
amountsParamValue = decodeURIComponent(amountsParamValue); // convert URI encoded string to normal characters before parsing
if (amountsParamValue.includes(MULTIPLE_GIFT_ARRAY_DELIMETER)) { // multiple gift array provided with gift arrays separated by ';' and values separated by ','
const amountArrays = amountsParamValue.split(MULTIPLE_GIFT_ARRAY_DELIMETER).map((amountArrayString) => amountArrayString.includes(GIFT_ARRAY_VALUE_DELIMITER) ? amountArrayString.split(GIFT_ARRAY_VALUE_DELIMITER).map((amount) => parseInt(amount)) : undefined) // convert string to array of arrays of numbers split by ',' and gift arrays separated by ';'
if (amountArrays && Array.isArray(amountArrays) && amountArrays.length === 2 && amountArrays.every((amountArray) => amountArray.every((amount) => !Number.isNaN(amount) && Number.isInteger(amount) && amount > 0))) { // if amount arrays is defined as an array with 2 arrays, where every item in EACH of the array is an integer greater than 0
if ((Array.isArray(config.tabs["one-time"].giftArrayAmounts) && config.tabs["one-time"].giftArrayAmounts.length > 0) || (Array.isArray(config.tabs["recurring"].giftArrayAmounts && config.tabs["recurring"].giftArrayAmounts.length > 0))) // if either of the split gift array options are configured
console.warn("Split gift array values were configured but the URL contains parameters to set the gift array. The gifty array values from the URL will override the split gift array values configured.");
config.tabs["one-time"].giftArrayAmounts = amountArrays[0]; // set configuration one-time gift array values to the first array of values from amountArrays
config.tabs["recurring"].giftArrayAmounts = amountArrays[1]; // set configuration recurring gift array values to the second array of values from amountArrays
const isRecurring = window.NA.DonationForm.isRecurring; // get the current frequency,
window.NA.DonationForm.setGiftArrayValues(amountArrays[isRecurring ? 1 : 0]); // set the gift array values to the new values assigned for that frequency
}
} else { // single gift array provided with values separated by ','
const amountArray = amountsParamValue.includes(GIFT_ARRAY_VALUE_DELIMITER) ? amountsParamValue.split(GIFT_ARRAY_VALUE_DELIMITER).map((amount) => parseInt(amount)) : undefined; // convert string to array of numbers split by ','
if (amountArray && Array.isArray(amountArray) && amountArray.every((amount) => !Number.isNaN(amount) && Number.isInteger(amount) && amount > 0)) { // if amount array is defined as an array where every item in EACH of the array is an integer greater than 0
if ((Array.isArray(config.tabs["one-time"].giftArrayAmounts) && config.tabs["one-time"].giftArrayAmounts.length > 0) || (Array.isArray(config.tabs["recurring"].giftArrayAmounts && config.tabs["recurring"].giftArrayAmounts.length > 0))) // if either of the split gift array options are configured
console.warn("Split gift array values were configured but the URL contains parameters to set the gift array. The gifty array values from the URL will override the split gift array values configured.");
config.tabs["one-time"].giftArrayAmounts = amountArray; // set configuration one-time gift array values to the array of values from amountArray
config.tabs["recurring"].giftArrayAmounts = amountArray; // set configuration of recurring gift array values to the array of values from amountArray
window.NA.DonationForm.setGiftArrayValues(amountArray); // set the gift array values to the new values from the amountArray
}
}
}
if (searchParams.get('frequency') || searchParams.get('freq')) {
const frequencyParamValue = searchParams.get('frequency') || searchParams.get('freq') || undefined;
const frequency = decodeURIComponent(frequencyParamValue);
if (frequency) {
if (config.defaultRecurring !== undefined && config.defaultRecurring !== null)
console.warn("Default frequency is configured but the URL contains parameters to set the default frequency. The frequency from the URL will override the default frequency configured.");
window.NA.DonationForm.recurring = reRecurring.test(frequency);
}
}
if (searchParams.get('amount') || searchParams.get('amt')) {
const amountParamValue = decodeURIComponent(searchParams.get('amount') || searchParams.get('amt') || undefined);
const amount = !Number.isNaN(parseFloat(amountParamValue)) ? parseFloat(amountParamValue) : undefined;
if (amount) {
if (config.defaultAmount !== undefined && config.defaultAmount !== null)
console.warn("Default amount is configured but the URL contains parameters to set the default amount. The amount from the URL will override the default amount configured.");
window.NA.DonationForm.setAmount(amount);
}
}
}
if (window.location.search.length > 1) {
configureDonationFormFromURL(new URLSearchParams(window.location.search));
}
//
//
//
//
//
//
//
//
function addDonationInterrupter (config) {
const { content } = config;
const DONATION_INTERRUPTER_HTML = ``;
document.body.insertAdjacentHTML('beforeend', DONATION_INTERRUPTER_HTML);
const dialog = config.uniqueName ? document.getElementById(config.uniqueName) : document.querySelector('dialog.donation-interrupter');
//
//
//
const calculateAskAmount = config.askAmount;
const evaluateConditions = config.askConditions;
function getMemoryModeStorageApi (memoryMode) {
if (memoryMode === 'forever')
return localStorage;
if (memoryMode === 'session')
return sessionStorage;
if (memoryMode === 'none')
return null;
}
const DonationInterrupterApi = {};
Object.defineProperties(DonationInterrupterApi, {
id: {
value: config.uniqueName,
writable: false,
configurable: true,
enumerable: true,
},
element: {
value: dialog,
writable: true,
configurable: true,
enumerable: true,
},
getCTAButtons: {
value: function () {
const dialog = this.element;
const ctaButtons = Array.from(dialog.querySelectorAll('.donation-interrupter--cta button'));
return ctaButtons;
},
writable: false,
configurable: false,
enumerable: false,
},
memoryMode: {
value: config.memoryMode ?? 'none',
writable: false,
configurable: false,
enumerable: false,
},
getStoredState: {
value: function () {
const storageApi = getMemoryModeStorageApi(this.memoryMode);
if ( !storageApi ) {
return console.error("Failed to read Donation Interrupter status. `memoryMode` is not set."), null;
} else {
return getToken(this.id, storageApi);
}
},
writable: false,
configurable: false,
enumerable: false,
},
setStoredState: {
value: function (newState) {
const storageApi = getMemoryModeStorageApi(this.memoryMode);
if ( !storageApi ) {
throw new Error("Failed to store Donation Interrupter status. `memoryMode` is not set.");
} else {
setToken(this.id, newState, storageApi);
}
},
writable: false,
configurable: false,
enumerable: false,
},
storedState: {
get () {
return this.getStoredState();
},
set (newStatus) {
this.setStoredState(newStatus);
}
},
getStatus: {
value: function () {
const state = this.storedState;
if (state && state.hasOwnProperty('status')) {
return state.status;
} else {
return state || null;
}
},
writable: false,
configurable: false,
enumerable: false,
},
setStatus: {
value: function (newStatus) {
const state = this.storedState;
if (state && state.hasOwnProperty('status')) {
this.storedState = { ...this.storedState, state: newStatus };
} else if (!state) {
this.storedState = { status: newStatus };
} else {
this.storedState = newStatus;
}
},
writable: false,
configurable: false,
enumerable: false,
},
status: {
get () {
return this.getStatus() || {};
},
set (newStatus) {
this.setStatus(newStatus);
}
},
hide: {
value: function hide () {
const dialog = this.element;
const close = () => {
dialog.close();
this.onHide?.forEach((callback) => {
callback.call(this, dialog);
});
this.status = "dismissed";
};
close();
},
writable: false,
configurable: true,
enumerable: true,
},
show: {
value: function show (force = false) {
const dialog = this.element;
const show = () => {
this.update();
dialog.showModal();
this.onShow?.forEach((callback) => {
callback.call(this, dialog);
});
};
if (this.evaluateConditions) {
if (typeof this.evaluateConditions === 'function') { // function that returns a boolean or truthy/falsy value
if (this.evaluateConditions() ? true : false) // call the function with this context to be evalutated
show();
} else if (Array.isArray(this.evaluateConditions)) { // array of conditions -- each item is evaluated to ensure all are truthy
if (this.evaluateConditions.every((condition) => condition ? true : false)) // evaluate each item in teh array
show();
} else { // booleans, string, numbers, etc.
if (this.evaluateConditions) // any other truthy value
show();
}
} else {
show();
}
if (force) {
show();
}
},
writable: false,
configurable: true,
enumerable: true,
},
evaluateConditions: {
value: function () {
return evaluateConditions.call(config, window.NA.DonationForm.getAmount(), window.NA.DonationForm.getFrequency(), window.NA.DonationForm.DonationInterrupter?.getStoredState()) ? true : false;
},
writable: false,
configurable: true,
enumerable: false,
},
onHide: {
value: new Array(),
writable: false,
configurable: false,
enumerable: false,
},
onShow: {
value: new Array(),
writable: false,
configurable: false,
enumerable: false,
},
onCTAButtonClick: {
value: new Array(),
writable: false,
configurable: false,
enumerable: false,
},
update: {
value: function updateData () {
const dialog = this.element;
if (dialog) {
const originalAmount = window.NA.DonationForm.amount,
suggestedAmount = calculateAskAmount(originalAmount);
[...dialog.querySelectorAll('span[data="amount_original"]')].forEach((span) => span.textContent = originalAmount.toLocaleString('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 2 }));
[...dialog.querySelectorAll('span[data="amount_suggested"]')].forEach((span) => span.textContent = suggestedAmount.toLocaleString('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 2 }));
}
},
writable: false,
configurable: false,
enumerable: true,
},
handleYesClick: {
value: function (e) {
const suggestedAmount = calculateAskAmount(window.NA.DonationForm.amount);
window.NA.DonationForm.recurring = true;
window.NA.DonationForm.amount = suggestedAmount;
//vwoCustomEvent("yes");
this.hide();
this.status = "converted";
setTimeout(() => {
window.NA.DonationForm.submit();
}, 200);
},
writable: true,
configurable: true,
enumerable: false,
},
handleNoClick: {
value: function (e) {
//vwoCustomEvent("no");
this.hide();
window.NA.DonationForm.submit();
},
writable: true,
configurable: true,
enumerable: false,
},
handleOtherClick: {
value: function (e) {},
writable: true,
configurable: true,
enumerable: false,
},
});
if (Array.isArray(DonationInterrupterApi.onShow)) {
DonationInterrupterApi.onShow.push(function updateState () {
const newState = {
...this.getStoredState(),
status: "shown",
lastSeenDate: getCurrentDate(),
};
this.setStoredState(newState);
});
DonationInterrupterApi.onShow.push(function sendVWOConversionEvent () {
vwoCustomEvent("donationInterrupterShown");
});
}
const ctaButtons = DonationInterrupterApi.getCTAButtons();
DonationInterrupterApi.hasOwnProperty('handleYesClick') && ctaButtons.find((ctaButton) => ctaButton.value.match(/yes/gi))?.addEventListener('click', DonationInterrupterApi.handleYesClick.bind(DonationInterrupterApi));
DonationInterrupterApi.hasOwnProperty('handleNoClick') && ctaButtons.find((ctaButton) => ctaButton.value.match(/no/gi))?.addEventListener('click', DonationInterrupterApi.handleNoClick.bind(DonationInterrupterApi));
DonationInterrupterApi.hasOwnProperty('handleOtherClick') && ctaButtons.find((ctaButton) => ctaButton.value.match(/other/gi))?.addEventListener('click', DonationInterrupterApi.handleOtherClick.bind(DonationInterrupterApi));
ctaButtons.forEach((ctaButton, ctaButtonIndex) => {
ctaButton.addEventListener('click', (e) => {
DonationInterrupterApi.onCTAButtonClick?.forEach((callback) => callback.call(DonationInterrupterApi, e.target, e.target.value));
});
});
if (!DonationInterrupterApi.getStoredState() || !DonationInterrupterApi.getStatus()) // if no state already found on browser storage
DonationInterrupterApi.setStoredState({ status: "initialized" });
window.NA.DonationForm.DonationInterrupter = DonationInterrupterApi; // assign the function that initialized the donation interrupter to the DonationInterrupterApi
return DonationInterrupterApi;
}
Object.defineProperty(window.NA.DonationForm, 'DonationInterrupter', {
value: addDonationInterrupter,
writable: true,
configurable: true,
enumerable: true,
});
//
//
//
//
//
//
//
//
resolve(window.NA.DonationForm); // resolves the Promise of the init function with the DonationForm API object
}
//
//
//
//
// Initialize only after required custom elements are defined in the custom element registry and appear on the page
try {
console.group("Donation Form: Init");
asyncWaitForCustomElements(['c-donate-community-staff-information', 'c-donate-community-donate-buttons', 'lightning-input', 'lightning-primitive-input-simple', 'lightning-primitive-input-checkbox', 'lightning-formatted-text'], main);
asyncWaitForCustomElements(['c-donate-community-staff-information', 'c-donate-community-donate-buttons', 'lightning-input', 'lightning-primitive-input-simple', 'lightning-primitive-input-checkbox', 'lightning-formatted-rich-text'], main);
} catch (error) {
console.error(error);
reject(error);
} finally {
console.groupEnd();
}
});
}
(function(){
window.NA.DonationForm.init = window.NA.DonationForm.init || init;
})();
}catch(e) {VWO._.vAEH(e);}
return vwo_$('head')[0] && vwo_$('head')[0].lastChild;})("head")}}},rules:[{"triggers":["4252289"],"tags":[{"data":{"campaigns":[{"g":1,"c":161}],"type":"m"},"id":"metric","metricId":490091},{"data":{"campaigns":[{"g":5,"c":70}],"type":"m"},"id":"metric","metricId":490091}]},{"triggers":["13064067"],"tags":[{"data":"campaigns.156","id":"runCampaign","priority":4},{"data":"campaigns.157","id":"runCampaign","priority":4},{"data":"campaigns.161","id":"runCampaign","priority":4}]},{"triggers":["12607149"],"tags":[{"data":{"campaigns":[{"g":5,"c":79}],"type":"g"},"id":"metric","metricId":0}]},{"triggers":["4091672"],"tags":[{"data":{"campaigns":[{"g":1,"c":79}],"type":"m"},"id":"metric","metricId":476312},{"data":{"campaigns":[{"g":3,"c":156}],"type":"m"},"id":"metric","metricId":476312},{"data":{"campaigns":[{"g":3,"c":157}],"type":"m"},"id":"metric","metricId":476312},{"data":{"campaigns":[{"g":5,"c":161}],"type":"m"},"id":"metric","metricId":476312},{"data":{"campaigns":[{"g":1,"c":121}],"type":"m"},"id":"metric","metricId":476312},{"data":{"campaigns":[{"g":1,"c":70}],"type":"m"},"id":"metric","metricId":476312}]},{"triggers":["12607152"],"tags":[{"data":{"campaigns":[{"g":6,"c":79}],"type":"g"},"id":"metric","metricId":0}]},{"triggers":["10067944"],"tags":[{"data":"campaigns.79","id":"runCampaign","priority":4}]},{"triggers":["12607155"],"tags":[{"data":{"campaigns":[{"g":7,"c":79}],"type":"g"},"id":"metric","metricId":0}]},{"triggers":["13290603"],"tags":[{"data":{"campaigns":[{"g":5,"c":157}],"type":"g"},"id":"metric","metricId":0}]},{"triggers":["10067839"],"tags":[{"data":"campaigns.121","id":"runCampaign","priority":4}]},{"triggers":["13742982"],"tags":[{"data":{"campaigns":[{"g":9,"c":161}],"type":"g"},"id":"metric","metricId":0}]},{"triggers":["4252295"],"tags":[{"data":{"campaigns":[{"g":7,"c":70}],"type":"m"},"id":"metric","metricId":490097}]},{"triggers":["4091675"],"tags":[{"data":{"campaigns":[{"g":2,"c":79}],"type":"m"},"id":"metric","metricId":476318},{"data":{"campaigns":[{"g":4,"c":156}],"type":"m"},"id":"metric","metricId":476318},{"data":{"campaigns":[{"g":4,"c":157}],"type":"m"},"id":"metric","metricId":476318},{"data":{"campaigns":[{"g":4,"c":161}],"type":"m"},"id":"metric","metricId":476318},{"data":{"campaigns":[{"g":2,"c":121}],"type":"m"},"id":"metric","metricId":476318},{"data":{"campaigns":[{"g":2,"c":70}],"type":"m"},"id":"metric","metricId":476318}]},{"triggers":["4252292"],"tags":[{"data":{"campaigns":[{"g":6,"c":70}],"type":"m"},"id":"metric","metricId":490094}]},{"triggers":["13742985"],"tags":[{"data":{"campaigns":[{"g":10,"c":161}],"type":"g"},"id":"metric","metricId":0}]},{"triggers":["8881173"],"tags":[{"data":"campaigns.70","id":"runCampaign","priority":4}]},{"triggers":["1740152"],"tags":[{"data":{"campaigns":[{"g":3,"c":79}],"type":"m"},"id":"metric","metricId":165095},{"data":{"campaigns":[{"g":1,"c":156}],"type":"m"},"id":"metric","metricId":165095},{"data":{"campaigns":[{"g":1,"c":157}],"type":"m"},"id":"metric","metricId":165095},{"data":{"campaigns":[{"g":6,"c":161}],"type":"m"},"id":"metric","metricId":165095},{"data":{"campaigns":[{"g":3,"c":121}],"type":"m"},"id":"metric","metricId":165095},{"data":{"campaigns":[{"g":3,"c":70}],"type":"m"},"id":"metric","metricId":165095}]},{"triggers":["11807227"],"tags":[{"data":{"campaigns":[{"g":6,"c":121}],"type":"g"},"id":"metric","metricId":0}]},{"triggers":["11807230"],"tags":[{"data":{"campaigns":[{"g":7,"c":121}],"type":"g"},"id":"metric","metricId":0}]},{"triggers":["1417796"],"tags":[{"data":{"campaigns":[{"g":8,"c":161}],"type":"m"},"id":"metric","metricId":165089}]},{"triggers":["1740149"],"tags":[{"data":{"campaigns":[{"g":4,"c":79}],"type":"m"},"id":"metric","metricId":165092},{"data":{"campaigns":[{"g":2,"c":156}],"type":"m"},"id":"metric","metricId":165092},{"data":{"campaigns":[{"g":2,"c":157}],"type":"m"},"id":"metric","metricId":165092},{"data":{"campaigns":[{"g":7,"c":161}],"type":"m"},"id":"metric","metricId":165092},{"data":{"campaigns":[{"g":4,"c":121}],"type":"m"},"id":"metric","metricId":165092},{"data":{"campaigns":[{"g":4,"c":70}],"type":"m"},"id":"metric","metricId":165092}]},{"triggers":["11807224"],"tags":[{"data":{"campaigns":[{"g":5,"c":121}],"type":"g"},"id":"metric","metricId":0}]},{"triggers":["5"],"tags":[{"id":"checkEnvironment"}]},{"triggers":["8"],"tags":[{"id":"prePostMutation","priority":3},{"id":"groupCampaigns","priority":2}]},{"triggers":["9"],"tags":[{"id":"visibilityService","priority":2}]},{"triggers":["2"],"tags":[{"id":"runTestCampaign"}]},{"triggers":["75"],"tags":[{"id":"urlChange"}]}],pages:{"ec":[{"1551882":{"inc":["o",["url","urlReg","(?i).*"]]}},{"1551882":{"inc":["o",["url","urlReg","(?i).*"]]}},{"2209614":{"exc":["o",["url","urlReg","(?i)^https?\\:\\\/\\\/(w{3}\\.)?donations\\.navigators\\.org.*"],["url","urlReg","(?i)^https?\\:\\\/\\\/(w{3}\\.)?donations\\-prod\\.navigators\\.org.*"],["url","urlReg","(?i)^https?\\:\\\/\\\/(w{3}\\.)?donate\\.navigators\\.org.*"],["url","urlReg","(?i)^https?\\:\\\/\\\/(w{3}\\.)?navigators\\.org\\\/disciplemaking.*"],["url","urlReg","(?i)^https?\\:\\\/\\\/(w{3}\\.)?navigators\\.org\\\/about\\\/contact\\-us.*"],["url","urlReg","(?i)^https?\\:\\\/\\\/(w{3}\\.)?navigators\\.org\\\/prayer\\-request.*"],["url","urlReg","(?i)^https?\\:\\\/\\\/(w{3}\\.)?forms\\.navigators\\.org.*"],["url","urlReg","(?i)^https?\\:\\\/\\\/(w{3}\\.)?joinstaff\\.navigators\\.org.*"],["url","urlReg","(?i)^https?\\:\\\/\\\/(w{3}\\.)?navigators\\.org\\\/mk.*"],["url","urlReg","(?i).*donations.*"],["url","urlReg","(?i).*give.*"],["url","urlReg","(?i)^https?\\:\\\/\\\/(w{3}\\.)?navigators\\.org\\\/ministry\\-partner\\-care.*"],["url","urlReg","(?i)^https?\\:\\\/\\\/(w{3}\\.)?dev\\-navigators\\.pantheonsite\\.io.*"]],"inc":["o",["url","urlReg","(?i)^https?\\:\\\/\\\/(w{3}\\.)?navigators\\.org.*"]]}}]},pagesEval:{"ec":[1551882,1551882,2209614]},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)}};
commonWrapper({valuesGetter:function(){return {"ga4s":0}},valuesSetter:function(data){var singleCall=data["ga4s"]||0;if(singleCall){window.sessionStorage.setItem("vwo-ga4-singlecall",true)}var ga4_device_id="";if(typeof window.VWO._.cookies!=="undefined"){ga4_device_id=window.VWO._.cookies.get("_ga")||""}if(ga4_device_id){window.vwo_ga4_uuid=ga4_device_id.split(".").slice(-2).join(".")}},verifyData:function(data){if(typeof window.VWO._.cookies!=="undefined"){return window.VWO._.cookies.get("_ga")||""}else{return false}}})();
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 validationUtils={exists:function(path){try{const parts=path.split(".");let current=window;for(const part of parts){if(current[part]===undefined){return false}current=current[part]}return true}catch(e){return false}},safeExecute:function(path,args=[]){try{const parts=path.split(".");let current=window;for(const part of parts){if(current[part]===undefined){return false}current=current[part]}if(typeof current!=="function"){return false}return current(...args)}catch(e){return false}},validateAll:function(paths){return paths.every(path=>this.exists(path))}};
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]);window._vwoIntegrationsLoaded=1;pushBasedCommonWrapper({integrationName:"GA4",getExperimentList:function(){return [70,79,121,156,157,161]},accountSettings:function(){var accountIntegrationSettings={"setupVia":"gtm","dataVariable":"dataLayer","manualSetup":true};if(accountIntegrationSettings["debugType"]=="ga4"&&accountIntegrationSettings["debug"]){accountIntegrationSettings["debug"]=1}else{accountIntegrationSettings["debug"]=0}return accountIntegrationSettings},pushData:function(expId,variationId){var accountIntegrationSettings={"setupVia":"gtm","dataVariable":"dataLayer","manualSetup":true};var ga4Setup=accountIntegrationSettings["setupVia"]||"gtag";if(ga4Setup==="gtag"){validationUtils.safeExecute("gtag",["event","VWO",{vwo_campaign_name:window._vwo_exp[expId].name+":"+expId,vwo_variation_name:window._vwo_exp[expId].comb_n[variationId]+":"+variationId}]);validationUtils.safeExecute("gtag",["event","experience_impression",{exp_variant_string:"VWO-"+expId+"-"+variationId}]);return true}return false}})();pushBasedCommonWrapper({integrationName:"GA4-GTM",getExperimentList:function(){return [70,79,121,156,157,161]},accountSettings:function(){var accountIntegrationSettings={"setupVia":"gtm","dataVariable":"dataLayer","manualSetup":true};if(accountIntegrationSettings["debugType"]=="gtm"&&accountIntegrationSettings["debug"]){accountIntegrationSettings["debug"]=1}else{accountIntegrationSettings["debug"]=0}return accountIntegrationSettings},pushData:function(expId,variationId){var accountIntegrationSettings={"setupVia":"gtm","dataVariable":"dataLayer","manualSetup":true};var ga4Setup=accountIntegrationSettings["setupVia"]||"gtm";var dataVariable=accountIntegrationSettings["dataVariable"]||"dataLayer";if(ga4Setup==="gtm"&&validationUtils.exists(dataVariable)&&Array.isArray(window[dataVariable])){window[dataVariable].push({event:"vwo-data-push-ga4",vwo_exp_variant_string:"VWO-"+expId+"-"+variationId});return true}return false}})();
;})();(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":{"args":{"1":{}},"vn":1}}},as:"r5.visualwebsiteoptimizer.com",dacdnUrl:"https://dev.visualwebsiteoptimizer.com",accountJSInfo:{"pc":{"t":0,"a":0},"noSS":false,"rp":30,"ts":1746334723,"pvn":0}};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=1746193875;window._VWO._vis_nc_lib=window._vwo_cdn+"edrv/nc-54cfde37c5a3743bc2f6e91bb1c31abfbr.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-aa7ffe63a93031e335ac2a7c312d4377br.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=722072&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-df0ecc1bb02a7e73cd2e2a895835ec5cbr.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-df0ecc1bb02a7e73cd2e2a895835ec5cbr.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-e70040e7d2d675ff50eeed490c144b1dbr.js":"edrv/va_gq-df0ecc1bb02a7e73cd2e2a895835ec5cbr.js":"edrv/va_gq-df0ecc1bb02a7e73cd2e2a895835ec5cbr.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}})();
Go HomeBlogSimple Principles for Everyday Disciplemaking
A discussion with Bill Mowry, Navigators Church Ministries staff and author of Walk with Me and The Ways of an Alongsider.
Q: Your new book is titled Walk with Me: Simple Principles for Everyday Disciplemaking. Why did you choose the phrase โwalk with meโ?
The word โwalkโ has three meanings for me. One, walking usually implies a relationship. When we walk with people, we talk with one another. Walking is also something that almost anyone can do. Also, in the New Testament, โwalkโ can be translated as โlive.โ In Colossians 2:7 and other passages, it can read as โwalkโ or โliveโ in Christ. โWalk with meโ uses an everyday life picture to intentionally invite one, two, or three people into a small circle of relationships to learn together how to live as Jesusโ disciples.
Q: Simplicity is one of the themes of your book. Why is simplicity so important?
I think weโve over-complicated disciplemaking and placed it in the hands of ministry professionals (like me!). I want to help everyday believers get engaged in discipling others. Doing it โsimplyโ means clarifying or synthesizing a subject to get to the essence or the basics of something. I want to get at the basics of disciplemaking so that many can be involved in the Great Commission.
Q: How do we complicate disciplemaking?
One book Iโve seen on the topic has thirty-two areas to disciple someone inโthis is way too complicated! I learned the importance of simplicity with an experience with a fitness trainer. The first trainer I employed to get me into shape showed me a bunch of different exercises and then kept adding to them with each session. I couldnโt remember or implement all those exercises! Now Iโm working with a trainer who shows me a few exercises and repeats them until Iโm confident in doing them on my own.
Disciplemaking takes a few simple practices and uses them again and again. In Walk with Me I write about how to build relationships, what it means to walk simple and slow, how to develop depth in peopleโs lives, and what it means to live on mission. I focus on some essential biblical principles rather than providing a step-by-step approach.
Q: One of the provocative principles in your book is that we must โwalk slow.โ Tell us what you mean by this.
The Scriptures teach that often God is not in a hurry. He took forty years to teach Israel some lessons about trusting Him. Disciplemaking happens within the context of walking with people through health, employment, or family challenges. Our rush to complete a class deadline may blind us to what God is doing in a life outside the program. Following Christ is not done in a minute but is learned through a lifetime. We must learn to go slow, following Godโs pace in someoneโs life.
Q: One of your repeated themes in the book is intentionality. Why is this important?
The New Testament is pretty clear that there are some really important things that disciples need to know, be, and do. We canโt approach disciplemaking in a haphazard or totally spontaneous way. Walking โsimpleโ means having a clear picture of a New Testament disciple and intentionally helping someone live out this picture in their lives. This picture is always in the back of our minds as we walk with others. A great picture of a disciple is The Navigators Wheel Illustration. The Wheel gives some basics that every disciple should know, be, and do.
Having taken part in a few different ministries including jr hi, sr hi, children ministries, camp ministry, door to door evangelism explosionโฆ. Iโm awed by Godโs usage of ordinary folks who just willingly step up to serve. Lotta โWowsโ watching Godโs influences๐
This email came at the perfect time to encourage me. This evening I will be hosting an online group of women ages 14 through 70. God has placed it on my heart that Christian Community has to be online as well as in person, local but also global, in depth but relatable, most importantly allow for open questions but Jesus is the only answer.
The Gospel (including growing to maturity) is simple and fast is slow. A thought that often nails me to the wall is that God could speed up the process but he doesnโt. If he enjoys watching me grow over time and if I want to be like him shouldnโt I find joy in the process too? It is easy for me to be results oriented instead of relationship oriented. If I want to be fruitful and teach others to be fruitful I need to focus on abiding in Christ. Great article
Good stuff. Thank you for sharing it today. As the old saying goes โKeep it simple stupidโ KISS. Iโm 75 and still learning to witness disciple people.
I think also an emphasis on numbers (How many people do you have in your class? How many commitments?) can also be a detriment. I, at times, feel overwhelmed b/c i donโt think Iโm taking the time necessary to fully nurture each relationship.
Good solid points, Bill. Some programs fill people with head knowledge, but the heart knowledge doesnโt keep pace. Simple is better. Being โthereโ during someoneโs life,โฆ.that shows that its real.
Spending time with God each day is an important part of deepening your relationship with Him. Here are five ideas to carry that intentionality into your family time. Continue Reading
Discover how thousands of students in Nashville joined The Navigatorsโ challenge โ to read the Gospel of John in 21 days with their friends! Continue Reading
Last month, Navigator staff came together in Texas for the National Staff Gathering where they enjoyed times of laughter, along with โฆ Continue Reading
You can be the difference in a child making a decision to follow Jesus at camp this summer. Will you help a kid get to Eagle Lake Camps of The Navigators this summer?
Having taken part in a few different ministries including jr hi, sr hi, children ministries, camp ministry, door to door evangelism explosionโฆ. Iโm awed by Godโs usage of ordinary folks who just willingly step up to serve. Lotta โWowsโ watching Godโs influences๐
Wow!thank you so much this is been a lots to learn on how to do discipleship.to our friends and family or to everyone.thank you so much.
Thank you,it helps me to grow more and more,to God be the Glory.
Where could I go but too the LORD!! He has and is ordaining me! Amen ๐ 1JOHN 2:27; JAMES 1:5,6-9.
This email came at the perfect time to encourage me. This evening I will be hosting an online group of women ages 14 through 70. God has placed it on my heart that Christian Community has to be online as well as in person, local but also global, in depth but relatable, most importantly allow for open questions but Jesus is the only answer.
The Gospel (including growing to maturity) is simple and fast is slow. A thought that often nails me to the wall is that God could speed up the process but he doesnโt. If he enjoys watching me grow over time and if I want to be like him shouldnโt I find joy in the process too? It is easy for me to be results oriented instead of relationship oriented. If I want to be fruitful and teach others to be fruitful I need to focus on abiding in Christ. Great article
Good stuff. Thank you for sharing it today. As the old saying goes โKeep it simple stupidโ KISS. Iโm 75 and still learning to witness disciple people.
Bill, I really love this book. It is so practical and clear.
I think also an emphasis on numbers (How many people do you have in your class? How many commitments?) can also be a detriment. I, at times, feel overwhelmed b/c i donโt think Iโm taking the time necessary to fully nurture each relationship.
This is so good teaching on discipleship
Good solid points, Bill. Some programs fill people with head knowledge, but the heart knowledge doesnโt keep pace. Simple is better. Being โthereโ during someoneโs life,โฆ.that shows that its real.