PageSourceSearch

https://www.weareplannedparenthoodaction.org/KDlEsm4r6EizP0SdpEj8Fg2?fb=true

html weareplannedparenthoodaction.org collected 2026-09-25 19:22:54 UTC 174,300 bytes, 4,616 lines download raw bytes

1
2
3<!DOCTYPE html>
4<html>
5<head>
6    <link rel="canonical" href="https://www.weareplannedparenthoodaction.org/KDlEsm4r6EizP0SdpEj8Fg2" />
7    <!-- Prioritize load of NGPVAN Head Content -->
8    <link nonce="744a3226-3f25-411c-9500-973157837f5a" rel="preload" href="https://static.everyaction.com/ea-actiontag/at.js" as="script" crossorigin="anonymous">
9    <link rel="preload" href="https://static.everyaction.com/ea-actiontag/at.min.css" as="style">
10        
10<script nonce="744a3226-3f25-411c-9500-973157837f5a" src="https://client.px-cloud.net/PXsJ1uzlSV/main.min.js" async crossorigin="anonymous" ></script>
10
11    <!-- Custom Head Content -->
12    
12<script type="text/javascript" src="https://try.abtasty.com/4a5beb0972e219edcff0400029191b52.js" nonce="744a3226-3f25-411c-9500-973157837f5a"></script>
vendor: 2 bytes, line 12
12
13<script nonce="744a3226-3f25-411c-9500-973157837f5a">
14    </script>
14
15<link rel="stylesheet" href="https://nvlupin.blob.core.windows.net/images/van/AV/PPFA/1/11607/images/CSS/NAT_BasicPPOLStyles.css">
16<link rel="stylesheet" href="https://fast.fonts.net/cssapi/cb6b236d-f129-416d-8196-4f29ffe0c887.css">
17<link rel="shortcut icon" href="https://nvlupin.blob.core.windows.net/images/van/AV/PPFA/1/11607/images/Online%20Actions/favicons/pp-pink-favicon.f2784b8a56e4-3.png" type="image/x-icon" />
18<link rel="icon" href="https://nvlupin.blob.core.windows.net/images/van/AV/PPFA/1/11607/images/Online%20Actions/favicons/pp-pink-favicon.f2784b8a56e4-3.png" type="image/x-icon" />
19<link rel="apple-touch-icon" href="https://www.plannedparenthoodaction.org/static/assets/favicons/pp-pink-apple-icon-152x152.dc56ff240fa2.png" />
20<meta name="msapplication-TileColor" content="#EC008C" />
21<meta name="msapplication-TileImage" content="https://www.plannedparenthoodaction.org/static/assets/favicons/metro-white-144.45a86b7de9ad.png" />
22<link rel="mask-icon" href="https://www.plannedparenthoodaction.org/static/assets/favicons/safari-pinned-tab.ae3b60cf3d2e.svg" color="#EC008C" />
23<meta name="viewport" content="width=device-width, initial-scale=1.0">
24<title>Donate to Planned Parenthood Action Fund</title>
25
26<!--  Facebook Metadata -->
27<meta property="og:url" content="https://www.weareplannedparenthoodaction.org/KDlEsm4r6EizP0SdpEj8Fg2" />
28<meta property="og:title" content="Fight for abortion access and repro rights." />
29<meta property="og:image" content="https://nvlupin.blob.core.windows.net/images/van/AV/PPFA/1/9816/images/Social/GenericDonate/StillHereNoMatterWhat_GiveNow_C4_1200.png" />
30<meta property="og:description" content="Reproductive health and rights are on the line.  Don't let extremists win. Donate to Planned Parenthood Action Fund now." />
31
32<!-- Data Layer Prep for GTM -->
33<script nonce="744a3226-3f25-411c-9500-973157837f5a">
34
35    window.dataLayer = window.dataLayer || [];
36
37    // --- Referring Widget, AFF NAME START
38    let affName = '';
39    let affID = '';
40    parseCommittee("Planned Parenthood Action Fund");
41
42    // Referring Widget 
43    let referringwidget = "";
44    if (referringwidget != '') {
45        refwidget = referringwidget.replaceAll('&#95;', ' ');
46    } else {
47        refwidget = 'No Referring Widget';
48    }
49
50    // --- Referring Widget, AFF NAME END
51    // This function grabs data from the form before submission and renders it to the dataLayer.
52
53    (function () {
54
55        var postRender = function (args) {
56            var dl_push = {
57                event: 'form-rendered-data'
58            };
59            dl_push.details = args;
60            dataLayer.push(dl_push.details.postVals);
61            return args;
62        }
63        window.nvtag_callbacks = window.nvtag_callbacks || {};
64        window.nvtag_callbacks.postRender = window.nvtag_callbacks.postRender || [];
65        window.nvtag_callbacks.postRender.push(postRender);
66    }
67    )();
68    //This function grabs data from the submitted form and echoes it into the dataLayer
69    (function () {
70        var submitSegue = function (args) {
71            var dl_push = {
72                event: 'form-submitted-data'
73            };
74            dl_push.details = args;
75            /*
76            if (dl_push.details.postVals && dl_push.details.postVals.CustomFormFieldQuestion_6308388360774211_MappedCustomFormFieldQuestion_39) {
77                //            dl_push.details.postVals.affiliateId = dl_push.details.postVals.CustomFormFieldQuestion_6308388360774211_MappedCustomFormFieldQuestion_39;
78                try {
79                    dl_push.details.postVals.affiliateName = '';
80                } catch (e) { }
81
82            }
83                */
84            dl_push.details.postVals.affiliateName = affName;
85            dl_push.details.postVals.affiliateID = affID;
86            dataLayer.push(dl_push);
87
88            return args;
89        }
90        window.nvtag_callbacks = window.nvtag_callbacks || {};
91        window.nvtag_callbacks.preSegue = window.nvtag_callbacks.preSegue || [];
92        window.nvtag_callbacks.preSegue.push(submitSegue);
93    }
94    )();
95    // This dataLayer push merges existing variables on the page (called "Form Merge Fields") and populates the dataLayer upon page render.
96    // The dataLayer event key is used to tell GTM when it can fire tags.
97    window.dataLayer.push({
98        "event": "dataLayer_initialized",
99        "everyAction": {
100            additionalContributionAmount: 0,
101        committeeFullName: "Planned Parenthood Action Fund",
102        contributionAmount: "",
103        contributionDateTime: " ",
104        contributionType: "contribution",
105        country: "",
106        dateOfBirth: "",
107        designation: "Action Fund C4",
108        // There is also a "Brand" value coming directly from EA's native GA integration -- we think this is Committee Name (according to EA)
109        ethnicity: "",
110        eventDescription: "",
111        eventName: "",
112        fundraiserContributionCount: "",
113        gender: "",
114        formTitle: "Donate to Planned Parenthood Action Fund",
115        formUrl: "https://www.weareplannedparenthoodaction.org/KDlEsm4r6EizP0SdpEj8Fg2",
116        zipCode: "",
117        affiliateID: affID,
118        affiliateName: affName,
119        referring_donation_widget: refwidget
120            }   
121        });
122
123
124
125    // UTIL
126    function parseCommittee(committeeFullName) {
127        const params = new URLSearchParams(window.location.search);
128
129        // Helper: strip stray quotes and trim whitespace
130        const clean = (str) => str ? str.replace(/^["']|["']$/g, '').trim() : str;
131
132        const urlAffID = clean(params.get('affiliateID'));
133        const urlAffName = clean(params.get('affName'));
134
135        // If either URL param is present, use them and skip parsing
136        if (urlAffID || urlAffName) {
137            affID = urlAffID || null;
138            affName = urlAffName || null;
139            return;
140        }
141
142        const value = committeeFullName;
143
144        // 5-digit numeric prefix: "20090-Planned Parenthood Advocates of Ohio"
145        const numericMatch = value.match(/^(\d{5})-(.+)$/);
146        if (numericMatch) {
147            affID = numericMatch[1];
148            affName = numericMatch[2].trim();
149            return;
150        }
151        // "Gen" prefix: "GenAL-Alabama Generation Action"
152        const genMatch = value.match(/^Gen[^-]*-(.+)$/);
153        if (genMatch) {
154            affName = genMatch[1].trim();
155            return;
156        }
157        // "C3" or "C4" prefix: "C3_MD-Maryland Statewide C3 Committee"
158        const cMatch = value.match(/^C[34][^-]*-(.+)$/);
159        if (cMatch) {
160            affName = cMatch[1].trim();
161            return;
162        }
163        // Not an affiliate — leave affID and affName as null
164    }
165
166
167</script>
167
168
169
170<!--- Google Tag Manager --->
171<!-- Google Tag Manager Container Code -->
172<script nonce="744a3226-3f25-411c-9500-973157837f5a">
173    (function (w, d, s, l, i) {
174        w[l] = w[l] || []; w[l].push({
175            'gtm.start':
176                new Date().getTime(), event: 'gtm.js'
177        }); var f = d.getElementsByTagName(s)[0],
178            j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src =
179                'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
180        j.setAttribute('data-script-justification', 'PPFA-GTM');
181        f.parentNode.insertBefore(j, f);
182    })(window, document, 'script', 'dataLayer', 'GTM-MZJZ59');
183</script>
183
184<!-- End Google Tag Manager --->
185<script nonce="744a3226-3f25-411c-9500-973157837f5a">
186
187    let gaAction = () => {
188
189
190        // Guard: If donate, dont run this
191        if (document.querySelector('.at-form.at-mode-person[id*="NVContribution"]')) return;
192
193        setTimeout(function () {
194
195            let fullFormName;
196            let deviceStatus;
197            let shortCode;
198            let campaignName;
199            let campaignId;
200            let sourceCodeId;
201            let tabStatus;
202            let activeFrq;
203            let activeAmt;
204            let activeAmtType;
205            let affName;
206            let affID;
207
208            mobileCheck();
209            getFormData();
210
211            window.actionGA = (eventName, addProp, addVal) => {
212
213                mobileCheck();
214                let data = {
215                    event: eventName,
216                    renderType: deviceStatus,
217                    displayTime: Date.now(),
218                    formName: fullFormName,  //example
219                    formShortCode: shortCode, //example
220                    formCampaignName: campaignName,
221                    formCampaignId: campaignId,
222                    formSourceCodeId: sourceCodeId,
223                    affiliateName: affName,
224                    affiliateID: affID
225                }
226
227                if (addProp) {
228                    data[addProp] = addVal;
229                }
230
231                window.dataLayer.push(data);
232
233            }
234
235
236            function getFormData() {
237
238                parseCommittee("Planned Parenthood Action Fund");
239
240                dataLayer.forEach(element => {
241                    for (const property in element) {
242
243                        // Form Name
244
245                        if (property && property == "formName") {
246                            fullFormName = element.formName;
247                        }
248
249                        // Short Code
250                        if (property && property == "formShortCode") {
251                            shortCode = element.formShortCode;
252                        }
253
254                        // Campaign
255                        if (property && property == "campaignId") {
256                            campaignId = element.campaignId;
257                        }
258
259                        // Campaign Name
260                        if (property && property == "campaignName") {
261                            campaignName = element.campaignName;
262                        }
263
264                        // SourceID
265                        if (property && property == "sourceCodeId") {
266                            sourceCodeId = element.sourceCodeId;
267
268                        }
269
270                    }
271
272                });
273            }
274
275            // renderType
276            function mobileCheck() {
277                var hasTouchScreen = false;
278                if ("maxTouchPoints" in navigator) {
279                    hasTouchScreen = navigator.maxTouchPoints > 0;
280                }
281                if (hasTouchScreen) {
282                    // Device is likely mobile, so do stuff for mobile devices here.
283                    deviceStatus = 'mobile';
284                } else {
285                    deviceStatus = 'desktop';
286                }
287            };
288
289            // INTERACTIONS:
290
291            // Form Load
292            actionGA('Action Form Load');
293
294            // FastAction
295            if (!!document.querySelector('.fa-cta')) {
296                // Fastaction
297                document.querySelector('.fa-cta').onclick = () => {
298                    actionGA('FastAction Click');
299                }
300            }
301
302            // Additional Form Fields
303            /*
304            document.querySelectorAll('.AdditionalInformation, .EligibilityInformation')
305                .forEach((container) => {
306                    container.addEventListener('change', (e) => {
307                        const input = e.target.closest('input, textarea, select');
308                        if (!input || !container.contains(input)) return;
309
310                        const labelName = getLabelText(input);
311                        actionGA('Filled Form Additional Info Field', 'formFieldName', labelName);
312                    });
313                });
314            */
315
316            if (!window.__addlInfoGABound) {
317                window.__addlInfoGABound = true;
318
319                document.addEventListener('blur', (e) => {
320                    const input = e.target.closest('input[type="text"], textarea');
321                    if (!input) return;
322
323                    const container = input.closest('.AdditionalInformation, .EligibilityInformation');
324                    if (!container) return;
325
326                    if (!input.value.trim()) return;   // only fire if a value was added
327
328                    const labelName = getLabelText(input);
329                    actionGA('Filled Form Additional Info Field', 'formFieldName', labelName);
330                }, true);   // <-- capture phase, required for blur
331
332                document.addEventListener('change', (e) => {
333                    const input = e.target.closest('input[type="checkbox"], input[type="radio"]');
334                    if (!input) return;
335
336                    const container = input.closest('.AdditionalInformation, .EligibilityInformation');
337                    if (!container) return;
338
339                    if (!input.checked) return;   // only fire when it becomes checked, not unchecked
340
341                    const labelName = getLabelText(input);
342                    actionGA('Filled Form Additional Info Field', 'formFieldName', labelName);
343                });
344
345            }
346
347
348
349            // DEV: Multi-step
350            if (document.querySelector('.at-steps')) {
351                document.querySelectorAll('.at-steps a').forEach((element) => {
352                    let thisElement = element;
353                    element.onclick = () => {
354                        actionGA('Multi Step Click', 'Multi Step Title: ', thisElement.firstElementChild.textContent);
355                    };
356                });
357            }
358
359            // Contact Fields
360            if (!!document.querySelector('fieldset.ContactInformation')) {
361                document.querySelectorAll('fieldset.ContactInformation input').forEach((element) => {
362                    element.addEventListener('focusout', (event) => actionGA('Filled Form Field', 'formFieldName', element.title));
363                });
364            }
365
366
367
368            // UTIL 
369
370            function parseCommittee(committeeFullName) {
371                const params = new URLSearchParams(window.location.search);
372
373                // Helper: strip stray quotes and trim whitespace
374                const clean = (str) => str ? str.replace(/^["']|["']$/g, '').trim() : str;
375
376                const urlAffID = clean(params.get('affiliateID'));
377                const urlAffName = clean(params.get('affName'));
378
379                // If either URL param is present, use them and skip parsing
380                if (urlAffID || urlAffName) {
381                    affID = urlAffID || null;
382                    affName = urlAffName || null;
383                    return;
384                }
385
386                const value = committeeFullName;
387
388                // 5-digit numeric prefix: "20090-Planned Parenthood Advocates of Ohio"
389                const numericMatch = value.match(/^(\d{5})-(.+)$/);
390                if (numericMatch) {
391                    affID = numericMatch[1];
392                    affName = numericMatch[2].trim();
393                    return;
394                }
395                // "Gen" prefix: "GenAL-Alabama Generation Action"
396                const genMatch = value.match(/^Gen[^-]*-(.+)$/);
397                if (genMatch) {
398                    affName = genMatch[1].trim();
399                    return;
400                }
401                // "C3" or "C4" prefix: "C3_MD-Maryland Statewide C3 Committee"
402                const cMatch = value.match(/^C[34][^-]*-(.+)$/);
403                if (cMatch) {
404                    affName = cMatch[1].trim();
405                    return;
406                }
407                // Not an affiliate — leave affID and affName as null
408            }
409
410
411            function getLabelText(input) {
412                // closest label wrapping the input (works for your checkboxes/radios/text)
413                const label = input.closest('label');
414                let text = label ? label.textContent : '';
415
416                // fallback: the field-group label referenced by aria-describedby
417                if (!text.trim() && input.getAttribute('aria-describedby')) {
418                    const described = document.getElementById(input.getAttribute('aria-describedby'));
419                    if (described) text = described.textContent;
420                }
421
422                return shorten(text);
423            }
424
425            function shorten(str) {
426                return str
427                    .replace(/\s+/g, ' ')   // collapse newlines + runs of spaces into one
428                    .trim()
429                    .slice(0, 40);          // cap length — adjust to taste
430            }
431
432
433
434        }, 500);
435
436
437
438
439    }
440
441    var nvtag_callbacks = nvtag_callbacks || {};
442    nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
443    nvtag_callbacks.postRender.push(gaAction);
444
445
446</script>
vendor: 2 bytes, line 446
446
447<script nonce="744a3226-3f25-411c-9500-973157837f5a">
448
449    let gaDonate = () => {
450
451        // Guard: If donate, run this
452        if (!document.querySelector('.at-form.at-mode-person[id*="NVContribution"]')) return;
453
454        setTimeout(function () {
455
456            let fullFormName;
457            let deviceStatus;
458            let shortCode;
459            let campaignName;
460            let campaignId;
461            let sourceCodeId;
462            let tabStatus;
463            let activeFrq;
464            let activeAmt;
465            let activeAmtType;
466            let affName;
467            let affID;
468
469            mobileCheck();
470            getFormData();
471            tabCheck();
472            frqCheck();
473            amountCheck();
474
475            window.matchGA = (eventName, addProp, addVal) => {
476
477                mobileCheck();
478                tabCheck();
479                frqCheck();
480                amountCheck();
481                let data = {
482                    event: eventName,
483                    renderType: deviceStatus,
484                    displayTime: Date.now(),
485                    formName: fullFormName,  //example
486                    formShortCode: shortCode, //example
487                    formCampaignName: campaignName,
488                    formCampaignId: campaignId,
489                    formSourceCodeId: sourceCodeId,
490                    giftType: tabCheck(),
491                    giftFrequency: activeFrq, //of "Monthly"
492                    giftAmount: activeAmt, //the amount selected on the form
493                    giftAmountType: activeAmtType,// or "Input Amount"
494                    affiliateName: affName,
495                    affiliateID: affID
496                }
497
498                if (addProp) {
499                    data[addProp] = addVal;
500                }
501
502                window.dataLayer.push(data);
503
504            }
505
506
507            function getFormData() {
508
509                parseCommittee("Planned Parenthood Action Fund");
510
511                dataLayer.forEach(element => {
512                    for (const property in element) {
513
514                        // Form Name
515
516                        if (property && property == "formName") {
517                            fullFormName = element.formName;
518                        }
519
520                        // Short Code
521                        if (property && property == "formShortCode") {
522                            shortCode = element.formShortCode;
523                        }
524
525                        // Campaign
526                        if (property && property == "campaignId") {
527                            campaignId = element.campaignId;
528                        }
529
530                        // Campaign Name
531                        if (property && property == "campaignName") {
532                            campaignName = element.campaignName;
533                        }
534
535                        // SourceID
536                        if (property && property == "sourceCodeId") {
537                            sourceCodeId = element.sourceCodeId;
538
539                        }
540
541                    }
542
543                });
544            }
545
546            // renderType
547            function mobileCheck() {
548                var hasTouchScreen = false;
549                if ("maxTouchPoints" in navigator) {
550                    hasTouchScreen = navigator.maxTouchPoints > 0;
551                }
552                if (hasTouchScreen) {
553                    // Device is likely mobile, so do stuff for mobile devices here.
554                    deviceStatus = 'mobile';
555                } else {
556                    deviceStatus = 'desktop';
557                }
558            };
559
560            // Front-End Checker for Non-Directed or Directed
561            function tabCheck() {
562                if (document.querySelector('#giving-tabs')) {
563                    if (document.querySelector('#giving-tabs .nondirected-tab').classList.contains('current')) {
564                        return 'nondirected';
565                    } else {
566                        return 'directed'
567                    }
568                } else {
569                    if (document.querySelector('#yed-specific-giving label')) {
570                        return 'directed';
571                    }
572                    else {
573                        return 'nondirected';
574                    }
575                }
576            };
577
578            // Front-End Checker for Donation form Frequency
579            function frqCheck() {
580                if (!!document.querySelector('.form-item-selectedfrequency')) {
581                    if (document.querySelector('.form-item-selectedfrequency label input[value="0"]').checked) {
582                        activeFrq = 'One-Time';
583                    } else {
584                        activeFrq = 'Monthly';
585                    }
586                } else if (!!document.querySelector('.at-check.IsRecurring')) {
587                    if (document.querySelector('.at-check.IsRecurring > input').checked) {
588                        activeFrq = 'Monthly';
589                    } else {
590                        activeFrq = 'One-Time';
591                    }
592                } else {
593                    activeFrq = 'One-Time';
594                }
595            }
596
597            // Front-End Checker for Current Donation Amount
598            function amountCheck() {
599                if (!!document.querySelector('input.edit-otheramount')) {
600                    if ($("input.edit-otheramount").val()) {
601                        activeAmt = '$' + $("input.edit-otheramount").val();
602                        activeAmtType = 'Input Amount';
603                    } else {
604                        activeAmt = '$' + $(".form-item-selectamount .label-amount input[type='radio']:checked").val();
605                        activeAmtType = 'Preset Amount';
606                    }
607                } else if (!!document.querySelector('.SuggestedAmount input')) {
608                    activeAmt = '$' + document.querySelector('.SuggestedAmount input').value;
609                    activeAmtType = 'Input Amount';
610                } else if (document.querySelector(".form-item-selectamount .label-amount") && !document.querySelector('input.edit-otheramount') && !document.querySelector('.SuggestedAmount input')) {
611                    activeAmt = '$' + $(".form-item-selectamount .label-amount input[type='radio']:checked").val();
612                    activeAmtType = 'Preset Amount';
613                }
614            }
615
616
617
618            // INTERACTIONS:
619
620            // Form Load
621            matchGA('Donation Form Load');
622
623            // Frequency Change
624            if (!!document.querySelector('.form-item-selectedfrequency')) {
625                // Payment Method
626                document.querySelector('.form-item-selectedfrequency').onclick = function (event) {
627
628                    setTimeout(function () {
629                        let target = event.target; // where was the click?
630                        if (target.tagName !== 'LABEL') return;
631                        matchGA('Select Gift Period');
632                        otherInit();
633                    }, 200);
634
635                };
636
637            }
638
639            if (!!document.querySelector('.at-check.IsRecurring')) {
640                document.querySelector('.at-check.IsRecurring').addEventListener('click', (event) => {
641                    setTimeout(function () {
642                        let target = event.target; // where was the click?
643                        if (target.tagName !== 'INPUT') return;
644                        matchGA('Select Gift Period');
645                        otherInit();
646                    }, 200);
647                })
648            }
649
650            // Amount Button Click
651            if (!!document.querySelector('.at-fieldset.ContributionInformation')) {
652                document.querySelector('.at-fieldset.ContributionInformation').onclick = function (event) {
653                    setTimeout(function () {
654                        let target = event.target; // where was the click?
655                        if (target.tagName == "LABEL" && target.title.includes('$')) {
656                            matchGA('Select Preset Amount');
657                        }
658                    }, 200);
659                };
660            };
661
662            // Input Amount
663            function otherInit() {
664                if (!!document.querySelector('.label-otheramount')) {
665                    document.querySelector('.label-otheramount').addEventListener("focusout", (event) => matchGA("Input Amount"))
666                }
667                if (!!document.querySelector('.SuggestedAmount')) {
668                    document.querySelector('.SuggestedAmount').addEventListener("focusout", (event) => matchGA("Input Amount"))
669                }
670            }
671
672            otherInit();
673
674            // Covered Cost
675            if (!!document.querySelector('.CoverCostsAmount span')) {
676                document.querySelector('.CoverCostsAmount span').onclick = function () { matchGA('Select Cover C
676ost') };
677            }
678
679            // Tribute Gift Click
680            if (!!document.querySelector('.EnableTributeGift span')) {
681                document.querySelector('.EnableTributeGift span').onclick = function () { matchGA('Select Honorarium') };
682            }
683
684            // Tribute Field Focus Out
685            if (!!document.querySelector('.HonoreeName')) {
686                document.querySelector('.HonoreeName input').addEventListener("focusout", (event) => {
687                    if (document.querySelector('.HonoreeName input').value != '') {
688                        matchGA('Enter Honorarium Name');
689                    }
690                });
691            }
692
693            // Tribute Gift: Notify
694            if (!!document.querySelector('.IncludeRecipient span')) {
695                document.querySelector('.IncludeRecipient span').onclick = function () { matchGA('Select Notify Others Box') };
696            }
697
698            // Payment Method
699            if (!!document.querySelector('.at-payment-method-buttons')) {
700                document.querySelector('.at-payment-method-buttons').onclick = function (event) {
701
702                    setTimeout(function () {
703                        let target = event.target; // where was the click?
704                        let currentPay;
705                        if (target.classList.contains("at-paypal-button")) {
706                            currentPay = 'Paypal';
707                        } else if (target.getAttribute("for").includes('credit')) {
708                            currentPay = 'Credit Card';
709                        } else if (target.getAttribute("for").includes('eft')) {
710                            currentPay = 'Bank Account';
711                        }
712                        matchGA('Choose Payment Method', 'paymentMethod', currentPay);
713                    }, 200);
714
715                };
716            }
717
718            //
719
720            // Payment Method
721            if (!!document.querySelector('fieldset.ContactInformation')) {
722                document.querySelectorAll('fieldset.ContactInformation input').forEach((element) => {
723                    element.addEventListener('focusout', (event) => matchGA('Filled Form Field', 'formFieldName', element.title));
724                });
725            }
726
727            // Selected Gift Type
728            if (!!document.querySelector('#giving-tabs')) {
729                document.querySelector('.directed-tab').onclick = () => { matchGA('Selected Gift Type') };
730                document.querySelector('.nondirected-tab').onclick = () => { matchGA('Selected Gift Type') };
731            }
732
733            // FastAction
734            if (!!document.querySelector('.fa-cta')) {
735                // Fastaction
736                document.querySelector('.fa-cta').onclick = () => {
737                    matchGA('FastAction Click');
738                }
739            }
740
741            // Directed
742            if (!!document.querySelector('select[title="Organization"]')) {
743                document.querySelector('select[title="Organization"]').onchange = (event) => {
744                    matchGA('Choose Organization');
745                }
746            }
747
748            // DEV: Multi-step
749            if (document.querySelector('.at-steps')) {
750                document.querySelectorAll('.at-steps a').forEach((element) => {
751                    let thisElement = element;
752                    element.onclick = () => {
753                        matchGA('Multi Step Click', 'Multi Step Title: ', thisElement.firstElementChild.textContent);
754                    };
755                });
756            }
757
758            // UTIL 
759
760            function parseCommittee(committeeFullName) {
761                const params = new URLSearchParams(window.location.search);
762
763                // Helper: strip stray quotes and trim whitespace
764                const clean = (str) => str ? str.replace(/^["']|["']$/g, '').trim() : str;
765
766                const urlAffID = clean(params.get('affiliateID'));
767                const urlAffName = clean(params.get('affName'));
768
769                // If either URL param is present, use them and skip parsing
770                if (urlAffID || urlAffName) {
771                    affID = urlAffID || null;
772                    affName = urlAffName || null;
773                    return;
774                }
775
776                const value = committeeFullName;
777
778                // 5-digit numeric prefix: "20090-Planned Parenthood Advocates of Ohio"
779                const numericMatch = value.match(/^(\d{5})-(.+)$/);
780                if (numericMatch) {
781                    affID = numericMatch[1];
782                    affName = numericMatch[2].trim();
783                    return;
784                }
785                // "Gen" prefix: "GenAL-Alabama Generation Action"
786                const genMatch = value.match(/^Gen[^-]*-(.+)$/);
787                if (genMatch) {
788                    affName = genMatch[1].trim();
789                    return;
790                }
791                // "C3" or "C4" prefix: "C3_MD-Maryland Statewide C3 Committee"
792                const cMatch = value.match(/^C[34][^-]*-(.+)$/);
793                if (cMatch) {
794                    affName = cMatch[1].trim();
795                    return;
796                }
797                // Not an affiliate — leave affID and affName as null
798            }
799
800
801
802        }, 500);
803
804
805
806
807    }
808
809    var nvtag_callbacks = nvtag_callbacks || {};
810    nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
811    nvtag_callbacks.postRender.push(gaDonate);
812
813
814</script>
814
815
816<!-- EA requested that we use external CSS for the larger files -->
817<link href="https://nvlupin.blob.core.windows.net/images/van/AV/PPFA/1/11607/images/CSS/Reus_AFFNAT_defaultTheme.css" rel="stylesheet">
818<!--- Font Awesome Icon Library --->
819<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.1/css/all.min.css" rel="stylesheet" />
820
821<!-- EA conditionals do not work in external CSS files consistently-->
822<style type="text/css">
823                <!--- Ads Promo Hotfix --->
824        /* Apple Btn */
825.at-apple-pay-button-wrapper label, .at-apple-pay-button-wrapper:hover label,  .at .at-radio-set-buttons .at-apple-pay-button-wrapper > label:hover {
826background: #000 !important;
827}
828
829/* EFT Btn: */
830.at .at-radio-set-buttons .at-eft-button-wrapper > label {
831display: flex !important;
832align-items: center !important;
833justify-content: center !important;
834}
835
836/* Small only */
837/* Hotfix: Hide */
838@media screen and (max-width: 39.9375em) {
839.at-eft-button-wrapper label.at-btn-radio.large::after, [data-org-type="c3"] .at-btn-radio-wrapper.at-eft-button-wrapper::after, [data-theme-color="blue"] .at-btn-radio-wrapper.at-eft-button-wrapper::before {
840display: none !important;
841}
842}
843
844/* Hotfix 2 // EA "Secure Processing" Styles */
845
846.secure-processing-single-step-div {
847    position: relative;
848    float: none !important;
849    text-align: center !important;
850    }
851    
852    .authorize-payment-label {
853        margin-top: 10px !important;
854    }
855    
856/* Hotfix 3 - (5.24.24) "Re-displaying #TYAboutGift on donation pages"  #TYAboutGift {display: block !important;} */
857
858/* Hotfix 4 [08.02.24] - Gender/Sex Pref Labels Overlay */
859.at-select.Genders, .at-select.PreferredLanguages {
860    z-index: auto;
861}
862    
863</style>
864<!-- EA requested that we use external CSS for the larger files -->
865<link href="https://nvlupin.blob.core.windows.net/images/van/AV/PPFA/1/11607/images/CSS/Reus_1800EG_CustomTheme.css" rel="stylesheet">
866<!-- EA conditionals do not work in external CSS files consistently-->
867<style>
868
869@media (max-width: 58.6876em){
870    main header.at-markup p,main header.at-markup h3, nav.breadcrumbs{display:none;}
871    main header.at-markup p.earmarking{display:block;}
872    main header.at-markup .neverhide{display:block;}
873}
874@media (max-width: 48em){
875    .at label.label-gift-type, .at label.label-gift-amount{display:none;}
876}
877
878main fieldset.at-fieldset.AdditionalInformation legend{display:none;}   main .at.ngp-form .at-row label.label-amount {
879  margin:0 0 10px 10px;
880  width:calc(50% - 10px) !important;
881}
882
883@media (min-width: 480px){
884
885    main .at.ngp-form .at-row label.label-amount {width:calc(50% - 10px) !important;}
886  main .at.ngp-form .at-row label.label-amount.label-otheramount {width:calc(100% - 10px) !important;}
887
888}
889
890@media (min-width: 600px){
891main .at.ngp-form .at-row label.label-amount {width:calc(25% - 10px) !important;}
892  main .at.ngp-form .at-row label.label-amount.label-otheramount {width:calc(50% - 10px) !important;}
893}
894
895[data-org-type="c4"] .sticky-promo-wrap{display:none;}
896}
897
898<!--- AC3 Hotfix: Pink Find Health... Promo Color Fix --->
899[data-theme-color="pink"] a.button.has-cta-arrow {color: #ec008c !important;}
900[data-theme-color="pink"] a.has-cta-arrow.button {color: #ec008c !important;}
901
902       /* HF: 2203S22-28 - AFF Dropdown */
903
904/* Keeps race underneath the other two selects */
905label.Race {z-index: 23;}
906label.SexualOrientation, label.Genders {
907z-index: 25;
908}
909
910label.Race .select2-container--above + .select2-container--open {
911    top:61px !important;
912}
913
914/* --- 2204S25-02 - Custom Question Error Update--- */
915
916/* --- Restore Correct Color Multi-Dropdown Q Label */
917div .checkbox-list-label.at-red, [class*='CustomFormFieldQuestion'] .error [class*='CustomFormFieldQuestion'] label, .form-unit-radio.error > label {
918color: #c9084c !important;
919}
920
921/* --- Hide Default Custom Question Error --- */
922[class*='CustomFormFieldQuestion'] small.checkbox-list-required-text.at-red b,
923label[class*='CustomFormFieldQuestion'] .error,
924label[class*='CustomformfieldQuestion'] .error,
925label[class*='Customformfieldquestion'] .error,
926label[class*='customformfieldquestion'] .error,
927.form-unit-radio.error > small.error  {
928display: none !important;
929}
930
931/* --- Create New Default Error --- */
932[class*='CustomFormFieldQuestion'] small.checkbox-list-required-text.at-red::after, 
933[class*='CustomFormFieldQuestion'].error::after, 
934[class*='CustomformfieldQuestion'].error::after,
935label[class*='customformfieldquestion'].error::after,
936.form-unit-radio.error .radios::after  {
937    content: 'A response is required.';
938    display: block;
939    margin-bottom: 1rem;
940    font-size: .75rem;
941    font-weight: 500;
942    white-space: normal;
943    color: #c9084c !important;
944}
945
946/* Fix Checkbox Error Styling */
947[class*='CustomFormFieldQuestion'] label.at-check {
948    display: flex;
949    flex-direction: column;
950    align-items: baseline;
951}
952
953/* Except c4 membership question */
954[data-org-type="c4"] [id*="MappedSurveyQuestion_203938"].error .error {
955display: block !important;
956}
957
958
959/* Except c4 assoc membership */
960
961[data-org-type="c4"] [id*="MappedSurveyQuestion_203938"].error::after {
962content: '';
963}
964
965/* Select2 Dropdown re-override */
966.select2-container--open > span {
967    background-color: #fff !important;
968}
969
970/* ACH */
971
972.at-eft-button-wrapper label {
973padding: 0.5rem 1.3rem !important;
974    font-size: 13px !important;
975    max-width: 160px !important;
976    max-height: 55px !important;
977}
978
979/* Small only */
980@media screen and (max-width: 39.9375em) {
981.at-eft-button-wrapper label{
982padding: 1rem 1.3rem !important;
983    font-size: 15px !important;
984    max-height: 55px !important;
985    max-width: 100% !important;
986
987}
988}
989
990.PaymentMethod .at-radio-set-buttons {
991    flex-wrap: wrap;
992}
993
994
995/* ---- EA Page - Form Embed Tab Description Content ---- */
996/* Tab Descriptions: No Form Body Content */
997.page-content .ngp-form #giving-tabs-descriptions {
998width: 100%;
999}
1000
1001.page-content #giving-tabs-descriptions > p {
1002    display: block !important;
1003}
1004
1005
1006/* Tab Descriptions: Body Content Present */
1007@media screen and (min-width: 58.6876em){
1008.page-content .ngp-form .at-markup.HeaderHtml + #giving-tabs-descriptions {
1009float: right;
1010width: 51%;
1011}
1012}
1013
1014
1015/* Hotfix - Events Pages */
1016
1017.oa-event-list-results-container {
1018    padding: 0px 10px;
1019}
1020
1021.oa-event-result-container {
1022  background: #fff; /* or your card bg var */
1023  border: 0.5px solid rgba(0,0,0,0.12);
1024  border-radius: 12px;
1025  padding: 1.25rem;
1026  display: flex;
1027  flex-direction: column;
1028  gap: 10px;
1029  transition: border-color 0.15s;
1030}
1031.oa-event-result-container:hover {
1032  border-color: rgba(0,0,0,0.25);
1033}
1034
1035/* Event type badge — move above title via order */
1036.oa-event-result-type {
1037  font-size: 11px;
1038  font-weight: 500;
1039  text-transform: uppercase;
1040  letter-spacing: 0.06em;
1041  background: #FBEAF0;
1042  color: #72243E;
1043  padding: 3px 8px;
1044  border-radius: 4px;
1045  align-self: flex-start;
1046  order: -1;
1047}
1048
1049.oa-event-result-name-link {
1050  font-size: 22px;
1051  font-weight: 500;
1052  color: inherit;
1053  text-decoration: none;
1054  line-height: 1.4;
1055}
1056.oa-event-result-name-link:hover {
1057  color: #B52555;
1058  text-decoration: underline;
1059}
1060
1061.oa-event-result-datetime {
1062  display: flex;
1063  align-items: center;
1064  gap: 4px;
1065  font-size: 18px;
1066  font-weight: 500;
1067}
1068.oa-event-result-timezone {
1069  font-weight: 400;
1070  color: #888;
1071  font-size: 13px;
1072}
1073
1074.oa-event-result-location-container {
1075  display: flex;
1076  align-items: flex-start;
1077  gap: 5px;
1078  font-size: 13px;
1079  color: #666;
1080}
1081
1082/* CTA button */
1083.oa-event-result-signup-link {
1084  display: inline-block;
1085  background: #C2185B;
1086  color: #fff;
1087  font-size: 14px;
1088  font-weight: 500;
1089  padding: 8px 20px;
1090  border-radius: 8px;
1091  text-decoration: none;
1092  transition: background 0.15s, transform 0.1s;
1093}
1094
1095a.oa-event-result-signup-link {
1096    color: #fff !important;
1097    background: #d7007f;
1098    border-radius: 25px;
1099    margin-top: 10px;
1100}
1101
1102[data-org-type="c3"] a.oa-event-result-signup-link {
1103    background: #0199da;
1104}
1105
1106.oa-event-result-signup-link:hover { cursor: pointer; }
1107.oa-event-result-signup-link:active { transform: scale(0.98); }
1108
1109
1110</style>
1111<!-- temporary repeat -->
1112<link href="https://fonts.googleapis.com/css?family=Caveat+Brush" rel="stylesheet">
1113
1114<style>
1115
1116main .SelectAmount .at-radio{margin:0 0 0 0;}
1117
1118    /*
1119    MappedCustomFormFieldQuestion_39 = Affiliate Code
1120    MappedCustomFormFieldQuestion_40 = Affiliate Percentage
1121    MappedCustomFormFieldQuestion_42 = Credit Account
1122    MappedCustomFormFieldQuestion_44 = Google Analytics clientId
1123    MappedCustomFormFieldQuestion_46 = Market Source / SalesForce Code
1124    */
1125    main .at-recurring.toggle-enabled,main fieldset.at-fieldset.AdditionalInformation legend,
1126    main fieldset.at-fieldset .at-row[class*="MappedCustomFormFieldQuestion_39"],
1127    main fieldset.at-fieldset .at-row[class*="MappedCustomFormFieldQuestion_40"],
1128    main fieldset.at-fieldset .at-row[class*="MappedCustomFormFieldQuestion_42"],
1129    main fieldset.at-fieldset .at-row[class*="MappedCustomFormFieldQuestion_44"],
1130    main fieldset.at-fieldset .at-row[class*="MappedCustomFormFieldQuestion_46"]{display:none!important;}
1131div.nudgeCopy{display:none;}
1132main .at .at-fieldset.TributeGift,
1133main .multistep-layout fieldset.TributeGift {display: none;}
1134
1135main .contribute-links-block span.radio-button-text {
1136  line-height:25px;
1137  color:#191919;
1138  font-family: "Avenir Next W01",Helvetica,Arial,sans-serif;
1139}
1140
1141
1142/*main .contribute-links-block span {
1143    display: block;
1144    float: left;
1145    height: 25px;
1146}*/
1147
1148main p.form-label {
1149    clear: both;
1150    font-size: 1em;
1151    padding: 0 10px;
1152    margin: 0;
1153}
1154
1155
1156main .contribute-links-block {
1157  margin: 10px 0 20px 0;
1158    padding: 0 10px;
1159    height:25px;
1160}
1161main .form-type-radios.form-item-selectamount{
1162    margin-top:10px;
1163}
1164
1165main .contribute-links-block a.contribute-links {
1166  display:block;
1167  float:left;
1168  height:25px;
1169  line-height:25px;
1170  vertical-align:middle;
1171}
1172
1173main .contribute-links-block span {
1174  display:block;
1175  float:left;
1176  height:25px;
1177}
1178
1179main .contribute-links-block span.radio-button-display {
1180  background-color:#fff;
1181  border-radius:20px;
1182  display:block;
1183  width:25px;
1184  height:25px;
1185  border:2px solid #ddd;
1186  margin:0 5px 0 0;  
1187}
1188
1189main .contribute-links-block span.radio-button-display:hover{background-color:#f1f1f1;}
1190
1191[data-theme-color="blue"] main .contribute-links-block .active span.radio-button-display {
1192  background-color:#192b6c;
1193  border-color:#192b6c;
1194}
1195[data-theme-color="pink"] main .contribute-links-block .active span.radio-button-display {
1196  background-color:#00286E;
1197  border-color:#00286E;
1198}
1199
1200main .onetime span.radio-button-display {margin-left:15px;}
1201
1202main .at .at-step.valid .recurring-step-title {
1203    padding-left: 25px;
1204    background-image: url(https://nvlupin.blob.core.windows.net/images/van/AV/PPFA/1/11607/images/Themes/Evergreen/Web/Icons/Recurring_MultiStep.png);
1205    background-repeat: no-repeat;
1206    background-position: left;
1207    background-size: 16px;
1208}
1209main .at .at-step.valid.active .recurring-step-title {
1210    background-image: none;
1211    padding-left: 0;
1212}
1213    
1214    
1215main .at.multistep-layout button.submitStep,
1216main .at.multistep-layout a.nextStep.btn-at{margin-bottom:0;}
1217
1218main .at-checkbox-title,
1219main .at-cover-costs-info {
1220    color: #191919;
1221}
1222
1223@media only screen and (max-width: 40em) {
1224	main .at .at-radio-set-buttons .at-btn-radio-wrapper label.at-btn-radio {
1225    		width: 100%;
1226	}
1227	main .at .ContributionInformation .label-otheramount.error small.error {
1228        	white-space: normal;
1229    	}
1230}
1231
1232main .at .at-radio-set-buttons .at-btn-radio-wrapper label.at-btn-radio.large,
1233main .at .at-radio-set-buttons .at-btn-radio-wrapper label.at-btn-radio.small {
1234    	min-width: 10em;
1235	min-height: 55px;
1236	padding: 1rem 1.3rem;
1237}
1238
1239main .at .at-radio-set-buttons .at-btn-radio-wrapper label.at-btn-radio,
1240main .at .at-radio-set-buttons .at-btn-radio-wrapper .at-paypal-button,
1241main .at .at-radio-set-buttons .at-btn-radio-wrapper .at-apple-pay-button {
1242    	min-width: 10em;
1243	min-height: 55px;
1244	padding: 1rem 1.3rem;
1245	background-color: #fff;
1246	border-color: #191919;
1247	color: #191919;
1248	border-radius: 32px;
1249	border-width: 2px;
1250	font-family: "Avenir Next W01",Helvetica,Arial,sans-serif;
1251	font-weight: 800;
1252	text-transform: uppercase;
1253	font-style: normal;
1254	font-size: 1rem;
1255	line-height: 1rem;
1256	cursor: pointer;
1257}
1258
1259
1260/* --- Frequency Toggle Styles START --- */
1261
1262.form-item-selectedfrequency label input {
1263width: 1.6em;
1264    margin-right: 1px;
1265    border: none;
1266    height: 0px;
1267    left: 0;
1268    margin-right: 3px !important;
1269position: absolute;
1270}
1271
1272.form-item-selectedfrequency input::before {
1273    content: "";
1274    height: 1.6em;
1275    width: 1.6em;
1276    display: block;
1277    z-index: 1;
1278    top: 0;
1279    cursor: pointer;
1280    left: 0;
1281    border: solid 2px#cccccc;
1282    border-radius: 50%;
1283position: absolute;
1284background: #fff;
1285left: -2px;
1286}
1287
1288.form-item-selectedfrequency .radios label  {
1289margin-left: 0px !important;
1290    padding-left: 28px;
1291}
1292
1293.form-item-selectedfrequency input:checked::before {
1294    background: #192b6c;
1295    border: solid 2px #192b6c;
1296}
1297
1298.form-item-selectedfrequency {
1299margin-top: 15px;
1300}
1301
1302@-moz-document url-prefix() {
1303        .form-item-selectedfrequency input {
1304            height: 24px !important;
1305        }
1306
1307    }
1308
1309/* --- Frequency Toggle Styles END --- */
1310
1311/*   ---   Radio Button Expansion ( ReFORM P1 ) ---   */
1312.radio-description  {
1313    margin-top: 10px;
1314}
1315    
1316.form-item-selectedfrequency .radios label {
1317    padding: 5px 10px 5px 25px !important;
1318}
1319
1320/* Centered Payment Buttons */
1321.at-payment-method-buttons .at-radio-set-buttons {
1322    justify-content: center !important;
1323    }
1324
1325
1326/* --- Premium Selection --- */
1327
1328main .at .at-gift input[type="radio"]:checked + div.description .gift-description-text,
1329main .at .at-gift input[type="radio"]:checked + div.description .gift-title {
1330    font-weight: bold;
1331    color: #010101;
1332}
1333
1334.site-logo a {
1335    width: 100%;
1336}
1337
1338/* --- AFF Language (tab description) > 2 Line edit  --- */
1339/* Medium and up */@media screen and (min-width: 40em)  {
1340    .nondirected-tab-description, .directed-tab-description {font-size: .85em;}
1341}@media screen and (min-width: 920px) and (max-width: 1025px) { .nondirected-tab-description, .directed-tab-description {font-size: .7em;} }
1342
1343</style>
1344
1345<script nonce="744a3226-3f25-411c-9500-973157837f5a">
1346let tributeCheck = () => {
1347$('.at-fieldset.TributeGift').attr('style', 'display: none');
1348}
1349
1350 var nvtag_callbacks = nvtag_callbacks || {};
1351    nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
1352    nvtag_callbacks.postRender.push(tributeCheck);
1353
1354
1355</script>
1355
1356
1357
1358<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js" nonce="744a3226-3f25-411c-9500-973157837f5a"></script>
vendor: 2 bytes, line 1358
1358
1359<script nonce="744a3226-3f25-411c-9500-973157837f5a">
1360    $( document ).ready(function() {
1361        $( "body" ).attr( "data-theme-color", "pink" );
1362        $( "body" ).attr( "data-affiliate", "no" );
1363        $( "body" ).attr( "data-org-type", "c4" );
1364    });
1365</script>
1365
1366<style type="text/css">
1367label[class*='_MappedSurveyQuestion_203938'] > small { display: none; }
1368#LegislatorLookupSubmit {min-width: 100%;}
1369</style>
1370<script nonce="744a3226-3f25-411c-9500-973157837f5a">
1371    
1372    // MASTER - OnRender
1373    // Used to signal EA Form Render for 3d party apps
1374    
1375    let renderReady = () => {
1376        window.renderReady = true;
1377        
1378        // Scan EA's default form dataLayer for info, then add them to global scoped variables so other functions can use them.
1379        window.basicFormData = '';
1380        
1381        dataLayer.forEach(element => {
1382            for (const property in element) {
1383
1384                // Get the form type data
1385                if (property && property == "eventAction") {
1386                    if (element[property] == 'Form Load') {
1387                        window.basicFormData = element.eventCategory;
1388                    }
1389                }
1390
1391            }
1392        });
1393        
1394        
1395        
1396    }
1397
1398    var nvtag_callbacks = nvtag_callbacks || {};
1399    nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
1400    nvtag_callbacks.postRender.push(renderReady);
1401    
1402    
1403    
1404</script>
1404
1405
1406
1407<!--carry strings incl multistep advocacy protection-->
1408<script nonce="744a3226-3f25-411c-9500-973157837f5a">
1409    var submitPreSegue = function(args) {
1410        console.log('submit pre segue called!');
1411                if (args.formdef.confirmation) {
1412            if (args.formdef.confirmation.action == 'ExternalPage') {
1413                var currentQs = window.location.search;
1414                
1415
1416                newRedirect = args.formdef.confirmation.redirect_url + currentQs;
1417
1418
1419
1420                console.log(newRedirect);
1421                args.formdef.confirmation.redirect_url = newRedirect;
1422                // debugger;
1423            }
1424        }
1425 
1426        return args;
1427    }
1428 
1429 
1430 
1431    var submitSegue = function(args) {
1432 
1433 
1434 
1435        console.log('submit segue called!');
1436                return args;
1437    }
1438 
1439 
1440    var nvtag_callbacks = nvtag_callbacks || {};
1441    nvtag_callbacks.preSegue = nvtag_callbacks.preSegue || [];
1442    nvtag_callbacks.preSegue.push(submitPreSegue);
1443 
1444    var nvtag_callbacks = nvtag_callbacks || {};
1445    nvtag_callbacks.segue = nvtag_callbacks.segue || [];
1446    nvtag_callbacks.segue.push(submitSegue);
1447</script>
1447
1448 
1448<script nonce="744a3226-3f25-411c-9500-973157837f5a"> 
1449 
1450var myPostRender = function(args) {
1451  (function ($) {
1452      
1453// hide unnecessary checkbox for forms that require email opt-in
1454 
1455if (($('.YesSignMeUpForUpdatesForBinder input[name=YesSignMeUpForUpdatesForBinder]:required').length) && ($('.YesSignMeUpForUpdatesForBinder input[name=YesSignMeUpForUpdatesForBinder]:checked').length)){
1456    
1457$(".YesSignMeUpForUpdatesForBinder input[name=YesSignMeUpForUpdatesForBinder]").parent('label').addClass('YesSignMeUpForUpdatesForBinder-hidden');
1458$(".YesSignMeUpForUpdatesForBinder label span").addClass('at-legal');
1459$('.YesSignMeUpForUpdatesForBinder label span').css( 'cursor', 'initial' );
1460    $(".YesSignMeUpForUpdatesForBinder label span").click(function( e ) {
1461  e.preventDefault();
1462    });
1463    
1464            $(".YesSignMeUpForUpdatesForBinder label").click(function( e ) {
1465            e.preventDefault();
1466            });
1467 
1468}
1469 
1470//if (($('.SmsSubscribeMobilePhone input[name=SmsSubscribeMobilePhone]:required').length) && ($('.SmsSubscribeMobilePhone input[name=SmsSubscribeMobilePhone]:checked').length)){
1471 
1472//$(".SmsSubscribeMobilePhone").addClass('SmsSubscribeMobilePhone-hidden');
1473//$(".SmsLegalDisclaimer").removeClass('at-indented');
1474 
1475//}
1476 
1477// add social share copy to thank you pages
1478if (($('.content.thankYou').length) && ($('#TYSocialShare_container').length)){
1479  
1480  var $shareDiv = $('#TYSocialShare_container').clone();
1481  $('.content.thankYou .contributions').append($shareDiv);
1482  $('#TYSocialShare_original').remove();
1483  
1484}
1485 
1486 
1487  }(jQuery));
1488  // 
1489  return args;
1490};
1491 
1492 
1493jQuery(document).ready(function ($) {
1494 
1495if ($('.oa-elected-officials-container').length) {
1496  
1497  $( ".site-main" ).wrapInner( "<div class='ngp-form at electedOfficials'></div>");
1498 
1499}
1500 
1501 
1502 
1503 
1504    
1505 
1506    });
1507    
1508 
1509 
1510 
1511var nvtag_callbacks = nvtag_callbacks || {};
1512nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
1513nvtag_callbacks.postRender.push(myPostRender);
1514 
1515</script>
1515
1516 
1517<script nonce="744a3226-3f25-411c-9500-973157837f5a">
1518 
1519// Repurpse "Yes"/"No" Drop Down Questions as Checkboxes until Checkboxes become available in EA
1520// Due to A/B test results, Ass. Membership is excluded from this customization. Ass. Membership will only appear as a drop-down, never a check
1521var myPostRender = function(args) {
1522  (function ($) {
1523      
1524    var mappedQ = ('.at-fieldset.AdditionalInformation div.at-row[class*=_MappedSurveyQuestion_]:not([class*=_MappedSurveyQuestion_203938])');
1525    
1526    // Does this form have a mapped survey question?
1527    if (($(mappedQ ).length)){
1528    // Prevent Advocacy Forms from running script twice
1529    if ($('.MappedSurveyQuestion_Created').length){
1530    }
1531    else{
1532        
1533        i=0;
1534        
1535        $('.at-fieldset.AdditionalInformation div.at-row[class*=_MappedSurveyQuestion_]:not([class*=_MappedSurveyQuestion_203938])').each(function() {
1536        
1537            i++;
1538            
1539            var mappedText = $( this ).find( 'select' ).attr('title');
1540            var mappedTrue = $( this ).find( 'select option:contains("Yes")' );
1541            var mappedFalse = $( this ).find( 'select option:contains("No")' );
1542            
1543            if (($( this ).find( 'select' ).children().length >= 2) && (mappedTrue.length) && (mappedFalse.length)){
1544                
1545                $( this ).addClass('MappedSurveyQuestion_' + i);
1546                $( this ).hide();
1547                //create checkbox
1548                $( this ).before('<div class="at-row at-row-solo at-row-full MappedSurveyQuestion_Created MappedSurveyQuestion_Created_' + i + '"><div class="at-markup "><label style="display:inline;"><input type="checkbox" name=""><span class="text">' + mappedText + '</span></label></div></div>');
1549                
1550            }
1551            if (($( this ).find(":selected").text()) == "Yes"){
1552            
1553                //preselect
1554                $('.MappedSurveyQuestion_Created_' + i + ' input[type=checkbox]').attr('checked', true);
1555            
1556            }
1557    
1558        });
1559    
1560        $('.MappedSurveyQuestion_Created input').on('change', function() {
1561            
1562            var num = $(this).closest('.at-row').attr('class').match(/\d+$/)[0];
1563            var valueYes = $('.MappedSurveyQuestion_'+num + ' select option:contains("Yes")').val();
1564            
1565            if ($(this).is(':checked')) {
1566                $('.MappedSurveyQuestion_'+num + ' select').val(valueYes);
1567            }
1568            else{
1569                $('.MappedSurveyQuestion_'+num + ' select').val(''); 
1570            }
1571            
1572        });
1573    }
1574    }
1575  }(jQuery));
1576  return args;
1577};
1578 
1579 
1580var nvtag_callbacks = nvtag_callbacks || {};
1581nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
1582nvtag_callbacks.postRender.push(myPostRender);
1583 
1584</script>
1584
1585
1586<!--- ADD ON SCRIPTS --->
1587<!--- 1. PROD + "defaultEA" --->
1588<!--- 1. E-Card // Insert tettra ID or shortlink --->
1589<script nonce="744a3226-3f25-411c-9500-973157837f5a">
1590
1591    // EA Callback: Init
1592    var ecardValidation = () => {
1593
1594        let giftSection = document.querySelector('.TributeGift');
1595        if (!giftSection) { return; }
1596
1597        /*   ---   ---   Honoree Name Validation [START]   ---   ---   */
1598
1599        // Grab Honoree Fields
1600        const honoreeContainer = document.querySelector('.at-tribute-gift .HonoreeName');
1601        const honoreeField = document.querySelector('.at-tribute-gift .HonoreeName input');
1602        const firstNameField = document.querySelector('label.RecipientFirstName input');
1603        const lastNameField = document.querySelector('label.RecipientLastName input');
1604
1605        /*  -- CALL: When words are bad... --   */
1606
1607        const cleanBadWord = () => {
1608            // Empty field to trigger default EA error
1609            honoreeField.value = "";
1610            // Change default EA error to badword error
1611            setTimeout(() => {
1612                let honoreeError = document.querySelector('.at-tribute-gift .HonoreeName .error');
1613                honoreeError.innerHTML = 'Appropriate Honoree Name is required.';
1614            }, 020)
1615        };
1616
1617        const cleanBadFirstName = () => {
1618            // Empty field to trigger default EA error
1619            firstNameField.value = "";
1620            // Change default EA error to badword error
1621            setTimeout(() => {
1622                let firstNameError = document.querySelector('label.RecipientFirstName .error');
1623                firstNameError.innerHTML = 'Appropriate First Name is required.';
1624            }, 020)
1625        };
1626
1627        const cleanBadLastName = () => {
1628            // Empty field to trigger default EA error
1629            lastNameField.value = "";
1630            // Change default EA error to badword error
1631            setTimeout(() => {
1632                let lastNameError = document.querySelector('label.RecipientLastName .error');
1633                lastNameError.innerHTML = 'Appropriate Last Name is required.';
1634            }, 020)
1635        };
1636
1637        /*  --  Get our list of badwords...  --  */
1638
1639        fetch('https://cdn.jsdelivr.net/npm/[email protected]/badwords.json')
1640            .then(response => response.json())
1641            .then(data => {
1642
1643                // CALL: Check if words are bad
1644                let isProfane = (string, cleanFunction) => {
1645
1646                    // Exceptions!
1647                    let excepted = data.badwords.splice(9, 1);
1648
1649                    let badwords = data.badwords;
1650
1651                    // Does the value match a word from the list?
1652                    const badWordFilter = (word) => {
1653
1654                        // Exceptions go here:
1655                        let exceptions = ['ass', 'hell', 'Dick', 'dick'];
1656                        let exceptedCheck = false;
1657
1658                        exceptions.forEach((element) => {
1659                            if (word.toLowerCase().includes(element)) {
1660                                exceptedCheck = true;
1661                            }
1662                        });
1663
1664
1665
1666                        if (exceptedCheck) { return false } else {
1667                            return badwords.filter((word) => {
1668                                const wordExp = new RegExp(`\\b${word.replace(/(\W)/g, '\\$1')}\\b`, 'gi');
1669                                // return badwords.includes(string.toLowerCase()) && wordExp.test(string);
1670                                return badwords.some(word => string.toLowerCase().includes(word));
1671                            }).length > 0 || false;
1672                        }
1673
1674                    }
1675
1676                    // If so, clean it!
1677                    badWordFilter(string) ? cleanFunction() : null;
1678
1679                };
1680
1681                /* --  Check for profanity when honoree name is changed  --  */
1682                honoreeField.addEventListener('change', (event) => {
1683                    isProfane(honoreeField.value, cleanBadWord);
1684                });
1685
1686                firstNameField.addEventListener('change', (event) => {
1687                    isProfane(firstNameField.value, cleanBadFirstName);
1688                });
1689
1690                lastNameField.addEventListener('change', (event) => {
1691                    isProfane(lastNameField.value, cleanBadLastName);
1692                });
1693
1694            })
1695            .catch(error => console.log(error));
1696
1697        /*   ---   ---   Honoree Name Validation [END]   ---   ---   */
1698
1699
1700        /*   ---   ---   Recipient Gov Email Validation [START]   ---   ---   */
1701
1702        let honoreeEmail = document.querySelector('.RecipientEmailAddress input');
1703
1704        if (honoreeEmail) {
1705
1706            let govCheck = (string) => {
1707                if (string.endsWith('.gov')) {
1708                    honoreeEmail.value = '';
1709                    setTimeout(() => {
1710                        let govErrorMsg = document.createElement('small');
1711                        govErrorMsg.classList.add('error');
1712                        govErrorMsg.innerHTML = 'Government emails are not allowed.';
1713                        document.querySelector('label.RecipientEmailAddress').classList.add('error');
1714                        document.querySelector('label.RecipientEmailAddress').append(govErrorMsg);
1715                    }, 050);
1716                }
1717            };
1718
1719            honoreeEmail.addEventListener('change', (event) => {
1720                govCheck(honoreeEmail.value)
1721            });
1722
1723        };
1724
1725
1726
1727        /*   ---   ---   Recipient Gov Email Validation [END]   ---   ---   */
1728
1729    };
1730
1731
1732    /*   ---   ---   Empty Email Validation [START]   ---   ---   */
1733
1734    var emailReq = () => {
1735
1736        let giftSection = document.querySelector('.TributeGift');
1737        if (!giftSection) { return; }
1738
1739        // Grab Submit Button
1740
1741        let submitBtn = document.querySelector('.at-form-submit input.at-submit');
1742
1743        if (!!submitBtn) {
1744
1745            submitBtn.addEventListener("click", function (event) {
1746                let emailField = document.querySelector('.RecipientEmailAddress input');
1747                // If Tribute section is active:
1748                if (document.querySelector('input[name="IncludeRecipient"]').checked && document.querySelector('#email').checked) {
1749                    // If email field is empty
1750                    if (emailField.value.length == 0) {
1751                        event.preventDefault();
1752                        // Create 'Fake EA error'
1753                        document.querySelector('label.RecipientEmailAddress').classList.add('error');
1754                        let emailErrorMsg = document.createElement('small');
1755                        let currentEmailError = document.querySelector('.RecipientEmailAddress small.error');
1756                        if (!currentEmailError) {
1757                            emailErrorMsg.classList.add('error');
1758                            emailErrorMsg.innerHTML = 'Recipient Email is required.';
1759                            document.querySelector('label.RecipientEmailAddress ').append(emailErrorMsg);
1760                        }
1761
1762                        document.querySelector('.RecipientEmailAddress.error').scrollIntoView();
1763
1764                    }
1765
1766                }
1767            });
1768
1769        }
1770
1771
1772    }
1773
1774    nvtag_callbacks.postRender.push(emailReq);
1775
1776    /*   ---   ---   Empty Email Validation [START]   ---   ---   */
1777
1778
1779    // 
1780
1781    nvtag_callbacks.postRender.push(ecardValidation);
1782
1783
1784
1785</script>
1785
1786<!--- Font Awesome Icon Library --->
1787<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.1/css/all.min.css" rel="stylesheet" />
1788
1789<!--- CSS Styles  --->
1790
1791<style type="text/css">
1792
1793/* Default Styles (Allows smooth visual transitions for hiding elements =) */
1794
1795    #preview-modal-content .text {
1796        padding-top: 0px;
1797        padding-bottom: 0px;
1798    }
1799
1800    #preview-modal .at-preview-markup h1 {
1801        display: none !important;
1802    }
1803
1804    #preview-footer-content a.close-button {
1805        font-size: 1rem;
1806    }
1807
1808    .IHO-card, .IMO-card {
1809        transition: .3s ease all;
1810        overflow: hidden;
1811        opacity: 1;
1812    }
1813    
1814    .card-hidden {
1815        height: 0px !important;
1816        width: 0px !important;
1817        opacity: 0 !important;
1818    }
1819    
1820    
1821    .ac-collapse {
1822        height: 0px !important;
1823        opacity: 0;
1824    }
1825    
1826    .mail-tile i, .email-tile i, .basic-info {
1827        transition: .3s ease all;
1828        overflow: hidden;
1829    }
1830    
1831    /* Hides custom messages from the user & hides the "optional" field labels */
1832    .NotificationMessage, .at-recipient-info label small {
1833        display: none !important;
1834    }
1835
1836        /* Override: Allows error messages to display */
1837    .at-recipient-info label small.error {
1838        display: block !important;
1839    }
1840    
1841    /*   ---   ---   AC3 - Version 2 (Extra Styling)   ---   ---    */
1842    
1843    .mail-checks {
1844        visibility: hidden;
1845        margin-bottom: 10px;
1846        max-height: 0px !important;
1847        overflow: hidden;
1848        margin: 0;
1849    }
1850    
1851    .at-recipient-info .mail-checks {
1852        visibility: visible !important;
1853        max-height: 1000px !important;
1854        margin-top: 10px;
1855    }
1856    
1857    .form-item-inhonororinmemoryof .radios {
1858        margin-bottom: .3em;
1859    }
1860    
1861    .email-container, .mail-container {
1862        width: 49%;
1863    }
1864    
1865    /* Icon Tile Styles */
1866    
1867    .mail-tile, .email-tile {
1868        text-align: center;
1869        border: 1px solid #b0b0b0;
1870        padding: 15px 28px;
1871        border-radius: 10px;
1872        overflow: hidden;
1873        transition: .3s ease all;
1874        opacity: .9;
1875    }
1876    
1877    .deliv {
1878        text-align: center;
1879        font-size: .85em;
1880        color: #757575;
1881        margin-top: 5px;
1882    }
1883    
1884    .mail-tile:hover, .email-tile:hover, .at-ecard:hover {
1885        -webkit-box-shadow: 0px 0px 17px 0px rgba(40,149,214,1);
1886        -moz-box-shadow: 0px 0px 17px 0px rgba(40,149,214,1);
1887        box-shadow: 0px 0px 17px 0px rgba(40,149,214,1);
1888    }
1889    
1890    i.fa-2x {
1891        opacity: .7;
1892    }
1893    
1894    .mail-tile:hover i, .email-tile:hover i {
1895        font-size: 2.2em;
1896    }
1897    
1898    .mail-tile.clicked, .email-tile.clicked {
1899        border: solid 3px #2895d6;
1900        opacity: 1;
1901        background: rgba(40, 149, 214, .1);
1902    }
1903    
1904    .mail-tile.clicked i, .email-tile.clicked i {
1905        color: #2895d6 !important;
1906        opacity: 1;
1907    }
1908    
1909    .at-preview-ecard {
1910        width: 100%;
1911    }
1912    
1913    .ecard-section .at-title {
1914        font-weight: bold;
1915        margin-bottom: 15px;
1916    }
1917    
1918    /*  Preview Modal  */
1919    
1920    #preview-modal-content .text {
1921        padding-top: 0px;
1922        padding-bottom: 0px;
1923    }
1924    #preview-footer-content a.close-button {
1925        font-size: 1rem;
1926    }
1927
1928    #preview-modal .close-button {display: none !important;}
1929
1930    .mail-checks::after {
1931    content: 'At least one delivery method is required.';
1932    padding-left: 12px;
1933    display: block;
1934    padding: 0.375rem;
1935    margin-bottom: 1rem;
1936    font-size: .75rem;
1937    font-weight: 500;
1938    font-style: normal;
1939    white-space: normal;
1940    text-align: left;
1941    clear: both;
1942    background: transparent;
1943    color: #c9084c;
1944    transition: ease .3s;
1945    opacity: 0;
1946    overflow: hidden;
1947    max-height: 0px;
1948    }
1949    
1950.mail-checks.errored::after {
1951    opacity: 1;
1952    max-height: 100px;
1953}
1954
1955    /* Mobile */
1956    
1957    @media screen and (max-width: 39.9375em) {
1958    
1959        .email-container, .mail-container {
1960            width: 100%;
1961        }
1962    
1963        .mail-checks {
1964            margin-top: 15px;
1965        }
1966    
1967        .mail-container, .email-conatiner {
1968            margin-top: 35px;
1969        }
1970    
1971    }
1972
1973    </style>
1974
1975
1976    
1976<script type="text/javascript" nonce="744a3226-3f25-411c-9500-973157837f5a">
1977    
1978        var ecardUpdate = function() {
1979
1980            let ecardSection = document.querySelector('.form-item-ecard');
1981            let eCardMessage = document.querySelector('textarea[name="NotificationMessage"]');
1982            if (!ecardSection) {return;}
1983            if (!eCardMessage) {console.log('DFSE: Enable E-Card Recipient Message!'); return;}
1984
1985            /*     *     *     *     *
1986        
1987            [A. ] PREPARATIONS & COMPONENTS
1988    
1989            *     *     *     *     */
1990    
1991            // * --   ---    IMO vs IHO start   ---   ---    *
1992    
1993            // Adds classes to ecards based on how they're tagged, allows them to be hidden
1994            $( "img[src*='ecard-iho-msg']" ).parents(".at-ecard").addClass("IHO-card");
1995            $( "img[src*='ecard-imo-msg']" ).parents(".at-ecard").addClass("IMO-card");
1996    
1997            // Adds incremental classes for each E Card
1998            var ihoCount = 1;
1999            $( "img[src*='ecard-iho-msg-']").each(function() {
2000                $(this).parents(".at-ecard").addClass("iho-msg-"+ihoCount);
2001                ihoCount++;
2002            });
2003    
2004            var imoCount = 1;
2005            $( "img[src*='ecard-imo-msg-']").each(function() {
2006                $(this).parents(".at-ecard").addClass("imo-msg-"+imoCount);
2007                imoCount++;
2008            });
2009    
2010    
2011            // IMO vs IHO toggle. Hides the opposite cards
2012            var honorToggle = () => {
2013                if ($('.form-item-inhonororinmemoryof input[value="1"]').prop("checked")) {
2014                    $(".IHO-card").addClass("card-hidden"); $(".IMO-card").removeClass("card-hidden");
2015                    // Selects the first card
2016                    // $(".imo-msg-1 input").prop("checked", true); $(".imo-msg-1").addClass("selected");
2017                    $(".imo-msg-1 input").click();
2018                } else if ($('.form-item-inhonororinmemoryof input[value="2"]').prop("checked")) {
2019                    $(".IMO-card").addClass("card-hidden"); $(".IHO-card").removeClass("card-hidden");
2020                    // Selects the first card
2021                    // $(".iho-msg-1 input").prop("checked", true); $(".iho-msg-1").addClass("selected");
2022                    $(".iho-msg-1 input").click();
2023                }
2024            };
2025    
2026            // *   ---   ---    IMO vs IHO end   ---   ---   *
2027    
2028            // *    ---   ---   PHYSICAL vs EMAIL start    ---   ---   *
2029    
2030            // Adds unique class to basic info (Delivery Descriptions, FirstName + Lastname)
2031            $(".at-recipient-info .at-title").addClass("basic-info"); $(".RecipientInfoHeaderHtml").addClass("basic-info");
2032            $(".RecipientFirstName.RecipientLastName").addClass("basic-info");
2033    
2034            // Adds unique class to ecard section
2035            $(".at-ecards").parents(".at-row").addClass("ecard-section");
2036    
2037            // Adds single class to Physical Mail and E Mail fields
2038            $(".RecipientStreetAddress").addClass("mail"); $(".RecipientCountry").addClass("mail");
2039            $(".RecipientEmailAddress").addClass("e-mail"); $(".ecard-section").addClass("e-mail");
2040    
2041            // Hide Basic Info(First Name, Last Name, & Delivery Description) if neither are selected
2042            var neitherCheck = () => {
2043                if ((!$("#mail").is(':checked')) && (!$("#email").is(':checked'))) {
2044                    $(".basic-info").addClass("ac-collapse");
2045                } else {
2046                    $(".basic-info").removeClass("ac-collapse");
2047                }
2048            };
2049            
2050            // Set strings for the mail description statement
2051            var mailInfo = "We will send a card in the mail to the address you provide below.";
2052            var emailInfo = "We will send an email notification to the email address you provide below. We are unable to send anonymous notifications — the recipient will see your name and email address.";
2053            var bothInfo = "We will send both a physical card in the mail and an email notification to the addresses you provide below. We are unable to send anonymous notifications — the recipient will see your name and email address. Please note mailed cards do not contain the e-card design.";
2054            
2055            // Grabs the paragraph tag for the description and uses our new default mailInfo
2056            var infoCon = $(".RecipientInfoHeaderHtml p");
2057            
2058
2059            $(".RecipientInfoHeaderHtml p:empty").remove();
2060            $(infoCon).text(emailInfo);
2061    
2062            // Mail Checkbox Toggle 
2063            var mailToggle =  (event) => {
2064
2065                // Prevent both checkbox unchecked
2066                if (!$('#email').is(':checked')) {
2067                    $('#mail').prop('checked', true);
2068                    document.querySelector('.mail-checks').classList.add('errored');
2069                    setTimeout(function() {document.querySelector('.mail-checks').classList.remove('errored')}, 2000);
2070                }
2071
2072                // If this is now checked, show the mail fields
2073                if ($('#mail').is(':checked')) {
2074                    $('.mail').show();
2075                    
2076                    // Stylize
2077                    $('#mail').parents(".mail-tile").addClass("clicked");
2078                    $('#mail').siblings("i").removeClass("far").addClass("fas");
2079    
2080                     // Is email also checked? Show  bothInfo, other just show mail
2081                     $('#email').is(':checked') ? $(infoCon).text(bothInfo) : $(infoCon).text(mailInfo);
2082                    
2083                }
2084    
2085                // (otherwise, uncheck it and hide the mail fields)
2086                else {
2087                    $('.mail').hide();
2088    
2089                    // Stylize
2090                    $('#mail').parents(".mail-tile").removeClass("clicked");
2091                    $('#mail').siblings("i").removeClass("fas").addClass("far");
2092    
2093                    // Description now becomes emailInfo
2094                    $(infoCon).text(emailInfo);
2095                }
2096    
2097                // Hide basic info if neither are checked
2098                neitherCheck();
2099            };
2100    
2101            // Email Checkbox Toggle
2102            var emailToggle =  (event) => {
2103
2104                // Prevent both checkbox unchecked
2105                if (!$('#mail').is(':checked')) {
2106                    $('#email').prop('checked', true);
2107                    document.querySelector('.mail-checks').classList.add('errored');
2108                    setTimeout(function() {document.querySelector('.mail-checks').classList.remove('errored')}, 2000);
2109                }
2110
2111                // If this is now checked, show the mail fields
2112                if ($('#email').is(':checked')) {
2113                    $('.e-mail').show();
2114    
2115                    // Stylize
2116                    $('#email').parents(".email-tile").addClass("clicked");
2117                    $('#email').siblings("i").removeClass("far").addClass("fas");
2118    
2119                    // Is mail also checked? Show  bothInfo, other just show email
2120                    $('#mail').is(':checked') ? $(infoCon).text(bothInfo) : $(infoCon).text(emailInfo);
2121
2122                } 
2123    
2124                //  ( otherwise, uncheck it and hide the email fields)
2125                else {
2126                    $('.e-mail').hide();
2127    
2128                    // Stylize
2129                    $('#email').parents(".email-tile").removeClass("clicked");
2130                    $('#email').siblings("i").removeClass("fas").addClass("far");
2131    
2132                    // Description now becomes mailInfo
2133                    $(infoCon).text(mailInfo);
2134
2135                }
2136    
2137                // Hide basic info if neither are checked
2138                neitherCheck();
2139            };
2140    
2141            // *   ---   ---    PHYSICAL vs EMAIL end  ---   ---    */
2142    
2143            // *   ---   --- E CARD MESSAGES start   ---   ---    */
2144
2145            // Bind toggle functions to checkboxes
2146            $(".mail-checks input").change(function(event) {
2147                $(this).is("#mail") ? mailToggle(event) : emailToggle(event);
2148            });
2149
2150            // On Load Defaults (Defaults to Mail being selected, hides email)
2151            $(".mail").hide();
2152            $("#email").prop("checked", true);
2153    
2154            // *   ---   --- E CARD MESSAGES end   ---   ---    *
2155    
2156            /*     *     *     *     *
2157        
2158            [B. ] Operations
2159    
2160            *     *     *     *     */
2161    
2162            // 1. Hides IMO or IHO cards on toggle
2163    
2164            honorToggle();
2165            $(".form-item-inhonororinmemoryof label").click(function() {
2166                honorToggle();
2167            });
2168    
2169            // 2. Physical vs Email toggle
2170    
2171            // Implants new radio buttons
2172            let mailChecks = $(".mail-checks");
2173            // $(".at-recipient-info").prepend(mailChecks);
2174            document.querySelector('.at-recipient-info').insertAdjacentElement('afterbegin',document.querySelector('.default-ecard-container .mail-checks'));
2175    
2176    
2177            // 3. When an ecard is selected, select the corresponding message (can use future updating for more efficiency)
2178    
2179                    // Grabs the custom message box
2180                    var message = $(".NotificationMessage textarea");
2181                    
2182
2183                    // Defaults to the first IHO ecard
2184                    eCardMessage.value = 'As a token of gratitude and appreciation, a gift to Planned Parenthood has been made in your honor.';
2185                    
2186                    document.querySelector('.form-item-ecard .at-ecards').addEventListener('click', (event) => {
2187                        let target = event.target;
2188
2189                        
2190                        // IHO
2191                        if (target.closest('.iho-msg-1')) {
2192                            eCardMessage.value = 'As a token of gratitude and appreciation, a gift to Planned Parenthood has been made in your honor.';
2193                        }
2194                        if (target.closest('.iho-msg-2')) {
2195                            eCardMessage.value = 'Congratulations!';
2196                        }
2197                        if (target.closest('.iho-msg-3')) {
2198                            eCardMessage.value = 'Thank you for standing with Planned Parenthood.';
2199                        }
2200                        if (target.closest('.iho-msg-4')) {
2201                            eCardMessage.value = 'Many happy returns on your birthday!';
2202                        }
2203                        
2204                        
2205                        // STANDARD MESSAGES
2206                        
2207                        
2208                        if (target.closest('.iho-msg-5')) {
2209                            eCardMessage.value = 'Congratulations on your wedding!';
2210                        }
2211                        if (target.closest('.iho-msg-6')) {
2212                            eCardMessage.value = 'Mazel tov on your wedding!';
2213                        }
2214                        
2215                        // Mother's Day 
2216                        /*
2217                        if (target.closest('.iho-msg-6')) {
2218                            eCardMessage.value = 'Happy Mother’s Day!';
2219                        }
2220                        */
2221                        
2222
2223            
2224                        // Valentines Day
2225                        
2226                        /*
2227                        
2228                        if (target.closest('.iho-msg-5')) {
2229                            eCardMessage.value = 'Happy Valentine’s Day!';
2230                        }
2231                        if (target.closest('.iho-msg-6')) {
2232                            eCardMessage.value = 'Happy Valentine’s Day!';
2233                        }
2234                        */
2235
2236                        
2237                        
2238                        
2239                        // HOLIDAY MESSAGES
2240                        
2241                        /*
2242                        
2243                        if (target.closest('.iho-msg-5')) {
2244                            eCardMessage.value = "Season's Greetings & Happy New Year!";
2245                        }
2246                        if (target.closest('.iho-msg-6')) {
2247                            eCardMessage.value = 'Happy Holidays!';
2248                        }
2249                        
2250                        */
2251                        
2252
2253                        // IMO
2254                        if (target.closest('.imo-msg-1')) {
2255                            eCardMessage.value = 'My deepest condolences for your loss.';
2256                        }
2257                        if (target.closest('.imo-msg-2')) {
2258                            eCardMessage.value = 'Thinking of you during this difficult time. ';
2259                        }
2260                        if (target.closest('.imo-msg-3')) {
2261                            eCardMessage.value = 'In loving memory.';
2262                        }
2263
2264    
2265
2266
2267                    });
2268    
2269    
2270                    $('.at-preview-ecard').click(function() {
2271                        setTimeout(function() {
2272                            $("#recipient-message").text(document.querySelector('textarea[name="NotificationMessage"]').value);
2273                        }, 020);
2274                    });
2275
2276                    console.log('Render Complete');
2277                    
2278
2279            };
2280
2281            nvtag_callbacks.postRender.push(ecardUpdate);
2282    
2283            </script>
2283
2284            
2285
2286            
2287            <!--- Fancy Checkboxes --->
2288            <div class="default-ecard-container">
2289    <div class="mail-checks radios at-row">
2290
2291        <div class="email-container">
2292
2293            <label class="email-tile clicked" for="email">
2294
2295                <input type="checkbox" name="email" id="email" value="email">
2296                <i class="fas fa-2x fa-paper-plane" aria-hidden="true">&nbsp;</i><br>
2297                <span class="mail-text">I'd like an e-card to be sent via email</span>
2298
2299            </label>
2300
2301            <div class="deliv">
2302                (delivered instantly or on a specific date of your choosing)
2303            </div>
2304
2305        </div>
2306
2307        <div class="mail-container">
2308
2309            <label class="mail-tile" for="mail">
2310                <input type="checkbox" name="mail" id="mail" value="mail">
2311                <i class="far fa-2x fa-envelope" aria-hidden="true">&nbsp;</i><br>
2312                <span class="mail-text">I'd like a physical card to be sent via the mail</span>
2313
2314            </label>
2315
2316            <div class="deliv">(delivered within 2 - 3 weeks)</div>
2317
2318        </div>
2319
2320    </div>
2321    </div>
2322
2323<!--- 2. Tooltip CSS // Insert tettra ID or shortlink --->
2324
2325<!--- DISABLED FOR ABTASTY TEST
2326
2327<style>
2328    /*   ----   ReFORM2 - Tooltip refactor   ----  */
2329    
2330    /* Tooltip container */
2331    #giving-tabs li::before {
2332        content: "";
2333        position: absolute;
2334        top: 70px;
2335        z-index: 99999999;
2336        width: 0px;
2337        height: 0px;
2338        border-left: 10px solid transparent;
2339        border-right: 10px solid transparent;
2340        border-bottom: 10px solid #2895d6;
2341    
2342        opacity: 0;
2343        z-index: -50;
2344    
2345    transition: .2s ease all;
2346    }
2347    
2348    #giving-tabs li:nth-of-type(1):before {
2349    margin-left: 145px;
2350    }
2351    
2352    #giving-tabs li:nth-of-type(2):before {
2353    margin-left: 85px;
2354    }
2355    
2356    #giving-tabs li::after {
2357        position: absolute;
2358        background: #2895d6;
2359        color: #fff;
2360        text-align: center;
2361        font-weight: 400;
2362    font-size: .9em;
2363        top: 80px;
2364        overflow: initial;
2365        width: 315px;
2366        padding: 10px;
2367    
2368        opacity: 0;
2369        z-index: -50;
2370    transition: .2s ease all;
2371    }
2372    
2373    #giving-tabs li:nth-of-type(1)::after {
2374    content: "Your gift will be shared between your local Planned Parenthood affiliate and Planned Parenthood Federation of America.";
2375    }
2376    
2377    #giving-tabs li:nth-of-type(2)::after {
2378    content: "Your gift will go to the Planned Parenthood organization of your choice.";
2379    margin-left: -30px;
2380    }
2381    
2382    #giving-tabs li:hover::after, #giving-tabs li:hover::before {
2383        margin-top: 0px;
2384        opacity: 1;
2385        z-index: 99999;
2386    }
2387    
2388    /* Media queries (Set to adjust and respond to current screen breakpoints) */
2389    
2390    /* Smallest screens */
2391    @media screen and (max-width: 420px) {
2392    .ngp-form #giving-tabs li::after, .ngp-form #giving-tabs li:hover::after  {
2393    max-width: 80vw;
2394        left: 35px !important;
2395        
2396    }
2397    
2398    .ngp-form #giving-tabs li:nth-of-type(1)::before, .ngp-form #giving-tabs li:nth-of-type(1):hover::before {
2399    margin-left: 45px!important;
2400    }
2401    .ngp-form #giving-tabs li:nth-of-type(2)::before, .ngp-form #giving-tabs li:nth-of-type(2):hover::before {
2402        margin-left: 35px!important;
2403    }
2404    
2405    .ngp-form #giving-tabs li:nth-of-type(1)::after, .ngp-form #giving-tabs li:nth-of-type(1):hover::after {
2406    margin-top: -155px;
2407    }
2408    
2409    .ngp-form #giving-tabs li:nth-of-type(2)::after, .ngp-form #giving-tabs li:nth-of-type(2):hover::after {
2410    margin-top: -115px !important;
2411    }
2412    
2413    }
2414    
2415    /*  */
2416    @media screen and (min-width: 346px) and (max-width: 767px) {
2417    li::after, #giving-tabs li:hover::after {
2418        margin-top: -135px !important;
2419    }
2420    
2421    #giving-tabs li:nth-of-type(2):hover::after, #giving-tabs li:nth-of-type(2)::after {
2422        margin-top: -115px !important;
2423    }
2424    
2425    }
2426    
2427    
2428    @media screen and (min-width: 768px)  and (max-width: 938px) {
2429    
2430    #giving-tabs li::after, #giving-tabs li:hover::after  {
2431    margin-top: -176px !important;
2432    }
2433    
2434    #giving-tabs li:hover::before, #giving-tabs li::before {
2435    margin-top: -3px;
2436    margin-left: 50px;
2437    }
2438    
2439    #giving-tabs li::before, #giving-tabs li:hover::before {
2440        margin-left: 45px !important;
2441    }
2442    
2443    
2444    #giving-tabs li:nth-of-type(2):hover::after, #giving-tabs li:nth-of-type(2)::after {
2445    margin-top: -152px !important;
2446    }
2447    
2448    }
2449    
2450    @media screen and (min-width: 939px) and (max-width: 1200px) {
2451    #giving-tabs li:nth-of-type(2)::after {
2452    right: 0 !important;
2453    }
2454    #giving-tabs li:nth-of-type(2):before {
2455        margin-left: 60px;
2456    }
2457    
2458    }
2459    
2460    @media screen and (max-width: 938px) {
2461    #giving-tabs li::after, #giving-tabs li::before, #giving-tabs li:hover::after, #giving-tabs li:hover::before {
2462    top: initial !important;
2463    left: initial;
2464    }
2465    #giving-tabs li:hover::before, #giving-tabs li::before {
2466    border-bottom: none;
2467    border-top: 10px solid #2895d6;
2468    }
2469    }
2470    
2471    /* Spanish Content Override */
2472/* 7.28.22 - Reform ToolTip ES */
2473[data-lang='es'] #giving-tabs li:nth-of-type(1)::after {
2474    content: "Tu donación irá a tu organización afiliada local de Planned Parenthood y a Planned Parenthood Federation of America." !important;
2475}
2476
2477[data-lang='es'] #giving-tabs li:nth-of-type(2)::after {
2478    content: "Tu donación irá a la organización de Planned Parenthood que elijas." !important;
2479}
2480
2481    
2482</style>
2483
2484--->
2485
2486<!--- 3. Covered Cost // Insert tettra ID or shortlink --->
2487<style type="text/css">
2488    /* Hiding Default Covered Cost Stuff*/
2489    .at-cover-costs-info strong,
2490    .CoverCostsAmount .at-checkbox-title,
2491    .at-cover-costs-info {
2492        display: none !important;
2493    }
2494
2495    /* Hides default test style changes */
2496    .CoverCostsAmount input {
2497        background: #fff !important;
2498    }
2499
2500    /*Load*/
2501    .CoverCostsAmount .at input[type=checkbox]:checked+span:before {
2502        background: #fff !important;
2503        border-color: #ced4da !important;
2504    }
2505
2506    .CoverCostsAmount .at input[type=checkbox]:focus+span:before {
2507        box-shadow: 0 0 0px 0 #fff;
2508
2509    }
2510
2511    /*Defaulted*/
2512    .CoverCostsAmount .at input[type=checkbox].ccDef:checked+span:before {
2513        background: #228ae6 !important;
2514        border-color: #1c7cd6;
2515    }
2516
2517    .CoverCostsAmount .at input[type=checkbox].ccDef:focus+span:before {
2518        box-shadow: 0 0 4px 0 #228ae6;
2519    }
2520
2521    .contr,
2522    .amCon {
2523        font-weight: bold;
2524    }
2525
2526    /* Formatting */
2527
2528    .at-check.CoverCostsAmount {
2529        margin: 0 0.925rem !important;
2530        padding-top: 25px;
2531    }
2532
2533    .CoverCostsAmount span {
2534        color: #191919;
2535    }
2536
2537    .defaultError {
2538        display: none !important;
2539    }
2540
2541    /* Hide Default Test */
2542     .at .defaultCheck input[type=checkbox]:checked+span:before, .at .defaultCheck input[type=checkbox]:focus+span:before {
2543        background: #fff !important;
2544        box-shadow: 0px 0px #fff !important;
2545        border-color: #ced4da;
2546    }
2547
2548</style>
2549<script type="text/javascript" nonce="744a3226-3f25-411c-9500-973157837f5a">
2550    //$(document).ready(function () {
2551    let coveredCostOvr = () => {
2552
2553        if (!document.querySelector('.CoverCostsAmount')) return;
2554
2555        // New Covered Cost Messages
2556
2557        var contrCon = '<span class="contr">' + '</span>';
2558        var amCon = '<span class="amCon">' + '</span>';
2559        var covCostMsg = "<span class='covered-cost-se'>" + "I'd like to cover the processing fees, making my total gift " + contrCon + ", so " + amCon + " goes to protect reproductive health." + "</span>";
2560
2561
2562        // Math: Covered Cost Amount Calc
2563        function covered(num, per) {
2564            return (num / 100) * per;
2565        }
2566
2567        // Math: Thousand Formatting
2568        function thous(num) {
2569            return '$' + num.toFixed(2).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,')
2570        }
2571
2572        let defaulted = true;
2573
2574        // 3.25 Check
2575        let defaultCheck = () => {
2576
2577            // Hide Default Interactions
2578            document.querySelector('.CoverCostsAmount').classList.add('defaultCheck');
2579
2580            if (document.querySelector('[name="CoverCostsAmount"]').checked !== true) {
2581                document.querySelector('.CoverCostsAmount').click();
2582            }
2583
2584            setTimeout(() => {
2585
2586                let userCost = document.querySelector('.CoverCostsAmount span strong').textContent.slice(1).replaceAll(',','');
2587
2588                let contrAmount = $("input.edit-otheramount").value;
2589
2590
2591                if ($(".edit-otheramount").val()) {
2592                    let contrAmount = Number($("input.edit-otheramount").val());
2593                    // DEV
2594                    // let fullCovCost = contr + covered(contr, 3.25);
2595                    let fullCovCost = roundThis(contrAmount+ covered(contrAmount, 3.25));
2596                    
2597                    // DEV
2598                    /*
2599                    console.log('Projected 3.25% cost: ' + fullCovCost);
2600                    window.fullCovCost = fullCovCost;
2601                    window.userCost = userCost;
2602                    console.log('Current Calc Cost - EA: ' + Number(userCost));
2603                    */
2604
2605                    if (Number(fullCovCost) !== Number(userCost)) {
2606                        setTimeout(function () {
2607                            defaultFalse(fullCovCost, userCost);
2608                        }, 100);
2609
2610                    } else {
2611                        document.querySelector('.CoverCostsAmount').classList.remove('defaultCheck');
2612                    }
2613
2614                } else {
2615                    // DEV
2616                    /*
2617                    let contrAmount = $(".form-item-selectamount .label-amount input[type='radio']:checked").val();
2618                    let contr = +contrAmount;
2619                    let coveredCost = contr;
2620                    let fullCovCost = contr + covered(contr, 3.25);
2621                    finalCost = coveredCost.toFixed(2);
2622                    fullCost = fullCovCost.toFixed(2);
2623                    
2624                    */
2625                    //if (thous(parseInt(fullCost)) !== thous(parseInt(userCost.replace(/\,/g, '')))) {
2626                    
2627                    let contrAmount = Number($(".form-item-selectamount .label-amount input[type='radio']:checked").val());
2628                    let fullCovCost = roundThis(contrAmount+ covered(contrAmount, 3.25));
2629                    
2630                    if (Number(fullCovCost) !== Number(userCost)) {
2631                        setTimeout(function () {
2632                            defaultFalse(fullCovCost, userCost);
2633                        }, 100);
2634                    } else {
2635                        document.querySelector('.CoverCostsAmount').classList.remove('defaultCheck');
2636                    }
2637
2638
2639                }
2640
2641                document.querySelector('.CoverCostsAmount').click();
2642                document.querySelector('.CoverCostsAmount input').blur();
2643                document.querySelector('.CoverCostsAmount input').classList.add('ccDef');
2644
2645            }, 400);
2646        }
2647        
2648        // Don't Default Check for Lightbox
2649        if (document.querySelector('#year-end-donations')) {
2650                    
2651        } else {
2652            defaultCheck();
2653        }
2654
2655
2656        if (defaulted === true) {
2657
2658            // Insert New Covered Cost Msg
2659            $(".CoverCostsAmount .at-checkbox-title-container").append(covCostMsg);
2660
2661            // [1. ] ON LOAD
2662
2663            // If Monthly...
2664            var loadCost = () => {
2665
2666                // If Monthly Selected
2667                if ($('.form-item-selectedfrequency input[value="4"]').is(':checked')) {
2668
2669                    // If there is a custom donate value, use it for the new CovCost calculations
2670                    if ($(".edit-otheramount").val()) {
2671                        var contrAmount = $("input.edit-otheramount").val();
2672                        var contr = +contrAmount;
2673                        var coveredCost = contr;
2674                        var fullCovCost = roundThis(contr + covered(contr, 3.25));
2675
2676                        // CHANGE VALUES HERE
2677                        finalCost = coveredCost.toFixed(2);
2678                        fullCost = fullCovCost.toFixed(2);
2679
2680                        $(".contr").text(thous(+fullCost));
2681                        $(".amCon").text(thous(+finalCost));
2682
2683                    } else {
2684                        // If no custom donate amount, use the default nudge value
2685                        var contrAmount = $(".form-item-selectamount .label-amount input[type='radio']:checked").val();
2686                        var contr = +contrAmount;
2687                        var coveredCost = contr;
2688                        var fullCovCost = roundThis(contr + covered(contr, 3.25));
2689                        finalCost = coveredCost.toFixed(2);
2690                        fullCost = fullCovCost.toFixed(2);
2691
2692                        $(".contr").text(thous(+fullCost));
2693                        $(".amCon").text(thous(+finalCost));
2694                    }
2695                } else {
2696                    if ($(".edit-otheramount").val()) {
2697                        var contrAmount = $("input.edit-otheramount").val();
2698                        var contr = +contrAmount;
2699                        var coveredCost = contr;
2700                        var fullCovCost = roundThis(contr + covered(contr, 3.25));
2701                        finalCost = coveredCost.toFixed(2);
2702                        fullCost = fullCovCost.toFixed(2);
2703
2704                        $(".contr").text(thous(+fullCost));
2705                        $(".amCon").text(thous(+finalCost));
2706                    } else {
2707                        var contrAmount = $(".label-amount input[type='radio']:checked").val();
2708                        var contr = +contrAmount;
2709                        var coveredCost = contr;
2710                        var fullCovCost = roundThis(contr + covered(contr, 3.25));
2711                        finalCost = coveredCost.toFixed(2);
2712                        fullCost = fullCovCost.toFixed(2);
2713
2714                        $(".contr").text(thous(+fullCost));
2715                        $(".amCon").text(thous(+finalCost));
2716                    }
2717                };
2718                
2719                singleClick();
2720
2721            }
2722
2723            setTimeout(loadCost, 300);
2724
2725            // Input
2726
2727            var inputCost = () => {
2728                var contrAmount = Number($("input.edit-otheramount").val());
2729                var fullCovCost = Number(roundThis(contrAmount + covered(contrAmount, 3.25)));
2730
2731                $(".contr").text(thous(fullCovCost));
2732                $(".amCon").text(thous(contrAmount));
2733            }
2734
2735            var inputEdit = function () {
2736
2737                setTimeout(function () {
2738
2739                    $('.edit-otheramount').on('input', function () {
2740                        inputCost();
2741                    })
2742                }, 200);
2743
2744            }
2745
2746            inputEdit();
2747
2748            // On Click
2749
2750            var singleClick = function () {
2751                $(".label-amount").click(function () {
2752
2753                    // input other amount?
2754                    if ($(this).is(".label-otheramount")) {
2755                        ($(".edit-otheramount").val() == '') ? $(".CoverCostsAmount").hide() : inputCost();
2756                    } else {
2757                        let contrAmount = Number($(this).children("input").val());
2758                        setTimeout(function () {
2759                            var fullCovCost = Number(roundThis(contrAmount + covered(contrAmount, 3.25)));
2760                            // var finalCost = coveredCost.toFixed(2).toString();
2761                            // var fullCost = fullCovCost.toFixed(2).toString();
2762                            $(".contr").text(thous(fullCovCost));
2763                            $(".amCon").text(thous(contrAmount));
2764                            (!$(".edit-otheramount").val() == "") ? inputCost() : null;
2765                        }, 100);
2766
2767                    }
2768
2769                });
2770
2771            }
2772
2773            singleClick();
2774
2775            // F R E Q U E N C Y - C H A N G E
2776
2777            $(".radios label input").click(function () {
2778
2779                //console.log(document.querySelector('.edit-otheramount').value);
2780
2781                setTimeout(function () {
2782
2783                    if ($(".edit-otheramount").val()) {
2784
2785                        var contrAmount = Number(document.querySelector('.edit-otheramount').value);
2786                        var fullCovCost = Number(roundThis(contrAmount + covered(contrAmount, 3.25)));
2787
2788
2789                        $(".contr").text(thous(fullCovCost));
2790                        $(".amCon").text(thous(contrAmount));
2791                        $(".form-item-selectamount .label-amount input[type='radio']:checked").parent().click();
2792
2793                    } else {
2794
2795                        var contrAmount = Number($(".form-item-selectamount .label-amount input[type='radio']:checked").val());
2796                        var fullCovCost = Number(roundThis(contrAmount + covered(contrAmount, 3.25)));
2797
2798                        $(".contr").text(thous(fullCovCost));
2799                        $(".amCon").text(thous(contrAmount));
2800                        $(".form-item-selectamount .label-amount input[type='radio']:checked").parent().click();
2801
2802                    }
2803
2804                    singleClick();
2805
2806                }, 100);
2807
2808
2809                inputEdit();
2810
2811
2812
2813            });
2814
2815            // Fix 2
2816
2817            $(".contribute-links").click(function () {
2818                if ($(this).hasClass("frequency")) {
2819                    $(".recurringNudge").click();
2820                } else if ($(this).hasClass("onetime")) {
2821                    $(".onetimeNudge").click();
2822                }
2823            });
2824
2825
2826
2827            //});
2828
2829        }
2830        
2831            // USE ROUND THIS!
2832    
2833    function roundThis(number) {
2834        return +(Math.round(number + "e+" + 2)  + "e-" + 2);
2835    }
2836    
2837    function defaultFalse(fullCovCost, userCost) {
2838        document.querySelector('[name="CoverCostsAmount"]').checked = false;
2839                            document.querySelector('[name="CoverCostsAmount"]').disabled = true;
2840                            document.querySelector('.CoverCostsAmount').classList.add('defaultError');
2841                            console.warn('PPOL Error: Covered Cost formula 
2841is not set to default.');
2842                            console.log('Expected Covered Cost Amount: ' + fullCovCost);
2843                            console.log('Current Covered Cost Amount: ' + userCost);
2844                            defaulted = false;
2845                            return;
2846        
2847    }
2848
2849
2850
2851    }
2852
2853    var nvtag_callbacks = nvtag_callbacks || {};
2854    nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
2855    nvtag_callbacks.postRender.push(coveredCostOvr);
2856
2857</script>
2857 
2858
2859<!--- 4. Accessibility // Insert tettra ID or shortlink --->
2860<style type="text/css">
2861    /* Darkens Blue Link */
2862    [data-theme-color="blue"] main a {
2863        color: #13405D !important;
2864    }
2865
2866    /*  Hidden but not for screen readers */
2867    .sr-only {
2868        position: absolute;
2869        width: 1px;
2870        height: 1px;
2871        padding: 0;
2872        margin: -1px;
2873        overflow: hidden;
2874        clip: rect(0, 0, 0, 0);
2875        white-space: nowrap;
2876        border: 0;
2877    }
2878    
2879    .access-hide {
2880        position: absolute;
2881        width: 1px;
2882        height: 1px;
2883        padding: 0;
2884        margin: -1px;
2885        overflow: hidden;
2886        clip: rect(0, 0, 0, 0);
2887        white-space: nowrap;
2888        border-width: 0;
2889    }
2890    
2891</style>
2892
2893<script nonce="744a3226-3f25-411c-9500-973157837f5a">
2894
2895    let accessibility = () => {
2896
2897        /* Accessibility: DONATION */
2898
2899        // 1. Add aria labels to radio  buttons
2900        if (!!document.querySelector('.at-fieldset.ContributionInformation .radios')) {
2901            accessRadio();
2902            document.querySelector('input[value="0"]').addEventListener('change', function () {
2903                accessRadio();
2904            });
2905            if (document.querySelector('input[value="4"]')) {
2906                document.querySelector('input[value="4"]').addEventListener('change', function () {
2907                    accessRadio();
2908                });
2909            }
2910        };
2911
2912        function accessRadio() {
2913
2914            let radio = document.querySelector('label.at-radio-label-0');
2915            let radio2 = document.querySelector('label.at-radio-label-4');
2916
2917            setTimeout(() => {
2918                if (document.querySelector('input[value="4"]').checked == true) {
2919                    radio.setAttribute('aria-checked', 'true');
2920                    radio2.setAttribute('aria-checked', 'false');
2921                } else {
2922                    radio.setAttribute('aria-checked', 'false');
2923                    radio2.setAttribute('aria-checked', 'true');
2924                }
2925            }, 100);
2926
2927        };
2928
2929        // 2. Remove duplicate IDs for contribution forms
2930        if (!!document.querySelector('.form-item-inhonororinmemoryof')) {
2931            document.querySelector('.form-item-inhonororinmemoryof label').removeAttribute('id');
2932        }
2933
2934
2935
2936        /* Accessibility: General */
2937
2938        // FastAction Logo needs Alt tag
2939        setTimeout(() => {
2940            if (!!document.querySelector('.at-markup.FastAction img')) {
2941                document.querySelector('.at-markup.FastAction img').setAttribute("alt", "Fast Action Logo");
2942            }
2943        }, 200);
2944
2945        /* Body element needs language tag Language */
2946        if (!document.querySelector('.site-footer').classList.contains('lang-es')) {
2947            document.documentElement.lang = 'en';
2948        } else {
2949            document.documentElement.lang = 'es';
2950        }
2951
2952        /*  ---  DEV 2026  ---   */
2953
2954        /* E-Card input labels */
2955
2956        // 1. Select all inputs with the class 'ecard'
2957        const ecardInputs = document.querySelectorAll('input[name="ecard"]');
2958
2959        ecardInputs.forEach((input, index) => {
2960            // 2. Define a descriptive label. 
2961            // Adding (index + 1) helps users know which design they are on.
2962            const labelText = `Select E-Card design option ${index + 1}`;
2963
2964            // 3. Apply the aria-label to the element
2965            input.setAttribute('aria-label', labelText);
2966        });
2967
2968        /* Hidden Labels */
2969        if (document.querySelector('.NotificationSendDate')) {
2970            document.querySelector('.NotificationSendDate').classList.add('sr-only');
2971        }
2972
2973        /* FA modal label */
2974        let faModal = document.querySelector('#fastaction-signup-inner');
2975        if (faModal) {
2976            document.querySelectorAll('#fastaction-signup-inner h1').forEach(element => {
2977                element.id = 'modal-label';
2978            });
2979        }
2980        if (document.querySelector('#fastaction-login-inner')) {
2981            document.querySelectorAll('#fastaction-login-inner h1').forEach(element => {
2982                element.id = 'modal-label';
2983            });
2984        }
2985        if (document.querySelector('#fastaction-signup-hustle-inner')) {
2986            document.querySelectorAll('#fastaction-signup-hustle-inner h1').forEach(element => {
2987                element.id = 'modal-label';
2988            });
2989        }
2990        if (document.querySelector('#fastaction-login-hustle-inner')) {
2991            document.querySelectorAll('#fastaction-login-hustle-inner h1').forEach(element => {
2992                element.id = 'modal-label';
2993            });
2994        }
2995
2996        /* Empty Labels */
2997
2998        if (document.querySelector('.NotificationMessage label.NotificationMessage')) {
2999            document.querySelector('.NotificationMessage label.NotificationMessage').textContent = 'E Card Notification';
3000        };
3001
3002        if (document.querySelector('label.notificationsenddate')) {
3003            document.querySelector('label.notificationsenddate').textContent = 'E Card Notification Send Date';
3004        };
3005
3006        /*
3007        if (document.querySelector('.paypal-label')) {
3008            document.querySelector('.paypal-label').textContent = 'PayPal Label';
3009        };
3010        */
3011        
3012        if(document.querySelector('.at-btn-radio-wrapper.at-paypal-button-wrapper')){
3013            document.querySelector('.at-btn-radio-wrapper.at-paypal-button-wrapper span').classList.add('access-hide');
3014            document.querySelector('.at-btn-radio-wrapper.at-paypal-button-wrapper span').textContent = 'PayPal';
3015        };
3016
3017        /* Home Logo Labeling */
3018        if (document.querySelector('.site-logo a')) {
3019            document.querySelector('.site-logo a').setAttribute('aria-label', 'Go to Home Page');
3020        }
3021        
3022        
3023        injectAccessibleLegend('.at-fieldset.TributeGift', 'Tribute Gift Information');
3024        
3025        injectAccessibleLegend('.at-fieldset.PaymentMethodSectiont', 'Payment Method Selection');
3026        
3027        injectAccessibleLegend('.at-fieldset.RecipientInformation', 'Notify E-Card Recipient');
3028    
3029    
3030     // Utils
3031    
3032    function injectAccessibleLegend(selector, text) {
3033            
3034            const fieldsets = document.querySelectorAll(selector);
3035
3036            fieldsets.forEach(fieldset => {
3037                
3038            if (!fieldset.querySelector('legend')) {
3039                const legend = document.createElement('legend');
3040                legend.classList.add('access-hide');
3041                legend.textContent = text;
3042      
3043                // Legend MUST be the first child
3044                fieldset.insertBefore(legend, fieldset.firstChild);
3045            }
3046            
3047        });
3048        
3049    }
3050
3051
3052
3053    };
3054
3055    nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
3056    nvtag_callbacks.postRender.push(accessibility);
3057
3058</script>
3058
3059
3060<!--- 5. Default Monthly // Insert tettra ID or shortlink --->
3061<style>
3062.monthly-only .at-row.SelectAmount.OtherAmount.NonRecurringButtons {
3063    margin-top: 30px;
3064}
3065
3066.monthly-only .at-row.SelectAmount.OtherAmount.NonRecurringButtons::before {
3067    content: 'Your gift will process monthly';
3068    padding-left: 14px;
3069    margin-top: -30px;
3070    position: absolute;
3071    font-size: 13px;
3072    opacity: .7;
3073}
3074
3075.monthly-only .at-recurring {
3076    visibility: hidden;
3077    display: none;
3078}
3079
3080</style>
3081
3082
3083<script nonce="744a3226-3f25-411c-9500-973157837f5a">
3084
3085let = monthlyOverride = () => {
3086    
3087// 
3088if (!!document.querySelector('.at-recurring')) {
3089if(document.querySelector('.at-recurring .SelectedFrequency span').textContent.includes('Monthly')) {
3090document.querySelector('.ngp-form').classList.add('monthly-only');
3091document.querySelector('.at-form form .at-legend').textContent = 'Monthly Gift 📅';
3092}
3093}
3094
3095}
3096
3097nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
3098nvtag_callbacks.postRender.push(monthlyOverride);
3099
3100</script>
3100
3101
3102<!--- 6. Email Validation // Insert tettra ID or shortlink --->
3103<style type="text/css">.confirm-email {
3104                display: flex;
3105                flex-direction: row;
3106                align-items: center;
3107                margin-bottom: 15px;
3108            }
3109    
3110            .confirm-email .confirm {
3111                display: flex;
3112                flex-direction: row;
3113            }
3114    
3115            /* Container
3116            .didYouMean.info:nth-of-type(1) {
3117                justify-content: end;
3118            }
3119    
3120            */
3121    
3122            .didYouMean.info {
3123                padding-right: 0px !important;
3124            }
3125    
3126            .didYouMean .text {
3127                padding-top: 4px;
3128                margin-right: 10px;
3129            }
3130    
3131            .confirm>div {
3132                color: #2895d5 !important;
3133                height: 35px;
3134                width: 25px;
3135                text-align: center;
3136                font-size: 1.5em;
3137                font-weight: bold;
3138            }
3139    
3140            .confirm-email .text {
3141                margin-right: 5px;
3142                color: #fa5252;
3143                font-weight: 600;
3144                font-size: .75rem;
3145            }
3146    
3147            #email-yes {
3148                font-size: 1.15em;
3149                padding-top: 5px;
3150            }
3151    
3152            .didYouMean.info>.didYouMean.info {
3153                padding-top: 13px !important;
3154            }
3155    
3156            .didYouMean.confirmState {
3157                display: none !important;
3158            }
3159    
3160            .email-confirm input[type="email"] {
3161                margin-bottom: 0px !important;
3162                border: solid 2px #c9084c !important;
3163            }
3164    
3165            /* Designs */
3166    
3167            /* #1 Highlighter */
3168    
3169            @keyframes highlighter {
3170                0% {
3171                    background: rgba(255, 255, 0, .8);
3172                }
3173    
3174                10% {
3175                    background: rgba(255, 255, 0, .8);
3176                }
3177    
3178                100% {
3179                    background: rgba(255, 255, 255, 1);
3180                }
3181            }
3182    
3183    
3184    
3185            .at small.info.didYouMean {
3186                color: #fa5252 !important;
3187                border-left: 5px #fa5252 solid;
3188                margin-top: -10px;
3189                animation: highlighter ease 1.5s forwards !important;
3190            }
3191</style>
3192
3193<script nonce="744a3226-3f25-411c-9500-973157837f5a">
3194    
3195            let emailAssure = () => {
3196            
3197
3198if (!!document.querySelector('input[type="submit"]')) {
3199
3200                window.dfseAddOns = window.dfseAddOns || [];
3201                let addOn = {name:'Email Validation JS', id: '15464'};
3202                dfseAddOns.push(addOn);
3203
3204                // On Submit button click
3205                document.querySelector('input[type="submit"]').addEventListener('click', (e) => {
3206    
3207                    // If Email "Did you mean warning exists"
3208                    if (document.querySelector('.EmailAddress .didYouMean')) {
3209    
3210                        // Is the confirm email error already active? (Did we already prompt the email correct?)
3211                        if (document.querySelector('.EmailAddress .confirm-email')) {
3212                            // Don't do anything
3213                            e.preventDefault();
3214                            document.querySelector('.EmailAddress input').scrollIntoView();
3215                            return;
3216                        }
3217    
3218                        // Does this include a common error ?
3219                        // Which email errors do we want to prompt for?
3220                        if(document.querySelector('.EmailAddress input').value.includes('gmail')) {
3221    
3222                        // If value is incorrect
3223                        if (!document.querySelector('.EmailAddress input').value.endsWith('@gmail.com')) {
3224    
3225                            // Stop Submit
3226                            e.preventDefault();
3227                            // console.log('ERROR');
3228                            document.querySelector('label.EmailAddress').classList.add('email-confirm');
3229                            document.querySelector('.EmailAddress input').scrollIntoView();
3230                            let unConfirm = () => { document.querySelector('label.EmailAddress').classList.remove('email-confirm') };
3231    
3232                            // Clear Out Old Error
3233                            document.querySelector('.EmailAddress .didYouMean').classList.add('confirmState');
3234    
3235                            // Add new stuff
3236                            // Add the 'Is this email correct' markup:
3237                            document.querySelector('.EmailAddress .didYouMean').insertAdjacentHTML('afterend', '<div class="confirm-email"><div class="text">Is this correct?</div><div class="confirm"><div id="email-yes">✓</div><div id="email-no">×</div></div></div>');
3238    
3239                            // Add logic for 'Is this correct button' clicks
3240                            document.querySelector('#email-yes').addEventListener('click', () => { document.querySelector('.confirm-email').remove(); document.querySelector('.EmailAddress .didYouMean').remove(); setTimeout(() => { document.querySelector('label input[name="EmailAddress"]').blur(), 200 }); unConfirm(); });
3241                            document.querySelector('#email-no').addEventListener('click', () => { document.querySelector('.confirm-email').remove(); document.querySelector('.EmailAddress .didYouMean').remove(); document.querySelector('.EmailAddress input').value = ''; document.querySelector('.EmailAddress input').click(); unConfirm(); });
3242    
3243                        }
3244    
3245                    }
3246    
3247                    }
3248                });
3249    
3250}
3251            }
3252    
3253            var nvtag_callbacks = nvtag_callbacks || {};
3254            nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
3255            nvtag_callbacks.postRender.push(emailAssure);
3256    
3257    
3258        </script>
3258
3259
3260<!--- 7. Advocacy Mobile Tooltip --->
3261<!--- 8. Progress Bar Upgrade --->
3262<style>
3263    /* --- Hide Old Progress Bar --- */
3264    .at-markup.MeterHtml iframe {
3265        display: none;
3266    }
3267
3268    .MeterHtml figure.standard {
3269        margin: 0;
3270        padding: 20px;
3271        border-radius: 4px;
3272        max-width: 100%;
3273        font-family: 'Helvetica Neue', Arial, sans-serif;
3274        margin-bottom: 40px;
3275        border: solid rgba(0, 0, 0, .1) 1px;
3276        background: rgba(255, 255, 255, .8);
3277        position: relative;
3278        overflow: hidden;
3279    }
3280
3281    .progress-meter-wrapper {
3282        display: flex;
3283        flex-direction: column;
3284        gap: 8px;
3285        position: relative;
3286        z-index: 1;
3287    }
3288
3289    .progress-meter-values {
3290        display: flex;
3291        justify-content: space-between;
3292        align-items: baseline;
3293    }
3294
3295    .progress-meter-raised div {
3296        font-size: 30px;
3297        font-weight: 700;
3298        color: #212b40;
3299        letter-spacing: -0.3px;
3300    }
3301
3302    .progress-meter-goal div {
3303        font-size: 13px;
3304        color: #6b7280;
3305    }
3306
3307    .time-remaining {
3308        font-size: 12px;
3309        color: #6b7280;
3310    }
3311
3312    .progress-meter-wrapper progress {
3313        -webkit-appearance: none;
3314        appearance: none;
3315        width: 100%;
3316        height: 30px;
3317        border: none;
3318        border-radius: 100px;
3319        display: block;
3320    }
3321
3322    progress::-webkit-progress-bar {
3323        background: #e8edf2;
3324        border-radius: 100px;
3325    }
3326
3327    [data-theme-color="blue"] progress::-webkit-progress-value {
3328        background: #3a7fc1;
3329        border-radius: 100px;
3330    }
3331   
3332   [data-theme-color="pink"] progress::-webkit-progress-value { 
3333    background: #EC008C;
3334    border-radius: 100px;
3335   }
3336
3337    progress::-moz-progress-bar {
3338        background: #3a7fc1;
3339    }
3340
3341    .progress-meter-supporters div {
3342        font-size: 13px;
3343        color: #6b7280;
3344        white-space: nowrap;
3345        text-indent: 0;
3346    }
3347
3348    .progress-meter-percentage {
3349        margin: 0;
3350        font-size: 12px;
3351        color: #6b7280;
3352        letter-spacing: 0.4px;
3353    }
3354
3355    .progress-meter-percentage strong {
3356        color: #000;
3357    }
3358
3359    .progress-meter-footer {
3360        display: flex;
3361        flex-direction: row;
3362    }
3363
3364    .progress-meter-footer>div {
3365        flex: 1;
3366    }
3367
3368    .progress-meter-footer .time-pill {
3369        white-space: nowrap;
3370        text-indent: 0;
3371    }
3372
3373    /* --- Days Left Pill --- */
3374    .days-left-container,
3375    .days-left-pill {
3376        display: flex;
3377        flex-direction: row;
3378        justify-content: right;
3379        align-items: center;
3380    }
3381
3382    .days-left-pill {
3383        gap: 5px;
3384        background: #f4f7fb;
3385        border: 1px solid #3a7fc1;
3386        border-radius: 100px;
3387        padding: 4px 10px;
3388        font-size: 12px;
3389        font-weight: 600;
3390        color: #3a7fc1;
3391        margin-left: auto;
3392    }
3393    
3394    [data-theme-color="pink"] .days-left-pill {
3395        color: #EC008C;
3396        border: 1px solid #EC008C;
3397    }
3398
3399    .days-left-text {
3400        padding: 0px 3px;
3401    }
3402
3403    .MeterHtml figure * {
3404        transition: ease .3s all;
3405    }
3406
3407    /* --- Time Remaining: while time still remains, show clock + countdown, hide status message --- */
3408    .time-remains .days-left-message {
3409        display: none;
3410    }
3411
3412    .time-remains .days-left-clock,
3413    .time-remains .days-left-text {
3414        display: inline-block;
3415    }
3416
3417    /* --- Ended states --- */
3418
3419    /* Goal met: hide clock + countdown, show green bolt message */
3420    .days-left-pill--goal-met .days-left-clock,
3421    .days-left-pill--goal-met .days-left-text {
3422        display: none;
3423    }
3424
3425    /* Final push (deadline lapsed, goal not met): hide countdown, keep clock, red message */
3426    .days-left-pill--expired .days-left-text {
3427        display: none;
3428    }
3429
3430    .days-left-pill--expired .days-left-clock {
3431        display: inline-block;
3432    }
3433
3434    .days-left-pill--goal-met .days-left-message {
3435        color: #2e7d32;
3436        /* green */
3437    }
3438
3439    .days-left-pill--expired .days-left-message {
3440        color: #c0392b;
3441        /* red */
3442    }
3443
3444    .days-left-pill--goal-met {
3445        background: rgba(46, 125, 50, .12) !important;
3446        border-color: #2e7d32;
3447    }
3448
3449    .days-left-pill--expired {
3450        background: rgba(192, 57, 43, .1) !important;
3451        border-color: #c0392b;
3452        color: #c0392b;
3453        /* tints the clock stroke red via currentColor */
3454    }
3455
3456    /* --- Radial Glow Sheen --- */
3457    .MeterHtml figure.standard::before {
3458        content: "";
3459        position: absolute;
3460        inset: 0;
3461        background: radial-gradient(circle, rgba(254, 219, 0, .04) 0%, transparent 35%);
3462        background-repeat: no-repeat;
3463        background-size: 200% 200%;
3464        background-position: 0% 0%;
3465        animation: sheenDrift 9s ease-in-out infinite alternate;
3466        pointer-events: none;
3467        z-index: 0;
3468    }
3469
3470    @keyframes sheenDrift {
3471        0% {
3472            background-position: 0% 0%;
3473        }
3474
3475        100% {
3476            background-position: 100% 100%;
3477        }
3478    }
3479
3480    /* --- Loading Animation --- */
3481    figure.standard {
3482        opacity: 0;
3483        transform: scale(0.8);
3484        animation: widgetFadeIn 0.6s ease forwards;
3485        transform-origin: center;
3486    }
3487
3488    @keyframes widgetFadeIn {
3489        0% {
3490            opacity: 0;
3491            transform: scale(0.8);
3492        }
3493
3494        100% {
3495            opacity: 1;
3496            transform: scale(1);
3497        }
3498    }
3499
3500    /* --- Reduced Motion --- */
3501    @media (prefers-reduced-motion: reduce) {
3502
3503        /*
3504  .MeterHtml figure.standard::before {
3505    animation: none;
3506  }
3507  */
3508        figure.standard {
3509            animation: widgetFadeIn 0.6s ease forwards;
3510        }
3511    }
3512    
3513    
3514    /* Mobile */
3515    
3516    @media (max-width: 475px) {
3517
3518.days-left-clock, .progress-meter-footer .divider {display: none !important;}
3519.progress-meter-raised > div {
3520    font-size: 20px;
3521    line-height: 23px;
3522    max-width: 50%;
3523}
3524}
3525</style>
3526
3527
3528
3529<script nonce="744a3226-3f25-411c-9500-973157837f5a">
3530
3531    const testProgBar = () => {
3532        
3533        if (!document.querySelector('.at-markup.MeterHtml')) return;
3534
3535        // Get form shortcode ID
3536        const shortCodeSearch = (window.dataLayer || []).find(
3537            obj => obj && typeof obj === 'object' && 'formShortCode' in obj
3538        );
3539
3540        const jsonURL = `https://secure.everyaction.com/v2/forms/${shortCodeSearch?.formShortCode}/progress`;
3541
3542        $(document).ready(function () {
3543
3544            currentLink = this;
3545            currentContainer = $(".MeterHtml");
3546
3547            $.getJSON(jsonURL, function (data) {
3548
3549                // --- Mode detection ---
3550                const isSubmission = data.progressType === "Submission";
3551                const showAll = data.showAllProgress === true;
3552
3553                // --- Deadline data may be entirely absent from the payload ---
3554                const hasDeadline = data.daysUntilDeadline !== undefined
3555                    && data.daysUntilDeadline !== null
3556                    && data.hoursUntilDeadline !== undefined
3557                    && data.hoursUntilDeadline !== null
3558                    && data.minutesUntilDeadline !== undefined
3559                    && data.minutesUntilDeadline !== null;
3560
3561                meterProgress = data.progressOutOfOneHundred;
3562                meterDaysLeft = data.daysUntilDeadline;
3563                meterHoursLeft = data.hoursUntilDeadline;
3564                meterMinutesLeft = data.minutesUntilDeadline;
3565                meterPeriodRemaining = "";
3566                meterUnitsRemaining = "";
3567
3568                // --- Parse both metrics up front ---
3569                const contributionTotal = parseFloat(data.totalContributionProgress);
3570                const submissionTotal = parseInt(data.totalSubmissionProgress, 10);
3571                const targetNum = parseFloat(data.targetAmount);
3572
3573                // --- Build headline, goal, and secondary line by mode ---
3574                let raisedMarkup = "";
3575                let goalMarkup = "";
3576                let secondaryMarkup = "";
3577                let animTarget = 0;
3578
3579                if (isSubmission) {
3580                    // Submissions are primary (drive the bar)
3581                    animTarget = submissionTotal;
3582                    raisedMarkup = '<div><span id="raised-count">0</span> supporters</div>';
3583                    goalMarkup = '<div>Goal: ' + numberWithCommas(parseInt(targetNum, 10)) + ' supporters</div>';
3584
3585                    // Secondary: contributions, only if showAll
3586                    if (showAll) {
3587                        secondaryMarkup = '<div class="progress-meter-supporters"><div>$' + numberWithCommas(contributionTotal.toFixed(2)) + ' raised</div></div><div class="divider"></div>';
3588                    }
3589                } else {
3590                    // Contributions are primary (drive the bar)
3591                    animTarget = contributionTotal;
3592                    raisedMarkup = '<div>$<span id="raised-amount">0.00</span> raised</div>';
3593                    goalMarkup = '<div>Goal: $' + numberWithCommas(targetNum.toFixed(2)) + '</div>';
3594
3595                    // Secondary: supporter count, only if showAll
3596                    if (showAll) {
3597                        secondaryMarkup = '<div class="progress-meter-supporters"><div>' + numberWithCommas(submissionTotal) + ' supporters</div></div><div class="divider"></div>';
3598                    }
3599                }
3600
3601                // --- Days-left pill: only build this markup when deadline data exists ---
3602                if (hasDeadline) {
3603
3604                    // --- End states ---
3605                    const timeExpired = meterDaysLeft <= 0 && meterHoursLeft <= 0 && meterMinutesLeft <= 0;
3606                    const goalMet = meterProgress >= 100;
3607
3608                    let pillStateClass = "";
3609                    let pillMessage = "";
3610
3611                    if (goalMet) {
3612                        pillStateClass = " days-left-pill--goal-met";
3613                        pillMessage = "\u26A1 Goal Exceeded";
3614                    } else if (timeExpired) {
3615                        pillStateClass = " days-left-pill--expired";
3616                        pillMessage = "Final Push";
3617                    }
3618
3619                    // --- Countdown units (only when no end-state applies) ---
3620                    if (!goalMet && !timeExpired) {
3621                        if (meterDaysLeft > 0) {
3622                            meterUnitsRemaining = meterDaysLeft + (meterDaysLeft === 1 ? " Day Left" : " Days Left");
3623                            meterPeriodRemaining = "days-remaining time-remains";
3624                        } else if (meterHoursLeft > 0) {
3625                            meterUnitsRemaining = meterHoursLeft + (meterHoursLeft === 1 ? " Hour Left" : " Hours Left");
3626                            meterPeriodRemaining = "hours-remaining time-remains";
3627                        } else if (meterMinutesLeft > 0) {
3628                            meterUnitsRemaining = meterMinutesLeft + (meterMinutesLeft === 1 ? " Minute Left" : " Minutes Left");
3629                            meterPeriodRemaining = "minutes-remaining time-remains";
3630                        }
3631                    }
3632
3633                    meterTimeLeft = '<div class="time-remaining ' + meterPeriodRemaining + '"><div class="days-left-container"><div class="days-left-pill' + pillStateClass + '">'
3634                        + '<svg class="days-left-clock" xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>'
3635                        + '<span class="days-left-message">' + pillMessage + '</span>'
3636                        + '<div class="days-left-text">' + meterUnitsRemaining + '</div>'
3637                        + '</div></div></div>';
3638
3639                } else {
3640                    meterTimeLeft = "";
3641                }
3642
3643                replacementContent = '<figure class="standard"><div class="progress-meter-wrapper"><div class="progress-meter-values"><div class="progress-meter-raised">' + raisedMarkup + '</div><div class="progress-meter-goal">' + goalMarkup + '</div></div><div class="progress-meter"><div class="loading-bar-wrapper loading-bar-success"><progress max="100" value="' + Math.min(meterProgress, 100) + '" id="progressBarDisplay"></progress></div></div><div class="progress-meter-footer">' + secondaryMarkup + '<p class="progress-meter-percentage"><strong id="percentage-text">0</strong>% of goal</p><div class="divider"></div>' + meterTimeLeft + '</div></div></figure>';
3644
3645                $(currentContainer).append(replacementContent);
3646
3647                animateDonationMeter(animTarget, meterProgress, 2000, isSubmission);
3648            });
3649
3650        });
3651
3652        function easeOutCubic(x) {
3653            return 1 - Math.pow(1 - x, 3);
3654        }
3655
3656        function numberWithCommas(number) {
3657            var parts = number.toString().split(".");
3658            parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
3659            return parts.join(".");
3660        }
3661
3662        function animateDonationMeter(targetValue, targetPercent, durationMs, isSubmission) {
3663            const progressBar = document.getElementById('progressBarDisplay');
3664            const raisedAmount = document.getElementById('raised-amount');
3665            const raisedCount = document.getElementById('raised-count');
3666            const percentText = document.getElementById('percentage-text');
3667
3668            const startTime = performance.now();
3669
3670            function updateMeter(currentTime) {
3671                const elapsedTime = currentTime - startTime;
3672                const linearProgress = Math.min(elapsedTime / durationMs, 1);
3673                const easedProgress = easeOutCubic(linearProgress);
3674
3675                const currentValue = easedProgress * targetValue;
3676                const currentPercent = easedProgress * targetPercent;
3677
3678                progressBar.value = Math.min(currentPercent, 100);
3679                percentText.textContent = Math.min(Math.floor(currentPercent), 100);
3680
3681                if (isSubmission) {
3682                    if (raisedCount) raisedCount.textContent = numberWithCommas(Math.floor(currentValue));
3683                } else {
3684                    if (raisedAmount) raisedAmount.textContent = numberWithCommas(currentValue.toFixed(2));
3685                }
3686
3687                if (linearProgress < 1) {
3688                    requestAnimationFrame(updateMeter);
3689                }
3690            }
3691
3692            requestAnimationFrame(updateMeter);
3693        }
3694
3695    }
3696
3697    nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
3698    nvtag_callbacks.postRender.push(testProgBar);
3699
3700</script>
3700
3701<!--- Hotfix 1 // Insert Tettra/Asana --->
3702
3703
3704<style type="text/css">/* Apple Btn */
3705.at-apple-pay-button-wrapper label, .at-apple-pay-button-wrapper:hover label,  .at .at-radio-set-buttons .at-apple-pay-button-wrapper > label:hover {
3706background: #000 !important;
3707}
3708
3709/* EFT Btn: */
3710.at .at-radio-set-buttons .at-eft-button-wrapper > label {
3711display: flex !important;
3712align-items: center !important;
3713justify-content: center !important;
3714}
3715
3716/* Small only */
3717/* Hotfix: Hide */
3718@media screen and (max-width: 39.9375em) {
3719.at-eft-button-wrapper label.at-btn-radio.large::after, [data-org-type="c3"] .at-btn-radio-wrapper.at-eft-button-wrapper::after, [data-theme-color="blue"] .at-btn-radio-wrapper.at-eft-button-wrapper::before {
3720display: none !important;
3721}
3722}
3723
3724/* Hotfix 2 // EA "Secure Processing" Styles */
3725
3726.secure-processing-single-step-div {
3727    position: relative;
3728    float: none !important;
3729    text-align: center !important;
3730    }
3731    
3732    .authorize-payment-label {
3733        margin-top: 10px !important;
3734    }
3735    
3736/* Hotfix 3 - (5.24.24) "Re-displaying #TYAboutGift on donation pages" 
3737    #TYAboutGift {
3738        display: block !important;
3739    }
3740*/
3741
3742/* Hotfix 4 [08.02.24] - Gender/Sex Pref Labels Overlay */
3743.at-select.Genders, .at-select.PreferredLanguages {
3744    z-index: auto;
3745}
3746
3747/* Hotfix 5 [03.28.25] - Birthday Calendar Picker Displaying underneath other fields */
3748#ui-datepicker-div {
3749    z-index: 99 !important;
3750}
3751
3752</style>
3753<!--- 2. autoQA --->
3754
3755
3756<!--- 3. Developer Mode --->
3757<!--- 1. C3 Demographic Survey --->
3758<!--- 2. C3 Latinx Organizing Signup ES --->
3759<!--- 3. C3 Year-End Resolutions --->
3760<!--- 4. C3 People's Brief Lawsuit Styling Script --->
3761<!--- 5. C3 Court Reform "Read More" Toggle --->
3762<!--- 6. C4 Valentines IHO --->
3763<!--- 7. C4 Demographic Survey --->
3764<!--- 8. C4 Latinos for PP --->
3765<!--- 9. C4 Latinos for PP ES --->
3766<!--- 10. C4 General Pledge ES --->
3767<!--- 11. C4 Repro Villains IHO --->
3768<!--- 12. Fireworks Styling --->
3769<!-- 13. C3 Low Monthly Sustainer -->
3770<!--- 14. Advocacy Field Move --->
3771<!--- 15. Dynamic Covered Cost --->
3772<!--- 16. 2407_c3_EmailForm_VibeCheck_Survey_1017076 Vibe Check Preselect --->
3773<script nonce="744a3226-3f25-411c-9500-973157837f5a">
3774var myPostRender = function(vals) {
3775  (function ($) {
3776    
3777// Original JavaScript getCookie code by Chirp Internet: www.chirp.com.au
3778
3779    var mappedGA = ('input[name*="MappedCustomFormFieldQuestion_44"]');
3780    var mappedMS = ('input[name*="MappedCustomFormFieldQuestion_46"]');
3781    
3782    // Does this form have a GA Client ID Field?
3783    if ($(mappedGA ).length){
3784        
3785        // hide GA question on affiliate forms
3786        $('div[class*="MappedCustomFormFieldQuestion_44"]').hide();
3787
3788        function getCookie(name) {
3789            var re = new RegExp(name + "=([^;]+)");
3790            var value = re.exec(document.cookie);
3791            return (value != null) ? unescape(value[1]) : null;
3792        }
3793        var gaClientId = getCookie("_ga");
3794        // Populate hidden field with GA cookie value
3795        $('input[name*="MappedCustomFormFieldQuestion_44"]').val(gaClientId);
3796        
3797    }
3798    // Does this form have a MS Field?
3799    if ($(mappedMS ).length){
3800        
3801        // hide default market source question on affiliate forms
3802        $('div[class*="MappedCustomFormFieldQuestion_46"]').hide();
3803        
3804                $('input[name*="MappedCustomFormFieldQuestion_46"]').val('4NIAzzz0zX1ANz');
3805            }
3806  }(jQuery));
3807};
3808
3809
3810var nvtag_callbacks = nvtag_callbacks || {};
3811nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
3812nvtag_callbacks.postRender.push(myPostRender);
3813</script>
3813
3814    
3815<script nonce="744a3226-3f25-411c-9500-973157837f5a">
3816
3817  // change variable below to be your default marketsource code. Eventually, could make a theme based input field to populate that as a merge field
3818    var defaultMs = '4NIAzzz0zX1ANz';
3819    var addMs = function (args) {
3820        var postData = new Object();
3821        postData = args.data;
3822        // actiontag loads lodash by default, hence why we can use that in the line below
3823        if (_.has(postData, "MarketSource")){ // if a marketsource is already populated in the form post (from the url, presumably), just return the post data
3824                      //Directed forms should always just use default value, we don't want anything other than 1N1D
3825          return args;
3826        }
3827        else { // lacking a marketsource code, add it to the post data object from the variable declared above
3828            args.data.MarketSource = defaultMs;
3829            return args;
3830        }
3831    }
3832    
3833var nvtag_callbacks = nvtag_callbacks || {};
3834nvtag_callbacks.alterPost = nvtag_callbacks.alterPost || [];
3835nvtag_callbacks.alterPost.push(addMs);
3836</script>
vendor: 2 bytes, line 3836
3836
3837<script nonce="744a3226-3f25-411c-9500-973157837f5a">
3838
3839var myPostRender = function(vals) {
3840    (function ($) {
3841        $('.ea-delay-display').show();
3842        if ($('.content.thankYou').length){
3843            $('#TYAboutGift').show();
3844            $('#PrivacyPolicy').hide();
3845        }
3846        else{
3847            var $privacyDiv = $('#PrivacyPolicy').clone();
3848            $('.at-form-submit.clearfix').append($privacyDiv);
3849            $('.at-form-submit.clearfix #PrivacyPolicy').show();
3850            $('#PrivacyPolicy_original').remove();
3851        }
3852    }(jQuery));
3853};
3854
3855var nvtag_callbacks = nvtag_callbacks || {};
3856nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
3857nvtag_callbacks.postRender.push(myPostRender);
3858</script>
3858
3859
3860
3861<script nonce="744a3226-3f25-411c-9500-973157837f5a">
3862      var myPostRender = function(args) {
3863          (function ($) {
3864            $(".PaymentMethodSection > legend").text("Choose Your Payment Method to Continue:");
3865            $(".at-credit-card-button-wrapper > label").text("Credit Card");
3866
3867            // Changes Credit Card Button Text Back
3868            $( document ).ready(function() {
3869                  var ccText = () => {
3870                    let textChange = () => { $(".at-credit-card-button-wrapper > label").text("Credit Card");}
3871                    setTimeout(textChange,.05);
3872                  }
3873                  $(".radios input").change(ccText());
3874                  $(".radios label input").click(ccText);
3875            })
3876
3877      }(jQuery));
3878          return args;
3879    };
3880    var nvtag_callbacks = nvtag_callbacks || {};
3881    nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
3882    nvtag_callbacks.postRender.push(myPostRender);
3883</script>
3883
3884
3885
3886
3887<!--- START EG_ACH_Tooltip_css --->
3888<style type="text/css">/* C3 & C4 Color Sync */
3889    [data-theme-color="pink"] .at-eft-button-wrapper label.at-btn-radio.large::after,    [data-theme-color="pink"]  .at-btn-radio-wrapper.at-eft-button-wrapper::after {background: #ec008c;}
3890    [data-theme-color="pink"]  .at-btn-radio-wrapper.at-eft-button-wrapper::before {        border-bottom: 10px solid #ec008c;}
3891
3892    [data-theme-color="blue"] .at-eft-button-wrapper label.at-btn-radio.large::after,    [data-theme-color="blue"]  .at-btn-radio-wrapper.at-eft-button-wrapper::after {background: #005DA6;}
3893    [data-theme-color="blue"]  .at-btn-radio-wrapper.at-eft-button-wrapper::before {        border-bottom: 10px solid #005DA6;}
3894
3895    /* C3 & C4 Content */
3896    [data-org-type="c4"] .at-btn-radio-wrapper.at-eft-button-wrapper::after {
3897        content: "Pay with an automatic deduction from your bank account — it's safe, convenient, and means more of your gift goes to support Planned Parenthood Action Fund.";
3898    }
3899
3900    [data-org-type="c3"] .at-btn-radio-wrapper.at-eft-button-wrapper::after {
3901        content: "Pay with an automatic deduction from your bank account — it's safe, convenient, and means more of your gift goes to support Planned Parenthood.";
3902    }
3903
3904    /* Styling */
3905
3906    .at-eft-button-wrapper label.at-btn-radio.large::after {
3907        content: "?";
3908        position: absolute;
3909
3910        border-radius: 50px;
3911        font-size: 12px;
3912        width: 15px;
3913        font-weight: bold;
3914        right: 6px;
3915        top: 16px;
3916        height: 15px;
3917        color: #fff;
3918        border: none;
3919    }
3920
3921
3922
3923    /* Arrow Decor */
3924    .at-btn-radio-wrapper.at-eft-button-wrapper::before {
3925        width: 0;
3926        height: 0;
3927        border-left: 10px solid transparent;
3928        border-right: 10px solid transparent;
3929
3930        content: '';
3931        position: absolute;
3932        left: 50%;
3933        bottom: -10px;
3934        margin-left: -10px;
3935    }
3936
3937    /* Text box */
3938    .at-btn-radio-wrapper.at-eft-button-wrapper::after {
3939        font-size: .9em;
3940        display: flex;
3941        position: absolute;
3942        line-height: 23px;
3943        padding: 10px;
3944        left: 0;
3945        color: #fff;
3946        z-index: 99999;
3947
3948    }
3949
3950    /* Transition */
3951
3952    .at-btn-radio-wrapper.at-eft-button-wrapper::before,
3953    .at-btn-radio-wrapper.at-eft-button-wrapper::after {
3954        z-index: -5;
3955        opacity: 0;
3956        transition: .1s ease all;
3957        margin-top: -15px;
3958    }
3959
3960    .at-eft-button-wrapper:hover::before,
3961    .at-eft-button-wrapper:hover::after {
3962        opacity: 1 !important;
3963        margin-top: 0px !important;
3964        z-index: 99999;
3965
3966    }
3967
3968
3969    /*  Style ACH Section  */
3970
3971    .at-eft-accepted-here select, .at-eft-accepted-here input, .at-eft-accepted-here label {
3972        width: 100% !important;
3973    }
3974
3975    /* MEDIA QUERIES */
3976
3977/* Small only */
3978@media screen and (max-width: 39.9375em) {
3979
3980.at-eft-accepted-here .at-row-half {
3981width: 100% !important;
3982}
3983
3984}
3985
3986
3987    /* Spec. Medium Only */
3988    @media screen and (min-width: 63.5em) and (max-width: 68em) {
3989        .at-eft-button-wrapper label {
3990        padding: 1rem 1.3rem !important;
3991        }
3992
3993    }
3994
3995    @media screen and (min-width: 68.5em) and (max-width: 70em) {
3996        .at-eft-button-wrapper label {
3997            font-size: .65rem !important;
3998            padding: .4rem 1.3rem !important;
3999            line-height: 11px !important;
4000        }
4001
4002
4003
4004
4005    }
4006
4007    /* Medium  & UP */
4008    @media screen and (min-width: 58.5em) {
4009        .at-eft-button-wrapper label {
4010            font-size: .75rem !important;
4011            padding: .5rem 1.3rem !important;
4012        }
4013    }
4014</style>
4015
4016
4017<!--- Proof --->
4018<script nonce="744a3226-3f25-411c-9500-973157837f5a">
4019
4020var myPostRender = function(vals) {
4021    (function ($) {
4022        
4023        var tryMonthlyNotice = function()
4024        {
4025            // EveryAction can be slow to update the "OtherAmount" field
4026            // when toggling between One-Time and Monthly, so we wrap everything
4027            // in an immediate setTimeout:
4028            window.setTimeout(function()
4029            {
4030                var isMonthlyGift = false;
4031                var currentGiftAmount = 0;
4032
4033                // Check monthly only form hidden field
4034                if (!!document.querySelector('.at-recurring')) {
4035                    if(document.querySelector('.at-recurring .SelectedFrequency span').textContent.includes('Monthly')){
4036                        isMonthlyGift = true;
4037                    }
4038                }
4039                
4040                // Get selected frequency:
4041                // Frequency is "4" for a monthly gift
4042                if ($('[name="SelectedFrequency"]:checked').val() == 4)
4043                {
4044                    isMonthlyGift = true;
4045                }
4046                
4047                // Get selected gift amount:
4048                currentGiftAmount = $('[name="SelectAmount"]:checked').val();
4049                if (currentGiftAmount == "other")
4050                {
4051                    currentGiftAmount = $('[name="OtherAmount"]').val();
4052                }
4053
4054                if (isMonthlyGift && currentGiftAmount > 84)
4055                {
4056                    // Show blurb:
4057                    $("#monthlyWarnAmount").html(currentGiftAmount.replace(".00", ""));
4058                    $("#monthlyWarn").css("display", "block");
4059                }
4060                else
4061                {
4062                    // Hide blurb:
4063                    $("#monthlyWarn").css("display", "none");
4064                }
4065            }, 1);
4066        };
4067        
4068        // Insert blurb, hidden:
4069        $('.at-fieldset.ContributionInformation').append('<div id="monthlyWarn" style="display: none; padding-bottom: 24px; padding-left: 12px; color: #c9084c;">You are making a monthly gift of $<span id="monthlyWarnAmount"></span>. If you do not want to make a monthly gift, please select another option above.</div>');
4070        
4071        // Monitor gift frequency / gift amount changes:
4072        $('body').on("change click keyup", '[name="SelectedFrequency"], [name="SelectAmount"], [name="OtherAmount"]', function()
4073        {
4074            tryMonthlyNotice();
4075        });
4076        
4077        // Just in case it should be shown when the page loads, trigger a change event:
4078        $('[name="SelectAmount"]').change();
4079
4080
4081    }(jQuery));
4082};
4083
4084var nvtag_callbacks = nvtag_callbacks || {};
4085nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
4086nvtag_callbacks.postRender.push(myPostRender);
4087</script>
vendor: 2 bytes, line 4087
4087
4088<script nonce="744a3226-3f25-411c-9500-973157837f5a">
4089      var myPostRender = function(args) {
4090          (function ($) {
4091            
4092		  // Add c4 earmarking blurb after donation form intro copy
4093		  $('<p class="small earmarking"><em>Contributions to Planned Parenthood Action Fund will not be earmarked for any purpose, and will generally support our activities to protect and promote reproductive health nationwide.</em></p>').insertAfter('header.at-markup.HeaderHtml p:last');
4094
4095      }(jQuery));
4096          return args;
4097    };
4098    var nvtag_callbacks = nvtag_callbacks || {};
4099    nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
4100    nvtag_callbacks.postRender.push(myPostRender);
4101</script>
vendor: 2 bytes, line 4101
4101
4102<script nonce="744a3226-3f25-411c-9500-973157837f5a">
4103    
4104    
4105    var assocMemVal = "";
4106    
4107    var myPostRender2 = function(args) {
4108        window.adTap = false;
4109        adTap = window.adTap;
4110    
4111      $("input[type='submit']").on('click', function(e) {
4112    
4113        // only execute if there is an associate membership question on this form
4114    
4115        if($("select[name*='_MappedSurveyQuestion_203938']").length) {
4116    
4117          assocMemVal = $("select[name*='_MappedSurveyQuestion_203938']").val();
4118          console.log("assocMemField name: " + $("select[name*='_MappedSurveyQuestion_203938']").attr("name"));
4119          console.log("assocMemVal: " + assocMemVal);
4120    
4121          if($("select[name*='_MappedSurveyQuestion_203938']").hasClass("required")) {
4122            // if the associate membership question on this form is a required field, do nothing
4123          } else {
4124    
4125            if(assocMemVal == "") {
4126              // stop form submission
4127              e.preventDefault();
4128              if($("label[class*='_MappedSurveyQuestion_203938']").hasClass("error")) {
4129                // do nothing since error is already shown
4130                return false;
4131              } else {
4132                // generate error as if question was required
4133                $("fieldset.AdditionalInformation").focus();
4134                $("label[class*='_MappedSurveyQuestion_203938']").addClass("error");
4135                $("label[class*='_MappedSurveyQuestion_203938']").append("<small class='error' style='display: block;'>A response is required. By selecting \"Yes,\" you will become a member of Planned Parenthood Action Fund. <u>Membership is free</u> and allows you full access to timely Action Fund updates, including information about our grassroots organizing, legislative and regulatory advocacy, electoral endorsements, and volunteer opportunities in your area &mdash; and gives you an opportunity to vote for a member of the Action Fund Board of Directors.</small>");
4136              }
4137            } else if(assocMemVal == "860301") {
4138              // leave as is
4139              assocMemVal == "860301";
4140            } else if(assocMemVal == "860302") {
4141              // set to blank if value is no
4142             // $("select[name*='_MappedSurveyQuestion_203938']").val("");
4143
4144              // if advocacy form and submit button taps twice
4145              if($( "div[id*='VAdvocacyForm']" ).length) {
4146                    
4147
4148                    if (!adTap) {
4149                        adTap = true;
4150                    }
4151
4152                    else {
4153                        $("select[name*='_MappedSurveyQuestion_203938']").val("");
4154                        adTap = false;
4155                    }
4156                
4157            
4158            // If no adv form, proceed as normal
4159            } else {
4160
4161                //dev
4162                $("select[name*='_MappedSurveyQuestion_203938']").val("");
4163            }
4164
4165            } else {
4166              // when in doubt set to blank
4167              $("select[name*='_MappedSurveyQuestion_203938']").val("");
4168            }
4169          }
4170    
4171        }
4172        assocMemVal = $("select[name*='_MappedSurveyQuestion_203938']").val();
4173        console.log("final assocMemVal: " + assocMemVal);
4174      });
4175      
4176      return args;
4177    };
4178    
4179    nvtag_callbacks.postRender.push(myPostRender2);
4180    
4181    
4182</script>
4182
4183
4184<!--- E Cards
4185
4186--->
4187
4188<!-- START OA_Theme_JS_ABTasty_pt2_NAT -->
4189<script nonce="744a3226-3f25-411c-9500-973157837f5a">
4190
4191var myPreSegue = function(args) {
4192
4193	// console.log(args.postVals);
4194
4195	var marketSource;
4196	var amount;
4197	var currency;
4198	var paymentMethod;
4199	var recurringFrequency;
4200	var formURL;
4201
4202	marketSource = "4NIAzzz0zX1ANz";
4203	if(marketSource == "") { marketSource = "unknown"; }
4204	amount = args.postVals.Amount;
4205	if(amount == "") { amount = "0"; }
4206	currency = args.postVals.ProcessingCurrency;
4207	paymentMethod = args.postVals.PaymentMethod;
4208	recurringFrequency = args.postVals.SelectedFrequency;
4209	if(recurringFrequency == "0") { recurringFrequency = "one-time"; }
4210	if(recurringFrequency == "4") { recurringFrequency = "monthly"; }
4211	formURL = window.location.href;
4212
4213	window.abtasty.send("transaction", { 
4214		tid: marketSource, // transaction id format string 
4215		ta: "Donation2", // transaction affiliation format string 
4216		tr: amount, // transaction revenue format float 
4217		tc: currency, // transaction currency format string 
4218		tcc: formURL, // transaction coupon code format string
4219		pm: paymentMethod, // payment method format string
4220		sm: recurringFrequency, // shipping method format string
4221		icn: 1
4222	});
4223
4224	return args;
4225}
4226var nvtag_callbacks = nvtag_callbacks || {};
4227nvtag_callbacks.preSegue = nvtag_callbacks.preSegue || [];
4228nvtag_callbacks.preSegue.push(myPreSegue);
4229
4230</script>
4230
4231<!-- END OA_Theme_JS_ABTasty_pt2_NAT -->
4232
4233
4234    
4235
4236    
4236<script nonce="744a3226-3f25-411c-9500-973157837f5a" type="text/javascript">
4237        // This code is provided by Microsoft (Application Insights JS SDK loader v8).
4238        // It is a vendored, minified third-party snippet — its compact style
4239        // (hoisted vars, dense IIFEs, browser-builtin names like XMLHttpRequest)
4240        // is not something we author or maintain, so suppress all ReSharper JS
4241        // inspections for this function. Restore at the end of the function.
4242        // ReSharper disable All
4243    function cookieSettingsAcceptCookiesAi() {
4244        !(function (cfg) { function e() { cfg.onInit && cfg.onInit(n) } var x, w, D, t, E, n, C = window, O = document, b = C.location, q = "script", I = "ingestionendpoint", L = "disableExceptionTracking", j = "ai.device."; "instrumentationKey"[x = "toLowerCase"](), w = "crossOrigin", D = "POST", t = "appInsightsSDK", E = cfg.name || "appInsights", (cfg.name || C[t]) && (C[t] = E), n = C[E] || function (g) { var f = !1, m = !1, h = { initialize: !0, queue: [], sv: "8", version: 2, config: g }; function v(e, t) { var n = {}, i = "Browser"; function a(e) { e = "" + e; return 1 === e.length ? "0" + e : e } return n[j + "id"] = i[x](), n[j + "type"] = i, n["ai.operation.name"] = b && b.pathname || "_unknown_", n["ai.internal.sdkVersion"] = "javascript:snippet_" + (h.sv || h.version), { time: (i = new Date).getUTCFullYear() + "-" + a(1 + i.getUTCMonth()) + "-" + a(i.getUTCDate()) + "T" + a(i.getUTCHours()) + ":" + a(i.getUTCMinutes()) + ":" + a(i.getUTCSeconds()) + "." + (i.getUTCMilliseconds() / 1e3).toFixed(3).slice(2, 5) + "Z", iKey: e, name: "Microsoft.ApplicationInsights." + e.replace(/-/g, "") + "." + t, sampleRate: 100, tags: n, data: { baseData: { ver: 2 } }, ver: undefined, seq: "1", aiDataContract: undefined } } var n, i, t, a, y = -1, T = 0, S = ["js.monitor.azure.com", "js.cdn.applicationinsights.io", "js.cdn.monitor.azure.com", "js0.cdn.applicationinsights.io", "js0.cdn.monitor.azure.com", "js2.cdn.applicationinsights.io", "js2.cdn.monitor.azure.com", "az416426.vo.msecnd.net"], o = g.url || cfg.src, r = function () { return s(o, null) }; function s(d, t) { if ((n = navigator) && (~(n = (n.userAgent || "").toLowerCase()).indexOf("msie") || ~n.indexOf("trident/")) && ~d.indexOf("ai.3") && (d = d.replace(/(\/)(ai\.3\.)([^\d]*)$/, function (e, t, n) { return t + "ai.2" + n })), !1 !== cfg.cr) for (var e = 0; e < S.length; e++)if (0 < d.indexOf(S[e])) { y = e; break } var n, i = function (e) { var a, t, n, i, o, r, s, c, u, l; h.queue = [], m || (0 <= y && T + 1 < S.length ? (a = (y + T + 1) % S.length, p(d.replace(/^(.*\/\/)([\w\.]*)(\/.*)$/, function (e, t, n, i) { return t + S[a] + i })), T += 1) : (f = m = !0, s = d, !0 !== cfg.dle && (c = (t = function () { var e, t = {}, n = g.connectionString; if (n) for (var i = n.split(";"), a = 0; a < i.length; a++) { var o = i[a].split("="); 2 === o.length && (t[o[0][x]()] = o[1]) } return t[I] || (e = (n = t.endpointsuffix) ? t.location : null, t[I] = "https://" + (e ? e + "." : "") + "dc." + (n || "services.visualstudio.com")), t }()).instrumentationkey || g.instrumentationKey || "", t = (t = (t = t[I]) && "/" === t.slice(-1) ? t.slice(0, -1) : t) ? t + "/v2/track" : g.endpointUrl, t = g.userOverrideEndpointUrl || t, (n = []).push((i = "SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)", o = s, u = t, (l = (r = v(c, "Exception")).data).baseType = "ExceptionData", l.baseData.exceptions = [{ typeName: "SDKLoadFailed", message: i.replace(/\./g, "-"), hasFullStack: !1, stack: i + "\nSnippet failed to load [" + o + "] -- Telemetry is disabled\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\nHost: " + (b && b.pathname || "_unknown_") + "\nEndpoint: " + u, parsedStack: [] }], r)), n.push((l = s, i = t, (u = (o = v(c, "Message")).data).baseType = "MessageData", (r = u.baseData).message = 'AI (Internal): 99 message:"' + ("SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) (" + l + ")").replace(/\"/g, "") + '"', r.properties = { endpoint: i }, o)), s = n, c = t, JSON && ((u = C.fetch) && !cfg.useXhr ? u(c, { method: D, body: JSON.stringify(s), mode: "cors" }) : XMLHttpRequest && ((l = new XMLHttpRequest).open(D, c), l.setRequestHeader("Content-type", "application/json"), l.send(JSON.stringify(s))))))) }, a = function (e, t) { m || setTimeout(function () { !t && h.core || i() }, 500), f = !1 }, p = function (e) { var n = O.createElement(q), e = (n.src = e, t && (n.integrity = t), n.setAttribute("data-ai-name", E), cfg[w]); return !e && "" !== e || "undefined" == n[w] || (n[w] = e), n.onload = a, n.onerror = i, n.onreadystatechange = function (e, t) { "loaded" !== n.readyState && "complete" !== n.readyState || a(0, t) }, cfg.ld && cfg.ld < 0 ? O.getElementsByTagName("head")[0].appendChild(n) : setTimeout(function () { O.getElementsByTagName(q)[0].parentNode.appendChild(n) }, cfg.ld || 0), n }; p(d) } cfg.sri && (n = o.match(/^((http[s]?:\/\/.*\/)\w+(\.\d+){1,5})\.(([\w]+\.){0,2}js)$/)) && 6 === n.length ? (d = "".concat(n[1], ".integrity.json"), i = "@".concat(n[4]), l = window.fetch, t = function (e) { if (!e.ext || !e.ext[i] || !e.ext[i].file) throw Error("Error Loading JSON response"); var t = e.ext[i].integrity || null; s(o = n[2] + e.ext[i].file, t) }, l && !cfg.useXhr ? l(d, { method: "GET", mode: "cors" }).then(function (e) { return e.json()["catch"](function () { return {} }) }).then(t)["catch"](r) : XMLHttpRequest && ((a = new XMLHttpRequest).open("GET", d), a.onreadystatechange = function () { if (a.readyState === XMLHttpRequest.DONE) if (200 === a.status) try { t(JSON.parse(a.responseText)) } catch (e) { r() } else r() }, a.send())) : o && r(); try { h.cookie = O.cookie } catch (k) { } function e(e) { for (; e.length;)!function (t) { h[t] = function () { var e = arguments; f || h.queue.push(function () { h[t].apply(h, e) }) } }(e.pop()) } var c, u, l = "track", d = "TrackPage", p = "TrackEvent", l = (e([l + "Event", l + "PageView", l + "Exception", l + "Trace", l + "Depen
4244dencyData", l + "Metric", l + "PageViewPerformance", "start" + d, "stop" + d, "start" + p, "stop" + p, "addTelemetryInitializer", "setAuthenticatedUserContext", "clearAuthenticatedUserContext", "flush"]), h.SeverityLevel = { Verbose: 0, Information: 1, Warning: 2, Error: 3, Critical: 4 }, (g.extensionConfig || {}).ApplicationInsightsAnalytics || {}); return !0 !== g[L] && !0 !== l[L] && (e(["_" + (c = "onerror")]), u = C[c], C[c] = function (e, t, n, i, a) { var o = u && u(e, t, n, i, a); return !0 !== o && h["_" + c]({ message: e, url: t, lineNumber: n, columnNumber: i, error: a, evt: C.event }), o }, g.autoExceptionInstrumented = !0), h }(cfg.cfg), (C[E] = n).queue && 0 === n.queue.length ? (n.queue.push(e), n.trackPageView({})) : e(); })({
4245            src: "https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js",
4246            crossOrigin: "anonymous",
4247            onInit: function (sdk) {
4248                sdk.addTelemetryInitializer(function (envelope) {
4249                    var telemetryItem = envelope.data;
4250                    var telemetryBaseData = envelope.baseData;
4251
4252                    // remove auth from req headers
4253                    if (telemetryBaseData.properties && telemetryBaseData.properties.requestHeaders) {
4254                        var requestHeaders = telemetryBaseData.properties.requestHeaders;
4255                        Object.keys(requestHeaders).forEach(function (key) {
4256                            if (key.toLowerCase() === "authorization") {
4257                                delete requestHeaders[key];
4258                            }
4259                        });
4260                    }
4261
4262                    // Set custom properties
4263                    telemetryItem["Application"] = 'Forms-prod';
4264                    // For custom events, make sure we have the URL of the current page
4265                    if (envelope.baseType == "EventData" || envelope.baseType == "RemoteDependencyData") {
4266                        telemetryItem["Location"] = telemetryItem["Location"] || window.location.href;
4267                    }
4268
4269                    return true;
4270                });
4271            },
4272            cfg: {
4273                connectionString: "InstrumentationKey=def53ae9-b7c9-41b7-abab-9c939b304095;IngestionEndpoint=https://southcentralus-0.in.applicationinsights.azure.com/;LiveEndpoint=https://southcentralus.livediagnostics.monitor.azure.com/;ApplicationId=ccd92c0b-19c7-485c-b607-cbfe2344efa3",
4274                enableAjaxErrorStatusText: true,
4275                enableRequestHeaderTracking: true,
4276                enableResponseHeaderTracking: true
4277            }
4278        });
4279        // ReSharper restore All
4280    }
4281
4282        
4283            cookieSettingsAcceptCookiesAi();
4284        
4285
4286
4287    </script>
4287
4288
4289    
4290<script nonce="744a3226-3f25-411c-9500-973157837f5a">
4291    // Logs errors for script tags with the attribute data-log-errors="true"
4292    function handleScriptLoadError(e) {
4293        if (window.appInsights && e && e.target && e.target.nodeName == 'script' && e.target.dataset && e.target.dataset.logErrors == "true" ) {
4294            window.appInsights.trackEvent({name: 'Script Load Failure',
4295                properties: {
4296                    ScriptSrc: e.target.src,
4297                    ScriptCrossorigin: e.target.getAttribute('crossorigin'),
4298                    ScriptType: e.target.getAttribute('type')
4299                }
4300            });
4301        }
4302    }
4303    window.onerror = handleScriptLoadError();
4304</script>
4304
4305</head>
4306<body >
4307    <!-- NGPVAN Body Content -->
4308    <div class="content ngp-content">
4309        <!-- Custom Body Content -->
4310        <div class="page-wrap " >
4311    <header class="site-header has-icon-nav magic-header site-header-with-banner top not-bottom ea-donate-header" id="site-header" data-section-name="header">
4312<div class="site-header-outer-wrapper">
4313<div class="site-header-wrapper">
4314<span class="site-logo" data-logo="PPFA">
4315<a href="https://plannedparenthoodaction.org"><img src="https://nvlupin.blob.core.windows.net/images/van/AV/PPFA/1/11607/images/Themes/Evergreen/Web/Logos/planned-parenthood-action-horizontal.svg" alt="Planned Parenthood Action Fund" title="Back to home"></a>
4316</span><!-- end site-logo -->
4317</div><!-- end site-header-wrapper -->
4318</div><!-- end site-header-outer-wrapper -->
4319</header>
4320    <main class="site-main theme-marble">
4321        
4322
4323<div class="ngp-form"
4324     data-form-url="https://secure.ngpvan.com/v1/Forms/KDlEsm4r6EizP0SdpEj8Fg2"
4325          data-fastaction-endpoint="https://fastaction.ngpvan.com"
4326     data-inline-errors="true"
4327     data-fastaction-nologin="true"
4328         data-formbuilder-hosted="true"
4329            data-script-execution-mode="block"
4330          data-mobile-autofocus="true">
4331</div>
4332
4333
4334        
4334<script nonce="744a3226-3f25-411c-9500-973157837f5a">
4335    // find the form element by class name.  Needs to be placed after the form embed html.
4336    var formElements = document.getElementsByClassName('ngp-form');
4337    // Set autofocus off for all forms found
4338    for (var i = 0; i < formElements.length; i++) {
4339        formElements.item(i).dataset.mobileAutofocus = false;
4340    }
4341</script>
4341
4342         <div id="TYSocialShare_original">
4343<div id="TYSocialShare_container">    
4344        <div id="TYSocialShare">
4345        
4346       
4347
4348<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.weareplannedparenthoodaction.org%2Fonlineactions%2FKDlEsm4r6EizP0SdpEj8Fg2%3Fsnw%3D1%26ref%3D" title="Share on Facebook" target="_blank">
4349     
4350
4351
4352<div class="TYSocialShare-image">
4353<img src="https://nvlupin.blob.core.windows.net/images/van/AV/PPFA/1/9816/images/Social/GenericDonate/StillHereNoMatterWhat_GiveNow_C4_1200.png" alt="Facebook Image">
4354</div>
4355
4356<div class="TYSocialShare-copy small">
4357
4358<p class="TYSocialShare-copyTitle small"><strong>Fight for abortion access and repro rights.</strong></p>
4359
4360<p class="TYSocialShare-copyDescription small">
4361Reproductive health and rights are on the line.  Don't let extremists win. Donate to Planned Parenthood Action Fund now.
4362</p>
4363
4364</div>
4365
4366
4367
4368</a>
4369
4370</div>
4371</div></div>
4372<style type="text/css">
4373
4374#twShareBtn.disabled-hide {
4375    display: none !important;
4376}
4377
4378main .thankYou .btn-social.btn-threads {
4379    margin-left: 5px;
4380}
4381
4382.thankYou .btn-threads {
4383    background: #000;
4384    color: #fff;
4385}
4386
4387.thankYou .btn-threads::before {
4388    content: url("data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%0A%09%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%220%200%2016%2018.2%22%20overflow%3D%22visible%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23FFFFFF%22%20d%3D%22M8.1%2C18.2L8.1%2C18.2c-2.7%2C0-4.8-0.9-6.2-2.7C0.7%2C14%2C0%2C11.9%2C0%2C9.1v0c0-2.7%2C0.7-4.9%2C1.9-6.4%0A%09%09C3.3%2C1%2C5.4%2C0.1%2C8.1%2C0h0h0c2.1%2C0%2C3.8%2C0.5%2C5.2%2C1.6c1.3%2C1%2C2.2%2C2.4%2C2.7%2C4.1l-1.5%2C0.4c-0.8-3-3-4.5-6.3-4.6c-2.2%2C0-3.9%2C0.7-5%2C2.1%0A%09%09C2.1%2C5%2C1.6%2C6.8%2C1.6%2C9.1c0%2C2.3%2C0.5%2C4.2%2C1.6%2C5.4c1.1%2C1.4%2C2.7%2C2%2C5%2C2.1c2%2C0%2C3.3-0.5%2C4.4-1.5c1.2-1.2%2C1.2-2.7%2C0.8-3.6%0A%09%09c-0.2-0.5-0.7-1-1.2-1.3c-0.1%2C1-0.5%2C1.9-1%2C2.5c-0.7%2C0.8-1.6%2C1.3-2.8%2C1.4c-0.9%2C0-1.8-0.2-2.5-0.6C5%2C12.8%2C4.6%2C12%2C4.5%2C11.1%0A%09%09c0-0.9%2C0.3-1.7%2C1-2.3c0.7-0.6%2C1.6-0.9%2C2.7-1c0.8%2C0%2C1.6%2C0%2C2.3%2C0.1c-0.1-0.6-0.3-1-0.6-1.3C9.6%2C6.1%2C9%2C5.9%2C8.2%2C5.9c0%2C0%2C0%2C0%2C0%2C0%0A%09%09c-0.6%2C0-1.5%2C0.2-2.1%2C1L4.7%2C6c0.7-1.1%2C1.9-1.7%2C3.4-1.7c0%2C0%2C0%2C0%2C0%2C0c2.4%2C0%2C3.9%2C1.5%2C4%2C4.1c0.1%2C0%2C0.2%2C0.1%2C0.2%2C0.1%0A%09%09c1.1%2C0.5%2C2%2C1.3%2C2.4%2C2.3c0.6%2C1.4%2C0.7%2C3.6-1.2%2C5.4C12.2%2C17.6%2C10.5%2C18.2%2C8.1%2C18.2L8.1%2C18.2L8.1%2C18.2z%20M8.9%2C9.4c-0.2%2C0-0.4%2C0-0.6%2C0%0A%09%09C6.9%2C9.5%2C6.1%2C10.1%2C6.1%2C11c0.1%2C1%2C1.1%2C1.4%2C2.1%2C1.3c0.9%2C0%2C2.1-0.4%2C2.3-2.8C10%2C9.4%2C9.5%2C9.4%2C8.9%2C9.4z%22%2F%3E%0A%3C%2Fg%3E%0A%3C%2Fsvg%3E");
4389    width: 16px;
4390    height: 18.2px;
4391}
4392
4393</style>
4394
4395<script nonce="744a3226-3f25-411c-9500-973157837f5a">
4396      var myPostRender = function(args) {
4397          (function ($) {
4398
4399                // if Twitter button is present on the page
4400                if ($('#twShareBtn').length) {
4401
4402                    // hide Twitter button
4403                    $('#twShareBtn').addClass('disabled-hide');
4404                }
4405
4406      }(jQuery));
4407          return args;
4408    };
4409    var nvtag_callbacks = nvtag_callbacks || {};
4410    nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
4411    nvtag_callbacks.postRender.push(myPostRender);
4412</script>
4412
4413
4414<script nonce="744a3226-3f25-411c-9500-973157837f5a">
4415      var myPostRender = function(args) {
4416          (function ($) {
4417            
4418		        // if Facebook button is present on the page
4419          		if ($('#fbShareBtn').length) {
4420
4421                    // get share post URL
4422                    var shareURL = $('#fbShareBtn').attr('data-trackingurl');
4423
4424                    // encode share post text
4425                    var post = encodeURIComponent("Reproductive health and rights are on the line.  Don't let extremists win. Donate to Planned Parenthood Action Fund now.");
4426
4427          			// add Threads button after Facebook button
4428                    $('#fbShareBtn').after('<a href="https://threads.net/intent/post?text='+post+'&amp;url='+shareURL+'" title="Share on Threads" target="_blank"><button id="thShareBtn" class="btn btn-social btn-threads inline-block">Share</button></a>');
4429          		}
4430
4431      }(jQuery));
4432          return args;
4433    };
4434    var nvtag_callbacks = nvtag_callbacks || {};
4435    nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
4436    nvtag_callbacks.postRender.push(myPostRender);
4437</script>
vendor: 2 bytes, line 4437
4437
4438<script nonce="744a3226-3f25-411c-9500-973157837f5a">
4439
4440    let tyAboutYourGift = () => {
4441
4442        if (document.querySelector('.at-form.at-mode-person .thankYou')) {
4443
4444            let tyAboutGift = '';
4445            let donorEmailAddress = '';
4446            
4447            // InTheme Donor Email Workaround
4448            if (document.querySelector('#donorEmailAddress')) {
4449            if (document.querySelector('#donorEmailAddress').textContent !== '') {
4450                donorEmailAddress = document.querySelector('#donorEmailAddress').textContent;
4451            } else {
4452                if(document.querySelector('body').getAttribute('data-lang') == 'es') {
4453                    donorEmailAddress = 'su dirección de correo electrónico';
4454                } else {
4455                    donorEmailAddress = 'your email address';
4456                }
4457            }
4458            } else {
4459                if(document.querySelector('body').getAttribute('data-lang') == 'es') {
4460                    donorEmailAddress = 'su dirección de correo electrónico';
4461                } else {
4462                    donorEmailAddress = 'your email address';
4463                }
4464            }
4465
4466            if (window.basicFormData.includes('ContributionForm')) {
4467
4468                if (document.querySelector('body').getAttribute('data-lang') == 'es') {
4469                    tyAboutGift = `<p class="TYAboutGift_Email small">Te enviaremos un recibo de tu donación con toda la información a ${donorEmailAddress}. Esto puede tardar varios minutos. Si no recibes el correo electrónico, por favor revisa tu carpeta de correo no deseado (spam).
4469</p>`;
4470                } else if (document.querySelector('body').getAttribute('data-lang') == 'en' || !document.querySelector('body').getAttribute('data-lang')) {
4471                    tyAboutGift = `<p class="TYAboutGift_Email small">A detailed gift receipt will be sent to ${donorEmailAddress}. This may take several minutes. If you do not receive this email, please check your spam folder. </p>`;
4472                }
4473
4474
4475
4476                // If the container is present...
4477                if (document.querySelector('#TYAboutGift')) {
4478                    // Append the TY message into it
4479                    document.querySelector('#TYAboutGift h4').insertAdjacentHTML('afterend', tyAboutGift);
4480                };
4481
4482            }
4483
4484        }
4485
4486
4487    }
4488
4489
4490    var nvtag_callbacks = nvtag_callbacks || {};
4491    nvtag_callbacks.postRender = nvtag_callbacks.postRender || [];
4492    nvtag_callbacks.postRender.push(tyAboutYourGift);
4493
4494</script>
4494
4495        <div id="PrivacyPolicy_original">
4496    <div id="PrivacyPolicy">
4497        <p class="legal">
4498        	All information provided by you on this form will be handled, and may be used, processed and disclosed, pursuant to our <a href="https://www.plannedparenthoodaction.org/about-us/privacy-policy" target="_blank"
4499                title="Privacy Policy" style="text-decoration: underline;">privacy policy</a> and our website's <a href="https://www.plannedparenthoodaction.org/about-us/terms-use"
4500                target="_blank" title="Terms of Use" style="text-decoration: underline;">terms of use</a>. If you have any questions or wish to opt out of communications, please <a
4501                href="https://www.plannedparenthoodaction.org/donor-services" target="_blank" title="Contact Us" style="text-decoration: underline;">contact&nbsp;us</a>.
4502        </p>
4503    </div><!-- end #PrivacyPolicy -->
4504</div><!-- end #PrivacyPolicy_original -->
4505
4506<div id="TYAboutGift">
4507    <h4>About your Gift</h4>
4508    <p class="legal">Contributions or gifts to Planned Parenthood Action Fund are not tax deductible as charitable contributions or as business expenses under IRC Section 162(e).</p>
4509</div><!-- end TYAboutGift -->
4510
4511<div class="snapshot-tiles ea-thin-block ea-delay-display ea-donate-footer">
4512    <div class="grid-container grid-x grid-padding-x">
4513
4514        <!-- START DESKTOP ONLY -->
4515        <div class="small-12 large-4 cell show-for-large">
4516            <p class="small"><strong>About your Gift</strong><br />
4517                <spa>
4518                Contributions or gifts to Planned Parenthood Action Fund are not tax deductible as charitable contributions or as business expenses under IRC Section 162(e).</spa></p>
4519        </div><!-- end cell -->
4520
4521        <div class="small-12 large-4 cell show-for-large">
4522            <p class="small"><strong>Contact Us</strong><br />
4523                <spa>
4524                <a href="https://www.plannedparenthoodaction.org/donor-services" target="_blank" title="Contact Us">Contact Donor
4525                    Services</a><br />
4526                    Call <a href="tel:1-855-789-7723">
4527                    <span
4528                        style="white-space:nowrap;">1-855-789-7723
4529                        </span>
4530                        </a>
4531                    </spa></p>
4532        </div><!-- end cell -->
4533
4534        <div class="small-12 large-4 cell show-for-large">
4535            <p class="small"><strong>Financial Information</strong><br />
4536                <spa>
4537                <a href="https://www.plannedparenthoodaction.org/about-us/disclosure-statement" target="_blank">Get more information</a>, including how to obtain a copy of our latest state solicitation disclosures.
4538                </spa></p>
4539        </div><!-- end cell -->
4540        <!-- END DESKTOP ONLY -->
4541
4542        <!-- START MOBILE ONLY -->
4543        <div class="small-12 large-4 cell hide-for-large">
4544            <p class="small"><strong>About your Gift</strong><br />
4545                Contributions or gifts to Planned Parenthood Action Fund are not tax deductible as charitable contributions or as business expenses under IRC Section 162(e).<br />
4546
4547                <a href="https://www.plannedparenthoodaction.org/about-us/disclosure-statement" target="_blank">Financial Report &amp; Registration&nbsp;&nbsp;&raquo;</a>
4548                
4549            </p>
4550
4551            <p class="small"><strong>Contact Us</strong><br />
4552                    
4553                <a href="https://www.plannedparenthoodaction.org/donor-services" target="_blank" title="Contact Us">Contact Donor Services</a>
4554                    <br />
4555                Call <a href="tel:1-855-789-7723"><span style="white-space:nowrap;">1-855-789-7723</span></a>
4556    
4557             </p>
4558                    
4559        </div><!-- end cell -->
4560        <!-- END MOBILE ONLY -->
4561
4562        <div class="small-12 large-12 cell">
4563            <p class="small" style="text-align: justify;">
4564                A gift of $10 qualifies you for annual contributing membership to Planned Parenthood Action Fund. Every dollar you give over the next twelve months up to $300 counts towards your dues to become a lifetime member. Sorry, no contributions from business corporations may be accepted.
4565                <br /><br />
4566                By making your contribution, you are affirming that you are a U.S. citizen or a permanent legal resident of the United States, you are not a Foreign Source of Concern (as defined by Fl. Stat. § 496.404(14)), and that you are making this contribution with your personal credit card and not the card of another person or entity.
4567            </p>
4568        </div><!-- end cell -->
4569
4570    </div><!-- end grid-x -->
4571</div><!-- end snapshot-tiles ea-donate-footer -->
4572    </main>
4573    <footer class="site-footer" data-section-name="footer">
4574<div class="site-footer-wrapper">
4575<div class="site-footer-branding">
4576<div class="site-footer-branding-info">
4577<a href="https://www.plannedparenthoodaction.org/" class="site-footer-logo">
4578<img src="https://nvlupin.blob.core.windows.net/images/van/AV/PPFA/1/11607/images/Themes/Evergreen/Web/Logos/planned-parenthood-action-stacked-tag.svg" alt="Planned Parenthood Action Fund, Inc." height="60">
4579</a>
4580<div class="site-footer-branding-info-text">
4581    <p>The Planned Parenthood Action Fund works to advance access to sexual health care and defend reproductive rights.</p>
4582    <p class="legal">This page is brought to you by the Planned Parenthood Action Fund.</p>
4583</div>
4584</div>
4585</div>
4586
4587<div class="site-footer-aux">
4588<div class="site-footer-aux-inner">
4589<nav class="site-footer-aux-nav" aria-label="auxilary navigation">
4590<ul>
4591<li><a href="https://www.plannedparenthoodaction.org/about-us/privacy-policy" data-footer-subcategory="Privacy Policy">Privacy Policy</a></li><li><a href="https://www.plannedparenthoodaction.org/about-us/terms-use" data-footer-subcategory="Terms of Use">Terms of Use</a></li>
4592</ul>
4593</nav>
4594<p class="site-footer-legal">
4595<small>
4596&copy; 2026 Planned Parenthood Action Fund, Inc. 
4597</small>
4598</p>
4599</div>
4600</div>
4601</div>
4602</footer>
4603</div><!-- End .page-wrap  -->
4604        <!-- NGPVAN Body Content -->
4605                
4605<script nonce="744a3226-3f25-411c-9500-973157837f5a" src="https://js.verygoodvault.com/vgs-collect/2.18.4/vgs-collect.js" data-log-errors="true" type="text/javascript" crossorigin="anonymous"></script>
4605
4606
4607        
4607<script nonce="744a3226-3f25-411c-9500-973157837f5a" src="https://static.everyaction.com/ea-actiontag/at.js" data-log-errors="true" type="text/javascript" crossorigin="anonymous" charset="utf-8"></script>
4607
4608        
4609
4610
4611
4612
4613    </div>
4614    
4615</body>
4616</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.