CINXE.COM
Join Free Law Project
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <!-- Add to home screen for Safari on iOS --> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="twitter:card" content="summary_large_image"> <meta property="og:type" content="article"/> <meta name="twitter:site" content="Free Law Project"> <meta name="twitter:title" content="Join Free Law Project as a Member"/> <meta name="twitter:description" content="Tier 1 ($10/month) Unlimited docket alerts Unlimited real-time opinion search alerts FREE stickers Tier 2 ($25/month) All benefits above You support our mission Credits to shop our merch Tiers 3 & 4 ($50 & $100/month) All benefits above You are a major supporter of our mission More credits to shop our merch * Check out our merch store at free.law/store. Merch credits will be emailed after 3 months of membership. Looking for an option for your organization or law firm to become members and receive benefits? Check out our Group Membership options. If you wish to make a tax-deductible donation, instead of a membership with benefits, please use our donation form. "/> <meta name="twitter:image" content="https://freelawproject.app.neoncrm.com/neon/resource/freelawproject/images/CourtListener(2).png"/> <meta property="og:image" content="https://freelawproject.app.neoncrm.com/neon/resource/freelawproject/images/CourtListener(2).png"/> <meta property="og:image:width" content="1600"/> <meta property="og:image:height" content="721"/> <meta property="og:site_name" content="Free Law Project"/> <meta property="og:url" content="https://freelawproject.app.neoncrm.com/forms/membership"/> <meta property="og:title" content="Join Free Law Project as a Member"/> <meta property="og:description" content="Tier 1 ($10/month) Unlimited docket alerts Unlimited real-time opinion search alerts FREE stickers Tier 2 ($25/month) All benefits above You support our mission Credits to shop our merch Tiers 3 & 4 ($50 & $100/month) All benefits above You are a major supporter of our mission More credits to shop our merch * Check out our merch store at free.law/store. Merch credits will be emailed after 3 months of membership. Looking for an option for your organization or law firm to become members and receive benefits? Check out our Group Membership options. If you wish to make a tax-deductible donation, instead of a membership with benefits, please use our donation form. "/> <title>Join Free Law Project</title> <link rel="shortcut icon" href="/neon/resource/freelawproject/images/favicon.gif"/> <!-- Common styles and scripts --> <link href="https://fonts.googleapis.com/css?family=Lato:400,700&subset=latin-ext" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700,900" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,700,900" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,900" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Roboto:100,100i,300,300i,400,400i,500,500i,700,700i,900,900i&subset=cyrillic,cyrillic-ext,greek,greek-ext,latin-ext,vietnamese" rel="stylesheet"> <link href="/nx/portal-static/component/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <link href="/nx/portal-static/component/fontawesome-pro/css/all.min.css" rel="stylesheet"> <link href="/nx/portal-static/component/multi-select/multi-select.css" rel="stylesheet"> <link href="/nx/portal-static/component/file-upload/file-upload.css" rel="stylesheet"> <link href="/nx/portal-static/component/neon-img-cutter/neon-img-cutter.css" rel="stylesheet"> <link href="/nx/portal-static/component/cropperjs/cropper.min.css" rel="stylesheet"> <link href="/nx/portal-static/component/advanced-search/advanced-search.css" rel="stylesheet"> <link href="/nx/portal-static/component/neon-select/neon-select.css" rel="stylesheet"> <link href="/nx/portal-static/css/portal/portal.css" rel="stylesheet"> <link v-if="false" href="" rel="stylesheet"> <style> .neon-body { position: relative; } .neonfront { position: relative; z-index: 2; } .neon-background { background: rgba(224, 224, 224, 1); background-image: url("https://freelawproject.app.neoncrm.com/neon/resource/freelawproject/images/scotus-hero.jpeg"); background-position: center; /* Center the image */ background-repeat: no-repeat; /* Do not repeat the image */ background-size: cover; /* Resize the background image to cover the entire container */ height: 100%; width: 100%; transform: ; background-position: center center; position: fixed; z-index: 1; } .neonfront_element .form-check-input:checked { background-color: rgba(24, 0, 64, 1)!important; } .neonfront_content_wrap{ background: rgba(255, 255, 255, 0.65); backdrop-filter: blur(3px); } .neonfront_content_title, .neonfront_content_desc { font-family: Georgia,sans-serif!important; color: #000000!important; word-break: break-word; } .btn-outline-primary,.btn-outline-primary:hover { color: rgba(24, 0, 64, 1)!important; background-color: transparent!important; border-color: #E6E9EE; box-shadow: none !important; } .btn-outline-secondary:hover,.btn-outline-secondary:active,.btn-outline-secondary:focus{ background-color: #fff!important; color: rgba(24, 0, 64, 1)!important; border-color: #E6E9EE; box-shadow: none !important; } .neonfront-btn-link { color: rgba(24, 0, 64, 1)!important; } .neonfront_stepper.on,.neonfront_stepper_num { background: rgba(24, 0, 64, 1)!important; } .neonfront_payment_tab .active { border-bottom: 4px solid rgba(24, 0, 64, 1) !important; color: rgba(24, 0, 64, 1) !important; } .neonfront-btn-primary, .btn-primary { background-color: rgba(24, 0, 64, 1) !important; color: #ffffff !important; box-shadow: none !important; } .neonfront-btn-paypal { background-color: #f7c457 !important; } .btn-primary, .form-check-input:checked { border-color: rgba(24, 0, 64, 1) !important; } .neonfront-btn-outline-primary { color: rgba(24, 0, 64, 1); } .btn-check:checked + .neonfront-btn-outline-primary, .donationFrequencyChecked, .btn-check:active + .neonfront-btn-outline-primary, .neonfront-btn-outline-primary.active, .neonfront-btn-outline-primary.dropdown-toggle.show { background-color: rgba(24, 0, 64, 1) !important; color: #ffffff !important; z-index: 0 !important; } .donation-frequency-default-select-icon-bg { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' %3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); } .neonfront-check-input-level:checked + .neonfront-btn-level, .neonfront-check-input-level:active + .neonfront-btn-level, .neonfront-btn-level:active, .neonfront-btn-level.active, .neonfront-btn-level.dropdown-toggle.show { border-color: rgba(24, 0, 64, 1) !important; } .container-fluid.neonfront_header { color: #ffffff !important; background-color: rgba(24, 0, 64, 1)!important; } .container-fluid.neonfront_header .navbar-toggler { color: #ffffff !important; z-index: 100; } .container-fluid.neonfront_footer { color: #ffffff!important; background-color: rgba(24, 0, 64, 1)!important; padding-left: 0px; padding-right: 0px; } .neonfront_footer_lv_info { color: #ffffff!important; font-family: Roboto; font-style: normal; font-weight: 400; font-size: 14px; padding-top: 21px; padding-bottom: 3px; word-break: break-word; min-height: 30px; } .neonfront_footer_lv_info a{ color: #ffffff!important; text-decoration: none!important; } .neonfront_footer_lv_info a:hover{ text-decoration: underline!important; } .neonfront_header .neonfront_link { color: #ffffff!important; } .neonfront-profile-dropdown .fa-caret-down { color: #ffffff!important; } .neonfront-profile-dropdown .name { background-color: #ffffff!important; color: #3C4144!important; } .neonfront_header .neonfront_link.login_button { border-color: #ffffff!important; width: 78px; height: 32px; padding: 0px 0px 2px 0px !important; margin-left: 15px; } .neonfront_footer_lv_info .neonfront_link { color: #ffffff!important; } .neonfront-switch input:checked{ background-color: rgba(24, 0, 64, 1) !important; } </style> </head> <body> <div class="neon-body" id="app" v-cloak> <!DOCTYPE html> <html lang="en"> <div class="d-flex justify-content-center align-items-center" style="min-height: 100vh;" v-if="redirectingToPayment"> <div>Redirecting you to a secure payment page…</div> </div> <form id="redirectToPaymentForm" method="post" target="_parent" action="/nx/portal/payment-form" class="d-none"> <input type="hidden" name="requestId" v-model="paymentRequestId"> </form> </html> <div class="neon-background"></div> <div class="neonfront" v-show="!redirectingToPayment"> <!DOCTYPE html> <html> <body> <nav class="navbar navbar-expand-lg pt-0" style="padding-bottom: 0!important;" id="header-content"> <div style="position: relative; width: 100%"> <div class="container-fluid neonfront_header"> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <i class="fas fa-bars"></i> </button> <div class="navbar-brand"> <div class="neonfront_logo"> <a href="https://free.law" target="_blank"> <img src="https://freelawproject.app.neoncrm.com/neon/resource/freelawproject/images/FLP%20v2%20-%20white.png" width="300" alt="Free Law Project"/> </a> </div> </div> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="neonfront_links navbar-nav mb-2 mb-lg-0"> <li class="nav-item"> <a class="neonfront_link" href="https://free.law">Free Law Project</a> </li> <li class="nav-item"> <a class="neonfront_link" href="https://www.courtlistener.com/">CourtListener</a> </li> <li class="nav-item"> <a class="neonfront_link" href="https://www.courtlistener.com/recap/">RECAP Archive</a> </li> <li v-if="loggedIn" class="nav-item"> <div class="dropdown neonfront-profile-dropdown"> <div id="dropdownMenuAccount" class="user_logged_logo" data-bs-toggle="dropdown" aria-expanded="false"> <div class="name" :style="{backgroundImage: 'url('+(profilePhoto.url)+')'}"><span>{{profilePhoto.url?'':accountBasicInfo}}</span><i class="fas fa-caret-down"></i></div> </div> <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuAccount"> <li class="up-arrow"></li> <li><div class="title">MY PROFILE</div></li> <li><hr class="dropdown-divider"></li> <li><a class="dropdown-item" :href="'/np/constituent/accountHome.do?orgId='+orgId">Dashboard</a></li> <li></li> <li><a class="dropdown-item" href="/np/logout.do">Log out</a></li> </ul> </div> </li> <li v-if="!loggedIn" class="nav-item"> <button type="button" class="btn btn-outline-primary neonfront_link login_button" @click="showEncourageLogin">Login</button> </li> </ul> </div> </div> </div> </nav> </body> </html> <div class="neonfront_cover container-fluid"> <div class="neonfront_body container-fluid" id="form-content"> <div class="neonfront_content"> <!DOCTYPE html> <html lang="en"> </html> <div class="neonfront_content_wrap"> <div class="neonfront_content_title">Join Free Law Project as a Member</div> <div class="neonfront_content_desc" v-html="pageDescription"></div> <div class="neonfront_content_media"> <img class="media_object" src="https://freelawproject.app.neoncrm.com/neon/resource/freelawproject/images/CourtListener(2).png" alt="CourtListener by Free.Law"/> </div> </div> <div class="d-none d-sm-block"> <!DOCTYPE html> <html lang="en"> </html> </div> </div> <!DOCTYPE html> <html lang="en"> <div> <!DOCTYPE html> <html lang="en"> </html> <div class="neonfront_container"> <form class="row" id="neonform_5" @submit.prevent> <input type="hidden" name="id" value="5"> <input type="hidden" name="requestId" value="132a691e-da33-4bd6-ae2e-1dad98e99f9f"> <input type="hidden" name="recaptchaResponse" v-model="recaptchaResponse"> <!-- Page --> <div class="col-12 mb-4"> <div class="row g-3 neonfront-form"> <div class="col-md-12 neonfront_element position-relative"> <button v-show="currentPage!==1 && !created && !separatePayment" type="button" class="btn btn-link neonfront-btn-link neonfront-form-back-button" @click="previousPage" :disabled="submitting"><i class="far fa-chevron-left"></i> </button> <div class="neonfront_steppers row justify-content-between"> <div class="neonfront_stepper" v-bind:class="{on:currentPage===1}" style="width:15%"></div> <div class="neonfront_stepper" v-bind:class="{on:currentPage===2}" style="width:15%"></div> <div class="neonfront_stepper" v-bind:class="{on:currentPage===3}" style="width:15%"></div> <div class="neonfront_stepper" v-bind:class="{on:currentPage===4}" style="width:15%"></div> <div class="neonfront_stepper" v-bind:class="{on:currentPage===5}" style="width:15%"></div> <div class="neonfront_stepper" v-bind:class="{on:currentPage===6}" style="width:15%"></div> </div> <div v-show="currentPage===1"> <div class="neonfront_stepper_title"> <div class="neonfront_stepper_num">1</div> <span class="neonfront_stepper_desc_text">{{pageTitles[currentPage-1]}}</span> </div> <div class="neonfront_page_desc"></div> </div> <div v-show="currentPage===2"> <div class="neonfront_stepper_title"> <div class="neonfront_stepper_num">2</div> <span class="neonfront_stepper_desc_text">{{pageTitles[currentPage-1]}}</span> </div> <div class="neonfront_page_desc"></div> </div> <div v-show="currentPage===3"> <div class="neonfront_stepper_title"> <div class="neonfront_stepper_num">3</div> <span class="neonfront_stepper_desc_text">{{pageTitles[currentPage-1]}}</span> </div> <div class="neonfront_page_desc"><p>Include a submember in your membership registration</p></div> </div> <div v-show="currentPage===4"> <div class="neonfront_stepper_title"> <div class="neonfront_stepper_num">4</div> <span class="neonfront_stepper_desc_text">{{pageTitles[currentPage-1]}}</span> </div> <div class="neonfront_page_desc"></div> </div> <div v-show="currentPage===5"> <div class="neonfront_stepper_title"> <div class="neonfront_stepper_num">5</div> <span class="neonfront_stepper_desc_text">{{pageTitles[currentPage-1]}}</span> </div> <div class="neonfront_page_desc"></div> </div> <div v-show="currentPage===6"> <div class="neonfront_stepper_title"> <div class="neonfront_stepper_num">6</div> <span class="neonfront_stepper_desc_text">{{pageTitles[currentPage-1]}}</span> </div> <div class="neonfront_page_desc"></div> </div> </div> </div> </div> <div class="col-12" id="neon-page-1" v-show="currentPage===1"> <div class="row g-3 neonfront-form"> <div class="col-md-12 neonfront_element mt-0"> </div> <!-- Fields --> <body> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!DOCTYPE html> <html lang="en"> <!-- Membership Levels --> <div class="row g-2"> <div class="col-12 position-relative"> <!DOCTYPE html> <html lang="en"> <input type="radio" class="form-check-input neonfront-check-input-level" :class="{'is-invalid': checkFieldInvalid('termId')}" name="termId" value="1" id="term1" v-model="formData.termId" @change="onFieldBlur" @click="selectTerm({"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"1","membership":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"2","category":null,"code":"CL1","description":"CL Membership - Tier 1","status":{"available":true,"name":"Active","value":1},"rank":2,"membershipBenefits":null,"groupMembershipType":null,"childMemberAllowed":null,"membershipScope":null,"benefit":"","organizationGroupMembership":false,"individualGroupMembership":false,"groupMembership":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"2","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"cost":10.0,"fullCost":10.0,"enrollType":{"available":true,"name":"JOIN","value":1},"term":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":null,"howLong":1,"unit":{"available":true,"name":"MONTH","value":2},"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":null,"createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":true},"display":"Tier 1 (monthly)","displayOrder":"0","isDiscountInPercentage":null,"discountValue":null,"gracePeriod":null,"packageItemId":null,"parentMembershipTermId":null,"parentMembershipTerm":null,"priceOffList":null,"couponCodeList":null,"freeinput":0,"hiddenFlag":0,"complimentaryAmount":null,"freeInputTermDisplayName":"Other Amount:","pairedTermId":2,"advantageAmount":5.0,"advantageAmountOption":false,"eligibleAmount":5.0,"advantageDescription":"Received services for premium features in CourtListener.com.","autoRenewal":0,"termType":"ONE_TIME","settings":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"1","startDateCalculationJoin":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateCalculationRenew":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateMonthJoin":0,"startDateDayJoin":1,"startDateMonthRenew":0,"startDateDayRenew":1,"startDateMonthJoinEnd":0,"startDateDayJoinEnd":1,"startDateMonthRenewEnd":0,"startDateDayRenewEnd":1,"endDateAdjust":{"available":true,"name":"None","value":1},"endDateAdjustForEndOfMonth":0,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"1","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"formattedComplimentaryAmount":null,"price":10.0,"listPrice":10.0,"subPrice":10.0,"mainIndividualGroupMembershipTerm":false,"mainOrganizationGroupMembershipTerm":false,"mainGroupMembershipTerm":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"1","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false})" autocomplete="off"> <label class="neonfront-btn-level" for="term1"> <span class="float-end ms-2" v-text="10.0===0?'Free':formatAmount(10.0)"></span> <span class="name"> <span>Tier 1 (monthly)</span> </span> </label> </html> </div> <div class="col-12 position-relative"> <!DOCTYPE html> <html lang="en"> <input type="radio" class="form-check-input neonfront-check-input-level" :class="{'is-invalid': checkFieldInvalid('termId')}" name="termId" value="3" id="term3" v-model="formData.termId" @change="onFieldBlur" @click="selectTerm({"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"3","membership":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"2","category":null,"code":"CL1","description":"CL Membership - Tier 1","status":{"available":true,"name":"Active","value":1},"rank":2,"membershipBenefits":null,"groupMembershipType":null,"childMemberAllowed":null,"membershipScope":null,"benefit":"","organizationGroupMembership":false,"individualGroupMembership":false,"groupMembership":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"2","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"cost":100.0,"fullCost":1200.0,"enrollType":{"available":true,"name":"JOIN","value":1},"term":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":null,"howLong":1,"unit":{"available":true,"name":"YEAR","value":1},"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":null,"createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":true},"display":"Tier 1 (yearly)","displayOrder":"2","isDiscountInPercentage":null,"discountValue":null,"gracePeriod":null,"packageItemId":null,"parentMembershipTermId":null,"parentMembershipTerm":null,"priceOffList":null,"couponCodeList":null,"freeinput":0,"hiddenFlag":0,"complimentaryAmount":null,"freeInputTermDisplayName":"Other Amount:","pairedTermId":4,"advantageAmount":60.0,"advantageAmountOption":false,"eligibleAmount":40.0,"advantageDescription":"","autoRenewal":0,"termType":"ONE_TIME","settings":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"2","startDateCalculationJoin":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateCalculationRenew":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateMonthJoin":0,"startDateDayJoin":1,"startDateMonthRenew":0,"startDateDayRenew":1,"startDateMonthJoinEnd":0,"startDateDayJoinEnd":1,"startDateMonthRenewEnd":0,"startDateDayRenewEnd":1,"endDateAdjust":{"available":true,"name":"None","value":1},"endDateAdjustForEndOfMonth":0,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"2","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"formattedComplimentaryAmount":null,"price":100.0,"listPrice":100.0,"subPrice":100.0,"mainIndividualGroupMembershipTerm":false,"mainOrganizationGroupMembershipTerm":false,"mainGroupMembershipTerm":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"3","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false})" autocomplete="off"> <label class="neonfront-btn-level" for="term3"> <span class="float-end ms-2" v-text="100.0===0?'Free':formatAmount(100.0)"></span> <span class="name"> <span>Tier 1 (yearly)</span> </span> </label> </html> </div> <div class="col-12 position-relative"> <!DOCTYPE html> <html lang="en"> <input type="radio" class="form-check-input neonfront-check-input-level" :class="{'is-invalid': checkFieldInvalid('termId')}" name="termId" value="9" id="term9" v-model="formData.termId" @change="onFieldBlur" @click="selectTerm({"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"9","membership":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"3","category":null,"code":"CL2","description":"CL Membership - Tier 2","status":{"available":true,"name":"Active","value":1},"rank":3,"membershipBenefits":null,"groupMembershipType":null,"childMemberAllowed":null,"membershipScope":null,"benefit":"","organizationGroupMembership":false,"individualGroupMembership":false,"groupMembership":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"3","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"cost":25.0,"fullCost":25.0,"enrollType":{"available":true,"name":"JOIN","value":1},"term":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":null,"howLong":1,"unit":{"available":true,"name":"MONTH","value":2},"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":null,"createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":true},"display":"Tier 2 (monthly)","displayOrder":"8","isDiscountInPercentage":null,"discountValue":null,"gracePeriod":null,"packageItemId":null,"parentMembershipTermId":null,"parentMembershipTerm":null,"priceOffList":null,"couponCodeList":null,"freeinput":0,"hiddenFlag":0,"complimentaryAmount":null,"freeInputTermDisplayName":"Other Amount:","pairedTermId":10,"advantageAmount":8.0,"advantageAmountOption":false,"eligibleAmount":17.0,"advantageDescription":"Received goods and services for premium features in CourtListener.com and FLP branded merchandise.","autoRenewal":1,"termType":"ONE_TIME","settings":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"5","startDateCalculationJoin":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateCalculationRenew":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateMonthJoin":0,"startDateDayJoin":1,"startDateMonthRenew":0,"startDateDayRenew":1,"startDateMonthJoinEnd":0,"startDateDayJoinEnd":1,"startDateMonthRenewEnd":0,"startDateDayRenewEnd":1,"endDateAdjust":{"available":true,"name":"None","value":1},"endDateAdjustForEndOfMonth":0,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"5","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"formattedComplimentaryAmount":null,"price":25.0,"listPrice":25.0,"subPrice":25.0,"mainIndividualGroupMembershipTerm":false,"mainOrganizationGroupMembershipTerm":false,"mainGroupMembershipTerm":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"9","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false})" autocomplete="off" checked="checked"> <label class="neonfront-btn-level" for="term9"> <span class="float-end ms-2" v-text="25.0===0?'Free':formatAmount(25.0)"></span> <span class="name"> <span>Tier 2 (monthly)</span> </span> </label> </html> </div> <div class="col-12 position-relative"> <!DOCTYPE html> <html lang="en"> <input type="radio" class="form-check-input neonfront-check-input-level" :class="{'is-invalid': checkFieldInvalid('termId')}" name="termId" value="7" id="term7" v-model="formData.termId" @change="onFieldBlur" @click="selectTerm({"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"7","membership":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"3","category":null,"code":"CL2","description":"CL Membership - Tier 2","status":{"available":true,"name":"Active","value":1},"rank":3,"membershipBenefits":null,"groupMembershipType":null,"childMemberAllowed":null,"membershipScope":null,"benefit":"","organizationGroupMembership":false,"individualGroupMembership":false,"groupMembership":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"3","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"cost":250.0,"fullCost":3000.0,"enrollType":{"available":true,"name":"JOIN","value":1},"term":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":null,"howLong":1,"unit":{"available":true,"name":"YEAR","value":1},"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":null,"createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":true},"display":"Tier 2 (yearly)","displayOrder":"6","isDiscountInPercentage":null,"discountValue":null,"gracePeriod":null,"packageItemId":null,"parentMembershipTermId":null,"parentMembershipTerm":null,"priceOffList":null,"couponCodeList":null,"freeinput":0,"hiddenFlag":0,"complimentaryAmount":null,"freeInputTermDisplayName":"Other Amount:","pairedTermId":8,"advantageAmount":96.0,"advantageAmountOption":false,"eligibleAmount":154.0,"advantageDescription":"Received goods and services for premium features in CourtListener.com and FLP branded merchandise.","autoRenewal":0,"termType":"ONE_TIME","settings":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"4","startDateCalculationJoin":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateCalculationRenew":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateMonthJoin":0,"startDateDayJoin":1,"startDateMonthRenew":0,"startDateDayRenew":1,"startDateMonthJoinEnd":0,"startDateDayJoinEnd":1,"startDateMonthRenewEnd":0,"startDateDayRenewEnd":1,"endDateAdjust":{"available":true,"name":"None","value":1},"endDateAdjustForEndOfMonth":0,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"4","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"formattedComplimentaryAmount":null,"price":250.0,"listPrice":250.0,"subPrice":250.0,"mainIndividualGroupMembershipTerm":false,"mainOrganizationGroupMembershipTerm":false,"mainGroupMembershipTerm":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"7","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false})" autocomplete="off"> <label class="neonfront-btn-level" for="term7"> <span class="float-end ms-2" v-text="250.0===0?'Free':formatAmount(250.0)"></span> <span class="name"> <span>Tier 2 (yearly)</span> </span> </label> </html> </div> <div class="col-12 position-relative"> <!DOCTYPE html> <html lang="en"> <input type="radio" class="form-check-input neonfront-check-input-level" :class="{'is-invalid': checkFieldInvalid('termId')}" name="termId" value="33" id="term33" v-model="formData.termId" @change="onFieldBlur" @click="selectTerm({"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"33","membership":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"4","category":null,"code":"CL3","description":"CL Membership - Tier 3","status":{"available":true,"name":"Active","value":1},"rank":4,"membershipBenefits":null,"groupMembershipType":null,"childMemberAllowed":null,"membershipScope":null,"benefit":"","organizationGroupMembership":false,"individualGroupMembership":false,"groupMembership":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"4","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"cost":50.0,"fullCost":50.0,"enrollType":{"available":true,"name":"JOIN","value":1},"term":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":null,"howLong":1,"unit":{"available":true,"name":"MONTH","value":2},"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":null,"createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":true},"display":"Tier 3 (monthly)","displayOrder":"32","isDiscountInPercentage":null,"discountValue":null,"gracePeriod":null,"packageItemId":null,"parentMembershipTermId":null,"parentMembershipTerm":null,"priceOffList":null,"couponCodeList":null,"freeinput":0,"hiddenFlag":0,"complimentaryAmount":null,"freeInputTermDisplayName":"Other Amount:","pairedTermId":34,"advantageAmount":12.0,"advantageAmountOption":false,"eligibleAmount":38.0,"advantageDescription":"Received goods and services for premium features in CourtListener.com and FLP branded merchandise.","autoRenewal":1,"termType":"ONE_TIME","settings":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"17","startDateCalculationJoin":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateCalculationRenew":{"available":true,"name":"Prior renewal date","value":3},"startDateMonthJoin":0,"startDateDayJoin":1,"startDateMonthRenew":0,"startDateDayRenew":1,"startDateMonthJoinEnd":0,"startDateDayJoinEnd":1,"startDateMonthRenewEnd":0,"startDateDayRenewEnd":1,"endDateAdjust":{"available":true,"name":"None","value":1},"endDateAdjustForEndOfMonth":0,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"17","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"formattedComplimentaryAmount":null,"price":50.0,"listPrice":50.0,"subPrice":50.0,"mainIndividualGroupMembershipTerm":false,"mainOrganizationGroupMembershipTerm":false,"mainGroupMembershipTerm":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"33","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false})" autocomplete="off"> <label class="neonfront-btn-level" for="term33"> <span class="float-end ms-2" v-text="50.0===0?'Free':formatAmount(50.0)"></span> <span class="name"> <span>Tier 3 (monthly)</span> </span> </label> </html> </div> <div class="col-12 position-relative"> <!DOCTYPE html> <html lang="en"> <input type="radio" class="form-check-input neonfront-check-input-level" :class="{'is-invalid': checkFieldInvalid('termId')}" name="termId" value="13" id="term13" v-model="formData.termId" @change="onFieldBlur" @click="selectTerm({"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"13","membership":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"4","category":null,"code":"CL3","description":"CL Membership - Tier 3","status":{"available":true,"name":"Active","value":1},"rank":4,"membershipBenefits":null,"groupMembershipType":null,"childMemberAllowed":null,"membershipScope":null,"benefit":"","organizationGroupMembership":false,"individualGroupMembership":false,"groupMembership":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"4","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"cost":500.0,"fullCost":6000.0,"enrollType":{"available":true,"name":"JOIN","value":1},"term":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":null,"howLong":1,"unit":{"available":true,"name":"YEAR","value":1},"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":null,"createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":true},"display":"Tier 3 (yearly)","displayOrder":"12","isDiscountInPercentage":null,"discountValue":null,"gracePeriod":null,"packageItemId":null,"parentMembershipTermId":null,"parentMembershipTerm":null,"priceOffList":null,"couponCodeList":null,"freeinput":0,"hiddenFlag":0,"complimentaryAmount":null,"freeInputTermDisplayName":"Other Amount:","pairedTermId":14,"advantageAmount":144.0,"advantageAmountOption":false,"eligibleAmount":356.0,"advantageDescription":"Received goods and services for premium features in CourtListener.com and FLP branded merchandise.","autoRenewal":0,"termType":"ONE_TIME","settings":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"7","startDateCalculationJoin":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateCalculationRenew":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateMonthJoin":0,"startDateDayJoin":1,"startDateMonthRenew":0,"startDateDayRenew":1,"startDateMonthJoinEnd":0,"startDateDayJoinEnd":1,"startDateMonthRenewEnd":0,"startDateDayRenewEnd":1,"endDateAdjust":{"available":true,"name":"None","value":1},"endDateAdjustForEndOfMonth":0,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"7","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"formattedComplimentaryAmount":null,"price":500.0,"listPrice":500.0,"subPrice":500.0,"mainIndividualGroupMembershipTerm":false,"mainOrganizationGroupMembershipTerm":false,"mainGroupMembershipTerm":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"13","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false})" autocomplete="off"> <label class="neonfront-btn-level" for="term13"> <span class="float-end ms-2" v-text="500.0===0?'Free':formatAmount(500.0)"></span> <span class="name"> <span>Tier 3 (yearly)</span> </span> </label> </html> </div> <div class="col-12 position-relative"> <!DOCTYPE html> <html lang="en"> <input type="radio" class="form-check-input neonfront-check-input-level" :class="{'is-invalid': checkFieldInvalid('termId')}" name="termId" value="15" id="term15" v-model="formData.termId" @change="onFieldBlur" @click="selectTerm({"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"15","membership":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"5","category":null,"code":"CL4","description":"CL Membership - Tier 4","status":{"available":true,"name":"Active","value":1},"rank":5,"membershipBenefits":null,"groupMembershipType":null,"childMemberAllowed":null,"membershipScope":null,"benefit":"","organizationGroupMembership":false,"individualGroupMembership":false,"groupMembership":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"5","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"cost":100.0,"fullCost":100.0,"enrollType":{"available":true,"name":"JOIN","value":1},"term":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":null,"howLong":1,"unit":{"available":true,"name":"MONTH","value":2},"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":null,"createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":true},"display":"Tier 4 (monthly)","displayOrder":"14","isDiscountInPercentage":null,"discountValue":null,"gracePeriod":null,"packageItemId":null,"parentMembershipTermId":null,"parentMembershipTerm":null,"priceOffList":null,"couponCodeList":null,"freeinput":0,"hiddenFlag":0,"complimentaryAmount":null,"freeInputTermDisplayName":"Other Amount:","pairedTermId":16,"advantageAmount":25.0,"advantageAmountOption":false,"eligibleAmount":75.0,"advantageDescription":"Received goods and services for premium features in CourtListener.com and FLP branded merchandise.","autoRenewal":0,"termType":"INSTALLMENT","settings":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"8","startDateCalculationJoin":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateCalculationRenew":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateMonthJoin":0,"startDateDayJoin":1,"startDateMonthRenew":0,"startDateDayRenew":1,"startDateMonthJoinEnd":0,"startDateDayJoinEnd":1,"startDateMonthRenewEnd":0,"startDateDayRenewEnd":1,"endDateAdjust":{"available":true,"name":"None","value":1},"endDateAdjustForEndOfMonth":0,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"8","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"formattedComplimentaryAmount":null,"price":100.0,"listPrice":100.0,"subPrice":100.0,"mainIndividualGroupMembershipTerm":false,"mainOrganizationGroupMembershipTerm":false,"mainGroupMembershipTerm":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"15","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false})" autocomplete="off"> <label class="neonfront-btn-level" for="term15"> <span class="float-end ms-2" v-text="100.0===0?'Free':formatAmount(100.0)"></span> <span class="name"> <span>Tier 4 (monthly)</span> </span> </label> </html> </div> <div class="col-12 position-relative"> <!DOCTYPE html> <html lang="en"> <input type="radio" class="form-check-input neonfront-check-input-level" :class="{'is-invalid': checkFieldInvalid('termId')}" name="termId" value="35" id="term35" v-model="formData.termId" @change="onFieldBlur" @click="selectTerm({"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"35","membership":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"5","category":null,"code":"CL4","description":"CL Membership - Tier 4","status":{"available":true,"name":"Active","value":1},"rank":5,"membershipBenefits":null,"groupMembershipType":null,"childMemberAllowed":null,"membershipScope":null,"benefit":"","organizationGroupMembership":false,"individualGroupMembership":false,"groupMembership":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"5","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"cost":1000.0,"fullCost":12000.0,"enrollType":{"available":true,"name":"JOIN","value":1},"term":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":null,"howLong":1,"unit":{"available":true,"name":"YEAR","value":1},"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":null,"createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":true},"display":"Tier 4 (yearly)","displayOrder":"34","isDiscountInPercentage":null,"discountValue":null,"gracePeriod":null,"packageItemId":null,"parentMembershipTermId":null,"parentMembershipTerm":null,"priceOffList":null,"couponCodeList":null,"freeinput":0,"hiddenFlag":0,"complimentaryAmount":null,"freeInputTermDisplayName":"Other Amount:","pairedTermId":36,"advantageAmount":300.0,"advantageAmountOption":false,"eligibleAmount":700.0,"advantageDescription":"Received goods and services for premium features in CourtListener.com and FLP branded merchandise.","autoRenewal":0,"termType":"ONE_TIME","settings":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"18","startDateCalculationJoin":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateCalculationRenew":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateMonthJoin":0,"startDateDayJoin":1,"startDateMonthRenew":0,"startDateDayRenew":1,"startDateMonthJoinEnd":0,"startDateDayJoinEnd":1,"startDateMonthRenewEnd":0,"startDateDayRenewEnd":1,"endDateAdjust":{"available":true,"name":"None","value":1},"endDateAdjustForEndOfMonth":0,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"18","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"formattedComplimentaryAmount":null,"price":1000.0,"listPrice":1000.0,"subPrice":1000.0,"mainIndividualGroupMembershipTerm":false,"mainOrganizationGroupMembershipTerm":false,"mainGroupMembershipTerm":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"35","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false})" autocomplete="off"> <label class="neonfront-btn-level" for="term35"> <span class="float-end ms-2" v-text="1000.0===0?'Free':formatAmount(1000.0)"></span> <span class="name"> <span>Tier 4 (yearly)</span> </span> </label> </html> <div id="termId_feedback" class="invalid-feedback mt-2"> <div v-for="item in invalidField['termId']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <input type="hidden" name="cost" v-model="formData.cost" value="25.0"> <input v-if="upgradeId != null && upgradeId != ''" type="hidden" name="upgradeId" v-model="upgradeId"> <input v-if="installmentRenewId != null && installmentRenewId != ''" type="hidden" name="installmentRenewId" v-model="installmentRenewId"> <div class="invalid-feedback d-block mt-2"> <div v-show="showCostInvalidMessage()"> <i class="fa fa-exclamation-triangle"></i>{{membershipCostInvalidMessage}} </div> </div> <!-- DEV-15499 --> <div class="mt-2" style="font-size: 13px;color: #54698D;font-family: Lato;" v-show="installmentDes !== ''"> {{ installmentDes }} </div> </div> </html> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'termId'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['termId']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12 d-none"> <!-- Section --> <!-- Label --> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <div class="row" v-show="showField('autoRenew')"> <div class="form-check" > <input class="form-check-input neonfront_checkbox neon-field--membership-autoRenew" type="checkbox" v-bind:id="'autoRenew'" v-bind:name="'autoRenew'" name="autoRenew" v-model="formData.autoRenew" @change="onFieldChange" value="true" checked="checked"> <label class="form-check-label neonfront_checkbox_label" v-bind:for="'autoRenew'">I would like to automatically renew my membership</label> </div> </div> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'autoRenew'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['autoRenew']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> </body> <!-- Button --> <div class="col-md-12 neonfront_element"> <div class="row g-2" v-show="currentPage===1"> <div class="col"> <button type="button" class="btn neonfront-btn-primary btn-lg" @click="nextPage"> {{forwardButtons[0]}} </button> </div> </div> </div> <!-- Google reCAPTCHA Policy --> <div v-if="currentPage===6" class="col-md-12 neonfront_element"> <div class="re-captcha-policy-border"> <i class="fal fa-lock"></i> Secure Payment </div> <div class="re-captcha-policy"> This site is protected by reCAPTCHA and the Google <a href="https://policies.google.com/privacy">Privacy Policy</a> and <a href="https://policies.google.com/terms">Terms of Service</a> apply. </div> </div> </div> </div> <div class="col-12" id="neon-page-2" v-show="currentPage===2"> <div class="row g-3 neonfront-form"> <div class="col-md-12 neonfront_element mt-0"> </div> <!-- Fields --> <body> <div class="neonfront_element col-md-6"> <!-- Section --> <!-- Label --> <label v-bind:for="'account.name.firstName'" class="form-label">First Name *</label> <!-- Input --> <input v-bind:id="'account.name.firstName'" v-bind:name="'account.name.firstName'" name="account.name.firstName" value="" type="text" class="form-control neonfront_input neon-field--membership-account-name-firstName" :class="{'is-invalid': checkFieldInvalid('account.name.firstName')}" v-bind:aria-describedby="'account.name.firstName'+'_feedback'" v-model="formData.account.name.firstName" @blur="onFieldBlur" > <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'account.name.firstName'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.name.firstName']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-6"> <!-- Section --> <!-- Label --> <label v-bind:for="'account.name.lastName'" class="form-label">Last Name *</label> <!-- Input --> <input v-bind:id="'account.name.lastName'" v-bind:name="'account.name.lastName'" name="account.name.lastName" autocomplete="family-name" value="" type="text" class="form-control neonfront_input neon-field--membership-account-name-lastName" :class="{'is-invalid': checkFieldInvalid('account.name.lastName')}" v-bind:aria-describedby="'account.name.lastName'+'_feedback'" v-model="formData.account.name.lastName" @blur="onFieldBlur" > <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'account.name.lastName'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.name.lastName']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <div class="row" v-show="showField('account.asCompany')"> <div class="form-check" > <input class="form-check-input neonfront_checkbox neon-field--membership-account-asCompany" type="checkbox" v-bind:id="'account.asCompany'" v-bind:name="'account.asCompany'" name="account.asCompany" v-model="formData.account.asCompany" @change="onFieldChange" value="true"> <label class="form-check-label neonfront_checkbox_label" v-bind:for="'account.asCompany'">Submit as a company</label> </div> </div> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'account.asCompany'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.asCompany']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <label v-bind:for="'account.company.name'" class="form-label">Company Name</label> <!-- Input --> <input v-bind:id="'account.company.name'" v-bind:name="'account.company.name'" name="account.company.name" value="" type="text" class="form-control neonfront_input neon-field--membership-account-company-name" :class="{'is-invalid': checkFieldInvalid('account.company.name')}" v-bind:aria-describedby="'account.company.name'+'_feedback'" v-model="formData.account.company.name" @blur="onFieldBlur" > <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'account.company.name'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.company.name']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <label v-bind:for="'account.email1'" class="form-label">Email *</label> <!-- Input --> <input v-bind:id="'account.email1'" v-bind:name="'account.email1'" name="account.email1" value="" type="text" class="form-control neonfront_input neon-field--membership-account-email1" :class="{'is-invalid': checkFieldInvalid('account.email1')}" v-bind:aria-describedby="'account.email1'+'_feedback'" v-model="formData.account.email1" @blur="onFieldBlur" > <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <div class="desc" > <i class="fa fa-info-circle"></i><span>To receive full benefits, this MUST be the same email address you use in CourtListener.com.</span> </div> <!-- Invalid --> <div id="'account.email1'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.email1']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <label v-bind:for="'account.address.phone1'" class="form-label">Phone 1</label> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <div class="row"> <div class="input-group"> <input v-bind:id="'account.address.phone1'" v-bind:name="'account.address.phone1'+'.number'" name="account.address.phone1.number" type="text" class="form-control neonfront_input" :class="{'is-invalid': checkFieldInvalid('account.address.phone1'+'.number')}" value="" @blur="onFieldBlur" v-model="formData.account.address.phone1.number" style="width: 42%"> <select class="form-select input-group-text neonfront_input" :class="{'is-invalid': checkFieldInvalid('account.address.phone1'+'.type')}" v-bind:name="'account.address.phone1'+'.type'" name="account.address.phone1.type" v-model="formData.account.address.phone1.type" @change="onFieldBlur" style="border-top-right-radius: 0.25rem;border-bottom-right-radius:0.25rem;padding-right: 36px;"> <option value="H">Home</option> <option value="M">Mobile</option> <option value="O">Other</option> <option value="W">Work</option> </select> <div v-bind:id="'account.address.phone1'+'.number_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.address.phone1'+'.number']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> <div v-bind:id="'account.address.phone1'+'.type_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.address.phone1'+'.type']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> </div> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'account.address.phone1'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.address.phone1']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <label v-bind:for="'account.address.line1'" class="form-label">Address Line 1 *</label> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <div class="row"> <div class="input-group"> <input v-bind:id="'account.address.line1'" v-bind:name="'account.address.line1'+'.line1'" name="account.address.line1.line1" autocomplete="address-line1" type="text" class="form-control neonfront_input" :class="{'is-invalid': checkFieldInvalid('account.address.line1'+'.line1')}" value="" @blur="onFieldBlur" v-model="formData.account.address.line1.line1" style="width: 42%"> <select class="form-select input-group-text neonfront_input" :class="{'is-invalid': checkFieldInvalid('account.address.line1'+'.type')}" v-bind:name="'account.address.line1'+'.type'" name="account.address.line1.type" v-model="formData.account.address.line1.type" @change="onFieldBlur" style="border-top-right-radius: 0.25rem;border-bottom-right-radius:0.25rem;padding-right: 36px;"> <option value="1" selected="selected">Home</option> <option value="2">Work</option> <option value="3">School</option> <option value="999">Other</option> </select> <div v-bind:id="'account.address.line1'+'.line1_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.address.line1'+'.line1']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> <div v-bind:id="'account.address.line1'+'.type_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.address.line1'+'.type']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> </div> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'account.address.line1'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.address.line1']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <label v-bind:for="'account.address.line2'" class="form-label">Address Line 2</label> <!-- Input --> <input v-bind:id="'account.address.line2'" v-bind:name="'account.address.line2'" name="account.address.line2" autocomplete="address-line2" value="" type="text" class="form-control neonfront_input neon-field--membership-account-address-line2" :class="{'is-invalid': checkFieldInvalid('account.address.line2')}" v-bind:aria-describedby="'account.address.line2'+'_feedback'" v-model="formData.account.address.line2" @blur="onFieldBlur" > <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'account.address.line2'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.address.line2']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-6"> <!-- Section --> <!-- Label --> <label v-bind:for="'account.address.city'" class="form-label">City *</label> <!-- Input --> <input v-bind:id="'account.address.city'" v-bind:name="'account.address.city'" name="account.address.city" value="" type="text" class="form-control neonfront_input neon-field--membership-account-address-city" :class="{'is-invalid': checkFieldInvalid('account.address.city')}" v-bind:aria-describedby="'account.address.city'+'_feedback'" v-model="formData.account.address.city" @blur="onFieldBlur" > <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'account.address.city'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.address.city']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-6"> <!-- Section --> <!-- Label --> <label v-bind:for="'account.address.stateOrProvince'" class="form-label">State/Province *</label> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <select v-bind:id="'account.address.stateOrProvince'" v-bind:name="'account.address.stateOrProvince'" name="account.address.stateOrProvince" class="form-select neonfront_input neon-field--membership-account-address-stateOrProvince" :class="{'is-invalid': checkFieldInvalid('account.address.stateOrProvince')}" v-bind:aria-describedby="'account.address.stateOrProvince'+'_feedback'" v-model="formData.account.address.stateOrProvince" @change="onFieldBlur"> <option></option> <option value="AL">Alabama</option> <option value="AK">Alaska</option> <option value="AZ">Arizona</option> <option value="AR">Arkansas</option> <option value="CA">California</option> <option value="CO">Colorado</option> <option value="CT">Connecticut</option> <option value="DE">Delaware</option> <option value="DC">District of Columbia</option> <option value="FL">Florida</option> <option value="GA">Georgia</option> <option value="HI">Hawaii</option> <option value="ID">Idaho</option> <option value="IL">Illinois</option> <option value="IN">Indiana</option> <option value="IA">Iowa</option> <option value="KS">Kansas</option> <option value="KY">Kentucky</option> <option value="LA">Louisiana</option> <option value="ME">Maine</option> <option value="MD">Maryland</option> <option value="MA">Massachusetts</option> <option value="MI">Michigan</option> <option value="MN">Minnesota</option> <option value="MS">Mississippi</option> <option value="MO">Missouri</option> <option value="MT">Montana</option> <option value="NE">Nebraska</option> <option value="NV">Nevada</option> <option value="NH">New Hampshire</option> <option value="NJ">New Jersey</option> <option value="NM">New Mexico</option> <option value="NY">New York</option> <option value="NC">North Carolina</option> <option value="ND">North Dakota</option> <option value="OH">Ohio</option> <option value="OK">Oklahoma</option> <option value="OR">Oregon</option> <option value="PA">Pennsylvania</option> <option value="RI">Rhode Island</option> <option value="SC">South Carolina</option> <option value="SD">South Dakota</option> <option value="TN">Tennessee</option> <option value="TX">Texas</option> <option value="UT">Utah</option> <option value="VT">Vermont</option> <option value="VA">Virginia</option> <option value="WA">Washington</option> <option value="WV">West Virginia</option> <option value="WI">Wisconsin</option> <option value="WY">Wyoming</option> <option value="AS">American Samoa</option> <option value="FM">Federated States of Micronesia</option> <option value="GU">Guam</option> <option value="MH">Marshall Islands</option> <option value="MP">Northern Mariana Islands</option> <option value="PW">Palau</option> <option value="PR">Puerto Rico</option> <option value="UM">U.S. Minor Outlying Islands</option> <option value="VI">Virgin Islands</option> <option value="AA">Armed Forces Americas</option> <option value="AE">Armed Forces Europe, the Middle East, an</option> <option value="AP">Armed Forces Pacific</option> <option value="AB">Alberta</option> <option value="BC">British Columbia</option> <option value="MB">Manitoba</option> <option value="NB">New Brunswick</option> <option value="NL">Newfoundland and Labrador</option> <option value="NS">Nova Scotia</option> <option value="NT">Northwest Territories</option> <option value="NU">Nunavut Territory</option> <option value="ON">Ontario</option> <option value="PE">Prince Edward Island</option> <option value="QC">Quebec</option> <option value="SK">Saskatchewan</option> <option value="YT">Yukon Territory</option> </select> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'account.address.stateOrProvince'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.address.stateOrProvince']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-6"> <!-- Section --> <!-- Label --> <label v-bind:for="'account.address.zipCode'" class="form-label">Zip/Postal Code *</label> <!-- Input --> <input v-bind:id="'account.address.zipCode'" v-bind:name="'account.address.zipCode'" name="account.address.zipCode" value="" type="text" class="form-control neonfront_input neon-field--membership-account-address-zipCode" :class="{'is-invalid': checkFieldInvalid('account.address.zipCode')}" v-bind:aria-describedby="'account.address.zipCode'+'_feedback'" v-model="formData.account.address.zipCode" @blur="onFieldBlur" > <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'account.address.zipCode'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.address.zipCode']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-6"> <!-- Section --> <!-- Label --> <label v-bind:for="'account.address.country'" class="form-label">Country *</label> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <select v-bind:id="'account.address.country'" v-bind:name="'account.address.country'" name="account.address.country" class="form-select neonfront_input neon-field--membership-account-address-country" :class="{'is-invalid': checkFieldInvalid('account.address.country')}" v-bind:aria-describedby="'account.address.country'+'_feedback'" v-model="formData.account.address.country" @change="onFieldBlur"> <option></option> <option value="1">United States of America</option> <option value="2">Canada</option> <option value="3">Afghanistan</option> <option value="247">Åland Islands</option> <option value="4">Albania</option> <option value="5">Algeria</option> <option value="6">American Samoa</option> <option value="7">Andorra</option> <option value="8">Angola</option> <option value="242">Anguilla</option> <option value="9">Antarctica</option> <option value="10">Antigua and Barbuda</option> <option value="11">Argentina</option> <option value="12">Armenia</option> <option value="13">Aruba</option> <option value="14">Australia</option> <option value="15">Austria</option> <option value="16">Azerbaijan</option> <option value="17">Bahamas</option> <option value="18">Bahrain</option> <option value="19">Bangladesh</option> <option value="20">Barbados</option> <option value="21">Belarus</option> <option value="22">Belgium</option> <option value="23">Belize</option> <option value="24">Benin</option> <option value="25">Bermuda</option> <option value="26">Bhutan</option> <option value="27">Bolivia (Plurinational State of)</option> <option value="248">Bonaire, Sint Eustatius and Saba</option> <option value="28">Bosnia and Herzegovina</option> <option value="29">Botswana</option> <option value="30">Bouvet Island</option> <option value="31">Brazil</option> <option value="32">British Indian Ocean Territory</option> <option value="33">Brunei Darussalam</option> <option value="34">Bulgaria</option> <option value="35">Burkina Faso</option> <option value="36">Burundi</option> <option value="39">Cabo Verde</option> <option value="37">Cambodia</option> <option value="38">Cameroon</option> <option value="40">Cayman Islands</option> <option value="41">Central African Republic</option> <option value="42">Chad</option> <option value="43">Chile</option> <option value="44">China</option> <option value="45">Christmas Island</option> <option value="46">Cocos (Keeling) Islands</option> <option value="47">Colombia</option> <option value="48">Comoros</option> <option value="49">Congo</option> <option value="238">Congo (the Democratic Republic of the)</option> <option value="50">Cook Islands</option> <option value="51">Costa Rica</option> <option value="106">Côte d'Ivoire</option> <option value="52">Croatia</option> <option value="53">Cuba</option> <option value="249">Curaçao</option> <option value="54">Cyprus</option> <option value="55">Czechia</option> <option value="56">Denmark</option> <option value="57">Djibouti</option> <option value="58">Dominica</option> <option value="59">Dominican Republic</option> <option value="61">Ecuador</option> <option value="62">Egypt</option> <option value="63">El Salvador</option> <option value="64">Equatorial Guinea</option> <option value="65">Eritrea</option> <option value="66">Estonia</option> <option value="67">Ethiopia</option> <option value="68">Falkland Islands [Malvinas]</option> <option value="69">Faroe Islands</option> <option value="70">Fiji</option> <option value="71">Finland</option> <option value="73">France</option> <option value="75">French Guiana</option> <option value="171">French Polynesia</option> <option value="76">French Southern Territories</option> <option value="77">Gabon</option> <option value="78">Gambia</option> <option value="79">Georgia</option> <option value="80">Germany</option> <option value="81">Ghana</option> <option value="82">Gibraltar</option> <option value="84">Greece</option> <option value="85">Greenland</option> <option value="86">Grenada</option> <option value="87">Guadeloupe</option> <option value="88">Guam</option> <option value="89">Guatemala</option> <option value="250">Guernsey</option> <option value="90">Guinea</option> <option value="91">Guinea-Bissau</option> <option value="92">Guyana</option> <option value="93">Haiti</option> <option value="94">Heard Island and McDonald Islands</option> <option value="229">Holy See</option> <option value="95">Honduras</option> <option value="96">Hong Kong</option> <option value="97">Hungary</option> <option value="98">Iceland</option> <option value="99">India</option> <option value="100">Indonesia</option> <option value="101">Iran (Islamic Republic of)</option> <option value="102">Iraq</option> <option value="103">Ireland</option> <option value="251">Isle of Man</option> <option value="104">Israel</option> <option value="105">Italy</option> <option value="107">Jamaica</option> <option value="108">Japan</option> <option value="252">Jersey</option> <option value="109">Jordan</option> <option value="110">Kazakhstan</option> <option value="111">Kenya</option> <option value="112">Kiribati</option> <option value="158">Korea (the Democratic People's Republic of)</option> <option value="198">Korea (the Republic of)</option> <option value="113">Kuwait</option> <option value="114">Kyrgyzstan</option> <option value="115">Lao People's Democratic Republic</option> <option value="116">Latvia</option> <option value="117">Lebanon</option> <option value="118">Lesotho</option> <option value="119">Liberia</option> <option value="120">Libya</option> <option value="121">Liechtenstein</option> <option value="122">Lithuania</option> <option value="123">Luxembourg</option> <option value="124">Macao</option> <option value="125">Macedonia (the former Yugoslav Republic of)</option> <option value="126">Madagascar</option> <option value="127">Malawi</option> <option value="128">Malaysia</option> <option value="129">Maldives</option> <option value="130">Mali</option> <option value="131">Malta</option> <option value="132">Marshall Islands</option> <option value="133">Martinique</option> <option value="134">Mauritania</option> <option value="135">Mauritius</option> <option value="136">Mayotte</option> <option value="137">Mexico</option> <option value="138">Micronesia (Federated States of)</option> <option value="139">Moldova (the Republic of)</option> <option value="140">Monaco</option> <option value="141">Mongolia</option> <option value="253">Montenegro</option> <option value="142">Montserrat</option> <option value="143">Morocco</option> <option value="144">Mozambique</option> <option value="145">Myanmar</option> <option value="146">Namibia</option> <option value="147">Nauru</option> <option value="148">Nepal</option> <option value="149">Netherlands</option> <option value="151">New Caledonia</option> <option value="152">New Zealand</option> <option value="153">Nicaragua</option> <option value="154">Niger</option> <option value="155">Nigeria</option> <option value="156">Niue</option> <option value="157">Norfolk Island</option> <option value="159">Northern Mariana Islands</option> <option value="160">Norway</option> <option value="161">Oman</option> <option value="162">Pakistan</option> <option value="163">Palau</option> <option value="246">Palestine, State of</option> <option value="164">Panama</option> <option value="165">Papua New Guinea</option> <option value="166">Paraguay</option> <option value="167">Peru</option> <option value="168">Philippines</option> <option value="169">Pitcairn</option> <option value="170">Poland</option> <option value="172">Portugal</option> <option value="173">Puerto Rico</option> <option value="174">Qatar</option> <option value="175">Réunion</option> <option value="176">Romania</option> <option value="177">Russian Federation</option> <option value="178">Rwanda</option> <option value="254">Saint Barthélemy</option> <option value="180">Saint Helena, Ascension and Tristan da Cunha</option> <option value="181">Saint Kitts and Nevis</option> <option value="182">Saint Lucia</option> <option value="255">Saint Martin (French part)</option> <option value="183">Saint Pierre and Miquelon</option> <option value="185">Saint Vincent and the Grenadines</option> <option value="186">Samoa</option> <option value="187">San Marino</option> <option value="184">Sao Tome and Principe</option> <option value="188">Saudi Arabia</option> <option value="189">Senegal</option> <option value="256">Serbia</option> <option value="190">Seychelles</option> <option value="191">Sierra Leone</option> <option value="192">Singapore</option> <option value="245">Sint Maarten (Dutch part)</option> <option value="193">Slovakia</option> <option value="194">Slovenia</option> <option value="195">Solomon Islands</option> <option value="196">Somalia</option> <option value="197">South Africa</option> <option value="179">South Georgia and the South Sandwich Islands</option> <option value="243">South Sudan</option> <option value="199">Spain</option> <option value="200">Sri Lanka</option> <option value="201">Sudan</option> <option value="202">Suriname</option> <option value="203">Svalbard and Jan Mayen</option> <option value="204">Swaziland</option> <option value="205">Sweden</option> <option value="206">Switzerland</option> <option value="207">Syrian Arab Republic</option> <option value="209">Taiwan (Province of China)</option> <option value="208">Tajikistan</option> <option value="210">Tanzania, United Republic of</option> <option value="211">Thailand</option> <option value="60">Timor-Leste</option> <option value="212">Togo</option> <option value="213">Tokelau</option> <option value="214">Tonga</option> <option value="215">Trinidad and Tobago</option> <option value="216">Tunisia</option> <option value="217">Turkey</option> <option value="218">Turkmenistan</option> <option value="219">Turks and Caicos Islands</option> <option value="220">Tuvalu</option> <option value="221">Uganda</option> <option value="222">Ukraine</option> <option value="223">United Arab Emirates</option> <option value="83">United Kingdom of Great Britain and Northern Ireland</option> <option value="226">United States Minor Outlying Islands</option> <option value="225">Uruguay</option> <option value="227">Uzbekistan</option> <option value="228">Vanuatu</option> <option value="230">Venezuela (Bolivarian Republic of)</option> <option value="231">Viet Nam</option> <option value="232">Virgin Islands (British)</option> <option value="233">Virgin Islands (U.S.)</option> <option value="234">Wallis and Futuna</option> <option value="235">Western Sahara*</option> <option value="236">Yemen</option> <option value="239">Zambia</option> <option value="240">Zimbabwe</option> </select> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'account.address.country'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.address.country']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <div class="neonfront_element col-md-12"><!DOCTYPE html> <html lang="en"> <label class="form-label">Data Privacy & Consent</label> <!-- Description --> <div class="col-md-12 mt-3"> <div class="neonfront-subform mb-2 pb-0"> <!-- Description --> <div class="col-md-12"> <a class="from-link" href="https://www.courtlistener.com/terms/#privacy" target="_blank">Free Law Project Privacy Policy</a> </div> <!-- Description --> </div> </div> </html></div> <!-- Description --> <!-- Invalid --> <div id="'account.gdpr'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['account.gdpr']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> </body> <!-- Button --> <div class="col-md-12 neonfront_element"> <div class="row g-2" v-show="currentPage===2"> <div class="col"> <button type="button" class="btn neonfront-btn-primary btn-lg" @click="nextPage"> {{forwardButtons[currentPage-1]}} </button> </div> </div> </div> <!-- Google reCAPTCHA Policy --> <div v-if="currentPage===6" class="col-md-12 neonfront_element"> <div class="re-captcha-policy-border"> <i class="fal fa-lock"></i> Secure Payment </div> <div class="re-captcha-policy"> This site is protected by reCAPTCHA and the Google <a href="https://policies.google.com/privacy">Privacy Policy</a> and <a href="https://policies.google.com/terms">Terms of Service</a> apply. </div> </div> </div> </div> <div class="col-12" id="neon-page-3" v-show="currentPage===3"> <div class="row g-3 neonfront-form"> <div class="col-md-12 neonfront_element mt-0"> </div> <!-- Fields --> <body> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!DOCTYPE html> <html lang="en"> <!-- Sub member --> <div> <div class="form-check"> <input class="form-check-input neonfront_checkbox neon-field--membership-subMemberChecked" type="checkbox" name="subMemberChecked" id="subMemberChecked" :disabled="subMemberRequried" value="true" @click="onFieldBlur" v-model="subMemberChecked"> <label class="form-check-label neonfront_checkbox_label" for="subMemberChecked">Include a submember</label> <input type="hidden" name="subMemberChecked" id="subMemberChecked" v-model="subMemberChecked" v-if="subMemberRequried"> </div> </div> <div id="sub-member-container"> <div v-for="(item, index) in subMembers" v-bind:id="'sub-member-'+index" class="sub-member-section" v-show="subMemberChecked"> <div class="sub-member-section-header"> <span class="sub-member-section-title" @click="toggleSubMember(index)"> <i class="far me-1" v-bind:class="[subMembers[index] ? 'fa-chevron-down' :'fa-chevron-right']"></i>{{subMemberDisplayName}} <span>{{index+1}}</span>: <span>{{getSubMemberName(index)}}</span> </span> <a v-show="subMembers.length>1" class="far fa-times" @click="removeSubMember(index)"></a> </div> <div class="row g-3 sub-member-section-body" v-show="subMembers[index]"> <!-- select contact --> <div class="sub-member-choose-contacts" v-show="loggedIn" @click="openContactsModal(index)"><i class="far fa-users me-1"></i>Choose Existing Contact(s)</div> <!-- Sub terms --> <label :for="'subMembers['+index+'].termId'" class="form-label">Membership Level *</label> <div v-for="(smt, smtIndex) in subMembershipTerms" class="col-12 mt-2 position-relative"> <input type="radio" class="form-check-input neonfront-check-input-level" :class="{'is-invalid': checkFieldInvalid('subMembers['+index+'].termId')}" :name="'subMembers['+index+'].termId'" :value="smt.id" :id="'subTerm'+smt.id+'-'+index" :checked="subMembershipTerms.length===1" v-model="formData.subMembers[index].termId" @change="onFieldBlur" @click="selectSubTerm(index, smt.id, smt.cost, smt.term.unit.name==='LIFE', smt)" autocomplete="off"> <label class="neonfront-btn-level" :for="'subTerm'+smt.id+'-'+index"> <span v-if="!membershipHidePrice && !smt.freeInput" class="float-end ms-2">{{smt.cost===0?'Free':formatAmount(smt.cost)}}</span> <span v-if="smt.freeInput" class="float-end"> <input type="number" class="form-control d-inline" v-model="formData.subMembers[index]['freeCost'+smt.id]" @blur="onSubFreeInputBlur(index, smt.id, $event)" @keypress="onAmountKeyPress" :style="{width: (48+((formatFreeCost(smt.cost)).length-3)*10)+'px'}" style="height:32px;border: 1px solid #D8DDE6;color: #98A5BB;font-size: 13px;"> </span> <span class="name"> <span>{{smt.display}}</span> <i v-if="smt.freeInput" :class="'fas fa-info-circle ms-1 subFreeInputTooltip'+index" style="color: #54698D" data-bs-toggle="tooltip" data-bs-placement="top" title="Enter the cost of the membership"></i> </span> </label> <div v-if="smtIndex===subMembershipTerms.length-1" :id="'subMembers['+index+'].termId_feedback'" class="invalid-feedback mt-2"> <div v-for="item in invalidField['subMembers['+index+'].termId']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <input type="hidden" :name="'subMembers['+index+'].cost'" v-model="formData.subMembers[index].cost"> <div class="invalid-feedback d-block mt-2"> <div v-show="showSubCostInvalidMessage(index)"> <i class="fa fa-exclamation-triangle"></i>{{formData.subMembers[index].membershipCostInvalidMessage}} </div> </div> <div class="neonfront_element col-md-12" v-show="!autoRenewHidden"> <div class="row"> <div class="form-check subMemberAutoRenew" :id="'subMemberAutoRenew'+index" data-bs-toggle="tooltip" data-bs-placement="top" title="Parent membership must be set to auto-renew"> <input class="form-check-input neonfront_checkbox neon-field--membership-autoRenew" type="checkbox" :id="'subMembers['+index+'].autoRenew'" :name="'subMembers['+index+'].autoRenew'" :class="{readonly: term.forceAutoRenew || !formData.autoRenew || formData.subMembers[index].isLife}" :checked="formData.autoRenew===true && !formData.subMembers[index].isLife" v-model="formData.subMembers[index].autoRenew" value="true"> <label class="form-check-label neonfront_checkbox_label" :for="'subMembers['+index+'].autoRenew'">I would like to automatically renew my membership</label> </div> </div> <div id="'autoRenew'+'_feedback'" class="invalid-feedback"></div> </div> <!-- DEV-15499 --> <div class="mt-2" style="font-size: 13px;color: #54698D;font-family: Lato;" v-show="subInstallmentDes[index] !== ''"> {{ subInstallmentDes[index] }} </div> <div v-if="selectedContactList[index].size===0" class="col-12" :id="'contact-field-'+index"> <input type="hidden" :name="'subMembers['+index+'].account.asCompany'" value="false"> <div class="row g-3"> <body> <div class="neonfront_element col-md-6"> <!-- Section --> <!-- Label --> <label v-bind:for="'subMembers['+index+'].account.name.firstName'" class="form-label">First Name *</label> <!-- Input --> <input v-bind:id="'subMembers['+index+'].account.name.firstName'" v-bind:name="'subMembers['+index+'].account.name.firstName'" name="subMembers[index].account.name.firstName" value="" type="text" class="form-control neonfront_input neon-field--membership-subMembers[index]-account-name-firstName" :class="{'is-invalid': checkFieldInvalid('subMembers['+index+'].account.name.firstName')}" v-bind:aria-describedby="'subMembers['+index+'].account.name.firstName'+'_feedback'" v-model="formData.subMembers[index].account.name.firstName" @blur="onFieldBlur" > <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'subMembers['+index+'].account.name.firstName'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['subMembers['+index+'].account.name.firstName']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-6"> <!-- Section --> <!-- Label --> <label v-bind:for="'subMembers['+index+'].account.name.lastName'" class="form-label">Last Name *</label> <!-- Input --> <input v-bind:id="'subMembers['+index+'].account.name.lastName'" v-bind:name="'subMembers['+index+'].account.name.lastName'" name="subMembers[index].account.name.lastName" value="" type="text" class="form-control neonfront_input neon-field--membership-subMembers[index]-account-name-lastName" :class="{'is-invalid': checkFieldInvalid('subMembers['+index+'].account.name.lastName')}" v-bind:aria-describedby="'subMembers['+index+'].account.name.lastName'+'_feedback'" v-model="formData.subMembers[index].account.name.lastName" @blur="onFieldBlur" > <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'subMembers['+index+'].account.name.lastName'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['subMembers['+index+'].account.name.lastName']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <label v-bind:for="'subMembers['+index+'].account.email1'" class="form-label">Email</label> <!-- Input --> <input v-bind:id="'subMembers['+index+'].account.email1'" v-bind:name="'subMembers['+index+'].account.email1'" name="subMembers[index].account.email1" value="" type="text" class="form-control neonfront_input neon-field--membership-subMembers[index]-account-email1" :class="{'is-invalid': checkFieldInvalid('subMembers['+index+'].account.email1')}" v-bind:aria-describedby="'subMembers['+index+'].account.email1'+'_feedback'" v-model="formData.subMembers[index].account.email1" @blur="onFieldBlur" > <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'subMembers['+index+'].account.email1'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['subMembers['+index+'].account.email1']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <label v-bind:for="'subMembers['+index+'].account.address.line1'" class="form-label">Address Line 1</label> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <div class="row"> <div class="input-group"> <input v-bind:id="'subMembers['+index+'].account.address.line1'" v-bind:name="'subMembers['+index+'].account.address.line1'+'.line1'" name="subMembers[index].account.address.line1.line1" autocomplete="address-line1" type="text" class="form-control neonfront_input" :class="{'is-invalid': checkFieldInvalid('subMembers['+index+'].account.address.line1'+'.line1')}" value="" @blur="onFieldBlur" v-model="formData.subMembers[index].account.address.line1.line1" style="width: 42%"> <select class="form-select input-group-text neonfront_input" :class="{'is-invalid': checkFieldInvalid('subMembers['+index+'].account.address.line1'+'.type')}" v-bind:name="'subMembers['+index+'].account.address.line1'+'.type'" name="subMembers[index].account.address.line1.type" v-model="formData.subMembers[index].account.address.line1.type" @change="onFieldBlur" style="border-top-right-radius: 0.25rem;border-bottom-right-radius:0.25rem;padding-right: 36px;"> <option value="1" selected="selected">Home</option> <option value="2">Work</option> <option value="3">School</option> <option value="999">Other</option> </select> <div v-bind:id="'subMembers['+index+'].account.address.line1'+'.line1_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['subMembers['+index+'].account.address.line1'+'.line1']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> <div v-bind:id="'subMembers['+index+'].account.address.line1'+'.type_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['subMembers['+index+'].account.address.line1'+'.type']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> </div> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'subMembers['+index+'].account.address.line1'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['subMembers['+index+'].account.address.line1']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <label v-bind:for="'subMembers['+index+'].account.address.line2'" class="form-label">Address Line 2</label> <!-- Input --> <input v-bind:id="'subMembers['+index+'].account.address.line2'" v-bind:name="'subMembers['+index+'].account.address.line2'" name="subMembers[index].account.address.line2" autocomplete="address-line2" value="" type="text" class="form-control neonfront_input neon-field--membership-subMembers[index]-account-address-line2" :class="{'is-invalid': checkFieldInvalid('subMembers['+index+'].account.address.line2')}" v-bind:aria-describedby="'subMembers['+index+'].account.address.line2'+'_feedback'" v-model="formData.subMembers[index].account.address.line2" @blur="onFieldBlur" > <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'subMembers['+index+'].account.address.line2'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['subMembers['+index+'].account.address.line2']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-6"> <!-- Section --> <!-- Label --> <label v-bind:for="'subMembers['+index+'].account.address.city'" class="form-label">City</label> <!-- Input --> <input v-bind:id="'subMembers['+index+'].account.address.city'" v-bind:name="'subMembers['+index+'].account.address.city'" name="subMembers[index].account.address.city" value="" type="text" class="form-control neonfront_input neon-field--membership-subMembers[index]-account-address-city" :class="{'is-invalid': checkFieldInvalid('subMembers['+index+'].account.address.city')}" v-bind:aria-describedby="'subMembers['+index+'].account.address.city'+'_feedback'" v-model="formData.subMembers[index].account.address.city" @blur="onFieldBlur" > <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'subMembers['+index+'].account.address.city'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['subMembers['+index+'].account.address.city']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-6"> <!-- Section --> <!-- Label --> <label v-bind:for="'subMembers['+index+'].account.address.stateOrProvince'" class="form-label">State/Province</label> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <select v-bind:id="'subMembers['+index+'].account.address.stateOrProvince'" v-bind:name="'subMembers['+index+'].account.address.stateOrProvince'" name="subMembers[index].account.address.stateOrProvince" class="form-select neonfront_input neon-field--membership-subMembers[index]-account-address-stateOrProvince" :class="{'is-invalid': checkFieldInvalid('subMembers['+index+'].account.address.stateOrProvince')}" v-bind:aria-describedby="'subMembers['+index+'].account.address.stateOrProvince'+'_feedback'" v-model="formData.subMembers[index].account.address.stateOrProvince" @change="onFieldBlur"> <option></option> <option value="AL">Alabama</option> <option value="AK">Alaska</option> <option value="AZ">Arizona</option> <option value="AR">Arkansas</option> <option value="CA">California</option> <option value="CO">Colorado</option> <option value="CT">Connecticut</option> <option value="DE">Delaware</option> <option value="DC">District of Columbia</option> <option value="FL">Florida</option> <option value="GA">Georgia</option> <option value="HI">Hawaii</option> <option value="ID">Idaho</option> <option value="IL">Illinois</option> <option value="IN">Indiana</option> <option value="IA">Iowa</option> <option value="KS">Kansas</option> <option value="KY">Kentucky</option> <option value="LA">Louisiana</option> <option value="ME">Maine</option> <option value="MD">Maryland</option> <option value="MA">Massachusetts</option> <option value="MI">Michigan</option> <option value="MN">Minnesota</option> <option value="MS">Mississippi</option> <option value="MO">Missouri</option> <option value="MT">Montana</option> <option value="NE">Nebraska</option> <option value="NV">Nevada</option> <option value="NH">New Hampshire</option> <option value="NJ">New Jersey</option> <option value="NM">New Mexico</option> <option value="NY">New York</option> <option value="NC">North Carolina</option> <option value="ND">North Dakota</option> <option value="OH">Ohio</option> <option value="OK">Oklahoma</option> <option value="OR">Oregon</option> <option value="PA">Pennsylvania</option> <option value="RI">Rhode Island</option> <option value="SC">South Carolina</option> <option value="SD">South Dakota</option> <option value="TN">Tennessee</option> <option value="TX">Texas</option> <option value="UT">Utah</option> <option value="VT">Vermont</option> <option value="VA">Virginia</option> <option value="WA">Washington</option> <option value="WV">West Virginia</option> <option value="WI">Wisconsin</option> <option value="WY">Wyoming</option> <option value="AS">American Samoa</option> <option value="FM">Federated States of Micronesia</option> <option value="GU">Guam</option> <option value="MH">Marshall Islands</option> <option value="MP">Northern Mariana Islands</option> <option value="PW">Palau</option> <option value="PR">Puerto Rico</option> <option value="UM">U.S. Minor Outlying Islands</option> <option value="VI">Virgin Islands</option> <option value="AA">Armed Forces Americas</option> <option value="AE">Armed Forces Europe, the Middle East, an</option> <option value="AP">Armed Forces Pacific</option> <option value="AB">Alberta</option> <option value="BC">British Columbia</option> <option value="MB">Manitoba</option> <option value="NB">New Brunswick</option> <option value="NL">Newfoundland and Labrador</option> <option value="NS">Nova Scotia</option> <option value="NT">Northwest Territories</option> <option value="NU">Nunavut Territory</option> <option value="ON">Ontario</option> <option value="PE">Prince Edward Island</option> <option value="QC">Quebec</option> <option value="SK">Saskatchewan</option> <option value="YT">Yukon Territory</option> </select> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'subMembers['+index+'].account.address.stateOrProvince'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['subMembers['+index+'].account.address.stateOrProvince']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-6"> <!-- Section --> <!-- Label --> <label v-bind:for="'subMembers['+index+'].account.address.zipCode'" class="form-label">Zip/Postal Code</label> <!-- Input --> <input v-bind:id="'subMembers['+index+'].account.address.zipCode'" v-bind:name="'subMembers['+index+'].account.address.zipCode'" name="subMembers[index].account.address.zipCode" value="" type="text" class="form-control neonfront_input neon-field--membership-subMembers[index]-account-address-zipCode" :class="{'is-invalid': checkFieldInvalid('subMembers['+index+'].account.address.zipCode')}" v-bind:aria-describedby="'subMembers['+index+'].account.address.zipCode'+'_feedback'" v-model="formData.subMembers[index].account.address.zipCode" @blur="onFieldBlur" > <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'subMembers['+index+'].account.address.zipCode'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['subMembers['+index+'].account.address.zipCode']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-6"> <!-- Section --> <!-- Label --> <label v-bind:for="'subMembers['+index+'].account.address.country'" class="form-label">Country</label> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <select v-bind:id="'subMembers['+index+'].account.address.country'" v-bind:name="'subMembers['+index+'].account.address.country'" name="subMembers[index].account.address.country" class="form-select neonfront_input neon-field--membership-subMembers[index]-account-address-country" :class="{'is-invalid': checkFieldInvalid('subMembers['+index+'].account.address.country')}" v-bind:aria-describedby="'subMembers['+index+'].account.address.country'+'_feedback'" v-model="formData.subMembers[index].account.address.country" @change="onFieldBlur"> <option></option> <option value="1">United States of America</option> <option value="2">Canada</option> <option value="3">Afghanistan</option> <option value="247">Åland Islands</option> <option value="4">Albania</option> <option value="5">Algeria</option> <option value="6">American Samoa</option> <option value="7">Andorra</option> <option value="8">Angola</option> <option value="242">Anguilla</option> <option value="9">Antarctica</option> <option value="10">Antigua and Barbuda</option> <option value="11">Argentina</option> <option value="12">Armenia</option> <option value="13">Aruba</option> <option value="14">Australia</option> <option value="15">Austria</option> <option value="16">Azerbaijan</option> <option value="17">Bahamas</option> <option value="18">Bahrain</option> <option value="19">Bangladesh</option> <option value="20">Barbados</option> <option value="21">Belarus</option> <option value="22">Belgium</option> <option value="23">Belize</option> <option value="24">Benin</option> <option value="25">Bermuda</option> <option value="26">Bhutan</option> <option value="27">Bolivia (Plurinational State of)</option> <option value="248">Bonaire, Sint Eustatius and Saba</option> <option value="28">Bosnia and Herzegovina</option> <option value="29">Botswana</option> <option value="30">Bouvet Island</option> <option value="31">Brazil</option> <option value="32">British Indian Ocean Territory</option> <option value="33">Brunei Darussalam</option> <option value="34">Bulgaria</option> <option value="35">Burkina Faso</option> <option value="36">Burundi</option> <option value="39">Cabo Verde</option> <option value="37">Cambodia</option> <option value="38">Cameroon</option> <option value="40">Cayman Islands</option> <option value="41">Central African Republic</option> <option value="42">Chad</option> <option value="43">Chile</option> <option value="44">China</option> <option value="45">Christmas Island</option> <option value="46">Cocos (Keeling) Islands</option> <option value="47">Colombia</option> <option value="48">Comoros</option> <option value="49">Congo</option> <option value="238">Congo (the Democratic Republic of the)</option> <option value="50">Cook Islands</option> <option value="51">Costa Rica</option> <option value="106">Côte d'Ivoire</option> <option value="52">Croatia</option> <option value="53">Cuba</option> <option value="249">Curaçao</option> <option value="54">Cyprus</option> <option value="55">Czechia</option> <option value="56">Denmark</option> <option value="57">Djibouti</option> <option value="58">Dominica</option> <option value="59">Dominican Republic</option> <option value="61">Ecuador</option> <option value="62">Egypt</option> <option value="63">El Salvador</option> <option value="64">Equatorial Guinea</option> <option value="65">Eritrea</option> <option value="66">Estonia</option> <option value="67">Ethiopia</option> <option value="68">Falkland Islands [Malvinas]</option> <option value="69">Faroe Islands</option> <option value="70">Fiji</option> <option value="71">Finland</option> <option value="73">France</option> <option value="75">French Guiana</option> <option value="171">French Polynesia</option> <option value="76">French Southern Territories</option> <option value="77">Gabon</option> <option value="78">Gambia</option> <option value="79">Georgia</option> <option value="80">Germany</option> <option value="81">Ghana</option> <option value="82">Gibraltar</option> <option value="84">Greece</option> <option value="85">Greenland</option> <option value="86">Grenada</option> <option value="87">Guadeloupe</option> <option value="88">Guam</option> <option value="89">Guatemala</option> <option value="250">Guernsey</option> <option value="90">Guinea</option> <option value="91">Guinea-Bissau</option> <option value="92">Guyana</option> <option value="93">Haiti</option> <option value="94">Heard Island and McDonald Islands</option> <option value="229">Holy See</option> <option value="95">Honduras</option> <option value="96">Hong Kong</option> <option value="97">Hungary</option> <option value="98">Iceland</option> <option value="99">India</option> <option value="100">Indonesia</option> <option value="101">Iran (Islamic Republic of)</option> <option value="102">Iraq</option> <option value="103">Ireland</option> <option value="251">Isle of Man</option> <option value="104">Israel</option> <option value="105">Italy</option> <option value="107">Jamaica</option> <option value="108">Japan</option> <option value="252">Jersey</option> <option value="109">Jordan</option> <option value="110">Kazakhstan</option> <option value="111">Kenya</option> <option value="112">Kiribati</option> <option value="158">Korea (the Democratic People's Republic of)</option> <option value="198">Korea (the Republic of)</option> <option value="113">Kuwait</option> <option value="114">Kyrgyzstan</option> <option value="115">Lao People's Democratic Republic</option> <option value="116">Latvia</option> <option value="117">Lebanon</option> <option value="118">Lesotho</option> <option value="119">Liberia</option> <option value="120">Libya</option> <option value="121">Liechtenstein</option> <option value="122">Lithuania</option> <option value="123">Luxembourg</option> <option value="124">Macao</option> <option value="125">Macedonia (the former Yugoslav Republic of)</option> <option value="126">Madagascar</option> <option value="127">Malawi</option> <option value="128">Malaysia</option> <option value="129">Maldives</option> <option value="130">Mali</option> <option value="131">Malta</option> <option value="132">Marshall Islands</option> <option value="133">Martinique</option> <option value="134">Mauritania</option> <option value="135">Mauritius</option> <option value="136">Mayotte</option> <option value="137">Mexico</option> <option value="138">Micronesia (Federated States of)</option> <option value="139">Moldova (the Republic of)</option> <option value="140">Monaco</option> <option value="141">Mongolia</option> <option value="253">Montenegro</option> <option value="142">Montserrat</option> <option value="143">Morocco</option> <option value="144">Mozambique</option> <option value="145">Myanmar</option> <option value="146">Namibia</option> <option value="147">Nauru</option> <option value="148">Nepal</option> <option value="149">Netherlands</option> <option value="151">New Caledonia</option> <option value="152">New Zealand</option> <option value="153">Nicaragua</option> <option value="154">Niger</option> <option value="155">Nigeria</option> <option value="156">Niue</option> <option value="157">Norfolk Island</option> <option value="159">Northern Mariana Islands</option> <option value="160">Norway</option> <option value="161">Oman</option> <option value="162">Pakistan</option> <option value="163">Palau</option> <option value="246">Palestine, State of</option> <option value="164">Panama</option> <option value="165">Papua New Guinea</option> <option value="166">Paraguay</option> <option value="167">Peru</option> <option value="168">Philippines</option> <option value="169">Pitcairn</option> <option value="170">Poland</option> <option value="172">Portugal</option> <option value="173">Puerto Rico</option> <option value="174">Qatar</option> <option value="175">Réunion</option> <option value="176">Romania</option> <option value="177">Russian Federation</option> <option value="178">Rwanda</option> <option value="254">Saint Barthélemy</option> <option value="180">Saint Helena, Ascension and Tristan da Cunha</option> <option value="181">Saint Kitts and Nevis</option> <option value="182">Saint Lucia</option> <option value="255">Saint Martin (French part)</option> <option value="183">Saint Pierre and Miquelon</option> <option value="185">Saint Vincent and the Grenadines</option> <option value="186">Samoa</option> <option value="187">San Marino</option> <option value="184">Sao Tome and Principe</option> <option value="188">Saudi Arabia</option> <option value="189">Senegal</option> <option value="256">Serbia</option> <option value="190">Seychelles</option> <option value="191">Sierra Leone</option> <option value="192">Singapore</option> <option value="245">Sint Maarten (Dutch part)</option> <option value="193">Slovakia</option> <option value="194">Slovenia</option> <option value="195">Solomon Islands</option> <option value="196">Somalia</option> <option value="197">South Africa</option> <option value="179">South Georgia and the South Sandwich Islands</option> <option value="243">South Sudan</option> <option value="199">Spain</option> <option value="200">Sri Lanka</option> <option value="201">Sudan</option> <option value="202">Suriname</option> <option value="203">Svalbard and Jan Mayen</option> <option value="204">Swaziland</option> <option value="205">Sweden</option> <option value="206">Switzerland</option> <option value="207">Syrian Arab Republic</option> <option value="209">Taiwan (Province of China)</option> <option value="208">Tajikistan</option> <option value="210">Tanzania, United Republic of</option> <option value="211">Thailand</option> <option value="60">Timor-Leste</option> <option value="212">Togo</option> <option value="213">Tokelau</option> <option value="214">Tonga</option> <option value="215">Trinidad and Tobago</option> <option value="216">Tunisia</option> <option value="217">Turkey</option> <option value="218">Turkmenistan</option> <option value="219">Turks and Caicos Islands</option> <option value="220">Tuvalu</option> <option value="221">Uganda</option> <option value="222">Ukraine</option> <option value="223">United Arab Emirates</option> <option value="83">United Kingdom of Great Britain and Northern Ireland</option> <option value="226">United States Minor Outlying Islands</option> <option value="225">Uruguay</option> <option value="227">Uzbekistan</option> <option value="228">Vanuatu</option> <option value="230">Venezuela (Bolivarian Republic of)</option> <option value="231">Viet Nam</option> <option value="232">Virgin Islands (British)</option> <option value="233">Virgin Islands (U.S.)</option> <option value="234">Wallis and Futuna</option> <option value="235">Western Sahara*</option> <option value="236">Yemen</option> <option value="239">Zambia</option> <option value="240">Zimbabwe</option> </select> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'subMembers['+index+'].account.address.country'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['subMembers['+index+'].account.address.country']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> </body> </div> </div> <div v-else class="col-12 order-summary"> <div class="neonfront-subform"> <div class="row" v-for="(sm,smIndex) in selectedContactList[index]"> <div class="col-1"> <span class="sub-idx float-start">{{smIndex+1}}</span> <input type="hidden" :name="'subMembers['+index+'].contactIds['+smIndex+']'" :value="sm.contactId"> <input type="hidden" :name="'subMembers['+index+'].installRenewMeIds['+smIndex+']'" :value="sm.subMeId"> </div> <div class="col-11"> <div class="sub-item-name">{{sm.contactName.toUpperCase()}}</div> </div> </div> </div> </div> </div> </div> </div> <div class="sub-member-addition" v-show="subMemberChecked"> <span v-if="this.selectContactCount<this.term.subMemberAllowed" @click="addSubMember"><i class="fal fa-plus-circle me-1"></i>Add {{subMemberDisplayName}}</span> </div> </html> <!-- Description --> <!-- Invalid --> <div id="'subMemberChecked'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['subMemberChecked']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> </body> <!-- Button --> <div class="col-md-12 neonfront_element"> <div class="row g-2" v-show="currentPage===3"> <div class="col"> <button type="button" class="btn neonfront-btn-primary btn-lg" @click="nextPage"> {{forwardButtons[currentPage-1]}} </button> </div> </div> </div> <!-- Google reCAPTCHA Policy --> <div v-if="currentPage===6" class="col-md-12 neonfront_element"> <div class="re-captcha-policy-border"> <i class="fal fa-lock"></i> Secure Payment </div> <div class="re-captcha-policy"> This site is protected by reCAPTCHA and the Google <a href="https://policies.google.com/privacy">Privacy Policy</a> and <a href="https://policies.google.com/terms">Terms of Service</a> apply. </div> </div> </div> </div> <div class="col-12" id="neon-page-4" v-show="currentPage===4"> <div class="row g-3 neonfront-form"> <div class="col-md-12 neonfront_element mt-0"> </div> <!-- Fields --> <body> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <div class="row" v-show="showField('donationChecked')"> <div class="form-check" > <input class="form-check-input neonfront_checkbox neon-field--membership-donationChecked" type="checkbox" v-bind:id="'donationChecked'" v-bind:name="'donationChecked'" name="donationChecked" v-model="formData.donationChecked" @change="onFieldChange" value="true"> <label class="form-check-label neonfront_checkbox_label" v-bind:for="'donationChecked'">$ Add a donation</label> </div> </div> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'donationChecked'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['donationChecked']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!DOCTYPE html> <html lang="en"> <!DOCTYPE html> <html lang="en"> <!-- Pledge Payment --> </html> <!DOCTYPE html> <html lang="en"> <!-- Grant Payment --> </html> <!-- Donation Frequency --> <div v-show="false" class="btn-group" role="group"> <input type="hidden" name="frequency" v-model="selectedFrequency"> <label v-on:click="changeDonationFrequency('donationOnce')" class="btn neonfront-btn-outline-primary btn-nm fs-875" :class="{'donationFrequencyChecked': donationFrequencyChecked('donationOnce')}" style="color: #54698D;border: 1px solid #C0C8D7;border-radius: 3px 0 0 3px;padding-right: 2px;padding-left: 2px;">Donate Once</label> </div> </html> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'frequency'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['frequency']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!DOCTYPE html> <html lang="en"> <!-- Donation Amount --> <div class="row g-2" id="donation-amount-container"> <!-- Layout: Amounts Only --> <div class="col-4" v-show="donationOnceChecked"> <input type="radio" class="btn-check btn-check-donationOnce" name="donationAmount.donationOnce" value="50.00" id="amount-radio-1" v-on:click="changeDonationAmount(50.00,true)" autocomplete="off"> <label class="btn neonfront-btn-outline-primary btn-nm px-0 fs-875 btn-label-donationOnce" style="color: #54698D;border: 1px solid #C0C8D7;" for="amount-radio-1" v-text="formatAmount(50.00)"></label> </div> <div class="col-4" v-show="!donationOnceChecked"> <input type="radio" class="btn-check btn-check-recurring" name="donationAmount.recurring" value="10" id="amount-radio-2" v-on:click="changeDonationAmount(10,false)" autocomplete="off"> <label class="btn neonfront-btn-outline-primary btn-nm px-0 fs-875 btn-label-recurring" style="color: #54698D;border: 1px solid #C0C8D7;" for="amount-radio-2" v-text="formatAmount(10)"></label> </div> <div class="col-4" v-show="donationOnceChecked"> <input type="radio" class="btn-check btn-check-donationOnce" name="donationAmount.donationOnce" value="100.00" id="amount-radio-3" v-on:click="changeDonationAmount(100.00,true)" autocomplete="off"> <label class="btn neonfront-btn-outline-primary btn-nm px-0 fs-875 btn-label-donationOnce" style="color: #54698D;border: 1px solid #C0C8D7;" for="amount-radio-3" v-text="formatAmount(100.00)"></label> </div> <div class="col-4" v-show="!donationOnceChecked"> <input type="radio" class="btn-check btn-check-recurring" name="donationAmount.recurring" value="25" id="amount-radio-4" v-on:click="changeDonationAmount(25,false)" autocomplete="off"> <label class="btn neonfront-btn-outline-primary btn-nm px-0 fs-875 btn-label-recurring" style="color: #54698D;border: 1px solid #C0C8D7;" for="amount-radio-4" v-text="formatAmount(25)"></label> </div> <div class="col-4" v-show="donationOnceChecked"> <input type="radio" class="btn-check btn-check-donationOnce" name="donationAmount.donationOnce" value="250.00" id="amount-radio-5" v-on:click="changeDonationAmount(250.00,true)" autocomplete="off" checked="checked"> <label class="btn neonfront-btn-outline-primary btn-nm px-0 fs-875 btn-label-donationOnce" style="color: #54698D;border: 1px solid #C0C8D7;" for="amount-radio-5" v-text="formatAmount(250.00)"></label> </div> <div class="col-4" v-show="!donationOnceChecked"> <input type="radio" class="btn-check btn-check-recurring" name="donationAmount.recurring" value="50" id="amount-radio-6" v-on:click="changeDonationAmount(50,false)" autocomplete="off"> <label class="btn neonfront-btn-outline-primary btn-nm px-0 fs-875 btn-label-recurring" style="color: #54698D;border: 1px solid #C0C8D7;" for="amount-radio-6" v-text="formatAmount(50)"></label> </div> <div class="col-4" v-show="donationOnceChecked"> <input type="radio" class="btn-check btn-check-donationOnce" name="donationAmount.donationOnce" value="500.00" id="amount-radio-7" v-on:click="changeDonationAmount(500.00,true)" autocomplete="off"> <label class="btn neonfront-btn-outline-primary btn-nm px-0 fs-875 btn-label-donationOnce" style="color: #54698D;border: 1px solid #C0C8D7;" for="amount-radio-7" v-text="formatAmount(500.00)"></label> </div> <div class="col-4" v-show="!donationOnceChecked"> <input type="radio" class="btn-check btn-check-recurring" name="donationAmount.recurring" value="100" id="amount-radio-8" v-on:click="changeDonationAmount(100,false)" autocomplete="off"> <label class="btn neonfront-btn-outline-primary btn-nm px-0 fs-875 btn-label-recurring" style="color: #54698D;border: 1px solid #C0C8D7;" for="amount-radio-8" v-text="formatAmount(100)"></label> </div> <div class="col-4" v-show="donationOnceChecked"> <input type="radio" class="btn-check btn-check-donationOnce" name="donationAmount.donationOnce" value="1000.00" id="amount-radio-9" v-on:click="changeDonationAmount(1000.00,true)" autocomplete="off"> <label class="btn neonfront-btn-outline-primary btn-nm px-0 fs-875 btn-label-donationOnce" style="color: #54698D;border: 1px solid #C0C8D7;" for="amount-radio-9" v-text="formatAmount(1000.00)"></label> </div> <div class="col-4" v-show="!donationOnceChecked"> <input type="radio" class="btn-check btn-check-recurring" name="donationAmount.recurring" value="250" id="amount-radio-10" v-on:click="changeDonationAmount(250,false)" autocomplete="off"> <label class="btn neonfront-btn-outline-primary btn-nm px-0 fs-875 btn-label-recurring" style="color: #54698D;border: 1px solid #C0C8D7;" for="amount-radio-10" v-text="formatAmount(250)"></label> </div> <div class="col-4" v-show="donationOnceChecked"> <input type="radio" class="btn-check btn-check-donationOnce" name="donationAmount.donationOnce" id="amount-radio-other1" autocomplete="off" @click="changeDonationAmount('',true)"> <label class="btn neonfront-btn-outline-primary btn-nm fs-875 btn-label-donationOnce" style="color: #54698D;border: 1px solid #C0C8D7;padding-left: 2px;padding-right: 2px;overflow: hidden;" for="amount-radio-other1">Other Amount</label> </div> <!-- Layout: Amounts + Description --> <div class="col-md-12" v-show="donationOtherAmountSelected"> <label class="form-label" style="color: #54698D" for="amount-other-input">{{donationOtherAmountLabel}} *</label> <div class="input-group amount-other-group" :class="{'is-invalid': checkFieldInvalid('donationAmount')}"> <span class="input-group-text"><i class="far" :class="formCurrencySignClass"></i></span> <input type="number" class="form-control neonfront_input neon-field--membership-donationAmount" :class="{'is-invalid': checkFieldInvalid('donationAmount')}" id="amount-other-input" name="donationAmount" aria-describedby="donationAmount_feedback" v-model="donationAmount" @blur="onFieldBlur" @keypress="onAmountKeyPress" @focus="otherAmountFocus" placeholder="0.00"> <span class="input-group-text" style="background-color: #fff;">USD</span> </div> <div id="'donationAmount'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['donationAmount']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="invalid-feedback d-block mt-2"> <div v-show="showDonationAmountInvalidMessage()"> <div v-for="item in invalidField['donationAmount']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> </div> </html> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'donationAmount'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['donationAmount']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> </body> <!-- Button --> <div class="col-md-12 neonfront_element"> <div class="row g-2" v-show="currentPage===4"> <div class="col"> <button type="button" class="btn neonfront-btn-primary btn-lg" @click="nextPage"> {{forwardButtons[currentPage-1]}} </button> </div> </div> </div> <!-- Google reCAPTCHA Policy --> <div v-if="currentPage===6" class="col-md-12 neonfront_element"> <div class="re-captcha-policy-border"> <i class="fal fa-lock"></i> Secure Payment </div> <div class="re-captcha-policy"> This site is protected by reCAPTCHA and the Google <a href="https://policies.google.com/privacy">Privacy Policy</a> and <a href="https://policies.google.com/terms">Terms of Service</a> apply. </div> </div> </div> </div> <div class="col-12" id="neon-page-5" v-show="currentPage===5"> <div class="row g-3 neonfront-form"> <div class="col-md-12 neonfront_element mt-0"> </div> <!-- Fields --> <body> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!DOCTYPE html> <html lang="en"> <!-- Summary --> <div class="order-summary"> <!-- membership and sub members --> <div class="row gx-0" v-if="orderSummary.membershipOrderItem"> <div class="col-9"> <div class="item-name">{{orderSummary.membershipOrderItem.termName}} <i class="fas fa-pencil" @click="editMembershipLevel"></i></div> <div>{{orderSummary.membershipOrderItem.startDate}} - {{orderSummary.membershipOrderItem.endDate}}</div> </div> <div class="col-3 text-end"> <div class="amount-block d-inline-block">{{orderSummary.membershipsTotal==0?'Free':formatAmount(orderSummary.membershipsTotal)}}</div> </div> <div v-if="orderSummary.membershipOrderItem.installmentFlag" class="col-12 mt-1"> <div class="auto-renew-text"> Membership auto-renews monthly for {{ formatAutoRenewAmount(orderSummary.membershipOrderItem.membershipInstallment.cost) }} until {{ orderSummary.membershipOrderItem.membershipInstallment.endDate }} </div> </div> <div v-else-if="orderSummary.membershipOrderItem.membershipAutoRenew.autoRenew" class="col-12 mt-1"> <div class="auto-renew-text">Membership auto-renews on {{orderSummary.membershipOrderItem.membershipAutoRenew.renewDate}} for {{formatAutoRenewAmount(orderSummary.membershipOrderItem.membershipAutoRenew.cost)}}</div> </div> </div> <div class="row" v-if="orderSummary.subMemberOrderItems!=null && orderSummary.subMemberOrderItems.length>0"> <div class="col-12 mt-3" v-show="showMembershipDetails"> <div class="neonfront-subform"> <div v-if="orderSummary.membershipOrderItem" class="row"> <div class="col-1"> <span class="sub-idx float-start">1</span> </div> <div class="col-11"> <div class="sub-item-name">{{orderSummary.membershipOrderItem.userName}}</div> <div class="blue-text"> <span class="float-end">{{orderSummary.membershipOrderItem.cost==0?'Free':formatAmount(orderSummary.membershipOrderItem.cost)}}</span> <span>{{orderSummary.membershipOrderItem.termName}}</span> </div> <div>{{orderSummary.membershipOrderItem.startDate}} - {{orderSummary.membershipOrderItem.endDate}}</div> </div> <div v-if="orderSummary.membershipOrderItem.installmentFlag" class="offset-1 col-11 mt-1"> <div class="auto-renew-text"> Membership auto-renews monthly for {{ formatAutoRenewAmount(orderSummary.membershipOrderItem.membershipInstallment.cost) }} until {{ orderSummary.membershipOrderItem.membershipInstallment.endDate }} </div> </div> <div v-else-if="orderSummary.membershipOrderItem.membershipAutoRenew.autoRenew" class="offset-1 col-11 mt-1"> <div class="auto-renew-text">Membership auto-renews on {{orderSummary.membershipOrderItem.membershipAutoRenew.renewDate}} for {{formatAutoRenewAmount(orderSummary.membershipOrderItem.membershipAutoRenew.cost)}}</div> </div> </div> <div class="row" v-for="(sm,smIndex) in orderSummary.subMemberOrderItems"> <div class="col-1"> <span class="sub-idx float-start">{{orderSummary.membershipOrderItem!=null?smIndex+2:smIndex+1}}</span> </div> <div class="col-11"> <div class="sub-item-name">{{sm.userName}} ({{subMemberDisplayName}})</div> <div class="blue-text"> <span class="float-end">{{sm.cost==0?'Free':formatAmount(sm.cost)}}</span> <span>{{sm.termName}}</span> </div> <div>{{sm.startDate}} - {{sm.endDate}}</div> </div> <div v-if="sm.installmentFlag" class="offset-1 col-11 mt-1"> <div class="auto-renew-text"> Membership auto-renews monthly for {{ formatAutoRenewAmount(sm.membershipInstallment.cost) }} until {{ sm.membershipInstallment.endDate }} </div> </div> <div v-else-if="sm.membershipAutoRenew.autoRenew" class="offset-1 col-11 mt-1"> <div class="auto-renew-text">Membership auto-renews on {{sm.membershipAutoRenew.renewDate}} for {{formatAutoRenewAmount(sm.membershipAutoRenew.cost)}}</div> </div> </div> </div> </div> <div v-if="orderSummary.membershipOrderItem" class="col-12 mt-2"> <div style="color: #0074D9;cursor: pointer" @click="showMembershipDetails=!showMembershipDetails" v-text="showMembershipDetails?'Hide Membership Details':'Show Membership Details'"></div> </div> </div> <div class="row"> <div class="col-12"> <div class="x-splitter"></div> </div> </div> <!-- Donation --> <div class="row" v-show="formData.donationChecked"> <div class="col-2"> <div class="sign-block">{{this.formCurrency.sign}}</div> </div> <div class="col-7" style="display: flex;align-items: center"> <div class="item-name" style="margin-left: -8px">{{addonDonationLabel}}<i class="fas fa-pencil" @click="editDonation"></i></div> </div> <div class="col-3 text-end"> <div class="amount-block d-inline-block" style="margin-top: 6px">{{formatAmount(orderSummary.donationAmount)}}</div> </div> <div class="col-12 mt-1" v-if="orderSummary.recurringDonationNextDate !== null"> <div class="auto-renew-text">Frequency selected: {{recurringUnitText}}. Next add-on payment processes on {{orderSummary.recurringDonationNextDate}} for {{formatAmount(orderSummary.donationAmount)}}</div> </div> <div class="col-12"> <div class="x-splitter"></div> </div> </div> <!-- Discount Code --> <div v-show="orderSummary.hasDiscountCode" class="row gx-2"> <div class="col-12"> <h3 class="section-title">Discount Code</h3> </div> <div class="col-9"> <input class="form-control neonfront_input" name="discountCode" id="discountCode" @blur="onDiscountCodeInputBlur" :class="{'is-invalid': checkFieldInvalid('discountCode')}" v-model="formData.discountCode" :readonly="discountCodeAdded" placeholder="Code"> <div id="discountCode_feedback" class="invalid-feedback"> <div v-for="item in invalidField['discountCode']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="col-3"> <button type="button" class="btn neonfront-btn-primary btn-lg" :disabled="this.formData.discountCode===''||discountCodeAdded" @click="applyDiscount">Apply</button> </div> <div v-show="discountCodeAdded" class="col-12" style="margin-top: 20px;"> <i class="fas fa-check-circle fs-075" style="color: #008000;"></i> <span class="ms-1" style="color: #36517D;font-weight: 600;"> Code: <span v-text="formData.discountCode"></span></span> <a class="far fa-times float-end" @click="cancelDiscount"></a> </div> <div v-show="discountCodeAdded" class="col-12"> <span class="ms-3" style="color: #002D41;">-{{formatAmount(orderSummary.codeDiscount)}}</span> </div> <div class="col-12"> <div class="x-splitter"></div> </div> </div> <!-- Order Summary --> <div class="row"> <div class="col-12"> <h3 class="section-title">Order summary</h3> </div> <div class="col-12"> <div class="mb-2"> <span class="total-item-name">Subtotal</span> <span class="total-item-amount float-end">{{formatAmount(orderSummary.subtotal)}}</span> </div> <div v-show="orderSummary.discounts && orderSummary.discounts > 0"> <span class="total-item-name">Discounts</span> <span class="total-item-amount float-end">-{{formatAmount(orderSummary.discounts)}}</span> </div> </div> <div class="col-12"> <div class="x-splitter" style="margin: 12px auto;"></div> </div> <div class="col-12 total"> <span>Total</span> <span class="float-end">{{formatAmount(orderSummary.total)}}</span> </div> </div> </div> <div v-show ="totalAmount===0.0" name="name:reCaptcha"></div> </html> <!-- Description --> <!-- Invalid --> <div id="'discountCode'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['discountCode']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> </body> <!-- Button --> <div class="col-md-12 neonfront_element"> <div class="row g-2" v-show="currentPage===5"> <div class="col"> <button type="button" class="btn neonfront-btn-primary btn-lg" @click="nextPage"> {{forwardButtons[currentPage-1]}} </button> </div> </div> </div> <!-- Google reCAPTCHA Policy --> <div v-if="currentPage===6" class="col-md-12 neonfront_element"> <div class="re-captcha-policy-border"> <i class="fal fa-lock"></i> Secure Payment </div> <div class="re-captcha-policy"> This site is protected by reCAPTCHA and the Google <a href="https://policies.google.com/privacy">Privacy Policy</a> and <a href="https://policies.google.com/terms">Terms of Service</a> apply. </div> </div> </div> </div> <div class="col-12" id="neon-page-6" v-show="currentPage===6"> <div class="row g-3 neonfront-form"> <div class="col-md-12 neonfront_element mt-0"> <div id="globalError" class="row mt-3 neonfront_form_failed_container" v-show="globalError!=''"> <div class="col-2"> <span class="fa fa-exclamation-circle mt-1" style="font-size: 2.25rem;"></span> </div> <div class="col-10"> <h5 class="fs-6 mb-1" v-text="globalErrorTitle"></h5> <p class="mb-0" style="font-size: 0.875rem;" v-text="globalError"></p> </div> </div> </div> <!-- Fields --> <body> <div class="neonfront_element col-md-12"> <!-- Section --> <!-- Label --> <!-- Input --> <!-- Double-The-Donation --> <!-- password update start --> <!-- password update end --> <!-- Date/Time --> <!-- Dropdown --> <!-- CheckBox Single --> <!-- Checkbox --> <!-- Radio --> <!-- Textarea --> <!-- Phone --> <!-- Line1 --> <!-- DOB --> <!-- Payment --> <!DOCTYPE html> <html lang="en"> <body> <div v-if="showPayment" v-show="!withoutPayment"> <div class="row mx-0 neonfront_payment_tab"> <input type="hidden" name="payment.type" v-model="paymentType"> <div class="col" :class="{'active':paymentType==='CARD'}" @click="changePaymentType('CARD')">Card</div> <div class="col" :class="{'active':paymentType==='ACH'}" @click="changePaymentType('ACH')">ACH</div> <div class="col" v-if="payPal" :class="{'active':paymentType==='PAYPAL'}" @click="changePaymentType('PAYPAL')">PayPal</div> </div> <div class="row g-3 mt-0" v-show="paymentType==='CARD'"> <div v-show="donorCoveredFeeEnabled" class="neonfront_element col-md-12" v-if="cardDonorCoveredFeeDesc!=null&&!googleAndApplePayIncompatible"> <div class="form-check"> <input class="form-check-input neonfront_checkbox" type="checkbox" v-model="cardDonorCoveredFeeOpt" value="true" name="payment.card.donorCoveredFeeOpt" id="payment.card.donorCoveredFeeOpt"> <label class="form-check-label neonfront_checkbox_label" for="payment.card.donorCoveredFeeOpt">{{cardDonorCoveredFeeDesc}}</label> </div> </div> <div class="neonfront_element col-md-12" v-show="!googleAndApplePayIncompatible"> <input type="hidden" name="payment.card.payWithApplePay" v-model="payWithApplePay"> <input type="hidden" name="payment.card.payWithGooglePay" v-model="payWithGooglePay"> <div id="payment-apple-container" v-if="!applepayIncompatible" v-show="!submitting"></div> <div id="payment-google-container" v-if="!googlepayIncompatible" v-show="!submitting"></div> <div v-show="submitting"> <button class="btn neonfront-btn-primary btn-lg" type="button" disabled> Processing <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> </button> </div> </div> <div class="neonfront_element col-md-12" v-show="!googleAndApplePayIncompatible"> <div class="line-text-splitter"> <div class="line"></div> <div class="text">or enter your card details below</div> </div> </div> <div class="neonfront_element col-md-12" v-show="!showCardFields"> <button type="button" class="btn neonfront-btn-primary btn-lg phone-card-button" @click="showCardFields=true" :disabled="submitting" style="padding: 0 0 !important;"> <i class="fas fa-credit-card"></i> <span>Pay With Card</span> </button> </div> <div class="neonfront_element col-md-12" v-show="showCardFields"> <label for="payment.card.holderFirstName" class="form-label">Cardholder First Name <span>*</span></label> <input id="payment.card.holderFirstName" name="payment.card.holderFirstName" type="text" class="form-control neonfront_input" :class="{'is-invalid': checkFieldInvalid('payment.card.holderFirstName')}" aria-describedby="payment.card.holderFirstName_feedback" v-model="formData.payment.card.holderFirstName" @blur="onFieldBlur"> <div id="payment.card.holderFirstName_feedback" class="invalid-feedback"> <div v-for="item in invalidField['payment.card.holderFirstName']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12" v-show="showCardFields"> <label for="payment.card.holderLastName" class="form-label">Cardholder Last Name <span>*</span></label> <input id="payment.card.holderLastName" name="payment.card.holderLastName" type="text" class="form-control neonfront_input" :class="{'is-invalid': checkFieldInvalid('payment.card.holderLastName')}" aria-describedby="payment.card.holderLastName_feedback" v-model="formData.payment.card.holderLastName" @blur="onFieldBlur"> <div id="payment.card.holderLastName_feedback" class="invalid-feedback"> <div v-for="item in invalidField['payment.card.holderLastName']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12" v-show="showCardFields"> <label for="payment.card.holderEmail" class="form-label">Cardholder Email </label> <input id="payment.card.holderEmail" name="payment.card.holderEmail" type="text" class="form-control neonfront_input" :class="{'is-invalid': checkFieldInvalid('payment.card.holderEmail')}" aria-describedby="payment.card.holderEmail_feedback" v-model="formData.payment.card.holderEmail" @blur="onFieldBlur"> <div id="payment.card.holderEmail_feedback" class="invalid-feedback"> <div v-for="item in invalidField['payment.card.holderEmail']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="col-md-12" v-show="showCardFields"> <input type="hidden" name="payment.card.token" id="payment.card.token"> <label class="form-label" for="payment-card-container">Card *</label> <div id="payment-card-container" class="form-control" :class="{'is-invalid': checkFieldInvalid('payment-card-container')}"></div> <div class="invalid-feedback" v-for="item in invalidField['payment-card-container']"><i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> <div class="neonfront_element col-md-12" v-show="showCardFields && showSameAsBillingAddress"> <div class="form-check"> <input class="form-check-input neonfront_checkbox" type="checkbox" v-model="sameAsBillingAddress" value="true" id="sameAsBillingAddress" checked> <label class="form-check-label neonfront_checkbox_label" for="sameAsBillingAddress">Billing address is the same as mailing address</label> </div> </div> <div class="neonfront_element col-md-12" v-show="showCardFields && !sameAsBillingAddress"> <label for="payment.card.address.line1.line1" class="form-label">Address Line 1 </label> <input id="payment.card.address.line1.line1" name="payment.card.address.line1.line1" type="text" class="form-control neonfront_input" :class="{'is-invalid': checkFieldInvalid('payment.card.address.line1.line1')}" aria-describedby="payment.card.address.line1.line1_feedback" v-model="formData.payment.card.address.line1.line1" @blur="onFieldBlur"> <div id="payment.card.address.line1.line1_feedback" class="invalid-feedback"> <div v-for="item in invalidField['payment.card.address.line1.line1']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-12" v-show="showCardFields && !sameAsBillingAddress"> <label for="payment.card.address.line2" class="form-label">Address Line 2 </label> <input id="payment.card.address.line2" name="payment.card.address.line2" type="text" class="form-control neonfront_input" :class="{'is-invalid': checkFieldInvalid('payment.card.address.line2')}" aria-describedby="payment.card.address.line2_feedback" v-model="formData.payment.card.address.line2" @blur="onFieldBlur"> <div id="payment.card.address.line2_feedback" class="invalid-feedback"> <div v-for="item in invalidField['payment.card.address.line2']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-6" v-show="showCardFields && !sameAsBillingAddress"> <label for="payment.card.address.city" class="form-label">City </label> <input id="payment.card.address.city" name="payment.card.address.city" type="text" class="form-control neonfront_input" :class="{'is-invalid': checkFieldInvalid('payment.card.address.city')}" aria-describedby="payment.card.address.city_feedback" v-model="formData.payment.card.address.city" @blur="onFieldBlur"> <div id="payment.card.address.city_feedback" class="invalid-feedback"> <div v-for="item in invalidField['payment.card.address.city']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-6" v-show="showCardFields && !sameAsBillingAddress"> <label for="payment.card.address.stateOrProvince" class="form-label">State/Province </label> <select id="payment.card.address.stateOrProvince" name="payment.card.address.stateOrProvince" class="form-select neonfront_input" :class="{'is-invalid': checkFieldInvalid('payment.card.address.stateOrProvince')}" aria-describedby="payment.card.address.stateOrProvince_feedback" v-model="formData.payment.card.address.stateOrProvince" @change="onFieldBlur"> <option></option> <option value="AL">Alabama</option> <option value="AK">Alaska</option> <option value="AZ">Arizona</option> <option value="AR">Arkansas</option> <option value="CA">California</option> <option value="CO">Colorado</option> <option value="CT">Connecticut</option> <option value="DE">Delaware</option> <option value="DC">District of Columbia</option> <option value="FL">Florida</option> <option value="GA">Georgia</option> <option value="HI">Hawaii</option> <option value="ID">Idaho</option> <option value="IL">Illinois</option> <option value="IN">Indiana</option> <option value="IA">Iowa</option> <option value="KS">Kansas</option> <option value="KY">Kentucky</option> <option value="LA">Louisiana</option> <option value="ME">Maine</option> <option value="MD">Maryland</option> <option value="MA">Massachusetts</option> <option value="MI">Michigan</option> <option value="MN">Minnesota</option> <option value="MS">Mississippi</option> <option value="MO">Missouri</option> <option value="MT">Montana</option> <option value="NE">Nebraska</option> <option value="NV">Nevada</option> <option value="NH">New Hampshire</option> <option value="NJ">New Jersey</option> <option value="NM">New Mexico</option> <option value="NY">New York</option> <option value="NC">North Carolina</option> <option value="ND">North Dakota</option> <option value="OH">Ohio</option> <option value="OK">Oklahoma</option> <option value="OR">Oregon</option> <option value="PA">Pennsylvania</option> <option value="RI">Rhode Island</option> <option value="SC">South Carolina</option> <option value="SD">South Dakota</option> <option value="TN">Tennessee</option> <option value="TX">Texas</option> <option value="UT">Utah</option> <option value="VT">Vermont</option> <option value="VA">Virginia</option> <option value="WA">Washington</option> <option value="WV">West Virginia</option> <option value="WI">Wisconsin</option> <option value="WY">Wyoming</option> <option value="AS">American Samoa</option> <option value="FM">Federated States of Micronesia</option> <option value="GU">Guam</option> <option value="MH">Marshall Islands</option> <option value="MP">Northern Mariana Islands</option> <option value="PW">Palau</option> <option value="PR">Puerto Rico</option> <option value="UM">U.S. Minor Outlying Islands</option> <option value="VI">Virgin Islands</option> <option value="AA">Armed Forces Americas</option> <option value="AE">Armed Forces Europe, the Middle East, an</option> <option value="AP">Armed Forces Pacific</option> <option value="AB">Alberta</option> <option value="BC">British Columbia</option> <option value="MB">Manitoba</option> <option value="NB">New Brunswick</option> <option value="NL">Newfoundland and Labrador</option> <option value="NS">Nova Scotia</option> <option value="NT">Northwest Territories</option> <option value="NU">Nunavut Territory</option> <option value="ON">Ontario</option> <option value="PE">Prince Edward Island</option> <option value="QC">Quebec</option> <option value="SK">Saskatchewan</option> <option value="YT">Yukon Territory</option> </select> <div id="payment.card.address.stateOrProvince_feedback" class="invalid-feedback"> <div v-for="item in invalidField['payment.card.address.stateOrProvince']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-6" v-show="showCardFields && !sameAsBillingAddress"> <label for="payment.card.address.zipCode" class="form-label">Zip <span>*</span></label> <input id="payment.card.address.zipCode" name="payment.card.address.zipCode" type="text" class="form-control neonfront_input" :class="{'is-invalid': checkFieldInvalid('payment.card.address.zipCode')}" aria-describedby="payment.card.address.zipCode_feedback" v-model="formData.payment.card.address.zipCode" @blur="onFieldBlur"> <div id="payment.card.address.zipCode_feedback" class="invalid-feedback"> <div v-for="item in invalidField['payment.card.address.zipCode']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div class="neonfront_element col-md-6" v-show="showCardFields && !sameAsBillingAddress"> <label for="payment.card.address.country" class="form-label">Country </label> <select id="payment.card.address.country" name="payment.card.address.country" class="form-select neonfront_input" :class="{'is-invalid': checkFieldInvalid('payment.card.address.country')}" aria-describedby="payment.card.address.country_feedback" v-model="formData.payment.card.address.country" @change="onFieldBlur"> <option></option> <option value="1">United States of America</option> <option value="2">Canada</option> <option value="3">Afghanistan</option> <option value="247">Åland Islands</option> <option value="4">Albania</option> <option value="5">Algeria</option> <option value="6">American Samoa</option> <option value="7">Andorra</option> <option value="8">Angola</option> <option value="242">Anguilla</option> <option value="9">Antarctica</option> <option value="10">Antigua and Barbuda</option> <option value="11">Argentina</option> <option value="12">Armenia</option> <option value="13">Aruba</option> <option value="14">Australia</option> <option value="15">Austria</option> <option value="16">Azerbaijan</option> <option value="17">Bahamas</option> <option value="18">Bahrain</option> <option value="19">Bangladesh</option> <option value="20">Barbados</option> <option value="21">Belarus</option> <option value="22">Belgium</option> <option value="23">Belize</option> <option value="24">Benin</option> <option value="25">Bermuda</option> <option value="26">Bhutan</option> <option value="27">Bolivia (Plurinational State of)</option> <option value="248">Bonaire, Sint Eustatius and Saba</option> <option value="28">Bosnia and Herzegovina</option> <option value="29">Botswana</option> <option value="30">Bouvet Island</option> <option value="31">Brazil</option> <option value="32">British Indian Ocean Territory</option> <option value="33">Brunei Darussalam</option> <option value="34">Bulgaria</option> <option value="35">Burkina Faso</option> <option value="36">Burundi</option> <option value="39">Cabo Verde</option> <option value="37">Cambodia</option> <option value="38">Cameroon</option> <option value="40">Cayman Islands</option> <option value="41">Central African Republic</option> <option value="42">Chad</option> <option value="43">Chile</option> <option value="44">China</option> <option value="45">Christmas Island</option> <option value="46">Cocos (Keeling) Islands</option> <option value="47">Colombia</option> <option value="48">Comoros</option> <option value="49">Congo</option> <option value="238">Congo (the Democratic Republic of the)</option> <option value="50">Cook Islands</option> <option value="51">Costa Rica</option> <option value="106">Côte d'Ivoire</option> <option value="52">Croatia</option> <option value="53">Cuba</option> <option value="249">Curaçao</option> <option value="54">Cyprus</option> <option value="55">Czechia</option> <option value="56">Denmark</option> <option value="57">Djibouti</option> <option value="58">Dominica</option> <option value="59">Dominican Republic</option> <option value="61">Ecuador</option> <option value="62">Egypt</option> <option value="63">El Salvador</option> <option value="64">Equatorial Guinea</option> <option value="65">Eritrea</option> <option value="66">Estonia</option> <option value="67">Ethiopia</option> <option value="68">Falkland Islands [Malvinas]</option> <option value="69">Faroe Islands</option> <option value="70">Fiji</option> <option value="71">Finland</option> <option value="73">France</option> <option value="75">French Guiana</option> <option value="171">French Polynesia</option> <option value="76">French Southern Territories</option> <option value="77">Gabon</option> <option value="78">Gambia</option> <option value="79">Georgia</option> <option value="80">Germany</option> <option value="81">Ghana</option> <option value="82">Gibraltar</option> <option value="84">Greece</option> <option value="85">Greenland</option> <option value="86">Grenada</option> <option value="87">Guadeloupe</option> <option value="88">Guam</option> <option value="89">Guatemala</option> <option value="250">Guernsey</option> <option value="90">Guinea</option> <option value="91">Guinea-Bissau</option> <option value="92">Guyana</option> <option value="93">Haiti</option> <option value="94">Heard Island and McDonald Islands</option> <option value="229">Holy See</option> <option value="95">Honduras</option> <option value="96">Hong Kong</option> <option value="97">Hungary</option> <option value="98">Iceland</option> <option value="99">India</option> <option value="100">Indonesia</option> <option value="101">Iran (Islamic Republic of)</option> <option value="102">Iraq</option> <option value="103">Ireland</option> <option value="251">Isle of Man</option> <option value="104">Israel</option> <option value="105">Italy</option> <option value="107">Jamaica</option> <option value="108">Japan</option> <option value="252">Jersey</option> <option value="109">Jordan</option> <option value="110">Kazakhstan</option> <option value="111">Kenya</option> <option value="112">Kiribati</option> <option value="158">Korea (the Democratic People's Republic of)</option> <option value="198">Korea (the Republic of)</option> <option value="113">Kuwait</option> <option value="114">Kyrgyzstan</option> <option value="115">Lao People's Democratic Republic</option> <option value="116">Latvia</option> <option value="117">Lebanon</option> <option value="118">Lesotho</option> <option value="119">Liberia</option> <option value="120">Libya</option> <option value="121">Liechtenstein</option> <option value="122">Lithuania</option> <option value="123">Luxembourg</option> <option value="124">Macao</option> <option value="125">Macedonia (the former Yugoslav Republic of)</option> <option value="126">Madagascar</option> <option value="127">Malawi</option> <option value="128">Malaysia</option> <option value="129">Maldives</option> <option value="130">Mali</option> <option value="131">Malta</option> <option value="132">Marshall Islands</option> <option value="133">Martinique</option> <option value="134">Mauritania</option> <option value="135">Mauritius</option> <option value="136">Mayotte</option> <option value="137">Mexico</option> <option value="138">Micronesia (Federated States of)</option> <option value="139">Moldova (the Republic of)</option> <option value="140">Monaco</option> <option value="141">Mongolia</option> <option value="253">Montenegro</option> <option value="142">Montserrat</option> <option value="143">Morocco</option> <option value="144">Mozambique</option> <option value="145">Myanmar</option> <option value="146">Namibia</option> <option value="147">Nauru</option> <option value="148">Nepal</option> <option value="149">Netherlands</option> <option value="151">New Caledonia</option> <option value="152">New Zealand</option> <option value="153">Nicaragua</option> <option value="154">Niger</option> <option value="155">Nigeria</option> <option value="156">Niue</option> <option value="157">Norfolk Island</option> <option value="159">Northern Mariana Islands</option> <option value="160">Norway</option> <option value="161">Oman</option> <option value="162">Pakistan</option> <option value="163">Palau</option> <option value="246">Palestine, State of</option> <option value="164">Panama</option> <option value="165">Papua New Guinea</option> <option value="166">Paraguay</option> <option value="167">Peru</option> <option value="168">Philippines</option> <option value="169">Pitcairn</option> <option value="170">Poland</option> <option value="172">Portugal</option> <option value="173">Puerto Rico</option> <option value="174">Qatar</option> <option value="175">Réunion</option> <option value="176">Romania</option> <option value="177">Russian Federation</option> <option value="178">Rwanda</option> <option value="254">Saint Barthélemy</option> <option value="180">Saint Helena, Ascension and Tristan da Cunha</option> <option value="181">Saint Kitts and Nevis</option> <option value="182">Saint Lucia</option> <option value="255">Saint Martin (French part)</option> <option value="183">Saint Pierre and Miquelon</option> <option value="185">Saint Vincent and the Grenadines</option> <option value="186">Samoa</option> <option value="187">San Marino</option> <option value="184">Sao Tome and Principe</option> <option value="188">Saudi Arabia</option> <option value="189">Senegal</option> <option value="256">Serbia</option> <option value="190">Seychelles</option> <option value="191">Sierra Leone</option> <option value="192">Singapore</option> <option value="245">Sint Maarten (Dutch part)</option> <option value="193">Slovakia</option> <option value="194">Slovenia</option> <option value="195">Solomon Islands</option> <option value="196">Somalia</option> <option value="197">South Africa</option> <option value="179">South Georgia and the South Sandwich Islands</option> <option value="243">South Sudan</option> <option value="199">Spain</option> <option value="200">Sri Lanka</option> <option value="201">Sudan</option> <option value="202">Suriname</option> <option value="203">Svalbard and Jan Mayen</option> <option value="204">Swaziland</option> <option value="205">Sweden</option> <option value="206">Switzerland</option> <option value="207">Syrian Arab Republic</option> <option value="209">Taiwan (Province of China)</option> <option value="208">Tajikistan</option> <option value="210">Tanzania, United Republic of</option> <option value="211">Thailand</option> <option value="60">Timor-Leste</option> <option value="212">Togo</option> <option value="213">Tokelau</option> <option value="214">Tonga</option> <option value="215">Trinidad and Tobago</option> <option value="216">Tunisia</option> <option value="217">Turkey</option> <option value="218">Turkmenistan</option> <option value="219">Turks and Caicos Islands</option> <option value="220">Tuvalu</option> <option value="221">Uganda</option> <option value="222">Ukraine</option> <option value="223">United Arab Emirates</option> <option value="83">United Kingdom of Great Britain and Northern Ireland</option> <option value="226">United States Minor Outlying Islands</option> <option value="225">Uruguay</option> <option value="227">Uzbekistan</option> <option value="228">Vanuatu</option> <option value="230">Venezuela (Bolivarian Republic of)</option> <option value="231">Viet Nam</option> <option value="232">Virgin Islands (British)</option> <option value="233">Virgin Islands (U.S.)</option> <option value="234">Wallis and Futuna</option> <option value="235">Western Sahara*</option> <option value="236">Yemen</option> <option value="239">Zambia</option> <option value="240">Zimbabwe</option> </select> <div id="payment.card.address.country_feedback" class="invalid-feedback"> <div v-for="item in invalidField['payment.card.address.country']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> <div v-show="donorCoveredFeeEnabled" class="neonfront_element col-md-12" v-if="cardDonorCoveredFeeDesc!=null && (!isNeonPay || googleAndApplePayIncompatible)"> <div class="form-check"> <input class="form-check-input neonfront_checkbox" type="checkbox" v-model="cardDonorCoveredFeeOpt" value="true" name="payment.card.donorCoveredFeeOpt" id="payment.card.donorCoveredFeeOpt"> <label class="form-check-label neonfront_checkbox_label" for="payment.card.donorCoveredFeeOpt">{{cardDonorCoveredFeeDesc}}</label> </div> </div> </div> <div class="row g-3 mt-0" v-show="paymentType==='ACH' && showAchMessage"> <input type="hidden" name="payment.ach.token" id="payment.ach.token"> <!-- DEV-15763 --> <div id="achPay-container"></div> <div class="neonfront_element col-md-12" v-show="donorCoveredFeeEnabled && achDonorCoveredFeeDesc!=null"> <div class="form-check"> <input class="form-check-input neonfront_checkbox" type="checkbox" v-model="achDonorCoveredFeeOpt" value="true" name="payment.ach.donorCoveredFeeOpt" id="payment.ach.donorCoveredFeeOpt"> <label class="form-check-label neonfront_checkbox_label" for="payment.ach.donorCoveredFeeOpt">{{achDonorCoveredFeeDesc}}</label> </div> </div> </div> <div class="row g-3 mt-0" v-if="paymentType==='ACH' && !showAchMessage"> {{ccfpInfo.notInGoodMessage || ''}} </div> <div class="row g-3 mt-0" v-if="payPal" v-show="payPal && paymentType==='PAYPAL'"> <div class="col-md-12 neonfront-paypal-text"> <p>You will be charged</p> <div class="amount mb-3">{{formatAmount(totalAmount)}}</div> <p>Click this button to make your payment via PayPal.</p> <p class="mt-4">Note: You will be redirected here once your payment is processed by PayPal.</p> </div> <div class="col-md-12 neonfront-paypal-text" v-show="paymentType==='PAYPAL' && submitting"> <p>You will now be taken to PayPal to complete your transaction. Please wait.</p> <p v-if="paypal.testMode">Please note: since you are in the testing mode, this Paypal button will direct you to Paypal testing site (Paypal Sandbox) to simulate the payment process. All information is fictitious in Paypal Sandbox and there will be no real transactions. For your convenience, you can use our pre-registered testing account [jhuang@dev.neoncrm.com/Watercube2]. To enter test mode, Paypal Sandbox may need you to log onto Paypal Developer Central first. Please use [jhuang@dev.neoncrm.com/Watercube2] to login.</p> <input v-if="paypal.showPayPalDonateButton" type="image" style="display:none;" src="https://www.paypal.com/en_US/i/btn/btn_donateCC_LG.gif" name="submit" alt="PayPal - The safer, easier way to pay online!" /> <input v-if="!paypal.showPayPalDonateButton" type="image" style="display:none;" src="https://www.paypal.com/en_US/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!"> </div> </div> </div> <div v-else v-show="!withoutPayment"> {{ccfpInfo.notInGoodMessage || ''}} </div> </body> </html> <!-- Start: Donation Frequency & Amount is linked --> <!-- Donation Frequency --> <!-- Donation Amount --> <!-- End: Donation Frequency & Amount --> <!-- Tribute --> <!-- Description --> <!-- Invalid --> <div id="'payment'+'_feedback'" class="invalid-feedback"> <div v-for="item in invalidField['payment']"> <i class="fa fa-exclamation-triangle"></i>{{item}} </div> </div> </div> </body> <div v-show ="formType==='ACCOUNT' || !isMultiPage || totalAmount>0" name="name:reCaptcha"></div> <!-- Button --> <div class="col-md-12 neonfront_element"> <div v-show="currentPage===6" class="row gx-1 gy-2" v-if="showSummary"> <!-- Multi Page --> <div v-if="isMultiPage" :class="[submitting?'col':'col-auto']" v-show="paymentType!=='PAYPAL'&&paymentType!=='PAY_LATER'"> <!-- Placeholder button --> <button v-show="!showSubmitBtn && !submitting" class="btn btn-link" style="color: #fff;">{{submitText}}</button> <button v-show="showSubmitBtn" type="button" class="btn neonfront-btn-primary btn-lg" @click="submitNeonForm" v-bind:disabled="disableSubmitButton" name="submitBtn">{{submitText}}</button> <button class="btn neonfront-btn-primary btn-lg" type="button" disabled v-show="submitting"> Processing <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> </button> </div> <div v-show="payPal && paymentType==='PAYPAL'" class="col"> <button type="button" class="btn neonfront-btn-primary neonfront-btn-paypal btn-lg" @click="submitNeonForm" v-show="!submitting" v-bind:disabled="previewMode"></button> <button class="btn neonfront-btn-primary btn-lg" type="button" disabled v-show="submitting"> Processing <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> </button> </div> <div v-show="paymentType==='PAY_LATER'" class="col"> <button type="button" class="btn neonfront-btn-primary btn-lg" @click="submitNeonForm" v-show="!submitting" v-bind:disabled="previewMode">Pay Later </button> <button class="btn neonfront-btn-primary btn-lg" type="button" disabled v-show="submitting"> Processing <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> </button> </div> <div v-show="paymentType!=='PAYPAL' && paymentType!=='PAY_LATER'" class="col" v-bind:class="{'ms-02': amountBrClass()}"> <div class="neonfront-recurring-amount neonfront-recurring-amount-single"> <label class="form-label mb-0">Amount:</label> <div class="amount-content"> <span class="amount">{{formatAmount(totalAmount)}}<span class="form-label fs-625" style="font-size: 0.625rem !important;"> USD</span></span> </div> <div v-show="paymentType==='CARD'&&cardDonorCoveredFeeOpt" class="fee-content"> {{cardTotalAmountIncludeFeeList}} </div> </div> </div> </div> </div> <!-- Google reCAPTCHA Policy --> <div v-if="currentPage===6" class="col-md-12 neonfront_element"> <div class="re-captcha-policy-border"> <i class="fal fa-lock"></i> Secure Payment </div> <div class="re-captcha-policy"> This site is protected by reCAPTCHA and the Google <a href="https://policies.google.com/privacy">Privacy Policy</a> and <a href="https://policies.google.com/terms">Terms of Service</a> apply. </div> </div> </div> </div> </form> <form id="paypal_xclick" name="_xclick" :action="paypal.paypalUrl" method="post" class="d-none"> <input v-for="(value,name) in paypal.items" type="hidden" :name="name" :value="value"> </form> </div> </div> </html> </div> </div> <!DOCTYPE html> <html> <body> <div class="container-fluid neonfront_footer" id="footer-content"> <div class="row neonfront_footer_lv_info"> <div class="col-md-4" style="padding-left: 30px;"> <div class="float-md-start float-none"></div> </div> <div class="col-md-4 text-md-center footer_center_column"> <div class="footer_center_column_content" style="margin: 0 auto 0 auto;"></div> </div> <div class="col-md-4" style="padding-right: 30px;"> <div class="float-md-end float-none"></div> </div> </div> <div class="neonfront_footer_lv_media text-center text-white"> <a href="https://www.twitter.com/freelawproject" class="text-reset social-link-icon"> <img width="24" height="24" v-bind:src="getSocialMediaIcon('Twitter', 'L')"> </a><a href="https://www.linkedin.com/company/free-law-project/" class="text-reset social-link-icon"> <img width="24" height="24" v-bind:src="getSocialMediaIcon('LinkedIn', 'L')"> </a><a href="https://law.builders/@flp" class="text-reset social-link-icon"> <img width="24" height="24" v-bind:src="getSocialMediaIcon('Website', 'L')"> </a><a href="https://www.threads.net/@freelawproject" class="text-reset social-link-icon"> <img width="24" height="24" v-bind:src="getSocialMediaIcon('Instagram', 'L')"> </a> </div> <div class="footer-root"> <div class="footer-root-left"><a class="footer-root-link" href="https://neonone.com/privacypolicy/" target="_blank">Privacy Statement</a> | <a class="footer-root-link" href="https://neonone.com/productterms/" target="_blank">Terms of Service</a></div> <div class="footer-root-right"> <a href="https://neonone.com/" target="_blank"> <div class="footer-root-right-header"><img width="60" height="20" src="/nx/portal-static/img/logo-variations.svg"/></div> <div class="footer-root-right-footer"><img width="60" height="20" src="/nx/portal-static/img/merchant-copy.svg"/></div> </a> </div> </div> </div> </body> </html> </div> <!DOCTYPE html> <html lang="en"> <body> <div class="modal fade" id="encourageLoginModal" tabindex="-1" aria-labelledby="encourageLoginModalLabel" aria-hidden="true"> <div id="login-toast-container" aria-live="polite" aria-atomic="true" class="position-relative"> <div class="toast-container position-absolute top-50 end-0 p-3 login_toast"> <div id="recover-success-alert" class="toast d-flex align-items-center text-white bg-info border-0 w-100" role="alert" aria-live="assertive" aria-atomic="true"> <div class="toast-body"> Your email has been submitted. If that email address exists in our system, you should receive a recovery information email shortly. If you do not receive an email, please check your spam folder. If you still don't receive an email, then there is no account associated with the submitted email address. </div> <button type="button" class="btn-close ms-auto me-2" data-bs-dismiss="toast" aria-label="Close"></button> </div> </div> </div> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content"> <div class="modal-header"> <button v-if="!requireLogin" type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <div class="login_header" v-if="encourageLoginConfig.header" v-html="encourageLoginConfig.header"></div> <fieldset class="neon_en_field_set"> <legend class="neon_en_legend">Log in to your existing account</legend> <div class="row justify-content-center"> <div class="login_errors col-9" v-if="loginHasError" v-for="errMsg in loginErrorMessages">{{errMsg}}</div> <div class="mb-3 col-9"> <label for="loginName" class="col-form-label">Login Name:</label> <input type="text" class="form-control" id="loginName" name="loginName" /> </div> <div class="mb-3 col-9"> <label for="loginPassword" class="col-form-label">Password:</label> <input type="password" class="form-control" id="loginPassword" name="loginPassword" autocomplete="new-password" /> </div> <div class="mb-3 d-grid gap-2 col-9 mx-auto"> <button class="btn btn-primary" type="button" @click="doLogin">Log In</button> </div> <div v-if="encourageLoginConfig.facebookLogin || encourageLoginConfig.twitterLogin" class="d-grid gap-2 col-9 mx-auto"> <div class="third_part_login_label">Or sign in with</div> <div class="third_part_login_type"> <span class="third_part_login_item" @click="openAuthWin('facebook')" v-if="encourageLoginConfig.facebookLogin" style="margin-right:2px"> <img width="40" src="/nx/static/img/icons/social-media/Facebook.png"> </span> <span class="third_part_login_item" @click="openAuthWin('twitter')" v-if="encourageLoginConfig.twitterLogin" style="margin-left:2px"> <img width="40" src="/nx/static/img/icons/social-media/Twitter.png"> </span> </div> </div> </div> </fieldset> <div> <div class="recover_account_label">Forgot your password?</div> <div class="recover_account_label" style="opacity:0.8;">Enter the e-mail address associated with your account and we'll send you a link to recover your login information.</div> <div class="mb-3 col-9"> <label for="forgot_email" class="col-form-label">Email:</label> <input type="text" class="form-control" id="forgot_email"> <div v-if="recoverEmailInValid" class="email_invalid_message">Please enter a valid email address</div> </div> <div class="row justify-content-end" style="width:349px"> <div class="mb-3 col-7"> <button type="button" class="btn btn-outline-primary" @click="sendRecoverAccountEmail">Recover Account</button> </div> </div> </div> <div class="login_footer" v-if="encourageLoginConfig.footer" v-html="encourageLoginConfig.footer"></div> </div> </div> </div> </div> </body> </html> <!DOCTYPE html> <html lang="en"> <body> <!DOCTYPE html> <html lang="en"> <body> <!-- Modal --> <div class="modal fade neonfront-modal" id="achConfirmModal" data-bs-backdrop="static" tabindex="-1"> <div class="modal-dialog"> <div class="modal-content px-sm-4 px-1"> <div class="modal-header"> <button type="button" class="btn-close" @click="cancelModal()"></button> </div> <div class="modal-body"> <div class="text-center mb-4"> <p class="title mb-2">ACH Payment Confirmation</p> <p class="sub-title mb-2">Verify that your bank account information is accurate.</p> </div> <div class="neonfront-subform clearfix mb-2 px-5"> <div class="clearfix mt-1 mb-2"> <div class="float-start">Total Amount</div> <div class="float-end text-end fw-bold">{{formatAmount(totalAmount)}}</div> </div> <div class="clearfix mb-2"> <div class="float-start">Routing Number</div> <div class="float-end text-end">{{hideAchNumber(formData.payment.ach.routingNumber)}}</div> </div> <div class="clearfix mb-2"> <div class="float-start">Bank Account Type</div> <div class="float-end text-end">{{Number(formData.payment.ach.accountType) === 2? 'Checking' : 'Saving'}} </div> </div> <div class="clearfix mb-1"> <div class="float-start">Bank Account Number</div> <div class="float-end text-end">{{hideAchNumber(formData.payment.ach.accountNumber)}}</div> </div> </div> <div class="desc"><i class="fa fa-info-circle"></i><span>ACH payments may take up to 10 days to appear on your bank account statement.</span> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-link neonfront-btn-link" @click="cancelModal()" style="width: auto">Cancel </button> <button type="button" class="btn neonfront-btn-primary btn-lg px-4" @click="submitNeonForm($event,true)" style="width: auto">Confirm </button> </div> </div> </div> </div> </body> </html> <!DOCTYPE html> <html lang="en"> <body> <!-- Modal --> </body> </html> <!DOCTYPE html> <html lang="en"> <body> <!-- Modal --> <div class="modal fade neonfront-modal" id="contactsListModal" data-bs-backdrop="static" tabindex="-1"> <div class="modal-dialog" style="max-width: 580px;"> <div class="modal-content px-sm-4 px-1"> <div class="modal-header"> <h5 class="modal-title"><i class="far fa-users me-1" style="color: #0074D9;"></i>Choose Existing Contact(s)</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <div class="row mt-1"> <div class="col-auto"> <div class="input-group" id="search-input-group"> <span class="input-group-text pe-2"><i class="fal fa-search"></i></span> <input type="text" class="form-control neonfront_input" placeholder="Search by Contact Name" v-model="searchContactKey"> </div> </div> <div class="col text-end"> <div class="btn-group neonfront-menu-bar w-auto" role="group"> <button v-if="contactsSelectionStatus==='none'" type="button" class="btn btn-outline-secondary neonfront-btn-outline-primary" @click="selectAllContacts()">Select All</button> <button v-else="" type="button" class="btn btn-outline-secondary neonfront-btn-outline-primary" @click="clearSelectedContact()">Clear All</button> </div> </div> </div> <div class="row" style="margin-top: 32px"> <div class="col contacts-table-container"> <div class="neonfront-table-error" v-show="exceedMaxSubMemberAllowed"> <i class="fas fa-info-circle fs-875" style="margin-right: 6px;"></i><span>Membership level allows for a maximum of {{term.subMemberAllowed}} submembers.</span> </div> <table class="table neonfront-table"> <thead class="table-light"> <tr> <th> <input v-if="contactsSelectionStatus==='all'" type="checkbox" class="form-check-input neonfront_checkbox" style="cursor: pointer;" checked @click="clearSelectedContact"> <input v-else="" type="checkbox" class="form-check-input neonfront_checkbox" style="cursor: pointer;" :disabled="currentSearchContactList.length==0" @click="selectAllContacts()"> </th> <th style="width: 45%">Contact Name</th> <th style="width: 45%">Membership Level</th> </tr> </thead> <tbody> <tr v-for="item in currentSearchContactList" :class="contactSelectedClass(item)"> <td><input type="checkbox" class="form-check-input neonfront_checkbox" style="cursor: pointer;" :checked="contactSelected(item)" @change="clickContact($event,item)"></td> <td class="user-name">{{item.contactName}}</td> <td> <div class="term-name"> {{item.membershipLevel==null?'-':item.membershipLevel}} <img v-if="item.complimentary" src="/nx/portal-static/img/complimentary-icon.svg" style="margin: 4px 10px; cursor: pointer" data-bs-toggle="tooltip" data-bs-placement="top" title="Complimentary Membership"></img> <img v-if="item.expiredAndNoOverGracePeriodDay" src="/nx/static/img/membership/WithInGracePeriodIcon.png" style="margin: 4px 10px;width: 14px;height: 13px; cursor: default" data-bs-toggle="tooltip" data-bs-placement="top" title="In grace period"></img> </div> <div class="period"><span v-if="item.startDate!==null">{{item.startDate}} - {{item.endDate}}</span></div> </td> </tr> <tr v-if="currentSearchContactList.length===0"> <td colspan="3" class="text-center"><span class="invalid-feedback d-block">No contacts.</span></td> </tr> </tbody> </table> </div> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-link neonfront-btn-link" data-bs-dismiss="modal" style="width: auto">Cancel</button> <button type="button" class="btn neonfront-btn-primary btn-lg px-4" @click="addContacts" style="width: auto" :disabled="exceedMaxSubMemberAllowed">Confirm</button> </div> </div> </div> </div> </body> </html> <!DOCTYPE html> <html lang="en"> <body> <!-- Modal --> </body> </html> </body> </html> </div> <script src="/nx/portal-static/component/vue/vue-3.1.2.min.js"></script> <script src="/nx/portal-static/component/axios/axios.min.js"></script> <script src="/nx/portal-static/component/qs/qs.min.js"></script> <script src="/nx/portal-static/component/bootstrap/js/bootstrap.bundle.min.js"></script> <script src="/nx/portal-static/component/laydate/laydate.js"></script> <script src="/nx/portal-static/component/multi-select/multi-select.js"></script> <script src="/nx/portal-static/component/file-upload/file-upload.js"></script> <script src="/nx/portal-static/component/neon-img-cutter/neon-img-cutter.js"></script> <script src="/nx/portal-static/component/cropperjs/cropper.min.js"></script> <script src="/nx/portal-static/component/advanced-search/advanced-search.js"></script> <script src="/nx/portal-static/component/neon-select/neon-select.js"></script> <script src="/nx/portal-static/component/moment-js/moment-2.29.4.min.js"></script> <script src="/nx/portal-static/component/moment-js/moment-timezone.min.js"></script> <script src="/nx/portal-static/js/common.js"></script> <script src="/nx/portal-static/js/err-collect.js"></script> <!-- <th:block th:if="${churnZeroEnabled && !#strings.isEmpty(churnZeroAccountExternalId)}"> <script src="https://neonone.us1app.churnzero.net/churnzero.js"></script> <script type="application/javascript"> var ChurnZero = ChurnZero || [] ChurnZero.push(['setAppKey', '1!MFdwDlKbVUgVpSRtljcqdO9tOYWtqDKqGG7trJX5JYwtE02']) // AppKey from ChurnZero ChurnZero.push(['setContact', '', '']) </script> </th:block> --> <script type="application/javascript"> // Common JS Code </script> <script src="https://www.google.com/recaptcha/api.js" async defer></script> <script async src="https://www.googletagmanager.com/gtag/js?id=G-E5PVK7VDYC"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-E5PVK7VDYC'); </script> <script> // I remove checkbox v-model, because FormDate doesn't collect uncheck checkbox, the related field miss, that will cause vue doesn't work correctly (Vue can't found related property) // I remove date/time v-model, because there are conflict with Laydate const formData = JSON.formAll('neonform_5') const appData = { formType: "MEMBERSHIP", fieldRules: {"account.email1":[{"fieldName":"account.email1","fieldLabel":"Email","message":"Email is required.","extra":[],"rule":"required","preconditions":[]},{"fieldName":"account.email1","fieldLabel":"Email","message":"Email is invalid.","extra":[],"rule":"email","preconditions":[]}],"payment.card.holderEmail":[{"fieldName":"payment.card.holderEmail","fieldLabel":"Cardholder Email","message":"Cardholder Email is invalid.","extra":[],"rule":"email","preconditions":[]}],"account.name.lastName":[{"fieldName":"account.name.lastName","fieldLabel":"Last Name","message":"Last Name is required.","extra":[],"rule":"required","preconditions":[]}],"account.address.city":[{"fieldName":"account.address.city","fieldLabel":"City","message":"City is required.","extra":[],"rule":"required","preconditions":[]}],"payment.card.expiration.year":[{"fieldName":"payment.card.expiration.year","fieldLabel":"Expiration (YY)","message":"Expiration (YY) is required.","extra":[],"rule":"required","preconditions":[]}],"payment.ach.holderLastName":[{"fieldName":"payment.ach.holderLastName","fieldLabel":"Account Holder Last Name","message":"Account Holder Last Name is required.","extra":[],"rule":"required","preconditions":[]}],"account.address.zipCode":[{"fieldName":"account.address.zipCode","fieldLabel":"Zip\/Postal Code","message":"Zip\/Postal Code is required.","extra":[],"rule":"required","preconditions":[]}],"subMembers[index].cost":[{"fieldName":"subMembers[index].cost","fieldLabel":"Cost","message":"Cost is required.","extra":[],"rule":"required","preconditions":[{"name":"subMemberChecked","value":"true"},{"name":"subMemberChecked","value":"true"}]},{"fieldName":"subMembers[index].cost","fieldLabel":"Cost","message":"Cost is invalid.","extra":[],"rule":"amount","preconditions":[{"name":"subMemberChecked","value":"true"},{"name":"subMemberChecked","value":"true"}]}],"frequency":[{"fieldName":"frequency","fieldLabel":"Donation Frequency","message":"Donation Frequency is required.","extra":[],"rule":"required","preconditions":[]}],"payment.ach.holderFirstName":[{"fieldName":"payment.ach.holderFirstName","fieldLabel":"Account Holder First Name","message":"Account Holder First Name is required.","extra":[],"rule":"required","preconditions":[]}],"termId":[{"fieldName":"termId","fieldLabel":"Membership Levels","message":"Membership Levels is required.","extra":[],"rule":"required","preconditions":[]}],"account.address.line1.line1":[{"fieldName":"account.address.line1.line1","fieldLabel":"Address Line 1","message":"Address Line 1 is required.","extra":[],"rule":"required","preconditions":[]}],"payment.card.expiration.month":[{"fieldName":"payment.card.expiration.month","fieldLabel":"Expiration (MM)","message":"Expiration (MM) is required.","extra":[],"rule":"required","preconditions":[]}],"payment.ach.routingNumber":[{"fieldName":"payment.ach.routingNumber","fieldLabel":"Routing Number","message":"Routing Number is required.","extra":[],"rule":"required","preconditions":[]}],"payment.card.cvv":[{"fieldName":"payment.card.cvv","fieldLabel":"CVV","message":"CVV is required.","extra":[],"rule":"required","preconditions":[]}],"payment.ach.accountNumber":[{"fieldName":"payment.ach.accountNumber","fieldLabel":"Account Number","message":"Account Number is required.","extra":[],"rule":"required","preconditions":[]}],"subMembers[index].account.email1":[{"fieldName":"subMembers[index].account.email1","fieldLabel":"Email","message":"Email is invalid.","extra":[],"rule":"email","preconditions":[{"name":"subMemberChecked","value":"true"}]}],"subMembers[index].termId":[{"fieldName":"subMembers[index].termId","fieldLabel":"Membership Level","message":"Membership Level is required.","extra":[],"rule":"required","preconditions":[{"name":"subMemberChecked","value":"true"}]}],"account.address.stateOrProvince":[{"fieldName":"account.address.stateOrProvince","fieldLabel":"State\/Province","message":"State\/Province is required.","extra":[],"rule":"required","preconditions":[]}],"cost":[{"fieldName":"cost","fieldLabel":"Cost","message":"Cost is required.","extra":[],"rule":"required","preconditions":[]},{"fieldName":"cost","fieldLabel":"Cost","message":"Cost is invalid.","extra":[],"rule":"amount","preconditions":[]}],"payment.ach.holderEmail":[{"fieldName":"payment.ach.holderEmail","fieldLabel":"Account Holder Email","message":"Account Holder Email is required.","extra":[],"rule":"required","preconditions":[]},{"fieldName":"payment.ach.holderEmail","fieldLabel":"Account Holder Email","message":"Account Holder Email is invalid.","extra":[],"rule":"email","preconditions":[]}],"subMembers[index].account.name.firstName":[{"fieldName":"subMembers[index].account.name.firstName","fieldLabel":"First Name","message":"First Name is required.","extra":[],"rule":"required","preconditions":[{"name":"subMemberChecked","value":"true"}]}],"payment.card.holderLastName":[{"fieldName":"payment.card.holderLastName","fieldLabel":"Cardholder Last Name","message":"Cardholder Last Name is required.","extra":[],"rule":"required","preconditions":[]}],"payment.ach.accountType":[{"fieldName":"payment.ach.accountType","fieldLabel":"Account Type","message":"Account Type is required.","extra":[],"rule":"required","preconditions":[]}],"account.company.name":[{"fieldName":"account.company.name","fieldLabel":"Company Name","message":"Company Name is required.","extra":[],"rule":"required","preconditions":[{"name":"account.asCompany","value":"true"}]}],"subMembers[index].account.name.lastName":[{"fieldName":"subMembers[index].account.name.lastName","fieldLabel":"Last Name","message":"Last Name is required.","extra":[],"rule":"required","preconditions":[{"name":"subMemberChecked","value":"true"}]}],"payment.card.address.zipCode":[{"fieldName":"payment.card.address.zipCode","fieldLabel":"Zip","message":"Zip is required.","extra":[],"rule":"required","preconditions":[]}],"payment.card.number":[{"fieldName":"payment.card.number","fieldLabel":"Card Number","message":"Card Number is required.","extra":[],"rule":"required","preconditions":[]},{"fieldName":"payment.card.number","fieldLabel":"Card Number","message":"Your credit card number must consist of numbers and be between 12 and 19 digits.","extra":[],"rule":"creditCardNumber","preconditions":[]}],"account.name.firstName":[{"fieldName":"account.name.firstName","fieldLabel":"First Name","message":"First Name is required.","extra":[],"rule":"required","preconditions":[]}],"donationAmount":[{"fieldName":"donationAmount","fieldLabel":"Amount","message":"Amount is required.","extra":[],"rule":"required","preconditions":[{"name":"donationChecked","value":"true"}]},{"fieldName":"donationAmount","fieldLabel":"Amount","message":"Amount is invalid.","extra":[],"rule":"amount","preconditions":[{"name":"donationChecked","value":"true"}]},{"fieldName":"donationAmount","fieldLabel":"Amount","message":"Amount must be less than 999,999,999,999.99.","extra":["999,999,999,999.99"],"rule":"max","preconditions":[{"name":"donationChecked","value":"true"}]}],"account.address.country":[{"fieldName":"account.address.country","fieldLabel":"Country","message":"Country is required.","extra":[],"rule":"required","preconditions":[]}],"payment.card.holderFirstName":[{"fieldName":"payment.card.holderFirstName","fieldLabel":"Cardholder First Name","message":"Cardholder First Name is required.","extra":[],"rule":"required","preconditions":[]}]}, orgInfo: {"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":null,"orgParentId":null,"orgCode":"freelawproject","orgName":"Free Law Project","orgLegalName":null,"address":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":null,"notes":null,"street1":"6432 Raymond Street","street2":"","street3":null,"street4":null,"city":"Oakland","state":"CA","province":null,"zip":"94609","zipSuffix":"","county":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":null,"code":null,"name":null,"stateAbbreviation":null,"stateName":null,"empty":true,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":null,"createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":true},"country":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"1","name":null,"code":null,"dataStatus":null,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"1","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"addressType":null,"phone1Number":null,"phone2Number":null,"phone3Number":null,"phone1Area":null,"countyStr":"","countryStr":"","invalidStr":"","shippingToName":null,"shippingToOrganization":null,"shippingEmail":null,"formatedStreetAddress":"6432 Raymond Street","formatedStreetAddressByXsl":"<div>6432 Raymond Street<\/div>","federalDistrict":null,"stateHouseDistrict":null,"stateSenateDistrict":null,"latitude":null,"longitude":null,"geoCodingTime":null,"tableState":null,"phone2Area":null,"phone3Area":null,"phone1Type":null,"phone2Type":null,"phone3Type":null,"faxNumber":null,"faxArea":null,"faxType":null,"primaryAddress":null,"shippingAddress":false,"defaultShippingAddress":false,"invalid":null,"invalidAddressDisplay":"","deliveryPoint":null,"noMail":null,"startDate":null,"endDate":null,"startDateMMdd":null,"endDateMMdd":null,"startDateMMddyyyy":null,"endDateMMddyyyy":null,"yearlyRepeat":null,"dataStatus":{"available":true,"name":"Active","value":1},"userId":null,"ownerId":null,"countryName":null,"ncoaDate":null,"addressTypeStr":"","updateAdd":"","noteParentType":{"available":true,"name":"ADDRESS","value":3},"billingAddress":null,"phone1TypeName":null,"phone2TypeName":null,"phone3TypeName":null,"phone1WithType":null,"phone2WithType":null,"phone3WithType":null,"fax":null,"faxWithType":null,"monthValidDisplay":"","oneLineFullAddress":"6432 Raymond Street, Oakland, CA 94609","oneLineFullAddressForGoogle":"6432+Raymond+Street,+Oakland,+CA+94609","oneLineStreetAddress":"6432 Raymond Street","defaultPhoneNumber":null,"zipDisplay":"94609","userAddress":false,"formatedStreetAddressByThymeleaf":"\u0026lt;div\u0026gt;6432 Raymond Street\u0026lt;\/div\u0026gt;","stateOrProvince":"CA","phone3":null,"phone2":null,"phone1":null,"blank":false,"primary":false,"empty":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":null,"createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":true},"orgPhone":null,"orgFax":null,"orgEmail":null,"orgContactName":null,"orgContactPhone":null,"orgContactPhoneExt":null,"orgContactEmail":null,"orgMission":null,"neonURLRoot":null,"orgURLRoot":null,"donationTaxDeductable":null,"fiscalYearStartDate":null,"fiscalYearStartMonth":null,"homePageURL":"https:\/\/free.law","url2":null,"homePageURLName":null,"url2Name":null,"forumHome":null,"liveHelpHome":null,"blogHome":null,"dataBackupURL":null,"isCustomer":null,"useYearType":1,"refCustomerId":null,"registrationDate":null,"reputationLevel":null,"wealthEngineUserName":null,"wealthEnginePassword":null,"wealthEngineUID":null,"donorSearchUserName":null,"donorSearchPassword":null,"donorSearchKey":null,"facebookMediaLink":null,"twitterMediaLink":null,"charityRegistrationNum":null,"salesforceId":null,"salesforceIdCreatedTime":null,"salesforceIdUpdatedTime":null,"countryType":null,"instanceType":null,"organizationId":null,"instanceId":null,"defaultTimeZone":null,"formCurrency":null,"taxId":null,"nteeDivision":null,"crmPackage":null,"httpneonURLRoot":null,"httporgURLRoot":null,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":null,"createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":true}, formCurrency: {"id":0,"name":null,"code":"USD","sign":"$"}, orgId: "freelawproject", loggedIn: false, loginMode: "ALLOW_LOGIN", previewMode: false, accountBasicInfo: null, profilePhoto: { url: null, approved: null, entity: null, uploading: false, deleting: false }, requireLogin: false, isExitPage: false, initMethods: [], success: false, submitting: false, created: false, customExitPage: false, customExitPageUrl: null, errors: [], invalidField: {}, globalError: '', globalErrorTitle: 'Oh no, your submit failed', isMultiPage: true, currentPage: 1, dateFields: [], withoutPayment: false, withoutPaymentParentUrl: '', redirectingToPayment: false, paymentRequestId: '', separatePayment: false, paymentType: "CARD", cardType: '', paypal: {}, payLater: false, payLaterCheck: false, showCardFields: true, sameAsBillingAddress: false, formData: formData, encourageLoginConfig: {"facebookLogin":false,"footer":"","header":"","defaultShow":false,"twitterLogin":false}, googleReCaptchaEnabled: true, recaptchaResponse: null, pageDescription: "<p><strong>Tier 1 ($10\/month)<br><\/strong><\/p>\n<ul>\n<li>Unlimited docket alerts<\/li>\n<li>Unlimited real-time opinion search alerts<\/li>\n<li>FREE stickers<\/li>\n<\/ul>\n<p><strong>Tier 2 ($25\/month)<br><\/strong><\/p>\n<ul>\n<li>All benefits above<\/li>\n<li>You support our mission<\/li>\n<li>Credits to shop our merch<\/li>\n<\/ul>\n<p><strong>Tiers 3 \u0026amp; 4 ($50 \u0026amp; $100\/month)<br><\/strong><\/p>\n<ul>\n<li>All benefits above<\/li>\n<li>You are a major supporter of our mission<\/li>\n<li>More credits to shop our merch<\/li>\n<\/ul>\n<p><em><strong>* Check out our merch store at <a href=\"https:\/\/free.law\/store\" target=\"_blank\" rel=\"noopener\">free.law\/store<\/a>.\u0026nbsp; Merch credits will be emailed after 3 months of membership.<br><\/strong><\/em><\/p>\n<p>\u0026nbsp;<\/p>\n<p>Looking for an option for your organization or law firm to become members and receive benefits? <a href=\"..\/..\/forms\/group-memberships\">Check out our Group Membership options<\/a>.<\/p>\n<p>\u0026nbsp;<\/p>\n<p><strong>If you wish to make a tax-deductible donation, instead of a membership with benefits, please use <a href=\"..\/..\/forms\/supportflp\">our donation form<\/a>.<\/strong><\/p>", pageTitles: ["Membership Levels","Your information","Submembers","Add-On","Summary","Payment Details"], forwardButtons: ["Next","Next","Skip","Skip","Next"], submitText: "Join Now", hiddenFields: [], donorCoveredFeeEnabled: true, hideTheme: "0", popDomainUrl: '', tempFileDirUUid:'', //manual validate isEnableVisibleReCaptcha: true, isReCaptchaPassed: false, ccfpInfo: {"notInGood":false,"nonCaOrgNotInGood":false,"notInGoodMessage":null,"adminNotInGoodMessage":null}, caZipCodeList: ["90001","90001","90001","90002","90002","90003","90003","90004","90004","90005","90005","90006","90006","90007","90007","90008","90008","90008","90008","90008","90009","90009","90009","90009","90010","90010","90011","90012","90012","90013","90013","90014","90015","90016","90016","90017","90017","90018","90018","90018","90019","90019","90020","90020","90021","90021","90022","90022","90022","90022","90023","90023","90023","90024","90024","90025","90025","90025","90025","90026","90026","90026","90026","90027","90027","90027","90028","90028","90029","90029","90030","90031","90031","90031","90032","90033","90033","90034","90034","90035","90035","90036","90036","90036","90036","90037","90037","90038","90038","90038","90038","90038","90039","90039","90040","90040","90040","90041","90041","90042","90042","90043","90043","90043","90043","90044","90044","90044","90045","90045","90045","90045","90046","90046","90046","90047","90047","90048","90048","90048","90048","90048","90049","90049","90050","90051","90051","90052","90053","90054","90055","90056","90056","90056","90056","90057","90057","90058","90058","90059","90059","90059","90060","90061","90061","90061","90062","90062","90063","90063","90064","90064","90065","90065","90065","90066","90066","90066","90067","90067","90068","90068","90069","90069","90069","90070","90071","90071","90071","90072","90072","90073","90073","90073","90073","90073","90074","90074","90075","90076","90077","90077","90078","90078","90079","90080","90081","90082","90083","90084","90084","90086","90087","90088","90088","90089","90089","90091","90091","90091","90093","90094","90094","90095","90095","90096","90096","90099","90099","90099","90134","90134","90140","90140","90189","90189","90189","90201","90201","90201","90202","90202","90205","90205","90209","90210","90211","90212","90213","90220","90220","90220","90220","90221","90221","90221","90222","90222","90223","90224","90224","90224","90230","90230","90231","90232","90239","90240","90241","90242","90245","90247","90248","90249","90250","90250","90250","90251","90254","90255","90255","90255","90260","90261","90262","90263","90263","90264","90265","90266","90266","90267","90267","90270","90270","90272","90272","90274","90274","90274","90274","90274","90274","90274","90275","90275","90275","90275","90275","90275","90275","90275","90277","90278","90280","90290","90291","90291","90292","90292","90292","90293","90293","90294","90295","90295","90295","90296","90296","90301","90302","90303","90304","90305","90306","90307","90308","90309","90310","90311","90312","90401","90402","90403","90404","90405","90406","90407","90408","90409","90410","90411","90501","90502","90503","90504","90505","90506","90507","90508","90509","90510","90601","90601","90601","90601","90602","90603","90604","90605","90606","90606","90607","90608","90609","90610","90610","90620","90621","90622","90623","90623","90624","90630","90631","90631","90631","90631","90632","90633","90637","90638","90638","90638","90639","90639","90640","90650","90651","90652","90660","90661","90662","90670","90670","90671","90671","90680","90701","90701","90702","90703","90703","90704","90704","90704","90706","90707","90710","90711","90712","90713","90714","90715","90716","90716","90716","90717","90720","90720","90720","90721","90723","90731","90731","90731","90731","90732","90733","90734","90740","90742","90743","90744","90745","90745","90746","90746","90747","90747","90747","90747","90748","90749","90749","90755","90755","90755","90801","90802","90803","90803","90803","90804","90804","90805","90805","90805","90806","90807","90807","90807","90808","90809","90810","90810","90810","90810","90813","90814","90815","90822","90822","90831","90832","90833","90840","90840","90840","90842","90842","90844","90844","90846","90846","90847","90847","90848","90848","90848","90853","90895","90895","90895","91001","91003","91006","91007","91008","91008","91009","91010","91011","91011","91011","91011","91011","91012","91012","91012","91016","91017","91020","91021","91023","91024","91025","91030","91030","91031","91031","91040","91040","91041","91042","91043","91046","91066","91077","91101","91102","91103","91104","91105","91106","91107","91108","91108","91109","91110","91110","91114","91115","91116","91117","91118","91118","91121","91121","91123","91123","91124","91124","91125","91125","91126","91126","91129","91129","91182","91182","91184","91184","91185","91185","91188","91188","91189","91189","91199","91199","91201","91202","91203","91204","91205","91206","91207","91208","91209","91210","91210","91214","91214","91221","91222","91224","91224","91225","91226","91301","91301","91301","91301","91301","91301","91301","91301","91301","91301","91302","91302","91302","91302","91302","91303","91303","91303","91304","91304","91304","91305","91306","91306","91307","91307","91307","91308","91308","91309","91310","91310","91311","91313","91316","91316","91319","91319","91320","91320","91320","91321","91321","91321","91322","91322","91324","91325","91325","91325","91326","91326","91327","91327","91328","91330","91330","91331","91331","91331","91331","91333","91334","91334","91335","91335","91337","91340","91341","91342","91342","91342","91342","91342","91342","91343","91343","91343","91344","91344","91345","91345","91346","91346","91350","91350","91350","91350","91350","91350","91350","91351","91351","91351","91352","91352","91352","91352","91353","91354","91354","91355","91355","91356","91357","91358","91359","91359","91359","91359","91360","91361","91361","91361","91361","91361","91362","91362","91362","91364","91364","91365","91365","91367","91367","91371","91371","91371","91372","91372","91372","91376","91376","91377","91377","91380","91380","91381","91381","91381","91381","91381","91382","91383","91384","91384","91384","91385","91385","91386","91386","91386","91387","91387","91387","91387","91390","91390","91390","91390","91390","91390","91390","91390","91392","91393","91393","91394","91395","91396","91396","91401","91401","91401","91402","91402","91403","91403","91404","91405","91405","91406","91406","91407","91408","91409","91410","91411","91411","91412","91412","91413","91413","91416","91416","91423","91423","91426","91426","91436","91436","91470","91470","91482","91482","91499","91499","91501","91501","91502","91503","91504","91505","91506","91507","91507","91508","91510","91521","91521","91522","91522","91523","91523","91526","91526","91601","91601","91601","91601","91601","91601","91602","91602","91602","91602","91602","91602","91603","91603","91604","91604","91604","91605","91605","91606","91606","91606","91607","91607","91607","91607","91607","91607","91607","91608","91608","91608","91608","91609","91609","91610","91610","91610","91614","91614","91614","91615","91615","91616","91616","91617","91617","91617","91617","91618","91618","91618","91701","91701","91701","91702","91702","91706","91706","91708","91709","91710","91710","91710","91711","91714","91714","91715","91715","91716","91716","91722","91723","91724","91724","91729","91729","91729","91730","91730","91730","91731","91732","91732","91732","91733","91733","91733","91734","91735","91735","91737","91737","91737","91739","91739","91739","91740","91741","91743","91744","91744","91744","91745","91745","91745","91745","91745","91746","91746","91746","91746","91747","91748","91748","91748","91748","91748","91748","91749","91750","91752","91752","91752","91754","91755","91756","91756","91756","91756","91756","91758","91759","91761","91762","91762","91763","91764","91765","91765","91766","91766","91766","91767","91768","91769","91770","91771","91771","91772","91772","91773","91775","91776","91778","91780","91784","91785","91786","91788","91789","91789","91789","91789","91790","91791","91792","91793","91801","91802","91803","91804","91896","91899","91901","91902","91903","91905","91906","91908","91909","91910","91911","91912","91913","91914","91915","91916","91917","91921","91931","91932","91932","91933","91933","91934","91935","91941","91942","91943","91944","91945","91946","91948","91950","91950","91951","91962","91963","91976","91977","91978","91979","91980","91987","91987","92003","92004","92004","92007","92007","92008","92009","92009","92009","92010","92011","92011","92011","92013","92014","92018","92019","92020","92021","92021","92021","92022","92023","92024","92024","92024","92025","92026","92026","92027","92028","92028","92029","92029","92030","92033","92036","92037","92038","92039","92040","92046","92049","92051","92052","92054","92054","92054","92055","92055","92055","92055","92056","92057","92058","92059","92060","92060","92061","92061","92064","92065","92066","92066","92066","92067","92067","92068","92068","92069","92069","92070","92071","92072","92074","92075","92078","92078","92079","92081","92082","92083","92084","92085","92086","92086","92088","92091","92091","92092","92092","92092","92093","92093","92093","92096","92096","92101","92102","92103","92104","92105","92106","92107","92107","92108","92109","92109","92110","92111","92112","92113","92114","92115","92116","92117","92118","92118","92119","92120","92121","92122","92123","92124","92126","92127","92128","92128","92129","92130","92131","92132","92132","92134","92134","92135","92135","92135","92136","92136","92137","92138","92139","92140","92140","92142","92143","92143","92145","92145","92147","92147","92149","92150","92152","92152","92153","92153","92154","92155","92155","92158","92158","92159","92160","92161","92161","92163","92165","92166","92167","92168","92169","92170","92171","92172","92173","92173","92174","92175","92176","92177","92178","92178","92179","92182","92182","92186","92187","92187","92191","92192","92193","92195","92196","92197","92198","92199","92201","92201","92201","92202","92203","92203","92210","92210","92211","92220","92222","92223","92223","92225","92225","92225","92226","92227","92230","92231","92231","92232","92233","92234","92234","92235","92235","92236","92239","92239","92239","92240","92240","92241","92241","92241","92241","92242","92242","92243","92244","92247","92248","92249","92250","92250","92251","92252","92253","92254","92254","92255","92256","92256","92257","92257","92258","92258","92258","92258","92259","92260","92261","92262","92262","92262","92262","92263","92264","92266","92267","92267","92268","92268","92270","92273","92274","92274","92274","92274","92274","92274","92274","92274","92275","92275","92276","92276","92276","92276","92276","92276","92277","92277","92277","92278","92278","92278","92278","92280","92280","92280","92281","92282","92282","92283","92283","92284","92285","92285","92285","92285","92286","92301","92301","92304","92304","92305","92305","92307","92308","92308","92309","92309","92310","92310","92311","92311","92312","92313","92314","92315","92315","92316","92316","92317","92318","92320","92321","92322","92322","92322","92323","92324","92324","92325","92325","92325","92327","92328","92328","92328","92328","92329","92331","92332","92332","92333","92334","92335","92336","92337","92338","92338","92338","92339","92339","92340","92341","92341","92342","92342","92344","92344","92345","92346","92347","92347","92350","92350","92352","92352","92354","92354","92356","92356","92357","92357","92358","92359","92359","92363","92363","92363","92363","92364","92364","92365","92365","92366","92368","92369","92371","92372","92373","92373","92373","92373","92374","92375","92376","92377","92378","92382","92382","92382","92382","92384","92385","92386","92386","92389","92389","92391","92392","92393","92394","92394","92395","92395","92395","92397","92398","92399","92399","92401","92401","92402","92402","92403","92403","92404","92404","92404","92405","92405","92406","92406","92407","92407","92407","92407","92407","92407","92407","92407","92407","92408","92408","92410","92410","92410","92411","92411","92413","92413","92413","92415","92415","92415","92418","92418","92418","92423","92423","92427","92427","92501","92502","92503","92503","92504","92504","92504","92505","92505","92506","92507","92507","92507","92508","92509","92509","92513","92514","92516","92517","92518","92518","92518","92519","92521","92521","92522","92522","92530","92530","92531","92531","92532","92532","92536","92536","92539","92543","92544","92544","92545","92546","92548","92549","92551","92552","92553","92554","92555","92555","92556","92557","92561","92561","92561","92562","92562","92563","92563","92564","92564","92567","92567","92570","92570","92571","92572","92581","92582","92583","92583","92583","92584","92584","92584","92584","92585","92585","92585","92585","92586","92586","92586","92586","92587","92587","92587","92587","92587","92589","92589","92590","92590","92591","92591","92592","92592","92593","92593","92595","92596","92596","92599","92599","92602","92603","92604","92605","92605","92606","92607","92607","92609","92609","92610","92610","92610","92610","92612","92614","92615","92615","92616","92617","92618","92619","92620","92623","92624","92624","92624","92625","92625","92626","92627","92628","92629","92629","92629","92630","92630","92637","92637","92646","92646","92646","92647","92647","92648","92648","92648","92649","92649","92650","92650","92651","92652","92652","92653","92653","92653","92653","92654","92654","92654","92655","92656","92656","92656","92657","92657","92658","92659","92660","92661","92662","92662","92662","92663","92672","92673","92674","92675","92675","92675","92676","92676","92676","92677","92677","92678","92678","92679","92679","92679","92679","92679","92679","92679","92679","92679","92683","92684","92685","92688","92688","92688","92688","92690","92690","92690","92691","92691","92691","92692","92692","92692","92693","92693","92694","92694","92694","92694","92694","92697","92697","92697","92698","92698","92701","92702","92703","92703","92704","92704","92704","92705","92705","92705","92706","92706","92707","92707","92707","92708","92708","92708","92711","92712","92728","92728","92728","92735","92780","92781","92782","92799","92801","92802","92802","92803","92804","92804","92805","92805","92806","92806","92807","92807","92808","92808","92809","92809","92811","92812","92814","92815","92816","92817","92817","92821","92822","92823","92825","92831","92832","92833","92834","92835","92836","92837","92838","92840","92841","92842","92843","92844","92845","92846","92850","92850","92856","92857","92859","92860","92861","92861","92862","92863","92864","92865","92866","92867","92867","92868","92869","92870","92871","92877","92878","92879","92880","92880","92881","92882","92883","92883","92883","92885","92886","92887","92899","93001","93001","93001","93001","93002","93003","93003","93004","93004","93004","93005","93006","93007","93009","93009","93010","93011","93012","93012","93012","93013","93014","93015","93016","93020","93021","93022","93023","93023","93024","93030","93031","93032","93033","93034","93035","93036","93040","93041","93041","93041","93041","93042","93042","93042","93042","93042","93043","93043","93043","93043","93043","93044","93044","93044","93060","93061","93062","93063","93063","93064","93064","93064","93065","93066","93067","93094","93099","93099","93101","93102","93103","93105","93105","93106","93106","93106","93106","93107","93107","93108","93108","93109","93110","93110","93111","93111","93116","93116","93117","93117","93117","93117","93118","93118","93120","93121","93130","93140","93150","93150","93160","93190","93199","93199","93199","93201","93202","93203","93203","93203","93204","93205","93206","93207","93207","93208","93208","93210","93212","93215","93216","93218","93219","93219","93220","93221","93222","93222","93222","93223","93224","93225","93226","93227","93230","93232","93234","93235","93237","93238","93238","93239","93239","93240","93240","93241","93242","93243","93243","93243","93244","93245","93245","93246","93246","93246","93246","93246","93247","93247","93247","93249","93250","93251","93252","93254","93254","93255","93256","93257","93257","93257","93258","93260","93260","93261","93262","93262","93263","93265","93266","93267","93268","93270","93271","93272","93274","93275","93276","93277","93278","93279","93280","93282","93282","93283","93285","93285","93286","93286","93287","93290","93291","93292","93301","93302","93303","93304","93305","93306","93307","93308","93309","93311","93312","93313","93313","93313","93314","93314","93380","93383","93383","93383","93384","93385","93386","93387","93388","93389","93390","93401","93401","93402","93402","93402","93402","93403","93403","93405","93405","93406","93406","93407","93407","93407","93407","93408","93408","93408","93409","93409","93409","93410","93410","93410","93410","93412","93412","93412","93420","93421","93422","93423","93424","93426","93426","93426","93426","93427","93428","93429","93430","93432","93433","93434","93435","93436","93436","93437","93437","93437","93437","93438","93440","93441","93442","93443","93444","93445","93446","93446","93446","93446","93446","93446","93447","93448","93448","93449","93449","93450","93451","93451","93451","93452","93452","93453","93453","93453","93453","93454","93454","93454","93454","93455","93455","93456","93457","93457","93458","93460","93461","93461","93463","93463","93464","93465","93475","93483","93501","93501","93501","93502","93504","93504","93505","93505","93510","93512","93512","93513","93514","93514","93514","93514","93514","93514","93514","93514","93514","93515","93516","93516","93516","93516","93517","93518","93518","93518","93519","93519","93522","93523","93523","93523","93523","93523","93524","93524","93524","93524","93526","93526","93527","93527","93528","93529","93529","93530","93531","93532","93532","93532","93532","93532","93532","93532","93534","93534","93534","93534","93534","93534","93535","93535","93535","93535","93535","93535","93536","93536","93536","93536","93536","93536","93539","93541","93541","93541","93542","93543","93543","93543","93544","93544","93545","93545","93545","93545","93545","93546","93546","93546","93546","93549","93549","93550","93550","93550","93551","93551","93551","93551","93552","93553","93553","93554","93554","93554","93555","93555","93555","93556","93558","93558","93560","93560","93560","93560","93561","93561","93561","93561","93561","93561","93561","93561","93561","93561","93562","93562","93562","93562","93563","93563","93581","93584","93586","93586","93590","93591","93591","93591","93592","93596","93599","93599","93601","93601","93602","93602","93603","93603","93604","93605","93606","93607","93607","93608","93608","93609","93610","93610","93610","93611","93611","93612","93613","93614","93615","93616","93618","93618","93619","93620","93621","93622","93623","93624","93625","93626","93627","93628","93628","93630","93631","93633","93633","93633","93633","93633","93634","93634","93635","93636","93637","93637","93638","93639","93640","93641","93641","93642","93642","93642","93643","93644","93645","93646","93647","93647","93648","93649","93650","93650","93651","93652","93653","93654","93654","93656","93657","93657","93657","93657","93660","93661","93661","93662","93662","93664","93665","93665","93666","93667","93668","93669","93669","93670","93673","93675","93675","93675","93701","93702","93703","93704","93705","93706","93706","93707","93708","93709","93710","93711","93712","93714","93715","93716","93717","93718","93720","93721","93722","93723","93724","93724","93725","93725","93725","93726","93727","93728","93729","93730","93737","93740","93740","93740","93741","93741","93744","93745","93745","93747","93750","93750","93755","93760","93760","93761","93761","93764","93764","93765","93765","93771","93772","93773","93774","93775","93776","93777","93778","93779","93786","93786","93790","93791","93792","93793","93794","93844","93844","93888","93888","93901","93902","93905","93905","93906","93907","93907","93908","93908","93908","93912","93915","93920","93920","93920","93920","93921","93921","93921","93922","93923","93923","93924","93924","93924","93924","93925","93926","93927","93928","93928","93928","93930","93932","93933","93933","93940","93940","93940","93940","93942","93943","93944","93944","93944","93950","93950","93953","93954","93955","93955","93960","93962","93962","94002","94005","94010","94010","94011","94014","94014","94015","94015","94016","94017","94018","94019","94019","94020","94021","94022","94022","94022","94023","94024","94024","94024","94025","94025","94025","94026","94027","94027","94028","94028","94028","94028","94030","94035","94035","94035","94037","94038","94039","94040","94040","94040","94041","94042","94043","94044","94044","94060","94061","94061","94062","94062","94062","94062","94063","94064","94065","94066","94070","94074","94080","94080","94080","94080","94083","94083","94083","94085","94086","94087","94088","94088","94089","94102","94103","94104","94105","94107","94108","94109","94110","94111","94112","94114","94115","94116","94117","94118","94119","94120","94121","94122","94123","94124","94125","94126","94127","94128","94128","94129","94129","94130","94131","94132","94133","94134","94137","94137","94139","94139","94139","94140","94141","94142","94143","94143","94144","94144","94145","94145","94146","94147","94151","94151","94158","94159","94160","94160","94161","94161","94163","94163","94164","94172","94177","94177","94188","94203","94203","94204","94204","94205","94205","94206","94206","94207","94207","94208","94208","94209","94209","94211","94211","94229","94229","94230","94230","94232","94232","94234","94234","94235","94235","94236","94236","94237","94237","94239","94239","94240","94240","94244","94244","94245","94245","94247","94247","94248","94248","94249","94249","94250","94250","94252","94252","94254","94254","94256","94256","94257","94257","94258","94258","94259","94259","94261","94261","94262","94262","94263","94263","94267","94267","94268","94268","94269","94269","94271","94271","94273","94273","94274","94274","94277","94277","94278","94278","94279","94279","94280","94280","94282","94282","94283","94283","94284","94284","94285","94285","94287","94287","94288","94288","94289","94289","94290","94290","94291","94291","94293","94293","94294","94294","94295","94295","94296","94296","94297","94297","94298","94298","94299","94299","94301","94302","94303","94303","94303","94304","94305","94305","94306","94309","94309","94401","94402","94403","94404","94404","94497","94497","94501","94501","94502","94503","94503","94503","94505","94505","94506","94506","94507","94508","94509","94510","94511","94512","94513","94514","94514","94515","94516","94517","94518","94519","94520","94520","94521","94522","94523","94523","94524","94525","94526","94527","94528","94529","94529","94529","94530","94531","94533","94534","94534","94535","94535","94536","94537","94538","94539","94540","94541","94542","94543","94544","94545","94546","94546","94547","94547","94548","94549","94550","94551","94552","94552","94553","94553","94553","94555","94556","94557","94557","94558","94558","94559","94560","94561","94562","94563","94564","94565","94565","94565","94565","94566","94567","94568","94568","94569","94570","94571","94572","94573","94574","94575","94576","94576","94577","94578","94579","94580","94581","94582","94583","94585","94585","94586","94587","94588","94589","94589","94589","94590","94591","94592","94592","94595","94595","94596","94597","94597","94598","94599","94601","94602","94602","94603","94604","94605","94606","94607","94608","94608","94609","94610","94610","94611","94611","94612","94612","94613","94614","94615","94617","94618","94618","94619","94620","94620","94621","94622","94622","94623","94624","94649","94649","94659","94659","94660","94660","94661","94662","94662","94666","94666","94701","94702","94703","94704","94705","94706","94706","94706","94707","94707","94707","94708","94708","94709","94710","94710","94712","94720","94720","94801","94801","94801","94801","94801","94802","94803","94803","94803","94804","94805","94805","94806","94806","94806","94806","94807","94808","94820","94820","94850","94901","94901","94903","94903","94903","94903","94904","94904","94904","94912","94913","94914","94914","94915","94915","94920","94920","94920","94920","94922","94923","94923","94924","94925","94926","94926","94926","94927","94927","94928","94928","94929","94930","94931","94933","94937","94938","94939","94940","94941","94941","94941","94941","94942","94945","94945","94945","94946","94947","94948","94949","94949","94949","94950","94951","94952","94952","94952","94952","94952","94953","94954","94955","94956","94956","94957","94960","94963","94964","94965","94965","94965","94966","94970","94971","94972","94973","94974","94975","94976","94977","94978","94979","94998","94998","94999","95001","95002","95002","95003","95003","95003","95003","95004","95005","95006","95006","95007","95008","95009","95010","95011","95012","95013","95014","95014","95014","95015","95017","95018","95018","95019","95020","95021","95023","95024","95026","95026","95026","95030","95030","95031","95032","95033","95035","95036","95037","95038","95039","95041","95042","95043","95043","95043","95043","95043","95044","95044","95044","95045","95045","95046","95050","95051","95052","95053","95053","95054","95055","95056","95060","95060","95060","95060","95061","95062","95063","95064","95065","95066","95066","95067","95067","95070","95071","95073","95075","95076","95076","95076","95076","95076","95076","95076","95076","95077","95101","95103","95106","95108","95109","95110","95111","95112","95113","95115","95116","95117","95118","95119","95120","95121","95122","95123","95124","95125","95126","95127","95128","95129","95130","95131","95132","95133","95134","95135","95136","95138","95139","95140","95140","95140","95141","95148","95150","95151","95152","95153","95154","95155","95156","95157","95158","95159","95160","95161","95164","95170","95172","95173","95190","95190","95191","95191","95192","95192","95193","95193","95194","95194","95196","95196","95201","95201","95202","95202","95203","95203","95204","95204","95205","95205","95206","95206","95207","95207","95208","95208","95209","95209","95210","95210","95211","95211","95211","95211","95211","95212","95212","95212","95213","95213","95214","95214","95215","95215","95219","95219","95220","95221","95221","95222","95223","95223","95223","95223","95224","95225","95226","95226","95226","95227","95228","95229","95229","95230","95231","95232","95233","95233","95234","95236","95237","95240","95241","95242","95245","95245","95246","95246","95246","95246","95247","95248","95248","95248","95249","95251","95252","95252","95253","95254","95255","95257","95258","95267","95267","95269","95269","95296","95296","95296","95297","95297","95301","95303","95304","95304","95305","95306","95306","95307","95309","95310","95311","95312","95313","95315","95316","95317","95318","95319","95320","95321","95322","95322","95323","95324","95325","95326","95327","95328","95329","95330","95333","95334","95335","95335","95336","95337","95338","95340","95341","95343","95344","95345","95346","95346","95347","95348","95350","95351","95352","95353","95354","95355","95356","95357","95358","95360","95361","95361","95361","95363","95363","95363","95364","95364","95365","95366","95367","95368","95369","95370","95372","95373","95373","95374","95375","95375","95376","95377","95378","95379","95380","95381","95382","95383","95385","95386","95387","95388","95389","95389","95389","95389","95389","95389","95391","95391","95391","95397","95397","95401","95402","95403","95403","95404","95405","95406","95407","95407","95409","95409","95410","95412","95415","95416","95416","95416","95416","95416","95417","95417","95418","95418","95419","95420","95421","95422","95423","95423","95423","95424","95424","95425","95425","95425","95426","95427","95427","95428","95429","95430","95431","95432","95433","95435","95436","95437","95437","95437","95437","95437","95437","95437","95439","95441","95442","95443","95444","95445","95445","95446","95446","95448","95449","95450","95450","95451","95452","95453","95454","95454","95456","95456","95457","95458","95459","95459","95460","95461","95461","95461","95462","95462","95462","95463","95464","95465","95466","95467","95467","95468","95468","95469","95470","95470","95471","95472","95472","95473","95476","95476","95476","95480","95480","95480","95481","95482","95485","95486","95487","95488","95488","95490","95492","95493","95493","95493","95494","95497","95501","95502","95503","95511","95514","95518","95519","95521","95521","95521","95521","95524","95525","95526","95526","95526","95527","95528","95531","95531","95532","95532","95534","95534","95536","95537","95537","95538","95538","95540","95542","95543","95545","95546","95546","95546","95547","95548","95549","95550","95551","95552","95553","95554","95555","95556","95558","95559","95560","95562","95563","95564","95565","95567","95568","95568","95569","95570","95571","95573","95585","95587","95589","95589","95595","95601","95602","95603","95603","95603","95603","95603","95604","95604","95605","95605","95605","95605","95605","95606","95607","95607","95608","95609","95610","95610","95611","95611","95612","95613","95614","95614","95615","95615","95615","95615","95616","95617","95618","95618","95619","95619","95620","95620","95621","95621","95623","95623","95624","95625","95626","95627","95628","95629","95630","95630","95630","95630","95630","95631","95631","95631","95631","95632","95633","95634","95634","95634","95634","95634","95635","95636","95637","95638","95638","95639","95640","95640","95640","95640","95641","95641","95641","95641","95642","95642","95644","95644","95645","95645","95646","95646","95646","95646","95646","95646","95646","95646","95648","95648","95648","95650","95651","95652","95653","95654","95654","95655","95655","95655","95656","95658","95659","95659","95659","95659","95659","95660","95660","95661","95661","95662","95662","95663","95664","95665","95666","95666","95667","95667","95667","95667","95667","95667","95667","95667","95667","95667","95668","95668","95669","95670","95670","95670","95670","95671","95671","95672","95673","95674","95675","95675","95676","95677","95677","95678","95679","95680","95681","95682","95682","95682","95682","95683","95683","95683","95684","95684","95684","95684","95685","95685","95686","95687","95688","95688","95689","95690","95690","95690","95690","95690","95690","95690","95690","95690","95691","95691","95692","95693","95694","95695","95696","95697","95698","95699","95699","95701","95703","95703","95709","95709","95709","95709","95712","95713","95713","95713","95713","95713","95713","95714","95715","95715","95715","95717","95717","95720","95720","95721","95721","95722","95724","95724","95726","95726","95726","95728","95728","95728","95728","95728","95735","95736","95741","95741","95742","95742","95746","95746","95747","95757","95758","95759","95762","95762","95762","95763","95765","95776","95798","95798","95798","95799","95799","95811","95812","95813","95814","95815","95815","95816","95817","95818","95819","95820","95820","95821","95822","95823","95824","95825","95826","95826","95827","95828","95829","95830","95831","95832","95833","95834","95835","95836","95837","95838","95840","95840","95841","95841","95842","95843","95843","95851","95852","95853","95860","95864","95865","95866","95867","95867","95894","95894","95899","95901","95901","95901","95901","95901","95903","95903","95910","95910","95912","95912","95913","95914","95915","95915","95915","95915","95916","95916","95917","95918","95919","95920","95920","95922","95923","95923","95923","95923","95924","95925","95925","95926","95927","95928","95928","95928","95928","95929","95929","95930","95930","95932","95934","95934","95935","95936","95937","95938","95939","95939","95940","95940","95941","95942","95942","95943","95943","95943","95944","95945","95945","95945","95945","95945","95945","95945","95945","95945","95945","95945","95945","95945","95946","95946","95947","95947","95948","95948","95948","95949","95950","95951","95951","95953","95953","95954","95954","95954","95955","95956","95956","95957","95957","95958","95958","95959","95959","95959","95959","95959","95960","95960","95960","95960","95961","95961","95961","95961","95962","95962","95963","95963","95965","95965","95965","95965","95965","95965","95965","95965","95965","95965","95965","95965","95965","95965","95965","95965","95965","95966","95967","95968","95969","95970","95970","95971","95971","95971","95971","95971","95971","95972","95973","95973","95973","95973","95974","95975","95975","95976","95976","95977","95977","95977","95977","95978","95979","95979","95979","95979","95980","95980","95980","95980","95980","95980","95980","95981","95981","95982","95983","95983","95984","95984","95986","95987","95987","95987","95988","95988","95991","95991","95992","95993","96001","96001","96002","96003","96006","96007","96007","96008","96009","96010","96011","96013","96013","96014","96015","96016","96017","96017","96019","96019","96019","96020","96021","96022","96023","96024","96025","96027","96027","96028","96028","96029","96029","96031","96031","96032","96033","96034","96035","96037","96038","96039","96040","96041","96041","96044","96044","96046","96047","96047","96048","96048","96049","96050","96050","96051","96052","96054","96055","96056","96056","96056","96057","96058","96059","96061","96062","96063","96063","96064","96065","96065","96067","96068","96069","96070","96070","96071","96073","96074","96075","96076","96076","96078","96079","96079","96079","96079","96080","96080","96084","96084","96085","96086","96087","96088","96088","96089","96089","96090","96091","96091","96092","96093","96094","96094","96094","96095","96096","96097","96099","96101","96101","96101","96101","96103","96103","96103","96103","96103","96103","96104","96105","96106","96107","96107","96108","96108","96109","96110","96111","96112","96112","96113","96113","96113","96114","96115","96116","96117","96118","96119","96120","96120","96120","96120","96120","96120","96120","96121","96122","96122","96123","96124","96124","96125","96125","96126","96127","96128","96129","96129","96130","96130","96130","96130","96130","96132","96133","96134","96134","96134","96134","96134","96135","96136","96137","96137","96137","96140","96140","96140","96140","96140","96140","96141","96141","96142","96142","96142","96143","96143","96145","96145","96145","96146","96146","96146","96146","96146","96148","96150","96150","96151","96151","96151","96152","96152","96154","96154","96155","96155","96155","96155","96156","96156","96156","96156","96157","96157","96157","96158","96158","96158","96160","96161","96161","96161","96161","96161","96161","96161","96161","96162","96162","96162"], constituentZipCode: null, isProfilePhoto: false, } appData.initMethods.push(function(){ if (this.formData.account && this.formData.account.address && this.formData.account.address.line1 !== undefined) { if(this.formData.payment && this.formData.payment.card) { this.sameAsBillingAddress = true } } if (this.formData.payment && this.formData.payment.card) { this.formData.payment.card.holderFirstName = this.firstName this.formData.payment.card.holderLastName = this.lastName this.formData.payment.card.holderEmail = this.email } if (this.formData.payment && this.formData.payment.ach) { this.formData.payment.ach.holderFirstName = this.firstName this.formData.payment.ach.holderLastName = this.lastName this.formData.payment.ach.holderEmail = this.email } }) const appMethods = { showField: function (fieldName){ fieldName = this.filterFieldName(fieldName); if(this.hiddenFields.includes(fieldName)){ return false } return true }, nextPage: function () { if(this.checkWithoutPayment()){ return } // validate if (this.validatePage(this.currentPage)) { this.currentPage = this.currentPage + 1 } }, previousPage: function () { this.currentPage = this.currentPage - 1 }, isOtherPaymentField: function (element) { let fieldName = element.getAttribute('name') if (fieldName === null) { return true } if(this.withoutPayment && fieldName.indexOf('payment.') === 0){ return true } if(this.separatePayment && fieldName.indexOf('payment.') !== 0){ return true } if (this.paymentType === 'CARD' && this.payingWithAppleOrGooglePay && fieldName.indexOf('payment.') === 0) { return true } if (this.paymentType === 'CARD' && fieldName.indexOf('payment.ach.') === 0) { return true }else if(this.paymentType==='ACH' && fieldName.indexOf('payment.card.')===0){ return true }else if((this.paymentType==='PAY_LATER' || this.paymentType==='PAYPAL') && fieldName.indexOf('payment.')===0){ return true } return false }, isNeedValidation:function(element){ if(this.isOtherPaymentField(element)){ return false } if(element.disabled){ return false } if(this.hiddenFields.includes(this.filterFieldName(element.getAttribute('name')))){ return false } return true }, validatePage: function(pageNumber){ let page = document.getElementById('neon-page-'+pageNumber) let itemObj={} for(let et of ['input','select','textarea']) { for (let item of page.getElementsByTagName(et)) { itemObj[item.getAttribute('name')] = item } } let pass = true let firstElement = null // FormData don't return un-checked checkbox let formData = this.getFormData() let es=document.getElementById('neonform_5').elements for(let e of es){ let fieldName=e.getAttribute('name') if(itemObj[fieldName]){ if(!this.isNeedValidation(e)){ continue } if(!this.validateField(e,formData.getAll(fieldName))){ if(firstElement===null){ firstElement = e } pass = false } } } if(firstElement!=null) { this.$nextTick(function(){ firstElement.focus() // donation amount special logic if(firstElement.getAttribute('name')==='amount'){ firstElement = document.getElementsByName('frequency')[0] firstElement.focus() } // Custom file upload box if(firstElement.getAttribute('type') === 'hidden' && firstElement.getAttribute('id').indexOf('customFields') > -1) { let uploadBox = document.getElementById('neon-file-upload-box-' + firstElement.getAttribute('id')) if (uploadBox) { uploadBox.focus() } } }) } if (!this.validateGDPRSmsFieldValue(true)) { pass = false } return pass }, clearInvalidFieldByPrecondition: function(fieldName,fieldValue){ // Here I hard code only apply to Territory & State/Province fields if(!fieldName.endsWith('address.territory') && !fieldName.endsWith('address.stateOrProvince')){ return } let fieldName2 = this.filterFieldName(fieldName) for(let f in this.fieldRules){ for(const r of this.fieldRules[f]){ if(r.preconditions.filter((pc) => pc.name===fieldName2 && pc.value !== fieldValue).length>0){ this.invalidField[this.filterPreconditionFieldName(fieldName,f)] = null } } } }, filterPreconditionFieldName: function(fieldName, preconditionName){ if(fieldName && preconditionName){ if(!fieldName.includes('subMembers[') || !preconditionName.includes('subMembers[')){ return preconditionName } let subMemberMatchStr = fieldName.match(/subMembers\[\d+\]/) if(subMemberMatchStr && subMemberMatchStr.length>0) { let indexedPreconditionName = preconditionName.replace('subMembers[index]', subMemberMatchStr[0]) return indexedPreconditionName } } return preconditionName }, filterFieldName: function(fieldName){ if(fieldName) { fieldName = fieldName.replace(/subMembers\[\d+\]/, 'subMembers[index]') } return fieldName }, validateField: function(element,value) { let fieldName = element.getAttribute('name') let fieldRules = this.fieldRules[this.filterFieldName(fieldName)] if (!fieldRules) { return true } let valid = true let fieldVal = value.toString() if( element.getAttribute('type') === 'file' && value[0].name === ''){ fieldVal = '' } element.getAttribute('type') this.invalidField[fieldName] = null for (let vt of fieldRules) { let preconditionNotHit = false for (let precondition of vt.preconditions) { let preconditionFieldName = this.filterPreconditionFieldName(fieldName, precondition.name) if (precondition !== null && this.getFormData().get(preconditionFieldName) !== precondition.value) { preconditionNotHit = true break } } if (preconditionNotHit) { continue } if(Validator[vt.rule].check(fieldVal,vt.extra)){ if(this.invalidField[fieldName]===null){ this.invalidField[fieldName] = [] } this.invalidField[fieldName].push(vt.message) valid = false if(fieldName.startsWith('payment.card.address')){ this.sameAsBillingAddress = false } } } return valid }, onFieldBlur: function (event) { this.checkNameField(event) this.checkSubMemberNameField(event) let val = this.getFormData().getAll(event.target.getAttribute('name')) this.validateField(event.target, val) this.clearInvalidFieldByPrecondition(event.target.getAttribute('name'), val) }, validateZipCode(){ const zipCodeNames = ['account.address.zipCode','payment.card.address.zipCode'] const zipCodeName = this.sameAsBillingAddress ? zipCodeNames[0] : this.paymentType !== 'CARD' ? zipCodeNames[0] : zipCodeNames[1] let zipCode = this.getFormData().get(zipCodeName) // If there is no zipCode for account in the form, use the code from login status if(zipCode === null){ zipCode = this.constituentZipCode } this.ccfpInfo.isCAZipCode = this.caZipCodeList.includes(zipCode) }, setDoubleTheDonation(toHide) { try { let doubleDonationField = document.getElementById('dd-company-name-input') let parentContainer = doubleDonationField.parentNode if (toHide) { parentContainer.style.display = 'none' } else { parentContainer.style.display = '' } } catch (e) { console.log('change the display css of double donation field error', e) } }, checkAsCompanyField(event) { try { if ('DONATION' !== this.formType) { return } let fieldId = event.target.getAttribute('id') if (fieldId && 'account.asCompany' === fieldId) { let val = this.getFormData().getAll(event.target.getAttribute('name')) if (val && 'true' === val[0]) { this.setDoubleTheDonation(true) } else { this.setDoubleTheDonation(false) } } } catch (e) { console.log('validate as company name field error', e) } }, setSmsPhoneNumberField(toHide) { try { let fileLabelId = "account.gdpr.smsPhoneNumber.label" let fileId = "account.gdpr.smsPhoneNumber" let fileRequiredToolTipId = "account.gdpr.smsPhoneNumber.requiredTooltip" let fileInvalidToolTipId = "account.gdpr.smsPhoneNumber.invalidTooltip" if (fileId) { let smsPhoneNumberFieldLabel = document.getElementById(fileLabelId) let smsPhoneNumberField = document.getElementById(fileId) let smsPhoneNumberFieldRequiredToolTip = document.getElementById(fileRequiredToolTipId) let smsPhoneNumberFieldInvalidToolTip = document.getElementById(fileInvalidToolTipId) if (smsPhoneNumberFieldLabel && smsPhoneNumberField) { if (toHide) { smsPhoneNumberFieldLabel.style.display = 'none' smsPhoneNumberField.style.display = 'none' smsPhoneNumberField.style.borderColor = '#ced4da' if (smsPhoneNumberFieldRequiredToolTip) { smsPhoneNumberFieldRequiredToolTip.style.display = 'none' } if (smsPhoneNumberFieldInvalidToolTip) { smsPhoneNumberFieldInvalidToolTip.style.display = 'none' } } else { smsPhoneNumberFieldLabel.style.display = '' smsPhoneNumberField.style.display = '' } } } } catch (e) { console.log('change the display css of sms number field error', e) } }, linkagePhone1WithSmsPhoneNumber(event) { try { let smsConsentFieldId = "account.gdpr.sms" let smsPhoneNumberFieldId = "account.gdpr.smsPhoneNumber" let fieldId = event.target.getAttribute('id') if (smsConsentFieldId && smsPhoneNumberFieldId && fieldId && smsConsentFieldId === fieldId) { let smsPhoneNumberField = document.getElementById(smsPhoneNumberFieldId) let phone1 let smsPhoneNumber = smsPhoneNumberField ? smsPhoneNumberField.value : null if ('ACCOUNT' === this.formType) { phone1 = this.formData.address.phone1.number } else { phone1 = this.formData.account.address.phone1.number } if (phone1 && phone1.trim() !== '' && (!smsPhoneNumber || smsPhoneNumber.trim() === '')) { smsPhoneNumberField.value = phone1 this.validateGDPRSmsFieldValue(false) } } } catch (e) { console.log('linkage phone1 with sms phone number error', e) } }, validateGDPRSmsFieldValue(needFocus) { try { let fileId = "account.gdpr.smsPhoneNumber" let gdprSmsFieldId = "account.gdpr.sms" let fileRequiredToolTipId = "account.gdpr.smsPhoneNumber.requiredTooltip" let fileInvalidToolTipId = "account.gdpr.smsPhoneNumber.invalidTooltip" if (fileId && gdprSmsFieldId) { let smsPhoneNumberField = document.getElementById(fileId) let smsPhoneNumberRequiredFieldToolTip = document.getElementById(fileRequiredToolTipId) let smsPhoneNumberInvalidFieldToolTip = document.getElementById(fileInvalidToolTipId) let val = this.getFormData().getAll(gdprSmsFieldId) let isInvalid = false let isRequired = false if (smsPhoneNumberField && val) { if ('true' === val[0]) { let smsPhoneNumberValue = smsPhoneNumberField.value if (smsPhoneNumberValue && smsPhoneNumberValue.trim() !== '') { let usPhoneReg = /^(\+?1)?[2-9]\d{2}[2-9](?!11)\d{6}$/ if (!usPhoneReg.test(smsPhoneNumberValue.replaceAll(' ', '').replaceAll('-', '').replaceAll('\\(', '').replaceAll('\\)', ''))) { isInvalid = true } } else { isRequired = true } } } if(smsPhoneNumberField && this.isNeedValidateGDPRSmsField(smsPhoneNumberField)){ if (isInvalid) { smsPhoneNumberField.style.borderColor = '#dc3545' if (smsPhoneNumberInvalidFieldToolTip) { smsPhoneNumberInvalidFieldToolTip.style.fontSize = '0.75rem' smsPhoneNumberInvalidFieldToolTip.style.width = '100%' smsPhoneNumberInvalidFieldToolTip.style.marginTop = '.25rem' smsPhoneNumberInvalidFieldToolTip.style.fontFamily = 'Lato' smsPhoneNumberInvalidFieldToolTip.style.color = '#DC143C' smsPhoneNumberInvalidFieldToolTip.style.display = '' } } else { if (smsPhoneNumberInvalidFieldToolTip) { smsPhoneNumberInvalidFieldToolTip.style.display = 'none' } } if (isRequired) { smsPhoneNumberField.style.borderColor = '#dc3545' if (smsPhoneNumberRequiredFieldToolTip) { smsPhoneNumberRequiredFieldToolTip.style.fontSize = '0.75rem' smsPhoneNumberRequiredFieldToolTip.style.width = '100%' smsPhoneNumberRequiredFieldToolTip.style.marginTop = '.25rem' smsPhoneNumberRequiredFieldToolTip.style.fontFamily = 'Lato' smsPhoneNumberRequiredFieldToolTip.style.color = '#DC143C' smsPhoneNumberRequiredFieldToolTip.style.display = '' } } else { if (smsPhoneNumberRequiredFieldToolTip) { smsPhoneNumberRequiredFieldToolTip.style.display = 'none' } } if (isInvalid || isRequired) { if (needFocus) { smsPhoneNumberField.focus() } return false } else { smsPhoneNumberField.style.borderColor = '#ced4da' } } } return true } catch (e) { console.log('validate GDPR sms field value error', e) return true } }, isNeedValidateGDPRSmsField(element) { let parentElement = element.parentNode; while (parentElement) { const parentId = parentElement.id; if (parentId.startsWith('neon-page-')) { return parentElement.style.display !== 'none'; } parentElement = parentElement.parentNode; } return false }, checkGDPRSmsField(event) { try { let fieldId = event.target.getAttribute('id') let gdprSmsFieldId = "account.gdpr.sms" if (gdprSmsFieldId && fieldId && gdprSmsFieldId === fieldId) { let val = this.getFormData().getAll(event.target.getAttribute('name')) if (val && 'true' === val[0]) { this.setSmsPhoneNumberField(false) } else { this.setSmsPhoneNumberField(true) } } } catch (e) { console.log('validate gdpr sms field error', e) } }, checkSubMemberNameField(event) { if ('MEMBERSHIP' !== this.formType && 'SUB_MEMBER' !== this.formType) { return } try { let firstNamePro = 'account.name.firstName' let preferredNamePro = 'account.name.preferredName' let fieldId = event.target.getAttribute('id') if (!fieldId || fieldId.indexOf('subMembers') < 0) { return; } if (fieldId.indexOf(firstNamePro) < 0 && fieldId.indexOf(preferredNamePro) < 0) { return; } let subMemberIndex let firstNameReg = /subMembers\[(.*)\].account.name.firstName/g let result = firstNameReg.exec(fieldId) if (result && result.length > 0 && result[1] !== null) { subMemberIndex = Number(result[1]) } let preferredNameReg = /subMembers\[(.*)\].account.name.preferredName/g result = preferredNameReg.exec(fieldId) if (result && result.length > 0 && result[1] !== null) { subMemberIndex = Number(result[1]) } firstNamePro = 'subMembers[' + subMemberIndex + '].' + firstNamePro preferredNamePro = 'subMembers[' + subMemberIndex + '].' + preferredNamePro let firstNameField = document.getElementById(firstNamePro) let preferredNameField = document.getElementById(preferredNamePro) if (!preferredNameField || !firstNameField) { return } let firstName = this.formData.subMembers[subMemberIndex].account.name.firstName let preferredName = this.formData.subMembers[subMemberIndex].account.name.preferredName if ((!preferredName || preferredName.replaceAll(' ', '') === '') && firstName && firstName.replaceAll(' ', '') !== '') { this.formData.subMembers[subMemberIndex].account.name.preferredName = firstName preferredNameField.value = firstName this.validateField(preferredNameField, firstName) } } catch (e) { console.log('validate sub member name field error', e) } }, checkNameField(event) { try { let firstNamePro = 'account.name.firstName' let preferredNamePro = 'account.name.preferredName' if ('ACCOUNT' === this.formType) { firstNamePro = 'name.firstName' preferredNamePro = 'name.preferredName' } let fieldId = event.target.getAttribute('id') if (fieldId && (fieldId === firstNamePro || fieldId === preferredNamePro)) { this.processNameField(firstNamePro, preferredNamePro) } } catch (e) { console.log('validate name field error', e) } }, processNameField(firstNamePro, preferredNamePro) { try { let firstNameField = document.getElementById(firstNamePro) let preferredNameField = document.getElementById(preferredNamePro) if (!preferredNameField || !firstNameField) { return } let firstName let preferredName if ('ACCOUNT' === this.formType) { firstName = this.formData.name.firstName preferredName = this.formData.name.preferredName } else { firstName = this.formData.account.name.firstName preferredName = this.formData.account.name.preferredName } if ((!preferredName || preferredName.replaceAll(' ', '') === '') && firstName && firstName.replaceAll(' ', '') !== '') { if ('ACCOUNT' === this.formType) { this.formData.name.preferredName = firstName } else { this.formData.account.name.preferredName = firstName } preferredNameField.value = firstName this.validateField(preferredNameField, firstName) } } catch (e) { console.log('process name field error', e) } }, onFieldChange: function (event) { this.checkAsCompanyField(event) this.linkagePhone1WithSmsPhoneNumber(event) this.checkGDPRSmsField(event) }, onFileCustomUploaded: function (resp) { if (resp.obj.success) { this.tempFileDirUUid = resp.obj.data.uuid this.$nextTick(function () { let el = document.getElementById(resp.key) el.value = resp.obj.data.tempPath let elVal = this.getFormData().getAll(resp.key) this.validateField(el, elVal) }) } }, onRemoveCustomFile: function (obj) { this.$nextTick(function () { let el = document.getElementById(obj.key) el.value = '' let elVal = this.getFormData().getAll(obj.key) this.validateField(el, elVal) }) }, getDefaultCustomFile: function (fileInfo) { if (fileInfo) { let infos = fileInfo.split(':') if (infos.length > 1) { return [{name: infos[0], size: infos[1]}] } } return [] }, unsupportedFileType:function (fileName) { const SUPPORTED_FILE_TYPES = ['mobi', 'km', 'me', 'ppk ', 'jtl', 'dat', 'one', 'kdc', 'stl', 'midi', 'png', 'thmx', 'conf', 'pnm', 'mht', 'dwg', 'mj2', 'xroles', 'onepkg', 'csv', 'jar', 'exr', 'exp', 'fh50', 'crw', 'srf', 'scala', 'aifc', 'slddrw', 'ecelp7470', 'aiff', 'jb2', 'iso19139', 'css', 'perl', 'f90', 'fh40', 'am', 'amr', 'f77', 'as', 'au', 'mef', 'sql', 'pkg', 'bpg', 'ad', 'ac', 'dtd', 'bash', 'dts', 'heif', 'junit', 'al', 'bpm', 'properties', 'kar', 'aj', 'bpk', 'heic', 'mli', 'sxi', 'sxw', 'webp', 'html', 'idl', 'data', 'mmpt', 'jfi', 'pro', 'mp4v', 'xbm', 'psd', 'mhtml', 'icb', 'mkd', 'asx', 'cs', 'rw2', 'mp4a', 'mkv', 'ics', 'webm', 'ico', 'cc', 'cxx', 'sxc', 'sxd', 'cl', 'ppj', 'arw', 'rtf', 'svg', 'lha', 'pps', 'txt', 'flac', 'ppm', 'ppz', 'ft12', 'ft11', 'asm', 'ft10', 'lhs', 'ppt', 'asf', 'r3d', 'xsamples', 'mka', 'asp', 'htaccess', 'groovy', 'mmmp', 'mid', 'abs-menulinks', 'g3', 'pod', 'dxf', 'rst', 'dxb', 'pom', 'mp2a', 'pot', 'jfif', 'el', 'ppa', 'ft', 'mjp2', 'pict', 'mpg', 'fv', 'nrw', 'mpt', 'mpp', 'xmind', 'fbs', 'fh', 'mpx', 'wdb', 'sldasm', 'mime', 'fn', 'gv', 'vsdm', 'markdown', 'jif', 'xdp', 'distz', 'ost', 'mos', 'diff', 'install', 'mov', 'mpe', 'wcm', 'zip', 'i3', 'vsdx', 'go', 'mng', 'sldprt', 'roles', 'ifb', 'hx', 'mp3', 'mp4', 'wax', 'xweb', 'mp2', 'wav', 'npx', 'fb2', 'ptx', 'awk', 'hh', 'mod', 'hs', 'xfdf', 'hp', 'ief', 'mmr', 'mmp', 'pst', 'xcf', 'ig', 'rest', 'avi', 'rwz', 'orf', 'in', 'xlog', 'jx', 'fff', 'list', 'lrm', 'fh4', 'fh5', 'dwfx', 'm2v', 'jp2', 'sldm', 'mdtext', 'jbig2', 'm3a', 'potm', 'fh8', 'jpgm', 'fh9', 'jl', 'fh7', 'sldx', 'coffee', 'xargs', 'jpgv', 'js', 'pptx', 'msp', 'owl', 'xht', 'm1v', 'mst', 'pyv', 'xif', 'jmx', 'm4', 'lisp', 'm3', 'jng', 'lrf', 'm2a', 'ppsx', 'pxn', 'vcs', 'keys', 'icns', 'mrw', 'md', 'vda', 'jpeg', 'xcat', 'mb', 'ma', 'wsdd', 'mg', 'mf', 'pya', 'pptm', 'ecelp9600', 'xltx', 'msi', 'xltm', 'n3', 'msg', 'rexx', 'epub', 'kml', 'opus', 'log', 'dotm', 'nb', 'iiq', 'readme', 'xlsb', 'ml', 'dotx', 'kmz', 'vcf', 'ppsm', 'xlsx', 'haml', 'xlsm', 'ntf', 'mxu', 'raw', 'lvp', 'tex', 'ras', 'config', 'cdr', 'bibtex', 'xquery', 'movie', 'project', 'makefile', 'aac', 'adoc', 'text', '3fr', 'cwiki', 'xlz', 'def', 'ocaml', 'smil', 'h263', 'h261', 'h264', 'ipa', 'bay', 'xmp', 'bau', 'xml', 'raf', 'bas', 'bat', 'rar', 'viv', 'ram', 'wks', 'scm', '3g2', 'jpm', 'ini', 'sas', 'vhd', 'xlf', 'json', 'inx', 'xld', 'xwelcome', 'k25', 'm4u', 'xlc', 'm4v', 'xla', 'xhtml', 'cbl', 'btif', 'xll', 'lua', 'pm', 'xlm', 'pl', 'pp', 'xlw', 'xlt', 'xlr', 'xls', 'py', 'ra', 'abs-linkmap', 'caf', 'h++', 'lsp', 'cab', 'gif', 'rb', 'ims', 'm3u', 'potx', 'dcl', 'm4a', 'mseq', 'm4b', 'dcx', 'cat', 'qt', 'dcs', 'jpf', 'jpg', 'fhc', 'jpe', 'tcl', 'chm', 'dist', 'wpl', 'sh', 'djv', 'ads', 'adp', 'wps', 'pbm', 'php3', 'oxps', 'shw', 'wbmp', 'emf', 'aspx', 'cgm', 'dtshd', 'cgi', 'tk', 'tif', 'mpeg', 'lzh', 'so', 'mpg4', 'st', 'pas', 'itk', 'less', 'ada', 'adb', 'elc', 'cfm', 'hpp', 'xgrm', 'cfg', 'flv', 'asnd', 'xps', 'rdf', 'nitf', 'xpm', 'restx', 'dif', 'dib', 'wma', 'cfml', 'jsp', 'vm', 'sed', 'classpath', 'wmf', 'tga', 'ihtml', 'j2c', 'wmx', 'fli', 'cfc', 'wmv', '3gp', 'flc', 'ft8', 'sfdu', 'ft9', 'ft7', 'java', 'wm', 'odf', 'xlam', 'cmd', 'doc', 'ppam', 'patch', 'docm', 'aif', 'odt', 'xegrm', 'dms', 'eot', 'x3f', 'bin', 'pef', 'vstx', 'xq', 'meta', 'ibooks', 'pen', 'clj', 'nar', 'dng', 'applescript', 'ent', 'xmap', 'pcx', 'pdf', 'fpx', 'vssx', 'tld', 'vstm', 'bib', 'manifest', 'tiff', 'eol', 'c++', 'dump', 'xsd', 'for', 'cil', 'mpga', 'eml', 'emz', 'php4', 'types', 'xsl', 'djvu', 'rgb', 'mmas', 'vssm', 'mmat', 'asciidoc', 'mmap', 'xsp', 'grm', 'pct', 'htm', 'xlex', 'mdb', 'rng', '4th', 'f4v', 'etx', 'asice', 'rnc', 'fvt', 'yaml', 'mdi', 'sr2', 'spx', 'deploy', 'vhdl', 'rnx', 'c', 'pic', 'd', 'e', 'f', 'oga', 'g', 'xliff', 'ecelp4800', 'h', 'bmp', 'l', 'm', 'rmi', 'p', 'ogg', 'nef', 'r', 's', 'asics', 'drf', 'v', 'svgz', 'y', 'rmp', 'drc', 'ogm', 'cr2', 'cpp', 'ogv', 'egrm', 'hxx', 'snd', 'rlc', 'fh12', 'dpr', 'fh11', 'fh10', 'aart', 'dpx', 'php', 'wvx', 'vtt', 'cob', 'xconf', 'dot', 'vsd', 'fst', 'docx', 'xwd', 'sml', 'cmx', 'smi', 'vsl', 'vsw', 'erf', 'vss', 'pgm', 'vst', 'erl'] if (fileName.indexOf('.') > -1) { let type = fileName.substring(fileName.lastIndexOf('.') + 1) return SUPPORTED_FILE_TYPES.indexOf(type.toLowerCase()) < 0 } return false }, div: function (arg1, arg2) { arg1 = parseFloat(arg1); arg2 = parseFloat(arg2); var t1 = 0, t2 = 0, r1, r2; try { t1 = arg1.toString().split(".")[1].length; } catch (e) { } try { t2 = arg2.toString().split(".")[1].length; } catch (e) { } r1 = Number(arg1.toString().replace(".", "")); r2 = Number(arg2.toString().replace(".", "")); return this.Mul(r1 / r2, Math.pow(10, t2 - t1)); }, Mul: function (arg1, arg2) { arg1 = parseFloat(arg1); arg2 = parseFloat(arg2); var m = 0, s1 = arg1.toString(), s2 = arg2.toString(); try { m += s1.split(".")[1].length } catch (e) { } try { m += s2.split(".")[1].length } catch (e) { } return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m); }, getLoginName: function(){ axios.post('/nx/portal/constituent/getLoginName').then(response => { this.formData.newLoginName = response.data.data }).catch(error => { if(error.response.data){ this.errors = error.response.data console.log('error: ',error) } }) }, validateCurrentPassword: function (event) { let val = this.getFormData().getAll(event.target.getAttribute('name')) this.validateField(event.target, val) this.sendCurrentPasswordToServer(this.getNeonFormJson()) }, changePasswordType(event){ const pid = event.target.getAttribute('pid') const eyeId = pid + '_eye' const input = document.getElementById(pid) const eyesIcon = document.getElementById(eyeId) if (input.type === "password"){ input.type = "text" eyesIcon.setAttribute( 'class', 'fa fa-eye neon-password-eye-icon' ) } else { input.type = "password" eyesIcon.setAttribute( 'class', 'fa fa-eye-slash neon-password-eye-icon' ) } }, sendCurrentPasswordToServer: function(neonFormData){ neonFormData.hiddenFields = this.hiddenFields axios.post('/nx/portal/constituent/checkCurrentPassword', neonFormData).then(response => { }).catch(error => { if(error.response.data){ this.errors = error.response.data let fields = {} this.errors.forEach(function(e){ if(e.type==='GLOBAL'){ }else { if (fields[e.field] === undefined) { fields[e.field] = [] } fields[e.field].push(e.message) } }) this.invalidField['oldPassword'] = fields['oldPassword'] } }) }, checkFieldInvalid: function (fieldName) { if (this.invalidField[fieldName]) { return true } return false }, validateBeforeSubmit() { if (!this.validateGDPRSmsFieldValue(true)) { return false } // validate current page if (this.validatePage(this.currentPage)) { return true } return false }, submitNeonForm: function (event,ach) { if(this.previewMode){ alert('Preview Mode') return } if(!this.validateBeforeSubmit()){ return } if(!this.neonPayEnable) { if(this.paymentType==='ACH' && ach===undefined){ let achConfirmModal = bootstrap.Modal.getInstance(document.getElementById('achConfirmModal')) achConfirmModal.show() return }else if(this.paymentType==='ACH' && ach){ let achConfirmModal = bootstrap.Modal.getInstance(document.getElementById('achConfirmModal')) achConfirmModal.hide() } this.errors = [] this.invalidField = {} if(this.googleReCaptchaEnabled){ this.validateReCaptcha() }else{ this.submitting = true this.invokePrepareSendToServer() } } else { this.errors = [] this.invalidField = {} if(ach) { this.submitting = true this.invokePrepareSendToServer(ach) } else { if(this.googleReCaptchaEnabled){ this.validateReCaptcha(ach) }else{ this.submitting = true this.invokePrepareSendToServer(ach) } } } }, invokePrepareSendToServer: function(ach){ const neonFormJson = this.getNeonFormJson() this.prepareSendToServer(neonFormJson, ach) }, prepareSendToServer: function(neonFormData){ // You can override this method If you want do something before send to server this.sendToServer(neonFormData) }, validateReCaptcha:function (ach) { if(window.grecaptcha) { if(this.isEnableVisibleReCaptcha){ if(this.recaptchaResponse !== null){ this.submitting = true this.isReCaptchaPassed = true; let neonFormData = this.getNeonFormJson() neonFormData.recaptchaResponse = this.recaptchaResponse this.prepareSendToServer(neonFormData, ach) }else{ this.globalError = 'reCAPTCHA verification failed.'; app.$nextTick(function(){ document.getElementById('globalError').scrollIntoView() }) this.isReCaptchaPassed = false; } }else{ this.recaptchaResponse = null window.grecaptcha.execute() } } else { this.submitting = true this.invokePrepareSendToServer(ach) } }, sendToServer: function(neonFormData){ if(this.selectEditTerm) { neonFormData.membershipTermId = this.selectEditTerm.id } let url = "\/nx\/portal\/membership-form" if(url && url.indexOf('/membership-form') > -1 && (!neonFormData.subMemberChecked || neonFormData.subMemberChecked && neonFormData.subMemberChecked !== 'true') && neonFormData.subMembers) { delete neonFormData.subMembers } neonFormData.hiddenFields = this.hiddenFields axios.post("\/nx\/portal\/membership-form", neonFormData).then(response => { console.info(response) try { if (window.doublethedonation && response.data.extraParameters.donationStatus === 'SUCCEEDED') { sessionStorage.dtdCompanyId = neonFormData.doublethedonation_company_id } } catch (e) { console.error(e) } if (this.paymentType === 'PAYPAL' && this.totalAmount > 0.0) { this.paypal = response.data.paypalFormRequest this.$nextTick(function () { console.log('redirects to paypal'); document.getElementById('paypal_xclick').submit(); }) } else { // tell the pop button iframe close try { let doubleDonationInvalid = 'DONATION' !== this.formType || (response.data && response.data.extraParameters && response.data.extraParameters.isCompanyDonor) if (this.popDomainUrl && this.hideTheme && this.hideTheme === '1' && (doubleDonationInvalid || !window.doublethedonation)) { let data = {target: 'closeModal', data: true} parent.postMessage(data, this.popDomainUrl) } } catch (ignore) { } if (this.customExitPage && this.customExitPageUrl !== null) { location.href = this.customExitPageUrl } else { let redirectUrl = '/nx/portal/forms/result/' + response.data.exitPageResponse.shareToken if (this.hideTheme && this.hideTheme === '1') { redirectUrl += '?hideTheme=1' } if(response.data && response.data.originalUrl){ redirectUrl += '?originalUrl=' + encodeURIComponent(response.data.originalUrl) } location.href = redirectUrl } this.success = true this.submitting = false this.success = true } }).catch(error => { this.catchError(error) }) }, checkWithoutPayment: function() { if(this.withoutPayment){ if(this.currentPage === 5){ this.submitFormWithoutPayment() return true } } return false }, submitFormWithoutPayment: function(){ if (this.validatePage(this.currentPage)) { console.info('Redirect to payment...') this.submitting = true var neonFormJson = this.getNeonFormJson(); neonFormJson.withoutPayment = true neonFormJson.withoutPaymentParentUrl = this.withoutPaymentParentUrl axios.post("\/nx\/portal\/membership-form", neonFormJson).then(response => { console.info(response) this.redirectingToPayment = true this.paymentRequestId = response.data setTimeout(() => { document.getElementById('redirectToPaymentForm').submit() },2000) }).catch(this.catchError) } }, catchError: function(error){ this.submitting = false if(error.response && error.response.data){ this.errors = error.response.data let fields = {} let globalMessage='' let created= false this.errors.forEach(function(e){ if(e.type==='GLOBAL'){ globalMessage = e.message if(e.code==='E-0020'){ created = true } else if(e.code === 'E-0021' && globalMessage){ document.location.href = globalMessage } app.$nextTick(function(){ document.getElementById('globalError').scrollIntoView() }) }else { if (fields[e.field] === undefined) { fields[e.field] = [] } fields[e.field].push(e.message) } }) this.invalidField = fields this.globalError = globalMessage if(created) { this.created = created this.payLater = false } if(this.globalError =='' && Object.keys(this.invalidField).length>0){ this.globalError='Some field is invalid, please check the form' } if(this.onSubmitError){ this.onSubmitError(this.globalError) } } console.error(error.response) }, getFormData:function(){ return new FormData(document.getElementById('neonform_5')) }, getNeonFormJson(){ return JSON.form('neonform_5') }, initDateField:function (){ this.$nextTick(function(){ for(let f of this.dateFields){ this.renderLayDate(f) } }) // currentLoginName this.getLoginName() }, renderLayDate: function(f){ let format = f.fieldType==='DATE'?'MM/dd/yyyy':'HH:mm:ss' let type = f.fieldType==='DATE'?'date':'time' let elem = document.getElementById(f.fieldName) laydate.render({ elem: elem, lang: 'en', type: type, format: format, ready: function (value){ app.validateField(elem,elem.value) }, done:function(value){ setObjectValueByPath('app.formData',f.fieldName,value) app.validateField(elem,value) } }); }, changePaymentType: function(type){ if(this.submitting){ return } this.paymentType=type }, reCaptchaInit: function () { this.reCaptchaPlaceholder() }, reCaptchaPlaceholder: function () { if(this.isEnableVisibleReCaptcha){ let tagArr = document.getElementsByName("name:reCaptcha"); tagArr.forEach(tag => { let timer = setInterval(() => { if(window.grecaptcha){ window.grecaptcha.render(tag,{ sitekey: '6LerUSscAAAAABvvEeo9zpqVYshHv-ncy2l0kHQL', callback: ($token) => { this.recaptchaResponse = $token // remove error messages this.globalError = ''; }, 'expired-callback' : () => { // expired this.recaptchaResponse = null; }, }); clearInterval(timer); } },500); }) }else{ window.ReCaptchaLoaded = this.reCaptchaCallback; let tag = document.createElement("div") tag.className = 'g-recaptcha' tag.setAttribute('data-sitekey', '6LerUSscAAAAABvvEeo9zpqVYshHv-ncy2l0kHQL') tag.setAttribute('data-callback', 'ReCaptchaLoaded') tag.setAttribute('data-size', 'invisible') document.body.appendChild(tag); } }, reCaptchaCallback: function ($token) { this.recaptchaResponse = $token if(window.grecaptcha) { window.grecaptcha.reset() } this.submitting = true let neonFormData = this.getNeonFormJson() neonFormData.recaptchaResponse = $token this.prepareSendToServer(neonFormData) }, isprofilePhotoChange: function () { this.isProfilePhoto = true }, closeprofilePhoto: function () { this.isProfilePhoto = false }, profilePhotoChange: function(e){ let file = e.target.files[0] if(file){ if(file.type!=='image/png' && file.type!=='image/gif' && file.type!=='image/jpeg'){ alert('Please choose jpg/gif/png format picture.') this.resetProfilePhoto() return } const fileSize = file.size const isLt10M = fileSize/1024 < 500 if (!isLt10M) { alert('The uploaded photo size cannot exceed 500KB.') file = '' this.resetProfilePhoto() return } this.profilePhoto.entity = file let fr = new FileReader(); fr.readAsDataURL(file) fr.onload = function(e){ // if(e.target.result.startsWith('data:image/')) { // app.$data.profilePhoto.url = e.target.result // } app.uploadProfilePhoto() } } }, uploadProfilePhoto: function(cfile) { this.profilePhoto.uploading = true let fileData = new FormData(); if(cfile){ fileData.append('file',cfile,'file') }else { fileData.append('file',this.profilePhoto.entity,'file') } axios.post('/nx/portal/constituent/profile/photo',fileData,{ headers: { 'Content-Type': 'multipart/form-data' } }).then(response => { this.profilePhoto.uploading = false this.profilePhoto.url = response.data.imgUrl + '?t=' + new Date().getTime() this.profilePhoto.approved = response.data.approved this.profilePhoto.entity = null if(!cfile){ this.resetProfilePhoto() } }).catch(error => { console.log(error.response) this.profilePhoto.uploading = false this.profilePhoto.entity = null if(!cfile){ this.resetProfilePhoto() } alert('Upload fail, please try again.') }) }, deleteProfilePhoto: function () { if(!window.confirm('Are you sure you want to delete this photo?')){ return } // delete server this.profilePhoto.deleting = true axios.delete('/nx/portal/constituent/profile/photo').then(response => { this.profilePhoto.deleting = false this.profilePhoto.url = null this.profilePhoto.approved = null this.profilePhoto.entity = null }).catch(error => { console.log(error.response) this.profilePhoto.deleting = false alert('Delete fail, please try again.') }) }, resetProfilePhoto: function() { this.$nextTick(function (){ document.getElementById('account-profile-photo').value='' }) }, getSocialMediaIcon: function (name, style) { if (style === 'D') { return '/nx/static/img/icons/social-media/darkicons/' + name + '.svg' } else { return '/nx/static/img/icons/social-media/lighticons/' + name + '.svg' } }, onAmountKeyPress: function(event){ let keyCode = String.fromCharCode(event.keyCode) if(keyCode==='+' || keyCode==='-' || keyCode.toLowerCase()==='e'){ event.preventDefault() return false } return true }, formatAmount: function (number) { return Formatter.numberFormat(number, 2, this.formCurrency.sign) }, formatAmountWithoutCurrency: function(number){ return Formatter.numberFormat(number, 2, '') }, doBindSubmitBtnTooltip: function (tooltip){ this.$nextTick(() => { const submitNeedDisabledButtons = document.getElementsByName('submitBtn') if(submitNeedDisabledButtons.length > 0){ [...submitNeedDisabledButtons].map(submitBtn => { submitBtn.setAttribute('data-bs-placement','top') submitBtn.setAttribute('data-bs-title',tooltip) submitBtn.setAttribute('data-bs-toggle','tooltip') submitBtn.style.pointerEvents = 'auto' new bootstrap.Tooltip(submitBtn) }) } }) }, initTooltip: function () { this.$nextTick(function () { setTimeout(() => { let tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')) let tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { return new bootstrap.Tooltip(tooltipTriggerEl, {container: 'body'}) }) }, 700) }) }, } const appComputed = { profilePhotoStatus: function (){ return this.profilePhoto.url!==null && !this.profilePhoto.url.startsWith('data:image/') }, showSubmitBtn: function () { return (this.paymentType === 'CARD' && !this.submitting && this.showCardFields) || (this.paymentType === 'ACH' && !this.submitting) }, formCurrencySignClass: function() { switch (this.formCurrency.sign){ case '$': return {'fa-dollar-sign':true} case '€': return {'fa-euro-sign':true} case '£': return {'fa-pound-sign':true} default: return {'fa-dollar-sign':true} } }, asCompany: function () { if (this.formData.account && this.formData.account.asCompany) { return this.formData.account.asCompany } else if (this.formData.asCompany) { return this.formData.asCompany } return null }, disableSubmitButton: function (){ if(this.previewMode){ return true } if(!this.ccfpInfo.nonCaOrgNotInGood){ return false } const result = this.paymentType === 'CARD' && this.ccfpInfo.isCAZipCode this.doBindSubmitBtnTooltip(result ? this.ccfpInfo.notInGoodMessage : '') return result }, showAchMessage: function (){ if(this.previewMode){ return true } if(!this.ccfpInfo.nonCaOrgNotInGood){ return true } return !this.ccfpInfo.isCAZipCode }, showSummary: function(){ if(this.previewMode){ return true } if(this.ccfpInfo.notInGood){ return false } if(this.paymentType !== 'ACH'){ return true } return this.showAchMessage }, showPayment: function (){ if(this.previewMode){ return true } return !this.ccfpInfo.notInGood }, showSameAsBillingAddress: function () { if (this.formData.account && this.formData.account.address) { if(this.formData.account.address.line1!==undefined){ return true } if(this.formData.account.address.line2!==undefined){ return true } if(this.formData.account.address.country!==undefined){ return true } if(this.formData.account.address.city!==undefined){ return true } if(this.formData.account.address.stateOrProvince!==undefined){ return true } if(this.formData.account.address.zipCode!==undefined){ return true } } return false }, addressLine1: function(){ if (this.formData.account && this.formData.account.address && this.formData.account.address.line1) { return this.formData.account.address.line1.line1 } return '' }, addressLine2: function(){ if(this.formData.account && this.formData.account.address) { return this.formData.account.address.line2 } return '' }, addressCountry: function(){ if(this.formData.account && this.formData.account.address) { return this.formData.account.address.country } return '' }, addressCity: function(){ if(this.formData.account && this.formData.account.address) { return this.formData.account.address.city } return '' }, addressStateOrProvince: function(){ if (this.formData.account && this.formData.account.address) { return this.formData.account.address.stateOrProvince } return '' }, addressZipCode: function () { if (this.formData.account && this.formData.account.address) { return this.formData.account.address.zipCode } return '' }, firstName: function () { if (this.formData.account && this.formData.account.name) { return this.formData.account.name.firstName } return '' }, lastName: function () { if (this.formData.account && this.formData.account.name) { return this.formData.account.name.lastName } return '' }, email: function () { if (this.formData.account && this.formData.account.email1) { return this.formData.account.email1 } return '' } } const appWatch ={ asCompany: function(val){ let account; if(this.formData.account){ account = this.formData.account }else{ account = this.formData } if(account.address){ for(let i=1;i<=3;i++){ if(account.address['phone'+i]){ account.address['phone'+i].type = (val?'W':'H') } } account.address.line1.type = (val ? '2' : '1') } }, sameAsBillingAddress: function(val){ if(val){ this.formData.payment.card.address.line1.line1 = this.addressLine1 this.formData.payment.card.address.line2 = this.addressLine2 this.formData.payment.card.address.country= this.addressCountry this.formData.payment.card.address.city= this.addressCity this.formData.payment.card.address.stateOrProvince= this.addressStateOrProvince this.formData.payment.card.address.zipCode= this.addressZipCode } this.validateZipCode() }, currentPage: function (val){ this.validateZipCode() this.initTooltip() }, addressLine1: function(val){ if(this.sameAsBillingAddress){ this.formData.payment.card.address.line1.line1 = val } }, addressLine2: function(val){ if(this.sameAsBillingAddress){ this.formData.payment.card.address.line2= val } }, addressCountry: function(val){ if(this.sameAsBillingAddress){ this.formData.payment.card.address.country= val } }, addressCity: function(val){ if(this.sameAsBillingAddress){ this.formData.payment.card.address.city= val } }, addressStateOrProvince: function (val) { if (this.sameAsBillingAddress) { this.formData.payment.card.address.stateOrProvince = val } }, addressZipCode: function (val) { if (this.sameAsBillingAddress) { this.formData.payment.card.address.zipCode = val } }, firstName: function (val) { if (this.formData.payment && this.formData.payment.card) { this.formData.payment.card.holderFirstName = val } if (this.formData.payment && this.formData.payment.ach) { this.formData.payment.ach.holderFirstName = val } }, lastName: function (val) { if (this.formData.payment && this.formData.payment.card) { this.formData.payment.card.holderLastName = val } if (this.formData.payment && this.formData.payment.ach) { this.formData.payment.ach.holderLastName = val } }, email: function (val) { if (this.formData.payment && this.formData.payment.card) { this.formData.payment.card.holderEmail = val } if (this.formData.payment && this.formData.payment.ach) { this.formData.payment.ach.holderEmail = val } }, 'formData.payment.card.address.zipCode': function (val){ this.validateZipCode() }, 'formData.account.address.zipCode': function (val){ this.validateZipCode() }, paymentType: function (val){ this.validateZipCode() } } const appConfig = { data: function () { return appData }, methods: appMethods, computed: appComputed, watch: appWatch, mounted: function (){ // Render Laydate this.initDateField() // Init google re captcha if(this.googleReCaptchaEnabled || this.googleReCaptchaEnabled0) { this.reCaptchaInit() } // Invoke other init methods for (let method of this.initMethods) { method.apply(this) } // listening the pop button iframe url try { let that = this window.addEventListener('message', function(e) { let domainUrl = e.data let re = new RegExp('^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$', 'i'); if (typeof(domainUrl === 'string') && re.test(domainUrl)) { if(!that.popDomainUrl) { that.popDomainUrl = domainUrl } that.withoutPaymentParentUrl = domainUrl } }); } catch (ignore) { } this.initTooltip() }, } </script> <script> appData.itemName = 'Amount' appData.membershipCostInvalidMessageSmall = 'The amount entered must be larger than or equal to the membership fee.' appData.membershipCostInvalidMessageBig = 'The amount entered must be less than 999,999,999,999.99.' appData.googleReCaptchaEnabled0 = false appData.originalForwardButtons = ["Next","Next","Skip","Skip","Next"] appData.pageNumberMapping = {"addOnPageNumber":3,"subMemberPageNumber":2,"membershipLevelsPageNumber":0,"summaryPageNumber":4} appData.canAddSubMember = true appData.autoRenewHidden = true appData.autoRenewDefaultVal = true appData.term = { cost: 25.0, hasSubMembers: false, subMemberAllowed: 99999, availableToCurrentEmployees: false, forceAutoRenew: true, long: 1, unitText: "MONTH", termType: "ONE_TIME" } appData.membershipCustomFieldMap = {} appData.membershipHidePrice = false appData.membershipCostInvalidMessage = appData.membershipCostInvalidMessageSmall appData.subMembershipTerms = [] appData.subMemberChecked = false appData.subMemberRequried = false appData.subMemberDisplayName = "Submember" appData.addOnChecked = false appData.subMembers = [] appData.showMembershipDetails = false // process subMembers formData appData.emptyAccountFieldJson = JSON.stringify(appData.formData.subMembers.index) appData.formData.subMembers = [] appData.contactList = null appData.contactList = appData.contactList==null?[]:appData.contactList // selected contact for each submember appData.selectedContactList = [] appData.searchContactKey = '' // all contacts for current dialog appData.currentSubmemberIdx = 0 appData.currentContactList = [] appData.currentSearchContactList = [] // mark current contact dialog selection appData.currentSelectedContactList = new Set() // appData.addOnPageTitle = appData.pageTitles[appData.pageNumberMapping.addOnPageNumber] appData.donationOnceChecked = true appData.donationAmount = "250.00" // appData.donationOtherAmountSelected = false appData.donationOnceAmount = "250.00" appData.donationRecurringAmount = "" appData.donationOnceOtherSelected = false appData.donationRecurringOtherSelected = false appData.orderSummary = {} appData.discountCodeAdded = false appData.payLater = false appData.payPal = false appData.preferAutoRenew = null appData.upgradeId = null appData.installmentDes = '' appData.subInstallmentDes = [] appData.installmentRenewId = null //addon appData.selectedFrequency = "donationOnce" appData.optionSelectedModel = null appData.recurringUnitText = null appData.addonDonationLabel = "Add-On" appData.addonCustomFields = [] appComputed.donationOtherAmountLabel = function () { let label = "Other Amount" return false && label ==='Other Amount' ? 'Amount' : label } appComputed.autoRenew=function(){ return this.formData.autoRenew } appWatch.autoRenew=function(val){ let bVal=JSON.parse(val) this.hideOrShowPayment(!bVal) if(this.subMembers.length>0) { this.$nextTick(function () { for(let index in this.subMembers){ let tt = this.formData.subMembers[index].autoRenewTooltip if(bVal){ tt.disable() }else{ tt.enable() } } }) } } appWatch.subMembershipTerms = function(val){ this.term.hasSubMembers = val!=null && val.length>0 if(this.subMemberChecked && !this.term.hasSubMembers) { this.subMemberChecked = false } } appData.initMethods.push(function(){ let defaultTerm = {"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"9","membership":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"3","category":null,"code":"CL2","description":"CL Membership - Tier 2","status":{"available":true,"name":"Active","value":1},"rank":3,"membershipBenefits":null,"groupMembershipType":null,"childMemberAllowed":null,"membershipScope":null,"benefit":"","organizationGroupMembership":false,"individualGroupMembership":false,"groupMembership":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"3","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"cost":25.0,"fullCost":25.0,"enrollType":{"available":true,"name":"JOIN","value":1},"term":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":null,"howLong":1,"unit":{"available":true,"name":"MONTH","value":2},"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":null,"createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":true},"display":"Tier 2 (monthly)","displayOrder":"8","isDiscountInPercentage":null,"discountValue":null,"gracePeriod":null,"packageItemId":null,"parentMembershipTermId":null,"parentMembershipTerm":null,"priceOffList":null,"couponCodeList":null,"freeinput":0,"hiddenFlag":0,"complimentaryAmount":null,"freeInputTermDisplayName":"Other Amount:","pairedTermId":10,"advantageAmount":8.0,"advantageAmountOption":false,"eligibleAmount":17.0,"advantageDescription":"Received goods and services for premium features in CourtListener.com and FLP branded merchandise.","autoRenewal":1,"termType":"ONE_TIME","settings":{"createdBy":null,"createdDate":null,"lastModifiedBy":null,"lastModifiedDate":null,"id":"5","startDateCalculationJoin":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateCalculationRenew":{"available":true,"name":"Transaction date or prior renewal date","value":2},"startDateMonthJoin":0,"startDateDayJoin":1,"startDateMonthRenew":0,"startDateDayRenew":1,"startDateMonthJoinEnd":0,"startDateDayJoinEnd":1,"startDateMonthRenewEnd":0,"startDateDayRenewEnd":1,"endDateAdjust":{"available":true,"name":"None","value":1},"endDateAdjustForEndOfMonth":0,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"5","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false},"formattedComplimentaryAmount":null,"price":25.0,"listPrice":25.0,"subPrice":25.0,"mainIndividualGroupMembershipTerm":false,"mainOrganizationGroupMembershipTerm":false,"mainGroupMembershipTerm":false,"lastModifiedDateMMddyyyy":null,"createdDateMMddyyyy":null,"debugId":"9","createdDisplay":"","lastModifiedDisplay":"","createdDateDisplay":null,"lastModifiedDateDisplay":null,"new":false} if(defaultTerm) { this.selectTerm(defaultTerm) } if(this.autoRenewDefaultVal){ this.formData.autoRenew = this.autoRenewDefaultVal } new bootstrap.Modal(document.getElementById('contactsListModal')) }) appData.initMethods.push(function () { let autoRenewCheckbox = document.querySelector('#autoRenew') if (autoRenewCheckbox) { let _this = this autoRenewCheckbox.onclick = function () { if (autoRenewCheckbox.checked) { _this.preferAutoRenew = true } else { _this.preferAutoRenew = false } } } }) // =========== Membership Term ============== appMethods.selectTerm = function (termObj) { this.formData.termId = termObj.id this.formData.cost = termObj.freeinput===1 ? this.formData['freeCost'+termObj.id] : termObj.cost if(termObj.term.unit.name==='LIFE'){ this.formData.autoRenew = false }else { this.formData.autoRenew = termObj.autoRenewal === 1 ? true : (this.autoRenewHidden ? this.autoRenewDefaultVal : (this.preferAutoRenew !== null ? this.preferAutoRenew : this.autoRenewDefaultVal)) } this.term.cost = termObj.cost this.term.long = termObj.term.howLong this.term.unitText = termObj.term.unit.name this.term.hasSubMembers = termObj.membership.groupMembership this.term.subMemberAllowed = termObj.membership.childMemberAllowed === null ? 99999 : termObj.membership.childMemberAllowed this.term.availableToCurrentEmployees = termObj.membership.organizationGroupMembership && termObj.membership.membershipScope!=null? termObj.membership.membershipScope.value===1: false this.term.forceAutoRenew = termObj.autoRenewal === 1 this.term.termType = termObj.termType if(!this.term.hasSubMembers) { this.subMemberChecked = false this.subMembers = [] this.subInstallmentDes = [] this.currentSubmemberIdx = 0 this.selectedContactList = [] } else { this.subMemberChecked = false } if(this.switchNeonPayMerchant) { this.switchNeonPayMerchant(termObj.id) } this.hiddenFields = this.hiddenFields.filter(fieldName => !(fieldName.includes('customFields[') && !fieldName.includes('addon.customFields['))) if(this.membershipCustomFieldMap && this.membershipCustomFieldMap[termObj.membership.id] && this.membershipCustomFieldMap[termObj.membership.id].length>0){ for(let field of this.membershipCustomFieldMap[termObj.membership.id]){ this.hiddenFields.push(field) } } //DEV-15499 if(termObj.termType === 'INSTALLMENT') { this.formData.autoRenew = false this.hiddenFields.push('autoRenew'); let months = termObj.term.unit.name === 'MONTH' ? termObj.term.howLong : termObj.term.howLong * 12 months += Number(months) > 1 ? ' Months.' : ' Month.' let fee = this.term.cost === 0 ? 'Free' : this.formatAmount(this.term.cost) this.installmentDes = 'This membership level is paid in monthly installments of '+ fee +' for '+ months this.hideOrShowPayment(false) } else { this.hiddenFields = this.hiddenFields.filter(fieldName => 'autoRenew' !== fieldName) this.installmentDes = '' this.hideOrShowPayment(!this.formData.autoRenew) } let accountMode = "INDIVIDUAL_COMPANY" let needChangeAsCompanyField = accountMode === 'INDIVIDUAL_COMPANY' && (!this.loggedIn || this.previewMode) let hideAsCompany = false if(needChangeAsCompanyField){ if(termObj.membership.organizationGroupMembership){ this.formData.account.asCompany = true hideAsCompany = true if(!true){ delete this.invalidField['account.name.firstName'] } if(!true){ delete this.invalidField['account.name.lastName'] } }else if(termObj.membership.individualGroupMembership){ this.formData.account.asCompany = false hideAsCompany = true if(!false) { delete this.invalidField['account.company.name'] } }else{ this.formData.account.asCompany = false if(!false) { delete this.invalidField['account.company.name'] } } } this.formData.discountCode = '' this.discountCodeAdded = false this.$nextTick(function(){ // auto renew if(termObj.autoRenewal === 1 || termObj.term.unit.name==='LIFE'){ document.getElementById('autoRenew').classList.add('readonly') }else{ document.getElementById('autoRenew').classList.remove('readonly') } // As company if(needChangeAsCompanyField){ document.getElementById('account.asCompany').parentNode.parentNode.parentNode.style.display = hideAsCompany ? 'none' : 'block' } }) } appMethods.hideOrShowPayment = function(val) { if(this.formData.autoRenew || this.term.termType === 'INSTALLMENT' || (this.selectedFrequency !== 'donationOnce' && this.donationChecked)) { val = false } this.payLater = val this.payPal = val if(!val && this.paymentType!=='ACH' && this.paymentType!=='CARD') { this.paymentType="CARD" } } appMethods.onFreeInputBlur = function (event) { this.formData.cost = event.target.value } appMethods.showCostInvalidMessage = function () { if (this.formData.termId === undefined || this.formData.termId === '' || this.formData.termId === 'null') { return false } if (this.formData.cost==='') { return true } if(parseInt(this.formData.cost)>999999999999.99){ this.membershipCostInvalidMessage=this.membershipCostInvalidMessageBig }else{ this.membershipCostInvalidMessage=this.membershipCostInvalidMessageSmall } return isNaN(parseFloat(this.formData.cost)) || parseFloat(this.formData.cost)<parseFloat(this.term.cost) || parseInt(this.formData.cost)>999999999999.99 } // =========== end Membership Term ============== // =========== Sub Membership ============== appMethods.getSubContactList = function(index){ // filter selected contact let unSelectedContactList = [this.emptyContact] for(let contact of this.contactList){ let found = false this.selectedContactList.forEach((selectedContact, i) => { if(i===index){ return } if(contact.contactId===selectedContact.contactId){ found = true return } }) if(!found && contact.deceased!==true) { unSelectedContactList.push(contact) } } if(!this.term.availableToCurrentEmployees){ return unSelectedContactList } let subContactList = [] for(let contact of unSelectedContactList){ if(contact.currentEmployer){ subContactList.push(contact) } } return subContactList } appMethods.selectContact = function(index, event) { let selectDom = event.target; let contactId = selectDom.options[selectDom.selectedIndex].value if(contactId===''){ this.selectedContactList[index]=this.emptyContact this.formData.subMembers[index] = JSON.parse(this.emptyAccountFieldJson) this.$nextTick(function(){ this.disableContactField(index,false) }) return } // remove selected contact from unselected list for(let i=0; i<this.contactList.length; i++){ if(this.contactList[i].contactId===contactId){ this.selectedContactList[index]=this.contactList[i] break } } axios.get('/nx/portal/membership-form/5/sub-contacts/' + contactId).then(response => { if(response.data != null) { this.formData.subMembers[index].account = response.data this.formData.subMembers[index].account.dob.mdy = response.data.dob.mdyStr this.$nextTick(function () { this.disableContactField(index, true) }) } }).catch(error => { if (error.response.data) { alert(error.response.data[0].message) } }) } appMethods.disableContactField = function(index, disabled){ let fieldsContainer = document.getElementById('contact-field-'+index); if(fieldsContainer===null){ return } for(let et of ['input','select','textarea']) { for (let field of fieldsContainer.getElementsByTagName(et)) { if(field.getAttribute('name').includes('.account.')) { field.disabled = disabled } if(disabled) { field.classList.remove('is-invalid') } } } } appWatch.subMemberChecked = function (val) { this.forwardButtons[this.pageNumberMapping.subMemberPageNumber] = val ? this.originalForwardButtons[0] : 'Skip' if (this.subMembers.length === 0) { this.addSubMember() } } appWatch.subMembershipTerms = function(val){ for(let index=0; index<this.subMembers.length; index++){ this.initSubFreeInput(index) } } appMethods.initSubFreeInput = function(index){ for(let term of this.subMembershipTerms){ if(term.freeInput){ this.formData.subMembers[index]['freeCost'+term.id] = this.formatFreeCost(term.cost) } } } appMethods.addSubMember = function () { for(let i=0;i<this.subMembers.length;i++){ this.subMembers[i] = false } this.formData.subMembers.push(JSON.parse(this.emptyAccountFieldJson)) this.subMembers.push(true) this.subInstallmentDes.push('') this.selectedContactList.push(new Set()) if(this.subMembershipTerms.length===1){ this.selectSubTerm(this.subMembers.length-1,this.subMembershipTerms[0].id,this.subMembershipTerms[0].cost,this.subMembershipTerms[0].term.unit.name==='LIFE', this.subMembershipTerms[0]) } //DEV-15499 if(this.term.termType === 'INSTALLMENT') { this.autoRenewHidden = true } // Init free cost this.initSubFreeInput(this.subMembers.length-1) this.$nextTick(function(){ for(let df of this.dateFields){ let f = JSON.parse(JSON.stringify(df)) if (!f.fieldName.startsWith("subMembers[index].")) { continue } f.fieldName = f.fieldName.replace('subMembers[index]','subMembers['+(this.subMembers.length-1)+']') this.renderLayDate(f) } let elements = document.getElementsByClassName('subFreeInputTooltip'+(this.subMembers.length-1)) for(ele of elements){ new bootstrap.Tooltip(ele) } let subAutoRenewEle = document.getElementById('subMemberAutoRenew'+(this.subMembers.length-1)) if(subAutoRenewEle){ let tooltip = new bootstrap.Tooltip(subAutoRenewEle) if(this.formData.autoRenew){ tooltip.disable() } this.formData.subMembers[this.subMembers.length-1].autoRenewTooltip = tooltip } }) } appMethods.removeSubMember = function (idx) { this.subMembers.splice(idx, 1) this.formData.subMembers.splice(idx, 1) this.subInstallmentDes.splice(idx, 1) // rearrangement invalidField for (let key in this.invalidField) { if (key.startsWith("subMembers")) { let n = parseInt(key.substr(key.indexOf('[') + 1, key.indexOf(']'))) if (n === this.subMembers.length) { this.invalidField[key.replace('[' + n + ']', '[' + (this.subMembers.length) + ']')] = null } else if (n > idx) { this.invalidField[key.replace('[' + n + ']', '[' + (n - 1) + ']')] = this.invalidField[key] } } } let selectedContacts = this.selectedContactList[idx]; this.selectedContactList.splice(idx,1) this.$nextTick(function(){ if(selectedContacts.size>0){ for(let df of this.dateFields){ let f = JSON.parse(JSON.stringify(df)) if (!f.fieldName.startsWith("subMembers[index].")) { continue } f.fieldName = f.fieldName.replace('subMembers[index]','subMembers['+(idx)+']') this.renderLayDate(f) } } }) } appMethods.getSubMemberName = function (index) { let contactSize = this.selectedContactList[index].size if(contactSize>0){ return contactSize + ' Contact'+(contactSize>1?'s':'') } let name=[] if(this.formData.subMembers[index].account.name.firstName){ name.push(this.formData.subMembers[index].account.name.firstName) } if(this.formData.subMembers[index].account.name.lastName){ name.push(this.formData.subMembers[index].account.name.lastName) } return name.join(' ') } appMethods.toggleSubMember = function (idx) { this.subMembers[idx] = !this.subMembers[idx] } appMethods.onSubFreeInputBlur = function (index, termId, event) { this.formData.subMembers[index].cost = event.target.value this.formData.subMembers[index]['freeCost' + termId] = event.target.value } appMethods.selectSubTerm = function (index, termId, subCost, isLife, termObj) { this.formData.subMembers[index].termId=termId this.formData.subMembers[index].cost=subCost this.formData.subMembers[index].originalCost=subCost this.formData.subMembers[index].isLife = isLife if(this.formData.subMembers[index]['freeCost'+termId]!==undefined) { this.formData.subMembers[index].cost = this.formData.subMembers[index]['freeCost' + termId] } //DEV-15499 this.autoRenewHidden = true this.subInstallmentDes[index] = '' this.hideOrShowPayment(!this.formData.autoRenew) if(isLife){ this.formData.subMembers[index].autoRenew=false this.$nextTick(function (){ if(!document.getElementById('subMembers['+index+'].autoRenew').classList.contains('readonly')){ document.getElementById('subMembers['+index+'].autoRenew').classList.add('readonly') } }) }else if(termObj.termType === 'INSTALLMENT'){ this.formData.subMembers[index].autoRenew = false this.autoRenewHidden = true let months = termObj.term.unit.name === 'MONTH' ? termObj.term.howLong : termObj.term.howLong * 12 months += Number(months) > 1 ? ' Months.' : ' Month.' let fee = subCost === 0 ? 'Free' : this.formatAmount(subCost) this.subInstallmentDes[index] = 'This membership level is paid in monthly installments of '+ fee +' for '+ months this.hideOrShowPayment(false) } else if(this.term.termType === 'INSTALLMENT'){ this.formData.subMembers[index].autoRenew = false this.autoRenewHidden = true } else { this.formData.subMembers[index].autoRenew=this.formData.autoRenew===true this.$nextTick(function () { if(this.term.forceAutoRenew || !this.formData.autoRenew) { if (!document.getElementById('subMembers[' + index + '].autoRenew').classList.contains('readonly')) { document.getElementById('subMembers[' + index + '].autoRenew').classList.add('readonly') } }else{ if (document.getElementById('subMembers[' + index + '].autoRenew').classList.contains('readonly')) { document.getElementById('subMembers[' + index + '].autoRenew').classList.remove('readonly') } } }) } } appMethods.showSubCostInvalidMessage = function (index) { console.log(this.formData) if (this.formData.subMembers[index].termId === undefined || this.formData.subMembers[index].termId === '' || this.formData.subMembers[index].termId === 'null') { return false } if (this.formData.subMembers[index].cost==='') { this.formData.subMembers[index].membershipCostInvalidMessage = this.membershipCostInvalidMessageSmall return true } if(parseInt(this.formData.subMembers[index].cost)>999999999999.99){ this.formData.subMembers[index].membershipCostInvalidMessage = this.membershipCostInvalidMessageBig }else{ this.formData.subMembers[index].membershipCostInvalidMessage = this.membershipCostInvalidMessageSmall } return isNaN(parseFloat(this.formData.subMembers[index].cost)) || parseFloat(this.formData.subMembers[index].cost)<parseFloat(this.formData.subMembers[index].originalCost) || parseInt(this.formData.subMembers[index].cost)>999999999999.99 } // =========== end Sub Membership ============== // =========== Contacts ======================== appWatch.searchContactKey = function(key){ if(key.trim() === ''){ this.currentSearchContactList = this.currentContactList return } key = key.trim().toUpperCase().replaceAll(' ',' ') this.currentSearchContactList = [] for(let contact of this.currentContactList){ if(contact.contactName.toUpperCase().replaceAll(' ',' ').indexOf(key)>-1){ this.currentSearchContactList.push(contact) } } } appMethods.openContactsModal = function (index) { this.filterContactList(index) let contactsListModal = bootstrap.Modal.getInstance(document.getElementById('contactsListModal')) contactsListModal.show() } appMethods.selectAllContacts = function(){ for(let e of this.currentSearchContactList){ this.currentSelectedContactList.add(e) } } appMethods.clearSelectedContact = function(){ this.currentSelectedContactList.clear() } appComputed.contactsSelectionStatus = function(){ if(this.currentSelectedContactList.size === 0){ return 'none' } if(this.currentSelectedContactList.size === this.currentContactList.length){ return 'all' } return 'part' } appMethods.contactSelected = function(contact){ return this.currentSelectedContactList.has(contact) } appMethods.contactSelectedClass = function(contact){ return {'selected': this.contactSelected(contact)} } appMethods.clickContact = function (e,contact){ if(e.target.checked){ this.currentSelectedContactList.add(contact) }else{ // Remove selected this.currentSelectedContactList.delete(contact) } } appMethods.addContacts = function(){ // Add to contact list this.selectedContactList[this.currentSubmemberIdx]=new Set() for(let e of this.currentSelectedContactList){ this.selectedContactList[this.currentSubmemberIdx].add(e) } let achConfirmModal = bootstrap.Modal.getInstance(document.getElementById('contactsListModal')) achConfirmModal.hide() } appComputed.selectContactCount = function(){ let count =0 for(let sc of this.selectedContactList){ if(sc.size==0){ count ++ }else{ count = count + sc.size } } return count } appComputed.exceedMaxSubMemberAllowed = function(){ if(this.selectedContactList[this.currentSubmemberIdx]===undefined || this.selectedContactList[this.currentSubmemberIdx].size===0){ return this.currentSelectedContactList.size + (this.selectContactCount-1) > this.term.subMemberAllowed }else{ return this.currentSelectedContactList.size + (this.selectContactCount-this.selectedContactList[this.currentSubmemberIdx].size) > this.term.subMemberAllowed } } appMethods.filterContactList = function(index){ this.searchContactKey = '' this.currentSubmemberIdx = index this.currentContactList = [] this.currentSelectedContactList.clear() // filter selected contact let unSelectedContactList = [] for(let contact of this.contactList){ let found = false this.selectedContactList.forEach((selectedContacts, i) => { if(i===index){ for(let e of selectedContacts){ this.currentSelectedContactList.add(e) } return } for(let e of selectedContacts){ if(contact.contactId===e.contactId){ found = true return } } }) if(!found && contact.deceased!==true) { unSelectedContactList.push(contact) } } for(let contact of unSelectedContactList){ if(!this.term.availableToCurrentEmployees || (this.term.availableToCurrentEmployees && contact.currentEmployer)){ this.currentContactList.push(contact) } } this.currentSearchContactList = this.currentContactList } appWatch.subMembershipTerms = function(val){ for(let index=0; index<this.subMembers.length; index++){ this.initSubFreeInput(index) } } // ========== End Contacts ====================== // ==============Donation amount method================= appData.initMethods.push(function(){ if(this.pageNumberMapping.addOnPageNumber) { this.formData.donationChecked = false } }) appComputed.donationChecked = function () { return this.formData.donationChecked } appWatch.donationChecked = function(val) { let checked = JSON.parse(val) this.forwardButtons[this.pageNumberMapping.addOnPageNumber] = checked? this.originalForwardButtons[0] : 'Skip' // this.pageTitles[this.pageNumberMapping.addOnPageNumber] = this.addOnPageTitle + ' (Donation)' if(!checked){ this.invalidField['donationAmount']=null this.donationOtherAmountSelected = false this.hiddenFields.push(...this.addonCustomFields) this.hideOrShowPayment(true) } else { for(let field of this.addonCustomFields){ this.hiddenFields = this.hiddenFields.filter(fieldName => field !== fieldName) } if(this.selectedFrequency !== 'donationOnce') { this.hideOrShowPayment(false) this.recurringUnitTextBuild(this.selectedFrequency) } } this.initDonationAmountSelected() } appMethods.showDonationAmountInvalidMessage = function () { return false } appMethods.isSkipSubMemberPage = function() { return !this.term.hasSubMembers || !this.canAddSubMember } // ============== end Donation amount method================= appMethods.nextPage = function () { // validate if (this.currentPage - 1 === this.pageNumberMapping.membershipLevelsPageNumber) { if (this.showCostInvalidMessage()) { return } }else if(this.currentPage - 1 === this.pageNumberMapping.subMemberPageNumber){ for(let index in this.subMembers){ if(this.showSubCostInvalidMessage(index)){ this.subMembers[index] = true return } } } if (this.validatePage(this.currentPage)) { if(this.currentPage-1 === this.pageNumberMapping.summaryPageNumber){ this.clearDiscountCode() if(this.totalAmount === 0.0) { // submit directly when total is 0 this.submitWhenTotalIs0() return }else{ // If the next page is payment page if(this.checkWithoutPayment()){ return } this.forwardButtons[this.currentPage - 1] = 'Processing...' this.preparePayment() return } }else if (this.currentPage === this.pageNumberMapping.summaryPageNumber) { // ajax calc this.nextToSummary(1) return } else if (this.currentPage - 1 === this.pageNumberMapping.membershipLevelsPageNumber) { // terms if (!this.isSkipSubMemberPage()) { if (this.forwardButtons[this.currentPage - 1] === 'Processing...') { return } this.forwardButtons[this.currentPage - 1] = 'Processing...' this.retrieveSubTerms() return } } if (this.isSkipSubMemberPage() && this.currentPage === this.pageNumberMapping.subMemberPageNumber) { if(this.currentPage+1 === this.pageNumberMapping.summaryPageNumber){ this.nextToSummary(2) }else{ this.currentPage = this.currentPage + 2 } } else { this.currentPage = this.currentPage + 1 } } else { if (this.currentPage - 1 === this.pageNumberMapping.subMemberPageNumber) { // extends error sub section for (let fieldName in this.invalidField) { if (fieldName.startsWith("subMembers") && this.invalidField[fieldName]!==null && this.invalidField[fieldName].length>0) { let n = parseInt(fieldName.substr(fieldName.indexOf('[') + 1, fieldName.indexOf(']'))) this.subMembers[n] = true } } } } } appMethods.onSubmitError = function(message){ this.forwardButtons[this.pageNumberMapping.summaryPageNumber] = this.submitText // last page do not alert if(this.currentPage !== this.pageNumberMapping.summaryPageNumber+2) { alert(message) } } appMethods.submitWhenTotalIs0 = function() { if(this.previewMode){ alert('Preview Mode') return } if(!this.validateBeforeSubmit()){ return } this.errors = [] this.invalidField = {} let oldPrepareSendToServer = this.prepareSendToServer this.prepareSendToServer = function(neonFormData){ delete neonFormData.payment this.sendToServer(neonFormData) this.prepareSendToServer = oldPrepareSendToServer } this.forwardButtons[this.pageNumberMapping.summaryPageNumber] = 'Processing...' if(this.googleReCaptchaEnabled || this.googleReCaptchaEnabled0){ this.validateReCaptcha() if(this.isEnableVisibleReCaptcha && !this.isReCaptchaPassed && this.totalAmount === 0.0){ alert("reCAPTCHA verification failed.") this.forwardButtons[this.pageNumberMapping.summaryPageNumber] = this.submitText } }else{ this.submitting = true let neonFormData = this.getNeonFormJson() delete neonFormData.payment this.sendToServer(neonFormData) } } appMethods.nextToSummary = function(stepNumber) { if (this.forwardButtons[this.currentPage - 1] === 'Processing...') { return } let oldBtnText = this.forwardButtons[this.currentPage - 1] this.forwardButtons[this.currentPage - 1] = 'Processing...' this.calcSummary(response => { this.forwardButtons[this.currentPage - 1] = oldBtnText // next this.currentPage = this.currentPage + stepNumber }, error => { this.forwardButtons[this.currentPage - 1] = oldBtnText }) } appMethods.previousPage = function () { if (this.isSkipSubMemberPage() && this.currentPage - 2 === this.pageNumberMapping.subMemberPageNumber) { this.clearDiscountCode() this.currentPage = this.currentPage - 2 } else if(this.currentPage -1 === this.pageNumberMapping.summaryPageNumber){ this.clearDiscountCode() this.currentPage = this.currentPage - 1 }else { this.currentPage = this.currentPage - 1 } } appMethods.onDiscountCodeInputBlur = function() { delete this.invalidField.discountCode } appMethods.clearDiscountCode = function() { if(!this.discountCodeAdded){ delete this.invalidField.discountCode this.formData.discountCode = '' } } appMethods.editMembershipLevel = function () { this.currentPage = this.pageNumberMapping.membershipLevelsPageNumber + 1 } appMethods.editDonation = function () { this.currentPage = this.pageNumberMapping.addOnPageNumber + 1 } appMethods.applyDiscount = function () { this.calcSummary(response => { this.discountCodeAdded = true delete this.invalidField.discountCode }) } appMethods.cancelDiscount = function () { this.formData.discountCode = '' this.$nextTick(function () { this.calcSummary(response => { this.discountCodeAdded = false }) }) } appMethods.retrieveSubTerms = function () { if(this.formData.termId===undefined){ this.forwardButtons[this.currentPage - 1] = this.originalForwardButtons[0] return } axios.get('/nx/portal/membership-form/sub-terms/' + this.formData.termId).then(response => { this.subMembershipTerms = response.data this.term.hasSubMembers = this.subMembershipTerms!=null && this.subMembershipTerms.length>0 if(this.subMemberChecked) { if(this.subMembers.length === 0) { this.forwardButtons[this.pageNumberMapping.subMemberPageNumber] = this.originalForwardButtons[0] this.addSubMember() } if(!this.term.hasSubMembers) { this.subMemberChecked = false this.subMembers = [] this.subInstallmentDes = [] this.currentSubmemberIdx = 0 this.selectedContactList = [] } if(this.subMembershipTerms.length===1) { this.selectSubTerm(this.subMembers.length-1,this.subMembershipTerms[0].id,this.subMembershipTerms[0].cost,this.subMembershipTerms[0].term.unit.name==='LIFE', this.subMembershipTerms[0]) } } this.forwardButtons[this.currentPage - 1] = this.originalForwardButtons[0] // next this.currentPage = this.currentPage + 1 }).catch(error => { this.forwardButtons[this.currentPage - 1] = this.originalForwardButtons[0] if (error.response.data) { alert(error.response.data[0].message) } }) } appMethods.calcSummary = function (onSuccess, onError) { axios.post('/nx/portal/membership-form/calculation', this.getNeonFormJson()).then(response => { console.info(response) this.orderSummary = response.data if(this.totalAmount===0.0){ this.forwardButtons[this.pageNumberMapping.summaryPageNumber] = this.submitText }else{ this.forwardButtons[this.pageNumberMapping.summaryPageNumber] = this.originalForwardButtons[0] } onSuccess(response) }).catch(error => { if (onError) { onError(error) } if (error.response.data) { let fields = {} let globalError = '' error.response.data.forEach(function (e) { if (e.type === 'GLOBAL') { globalError = e.message } else { if (fields[e.field] === undefined) { fields[e.field] = [] } fields[e.field].push(e.message) } }) this.invalidField = fields if (globalError == '' && Object.keys(this.invalidField).length > 0) { globalError = 'Some field is invalid, please check the form' } if(!this.invalidField['discountCode']) { alert(globalError) } } console.error(error.response) }) } appMethods.preparePayment = function (){ let isGateWayNone = false if(isGateWayNone){ this.currentPage = this.currentPage + 1 this.forwardButtons[this.currentPage - 2] = this.originalForwardButtons[0] return } let hasDonorCoveredFee = true axios.post('/nx/portal/membership-form/payment-preparation', this.getNeonFormJson()).then(response => { let paymentPreparation = response.data if(typeof(NeonPayCC)!=='undefined' && NeonPayCC) { NeonPayCC.merchant = paymentPreparation.neonPayMerchantId } if (typeof(hasGooglePay)!=='undefined' && hasGooglePay) { NeonPayGoogle.merchant = paymentPreparation.neonPayMerchantId } if (typeof(hasApplePay)!=='undefined' && hasApplePay) { NeonPayApple.merchant = paymentPreparation.neonPayMerchantId } if(hasDonorCoveredFee) { this.donorCoveredFeeEnabled = paymentPreparation.showDonorCoveredFee if (this.donorCoveredFeeEnabled) { if (paymentPreparation.neonPayMerchantFeeSetting) { this.ccPercentageFee = paymentPreparation.neonPayMerchantFeeSetting.ccFeeSetting.percentageFee this.ccFixedFee = paymentPreparation.neonPayMerchantFeeSetting.ccFeeSetting.fixedFee this.ccAePercentageFee = paymentPreparation.neonPayMerchantFeeSetting.ccAeFeeSetting.percentageFee this.ccAeFxiedFee = paymentPreparation.neonPayMerchantFeeSetting.ccAeFeeSetting.fixedFee this.ccMdPercentageFee = paymentPreparation.neonPayMerchantFeeSetting.ccMdFeeSetting.percentageFee this.ccMdFxiedFee = paymentPreparation.neonPayMerchantFeeSetting.ccMdFeeSetting.fixedFee } this.cardDonorCoveredFeeOpt = true this.achDonorCoveredFeeOpt = true }else{ this.cardDonorCoveredFeeOpt = false this.achDonorCoveredFeeOpt = false } } this.forwardButtons[this.currentPage - 1] = this.originalForwardButtons[0] // next this.currentPage = this.currentPage + 1 }).catch(error => { this.forwardButtons[this.currentPage - 1] = this.originalForwardButtons[0] console.error(error.response) if (error.response.data) { alert(error.response.data[0].message) } }) } appComputed.paymentAmount = function () { if(this.orderSummary && this.orderSummary.total){ return this.orderSummary.total } return 0.0 } appComputed.totalAmount = function () { if(this.paymentAmount===0.0){ return this.paymentAmount } if (this.cardDonorCoveredFeeOpt && this.paymentType === 'CARD' && this.cardDonorCoveredFee) { return addAmountAndDonorCoveredFee(this.orderSummary.total, this.cardDonorCoveredFee) } else if (this.achDonorCoveredFeeOpt && this.paymentType === 'ACH' && this.achDonorCoveredFee) { return addAmountAndDonorCoveredFee(this.orderSummary.total, this.achDonorCoveredFee) } return this.orderSummary.total } appComputed.amexTotalAmount = function () { if(this.paymentAmount===0.0){ return this.paymentAmount } return addAmountAndDonorCoveredFee(this.orderSummary.total, this.amexCardDonorCoveredFee) } appWatch.totalAmount = function (val) { if(typeof hasGooglePay!=='undefined') { if (googlepay) { console.info('set googlepay price '+val) googlepay.setPrice(parseFloat(val).toFixed(2)) }else{ console.warn('googlepay not ready or dev not available') } } if(typeof hasApplePay!=='undefined') { if (applepay) { console.info('set applepay price '+val) applepay.setPrice(parseFloat(val).toFixed(2)) }else{ console.warn('applepay not ready or dev not available') } } } appMethods.amountBrClass = function () { return this.isMultiPage && ((!this.formData.autoRenew && this.totalAmount > 99999) || (this.formData.autoRenew && this.totalAmount > 999999)) } appMethods.formatFreeCost = function(cost){ return this.formatAmountWithoutCurrency(cost).replaceAll(',','') } appMethods.formatAutoRenewAmount = function (cost) { let formatCost = cost==0?'Free':this.formatAmount(cost) // if(formatCost.endsWith('.00')){ // return formatCost.substr(0,formatCost.indexOf('.')) // } return formatCost } /** * add-on methods */ appMethods.donationFrequencyChecked = function (value){ if('options' === value) { let list = [] for(let i = 0; i < list.length; i++) { if(list[i].value === this.selectedFrequency){ return true } } return false } else { return this.selectedFrequency === value } } appMethods.handleFrequencyLabel = function (intervalCode, labelName) { const intervals = ['2w', '2m', '6m'] let isTooLongInterval = intervals.filter(item => item === intervalCode).length === 1 // chose 981 instead of 991, because there may be a scrollbar and width would be shorter if (document.documentElement.clientWidth < 981 && isTooLongInterval) { return labelName.replace('Donate ', '') } else { return labelName } } appMethods.changeDonationFrequency = function (frequency) { this.selectedFrequency = frequency this.initDonationAmountSelected() let flag if (frequency === 'donationOnce') { this.donationOnceChecked = true this.donationAmount = this.donationOnceAmount flag = true } else { this.donationOnceChecked = false this.donationAmount = this.donationRecurringAmount flag = false this.recurringUnitTextBuild(frequency) } if(this.donationChecked) { this.hideOrShowPayment(flag) } this.invalidField['amount'] = null } appMethods.recurringUnitTextBuild = function(val){ let options = [] for(let i = 0; i < options.length; i++) { let option = options[i] if(option.value == val){ this.recurringUnitText = option.description? option.description : option.name break; } } } appMethods.donationFrequencySelectOption = function (opt) { this.changeDonationFrequency(this.optionSelectedModel) } appMethods.changeDonationAmount=function(amount,isOnce){ this.donationAmount = amount if(isOnce){ this.donationOnceAmount = amount }else{ this.donationRecurringAmount = amount } this.changeOtherSelected(isOnce) this.formData.donationChecked = true } appMethods.changeOtherSelected=function(isOnce){ if (isOnce) { if(this.donationAmount===''){ this.donationOnceOtherSelected = true }else{ this.donationOnceOtherSelected = false } }else{ if(this.donationAmount===''){ this.donationRecurringOtherSelected = true } else { this.donationRecurringOtherSelected = false } } } appMethods.initDonationAmountSelected=function(){ let frequency = this.selectedFrequency === 'donationOnce' ? 'donationOnce' : 'recurring' this.$nextTick(function(){ let btnCheckList = document.getElementById('donation-amount-container').getElementsByClassName('btn-check-' + frequency) let btnNameList = document.getElementById('donation-amount-container').getElementsByClassName('btn-label-' + frequency) if(this.formData.donationChecked){ let hasChecked = false for(let btnCheck of btnCheckList){ if(btnCheck.checked){ hasChecked = true break } } if(!hasChecked) { if (btnNameList && btnNameList.length > 0) { btnNameList[0].click() } else { if(frequency === 'donationOnce') { this.donationOnceOtherSelected = btnNameList && btnNameList.length > 0 ? false : true } else { this.donationRecurringOtherSelected = btnNameList && btnNameList.length > 0 ? false : true } } } }else{ for(let btnCheck of btnCheckList){ btnCheck.checked = false } if(frequency === 'donationOnce') { this.donationOnceOtherSelected = btnNameList && btnNameList.length > 0 ? false : true } else { this.donationRecurringOtherSelected = btnNameList && btnNameList.length > 0 ? false : true } } }) } appMethods.otherAmountFocus = function() { this.formData.donationChecked = true } appComputed.donationOtherAmountSelected = function () { if (this.donationOnceChecked) { return this.donationOnceOtherSelected } else { return this.donationRecurringOtherSelected } } </script> <script> appData.initMethods.push(function(){ this.$nextTick(function (){ new bootstrap.Modal(document.getElementById('achConfirmModal')) }) }) appMethods.hideAchNumber=function (value){ if(!value){ return '' } return '**********' + value.substr(value.length-4) } appMethods.cancelModal = function() { let achConfirmModal = bootstrap.Modal.getInstance(document.getElementById('achConfirmModal')) achConfirmModal.hide() app.$data.submitting = false } </script> <script src="https://cdn.app.neononepay.com/3.0/neonpay.js"></script> <script src="/nx/portal-static/js/neonpay/neonpay-states.js"></script> <script src="/np/publicaccess/countryInfos.do"></script> <script> appData.payWithApplePay=false appData.payWithGooglePay=false appData.payingWithAppleOrGooglePay=false appData.neonPayEnable = true appMethods.prepareSendToServer=function(formData, ach) { this.payWithApplePay=false this.payWithGooglePay=false let fun = this.sendToServer if (this.paymentType === 'CARD') { if (window.createNeonPayCcToken) { fun = createNeonPayCcToken } } else if (this.paymentType === 'ACH') { if (window.createNeonPayAchToken && ach === undefined) { fun = createNeonPayAchToken } else if(ach) { let achConfirmModal = bootstrap.Modal.getInstance(document.getElementById('achConfirmModal')) achConfirmModal.hide() let achFormData = app.$data.formData.payment.ach formData.payment.ach.routingNumber = '' formData.payment.ach.accountNumber = '' formData.payment.ach.holderFirstName = achFormData.holderFirstName formData.payment.ach.holderLastName = achFormData.holderLastName formData.payment.ach.holderEmail = achFormData.holderEmail formData.payment.ach.accountType = achFormData.accountType formData.payment.ach.token = achFormData.token } } fun(formData) } appMethods.switchNeonPayMerchant = function (key) { if(this.neonPayMerchantMap === null || this.neonPayMerchantMap === undefined || this.neonPayMerchantMap.length===0){ return } let isNeonPay = true if (!isNeonPay) { return } let ccDonorCoveredFeeEnabled = true if (key === '') { key = 'default' } if (this.neonPayMerchantMap[key]) { let curMerchantId = this.neonPayMerchantMap[key].merchantId if(NeonPayCC) { NeonPayCC.merchant = curMerchantId } if (hasGooglePay) { NeonPayGoogle.merchant = curMerchantId } if (hasApplePay) { NeonPayApple.merchant = curMerchantId } if (ccDonorCoveredFeeEnabled) { this.ccPercentageFee = this.neonPayMerchantMap[key].ccFeeSetting.percentageFee this.ccFixedFee = this.neonPayMerchantMap[key].ccFeeSetting.fixedFee this.ccAePercentageFee = this.neonPayMerchantMap[key].ccAeFeeSetting.percentageFee this.ccAeFxiedFee = this.neonPayMerchantMap[key].ccAeFeeSetting.fixedFee this.ccMdPercentageFee = this.neonPayMerchantMap[key].ccMdFeeSetting.percentageFee this.ccMdFxiedFee = this.neonPayMerchantMap[key].ccMdFeeSetting.fixedFee } } } async function mountField(neonpay, field, container){ const result = await neonpay.canMakePayments(); if(result){ field.mount(container) }else{ console.log(result) } } </script> <script> const neonPayCcFieldMap = { first_name: 'payment.card.holderFirstName', last_name: 'payment.card.holderLastName', email: 'payment.card.holderEmail', address_line_1: 'payment.card.address.line1.line1', address_line_2: 'payment.card.address.line2', address_city: 'payment.card.address.city', address_state: 'payment.card.address.stateOrProvince', address_zip: 'payment.card.address.zipCode', address_country: 'payment.card.address.country' } appData.isNeonPay = true let NeonPayCC let neonPayCard appData.initMethods.push(function () { this.$nextTick(function () { NeonPayCC = createNeonPay(true) neonPayCard = NeonPayCC.createField('card', { hidePostalCode: true, hideBorders: true }) neonPayCard.on('cardbrand', function (event) { app.$data.cardType = event.brand }) mountField(NeonPayCC, neonPayCard, '#payment-card-container') }) }) function createNeonPayCcToken(formData) { let cardFormData = app.$data.formData.payment.card const neonPayCardData = { first_name: cardFormData.holderFirstName, last_name: cardFormData.holderLastName, email: cardFormData.holderEmail, address_line_1: cardFormData.address.line1.line1, address_line_2: cardFormData.address.line2, address_city: cardFormData.address.city, address_state: cardFormData.address.stateOrProvince, address_zip: cardFormData.address.zipCode, address_country: cardFormData.address.country } if (neonPayCardData.address_country != null) { neonPayCardData.address_country = window.countryInfos[neonPayCardData.address_country] } if (!isNeonPaySupportedState(neonPayCardData.address_state)) { neonPayCardData.address_state = null } NeonPayCC.createToken(neonPayCard, neonPayCardData).then(onPayTokenReturned, function (result) { let invalidField = {} for (let r in result) { if (result[r].message) { let fieldName = neonPayCcFieldMap[r] if (!fieldName) { fieldName = 'payment-card-container' } if (invalidField[fieldName] == undefined) { invalidField[fieldName] = [] } invalidField[fieldName].push(result[r].message) if (fieldName.startsWith('payment.card.address')) { app.$data.sameAsBillingAddress = false } } } app.$data.invalidField = invalidField app.$data.submitting = false }) } // ApplePay & Google Pay const hasGooglePay = true const hasApplePay = true appData.googlepayIncompatible = !hasGooglePay appData.applepayIncompatible = !hasApplePay appData.googleAndApplePayIncompatible = appData.googlepayIncompatible && appData.applepayIncompatible appData.showCardFields = false let NeonPayGoogle = null let NeonPayApple = null let googlepay = null let applepay =null if (hasGooglePay) { NeonPayGoogle = createNeonPay() googlepay = NeonPayGoogle.createField('googlepay',{buttonSizeMode:'fill', price:'0.00'}) googlepay.on('googlepayReady', function () { console.log('googlepayReady') }) googlepay.on('googlepayButtonReady', function () { console.log('googlepayButtonReady') if(app && app.totalAmount>0) { console.info('ready, set googlepay price '+app.totalAmount) // Make sure the price setting is correct googlepay.setPrice(parseFloat(app.totalAmount).toFixed(2)) } let paymentGoogleContainer = document.getElementById('payment-google-container') if(paymentGoogleContainer){ paymentGoogleContainer.style.display = appData.isMultiPage ? 'block' : 'inline'; } }) googlepay.on('googlepayButtonClick', function () { console.log('googlepayButtonClick') appData.payWithGooglePay=true }) googlepay.on('googlepayIncompatible',function(){ console.log('googlepayIncompatible') appData.googlepayIncompatible=true processGoogleAndApplePayIncompatible() }) googlepay.on('googlepayAuthorized', function () { console.log('googlepayAuthorized') onPayAuthorized(NeonPayGoogle,googlepay) }) appData.initMethods.push(function () { this.$nextTick(function () { mountField(NeonPayGoogle, googlepay, '#payment-google-container') }) }) } if (hasApplePay) { NeonPayApple = createNeonPay() applepay = NeonPayApple.createField('applepay', { buttonSizeMode:'fill', price:'0.00', label: appData.itemName, storeName: "Free Law Project".replace(new RegExp('\\||/|\\\\','gm'),"") }) applepay.on('applepayButtonClick', function () { console.log('applepayButtonClick') appData.payWithApplePay=true }) applepay.on('applepayIncompatible', function (){ console.log('applepayIncompatible') appData.applepayIncompatible=true processGoogleAndApplePayIncompatible() }) applepay.on('applepayAuthorized', function () { console.log('applepayAuthorized') onPayAuthorized(NeonPayApple,applepay) }) appData.initMethods.push(function () { this.$nextTick(function () { mountField(NeonPayApple, applepay, '#payment-apple-container') }) }) } function processGoogleAndApplePayIncompatible(){ if(appData.googlepayIncompatible && appData.applepayIncompatible){ appData.googleAndApplePayIncompatible = true app.showCardFields = true } } function createNeonPay(swipe){ let publicKey="public_0ed09e4e40d71a17b04f69e3e593fea7055a3d884270adf36d4f3b36" let merchant = "7493" if(swipe){ return new NeonPay(publicKey, merchant, {swipe: false}) }else{ return new NeonPay(publicKey, merchant) } } function onPayAuthorized(NeonPayInstance,neonPayField) { if (app.previewMode) { return } // validate on one-page app.payingWithAppleOrGooglePay = true if (!app.validateBeforeSubmit()) { app.payingWithAppleOrGooglePay = false return } // validate google ReCaptcha let validated = false if (app.googleReCaptchaEnabled) { if (window.grecaptcha && !app.isEnableVisibleReCaptcha) { console.log('execute google captcha') // switch google captcha call back function window.ReCaptchaLoaded = function ($token) { console.log('google captcha call back') app.recaptchaResponse = $token if (window.grecaptcha) { window.grecaptcha.reset() } app.payingWithAppleOrGooglePay = false window.ReCaptchaLoaded = app.reCaptchaCallback app.submitting = true NeonPayInstance.createToken(neonPayField, {}).then(onPayTokenReturned,onPayError) } this.recaptchaResponse = null window.grecaptcha.execute() } else { validated = true } } else { validated = true } app.payingWithAppleOrGooglePay = false if (validated) { app.submitting = true NeonPayInstance.createToken(neonPayField, {}).then(onPayTokenReturned,onPayError) } } function onPayError(result){ console.log("ApplePay or GooglePay get token error") console.log(result) app.submitting = false for (let r in result) { if (result[r].message) { alert(result[r].message) } } } function onPayTokenReturned(result) { //callback methods to handle result.error or result.token console.log(result) if (result.token) { let formData = app.getNeonFormJson() formData.payment.card.token = result.token app.sendToServer(formData) } } </script> <script> const neonPayAchFieldMap ={ routing_number: 'payment.ach.routingNumber', account_number: 'payment.ach.accountNumber', account_holder_first_name: 'payment.ach.holderFirstName', account_holder_last_name: 'payment.ach.holderLastName', email: 'payment.ach.holderEmail', account_type:'payment.ach.accountType' } const keyIdMap ={ account_holder_first_name: 'payframe-account_holder_first_name-', account_holder_last_name: 'payframe-account_holder_last_name-', email: 'payframe-email-', account_number: 'payframe-account_number-', routing_number: 'payframe-routing_number-', account_type:'payframe-account_type-' } const NeonPayACH = new NeonPay("public_0ed09e4e40d71a17b04f69e3e593fea7055a3d884270adf36d4f3b36", "7493") let NeonPayAchField; let isStrip; //DEV-15763 appData.initMethods.push(function () { isStrip = false this.$nextTick(function () { NeonPayAchField = NeonPayACH.createField('bankaccount', {}) mountField(NeonPayACH, NeonPayAchField, '#achPay-container') NeonPayAchField.on('ready', function(e) { if(isStrip) { let _parent = document.querySelector('[class^="NeonPay__field external_ach_token-"]') let _parent2 = document.querySelector('[class^="NeonPay__field ach_mandate-"]') if(_parent) { _parent.children[1].className = 'neonfront-btn-primary' } if(_parent2) { _parent2.children[2].className = 'neonfront-btn-primary' } } }) }) }) function createNeonPayAchToken(formData) { processAchData() NeonPayACH.createToken(NeonPayAchField).then(function(result) { //callback methods to handle result.error or result.token console.log(result) if (result.token) { app.$data.formData.payment.ach.token=result.token //DEV-15763 if(isStrip) { app.$data.formData.payment.ach.routingNumber = result.routing app.$data.formData.payment.ach.accountNumber = result.number if(result.method) { app.$data.formData.payment.ach.accountType = result.method.indexOf('Checking') > -1 ? 2 : 1 } } // app.sendToServer(formData) let achConfirmModal = bootstrap.Modal.getInstance(document.getElementById('achConfirmModal')) achConfirmModal.show() } },function(result){ let invalidField = {} processFocusError(result) for (let r in result) { if (result[r].message) { let fieldName = neonPayAchFieldMap[r] if(!fieldName){ continue } if(invalidField[fieldName]==undefined){ invalidField[fieldName] = [] } invalidField[fieldName].push(result[r].message) } } app.$data.invalidField=invalidField app.$data.submitting = false }) } function processAchData() { let res = app.$data.formData.payment.ach let l1 = document.querySelectorAll('[id^=payframe-account_holder_first_name-]'); if(l1 && l1.length > 0) { res.holderFirstName = l1[0].value } let l2 = document.querySelectorAll('[id^=payframe-account_holder_last_name-]') if(l2 && l2.length > 0) { res.holderLastName = l2[0].value } let l3 = document.querySelectorAll('[id^=payframe-email-]') if(l3 && l3.length > 0) { res.holderEmail = l3[0].value } let l4 = document.querySelectorAll('[id^=payframe-account_type-]') if(l4 && l4.length > 0) { let temp = l4[0].value res.accountType = temp.indexOf('checking') > -1 ? 2 : 1 } let l5 = document.querySelectorAll('[id^=payframe-account_number-]') if(l5 && l5.length > 0) { res.accountNumber = l5[0].value } let l6 = document.querySelectorAll('[id^=payframe-routing_number-]') if(l6 && l6.length > 0) { res.routingNumber = l6[0].value } } function processFocusError(obj) { for(let item of Object.keys(keyIdMap)) { for (let key of Object.keys(obj)) { if(item === key) { let l1 = document.querySelectorAll('[id^='+keyIdMap[item]+']'); if(l1 && l1.length > 0) { l1[0].focus(); return } } } } } </script> <script src="/nx/portal-static/component/math/math.min.js"></script> <script src="/nx/portal-static/js/donor-covered-fee/calculation.js"></script> <script> appData.cardDonorCoveredFeeOpt = true appData.ccPercentageFee = 0.0319 appData.ccFixedFee = 0.35 appData.ccAePercentageFee = 0.0419 appData.ccAeFxiedFee = 0.35 appData.ccMdPercentageFee = 0.0329 appData.ccMdFxiedFee = 0.35 appData.formCurrencyCode = 'USD' appComputed.cardDonorCoveredFee = function () { if (this.cardType === 'amex') { return calcDonorCoveredFee(this.paymentAmount, this.ccAePercentageFee, this.ccAeFxiedFee) } else if (this.cardType === 'mastercard' || this.cardType === 'discover') { return calcDonorCoveredFee(this.paymentAmount, this.ccMdPercentageFee, this.ccMdFxiedFee) } else { return calcDonorCoveredFee(this.paymentAmount, this.ccPercentageFee, this.ccFixedFee) } } appComputed.amexCardDonorCoveredFee = function(){ if(!this.paymentAmount || isNaN(this.paymentAmount)){ return 0.00 } return calcDonorCoveredFee(this.paymentAmount, this.ccAePercentageFee, this.ccAeFxiedFee) } appComputed.mdCardDonorCoveredFee = function(){ if(!this.paymentAmount || isNaN(this.paymentAmount)){ return 0.00 } return calcDonorCoveredFee(this.paymentAmount, this.ccMdPercentageFee, this.ccMdFxiedFee) } appComputed.cardTotalAmountIncludeFeeList = function() { if(!this.paymentAmount || isNaN(this.paymentAmount)){ return 0.00 } let amexTotalAmount = addAmountAndDonorCoveredFee(this.paymentAmount, this.amexCardDonorCoveredFee) let mdTotalAmount = addAmountAndDonorCoveredFee(this.paymentAmount, this.mdCardDonorCoveredFee) return '(' + this.formatAmount(amexTotalAmount) + ' ' + this.formCurrencyCode + ' for AMEX cards / ' + this.formatAmount(mdTotalAmount) + ' ' + this.formCurrencyCode + ' for Mastercard or Discover cards)' } appComputed.cardDonorCoveredFeeDesc=function(){ if(isNaN(parseFloat(this.paymentAmount))){ return null } let desc = "I want to make an additional donation to cover online processing fees, so that my entire contribution goes to Free Law Project. (<<Fee Amount>>)" return desc.replace('<<Fee Amount>>', this.formatAmount(this.cardDonorCoveredFee)) } </script> <script> appData.achDonorCoveredFeeOpt = true appComputed.achDonorCoveredFee=function(){ return calcDonorCoveredFee(this.paymentAmount, 0.01, 1.0) } appComputed.achDonorCoveredFeeDesc=function(){ if(isNaN(parseFloat(this.paymentAmount))){ return null } let desc = "I want to make an additional donation to cover online processing fees, so that my entire contribution goes to Free Law Project. (<<Fee Amount>>)" return desc.replace('<<Fee Amount>>', this.formatAmount(this.achDonorCoveredFee)) } </script> <script> appData.recoverEmailInValid = false appData.loginHasError = false appData.loginErrorMessages = [] appData.loginModal = undefined appData.loginToast = undefined appData.popDomainUrl = undefined appData.initMethods.push(function () { this.$nextTick(() => { if (this.encourageLoginConfig.defaultShow && !this.isExitPage) { setTimeout(() => { this.showEncourageLogin() }, 1000) } let tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')) let tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { return new bootstrap.Tooltip(tooltipTriggerEl, {container: 'body'}) }) }) }) appMethods.showEncourageLogin = function () { if (this.loggedIn || this.previewMode) { return } if (!this.loginModal) { this.loginModal = new bootstrap.Modal(document.getElementById("encourageLoginModal"), { backdrop: this.requireLogin ? 'static' : true, keyboard: !this.requireLogin }) } if (this.loginToast) { this.loginToast.hide() } this.loginModal.show() } appMethods.openAuthWin = function (type) { console.log(type) let url = '/np/clients/' + this.orgId + '/snOpenAuthWin.do' let param = '?src=' + type + '&da=login&targetURL=' + window.location.href let size = 'width=750,height=450,top=230,left=370,toolbar=no' window.location.href =url + param } appMethods.toAccountHome = function () { window.location.href = '/np/constituent/accountHome.do?orgId=' + this.orgId } appMethods.sendRecoverAccountEmail = function () { this.recoverEmailInValid = false let emailInput = document.getElementById("forgot_email").value if (emailInput.trim().length === 0 || Validator.email.check(emailInput)) { this.recoverEmailInValid = true return } let params = { email: emailInput, redirectUrl: window.location.href, orgId: this.orgId } axios.post('/np/security/ajaxForgetPassword.do', Qs.stringify(params)).then(response => { document.getElementById("forgot_email").value = '' if (!this.loginToast) { this.loginToast = new bootstrap.Toast(document.getElementById("recover-success-alert"), {animation: true, autohide: false}) let myToastEl = document.getElementById('recover-success-alert') myToastEl.addEventListener('hidden.bs.toast', function () { document.getElementById("login-toast-container").style.zIndex = '0' }) } document.getElementById("login-toast-container").style.zIndex = '9' this.loginToast.show() }).catch(error => { console.error(error.response) alert('Sending email error: ' + JSON.stringify(error.response)) }) } appMethods.doLogin = function () { this.loginHasError = false this.loginErrorMessages = [] let name = document.getElementById("loginName").value.trim() let password = document.getElementById("loginPassword").value.trim() if (!name || !password) { this.loginErrorMessages.push('Login Name & Password is required') this.loginHasError = true return } let params = { loginName: name, loginPassword: password, orgId: this.orgId, ajaxLogin: true } axios.post('/np/security/encouragedSignIn.do', Qs.stringify(params)).then(response => { let result = response.data if (result.status === 'success') { if (result.succeedRedirectPath) { window.location.href = result.succeedRedirectPath.startsWith('https://') ? result.succeedRedirectPath : ('https://' + window.location.host + result.succeedRedirectPath) } else { window.location.reload() } } else { this.loginErrorMessages = result.errors this.loginHasError = true } }).catch(error => { console.error(error.response) alert('Login error: ' + JSON.stringify(error.response)) }) } </script> <script> const vueApp = Vue.createApp(appConfig) vueApp.config.errorHandler = function (err, vm, info) { if (handleVueJSError) { handleVueJSError(err, vm, info) } console.log(err) } vueApp.component('neon-fileupload', window.NeonFileupload) vueApp.component('neon-img-cutter', window.NeonImgCutter) const app = vueApp.mount('#app') </script> <script defer data-domain="donate.free.law" src="https://plausible.io/js/script.js"></script> </body> </html>