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('_', ' '); 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"> </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"> </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 — 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+'&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 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 & Registration »</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© 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.