\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")}}, C_722072_158_1_2_0:{ fn:function(log,nonce=''){return (function(x) {
try{
var _vwo_sel = vwo_$("`);
!vwo_$("head").find('#1743104387377').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")}}, R_722072_158_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="1743104387377"]');
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="1743104387378"]')).remove();
} catch(e) {VWO._.vAEH(e);}
return vwo_$('head')[0] && vwo_$('head')[0].lastChild;})("head")}}, C_722072_158_1_2_1:{ fn:function(log,nonce=''){return (function(x) {
try{
var _vwo_sel = vwo_$("`);
!vwo_$("head").find('#1743104387380').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_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
If you want to memorize Scripture but arenโt sure what to memorize or how, this system is the perfect launch point to begin hiding Godโs Word in your heart. Itโs simple and easy-to-use โ and will help you memorize key verses that point to basic truths and important instruction.
The Topical Memory System (TMS) was developed by The Navigators as a clear, simple, proven way to meditate on key Bible verses.
Memorizing Scripture, will help you experience:
Freedom from Anxiety โ Writing Godโs promises on your heart helps you live in Godโs perfect presence.
Triumph Over Temptation โ Scripture memory makes the sword of the Spirit readily available for your battle against sin.
Confidence in Witnessing โ Share the Gospel effectively with friends, family, and neighbors using verses you know by heart.
Spiritual Strength โ Sense Godโs presence moment by moment and trust Him more deeply to meet the needs and opportunities that arise each day.
Below is a list of the five pivotal topics addressed in the Topical Memory System. By using the TMS course workbook and memory cards available from NavPress as your guide, you can memorize, review, and meditate on these 60 verses in just 30 weeks.
The Topical Memory System (TMS) and its sibling edition, the Topical Memory System: Life Issues, are proven ways to effectively commit Scripture to memory. The TMS focuses on how to live a life of Christ-focused, assured discipleship, and the TMS: Life Issues focuses on significant, relevant issues that face us on the road through life, such as anger, dealing with sin, suffering, and knowing Godโs will.
Order the complete Topical Memory System from NavPress (including workbook, pocket-sized memory verse cards and verse card holder) for yourself or as a gift for those you are discipling.
I started memorizing scripture even before I became a Christian by the encouragement of a Navigator . After memorizing a third of the TMS, I let it fade away because I was the only one doing it. This was in 1960โs . I tried to review and it did help. I needed someone to memorize with, now it is harder these days to memorize, but I still remember some of the verses and review them.
I had bought the TMS 37 years ago but have misplaced my cards. I bought TMS for the young women Iโm discipling in Dec and wanted to review myself and used this link today! Helpful because I am on staff with Athletes in Action. I became a Christian thru the Navigators and was discipled by Cari Nelson. I keep buying the hard copy of TMS of course for anyone who is up for meditating on Godโs Word!!
I memorized the TMS in college in the late 1970โs. It has had a profound impact on my life and thousands of others thru me. As a Christian Science Teacher I created a scripture memory program for our K4-8th graders. Before that time each teacher picked a verse of the week and the kids including mine forgot it by the next week. My system was based on my experience with the TMS and sports. Each grade had to memorize 8 new verses a year and review 8 verses from the previous year. The end of each year the student would recite 16 verses to earn their class pin. The pin went on a school letter similar to a sports program. There was also a half way award of 40 verses said at one time and then 80 verses said at one time for special awards. Many students over the years and parents memorized and commented on the impact Godโs memorized word had on their life. I highly recommend memorizing the TMS.
We studied the TMS over 30 years ago and the impact it has on my life to this day is astronomical. I highly recommend it to anyone who wants to โhide the Word of God in their heart.โ
Explore how your perspective of the power of the cross changes as you deepen your understanding of Godโs holiness and the extent of your sin. Continue Reading
Learn how Samuel and Nathan have used their Eagle Lake Camps experience to disciple campers and pass on what theyโve learned over the โฆ 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?
I started memorizing scripture even before I became a Christian by the encouragement of a Navigator . After memorizing a third of the TMS, I let it fade away because I was the only one doing it. This was in 1960โs . I tried to review and it did help. I needed someone to memorize with, now it is harder these days to memorize, but I still remember some of the verses and review them.
I had bought the TMS 37 years ago but have misplaced my cards. I bought TMS for the young women Iโm discipling in Dec and wanted to review myself and used this link today! Helpful because I am on staff with Athletes in Action. I became a Christian thru the Navigators and was discipled by Cari Nelson. I keep buying the hard copy of TMS of course for anyone who is up for meditating on Godโs Word!!
I memorized the TMS in college in the late 1970โs. It has had a profound impact on my life and thousands of others thru me. As a Christian Science Teacher I created a scripture memory program for our K4-8th graders. Before that time each teacher picked a verse of the week and the kids including mine forgot it by the next week. My system was based on my experience with the TMS and sports. Each grade had to memorize 8 new verses a year and review 8 verses from the previous year. The end of each year the student would recite 16 verses to earn their class pin. The pin went on a school letter similar to a sports program. There was also a half way award of 40 verses said at one time and then 80 verses said at one time for special awards. Many students over the years and parents memorized and commented on the impact Godโs memorized word had on their life. I highly recommend memorizing the TMS.
We studied the TMS over 30 years ago and the impact it has on my life to this day is astronomical. I highly recommend it to anyone who wants to โhide the Word of God in their heart.โ