1function processDonation( formId ){ 2 3 // Normalize the form 4 normalizeForm( formId ); 5 disableFormSubmit( formId ); 6 7 // Is subscription? 8 var subscription = false; 9 if( jQuery( 'input#monthly' ).is(':checked') ){ 10 subscription = true; 11 } 12 // SEt default amount 13 var amount = 0; 14 var error_message = ''; 15 16 // Get the amount 17 if( !subscription ){ 18 jQuery('div.donation-one-time input:radio').each(function() { 19 if( jQuery( this ).is(':checked') ){ 20 amount = jQuery( this ).val(); 21 } 22 }); 23 if( !amount ){ 24 amount = jQuery( '#oneTimeCustomPrice' ).val(); 25 } 26 }else if( subscription ){ 27 jQuery('div.donation-subscription input:radio').each(function() { 28 if( jQuery( this ).is(':checked') ){ 29 amount = jQuery( this ).val(); 30 } 31 }); 32 if( !amount ){ 33 amount = jQuery( '#monthlyCustomPrice' ).val(); 34 } 35 } 36 37 // If there is no valid amount 38 if( !amount ){ 39 error_msg = 'You must select a valid amount before you submit this form.'; 40 } 41 42 // Validate all other require fields 43 var requiredFieldsError = false; 44 jQuery( 'form#' + formId + ' input.required:visible' ).each(function() { 45 if( !jQuery( this ).val() ){ 46 jQuery("label[for='" + jQuery( this ).attr('id') + "']").css( 'color', 'red' ); 47 jQuery("#"+jQuery( this ).attr('id')).css( 'border-color', 'red' ); 48 requiredFieldsError = true; 49 } 50 }); 51 52 // Validate the state, zip and country 53 if( ( jQuery( 'select#country' ).val() == 'US' || jQuery( 'select#country' ).val() == 'CA' ) && !jQuery('input#state').val() ){ 54 jQuery("#label-state").css( 'color', 'red' ); 55 requiredFieldsError = true; 56 } 57 if( ( jQuery( 'select#country' ).val() == 'US' || jQuery( 'select#country' ).val() == 'CA' ) && !jQuery('input#zip').val() ){ 58 jQuery("#label-zip").css( 'color', 'red' ); 59 requiredFieldsError = true; 60 } 61 62 // If there are errors 63 if( requiredFieldsError ){ 64 jQuery('.error-msg').show(); 65 jQuery('.error-msg').html( 'All fields marked in red are required. Please fill-in all required fields before submitting the form.' ); 66 jQuery('html, body').animate({ scrollTop: 100 }, 'slow', function () { 67 }); 68 enableFormSubmit( formId ); 69 return; 70 } 71 72 // Validate the credit card number 73 if( !luhn_validate( jQuery('#cardNumber').val() ) ){ 74 jQuery('.error-msg-payment').show(); 75 jQuery('.error-msg-payment').html( 'The credit card number you entered is not valid. Please re-enter the card number.' ); 76 } 77 78 // Validate the expiration date 79 var expError = false; 80 var expDate = jQuery('#expDate').val(); 81 var expDateParts = expDate.split( '/' ); 82 if( expDateParts.length != 2 ){ 83 expError = true; 84 } 85 var date = ( Date.parse( expDateParts[0] + '/1/' + expDateParts[1] ) / 1000 ); 86 87 // Personal or Business? 88 var type = 'personal'; 89 var companyName = ''; 90 if( jQuery( 'form#' + formId + ' input:radio#business' ).val() && jQuery( 'form#' + formId + ' input:radio#business' ).is(':checked') ){ 91 type = 'business'; 92 if( jQuery( 'form#' + formId + ' input#companyName' ).val() ){ 93 companyName = jQuery( 'form#' + formId + ' input#companyName' ).val(); 94 companyName = companyName.replace( '"', '' ); 95 } 96 } 97 98 // Opted in? 99 var optedIn = false; 100 if( jQuery( 'form#' + formId + ' #checkbox-newsletter' ).is(':checked') ){ 101 optedIn = true; 102 } 103 104 // Package up the data 105 var purchaseData = { 106 paymentMethod: jQuery('[name="paymentMethod"]:checked').val(), 107 deviceData: jQuery('[data-paypal-devicedata]').val(), 108 paypalNonce: jQuery('[data-paypal-nonce]').val(), 109 subscription: subscription, 110 amount: amount, 111 cardNumber: jQuery( 'form#' + formId + ' input#cardNumber' ).val(), 112 expDate: jQuery( 'form#' + formId + ' input#expDate' ).val(), 113 cardCvv: jQuery( 'form#' + formId + ' input#cardCvv' ).val(), 114 firstName: jQuery( 'form#' + formId + ' input#firstName' ).val(), 115 lastName: jQuery( 'form#' + formId + ' input#lastName' ).val(), 116 email: jQuery( 'form#' + formId + ' input#email' ).val(), 117 address_1: jQuery( 'form#' + formId + ' input#streetAddress1' ).val(), 118 address_2: jQuery( 'form#' + formId + ' input#streetAddress2' ).val(), 119 city: jQuery( 'form#' + formId + ' input#city' ).val(), 120 state: jQuery( 'form#' + formId + ' input#state' ).val(), 121 zip: jQuery( 'form#' + formId + ' input#zip' ).val(), 122 country: jQuery( 'form#' + formId + ' select#country' ).val() ?? jQuery( 'form#' + formId + ' input#country' ).val(), 123 subType: type, 124 companyName: companyName, 125 optIn: optedIn, 126 inMemory: jQuery( 'input#in_memory' ).is(':checked'), 127 inMemoryFirstName: jQuery( 'input#memoryFirstName' ).val(), 128 inMemoryLastName: jQuery( 'input#memoryLastName' ).val(), 129 inMemoryRecipients: jQuery( 'input#memoryRecipients' ).val(), 130 inMemoryMessage: jQuery( 'textarea#memoryMessage' ).val(), 131 captchaResponse: jQuery( '[name=g-recaptcha-response]' ).val(), 132 formToken: jQuery( 'form#' + formId + ' input#form-token' ).val() 133 }; 134 135 // Send the data 136 var url = '/api/donation-purchase'; 137 jQuery.post( url, purchaseData, function( data ) { 138 if( !data.success && data.message ){ 139 jQuery('.error-msg-payment').show(); 140 jQuery('.error-msg-payment').html( data.message ); 141 enableFormSubmit( formId ); 142 }else if( data.success && data.order_id && data.redirect ){ 143 window.location.href = data.redirect; 144 } 145 }, "json"); 146 147 return false;
148 149} 150 151function disableFormSubmit( formId ){ 152 jQuery( 'form#' + formId + ' button#process-form i.fa-spinner' ).show(); 153 jQuery( 'form#' + formId + ' button#process-form' ).prop( 'disabled', true ); 154} 155 156function enableFormSubmit( formId ){ 157 jQuery( 'form#' + formId + ' button#process-form i.fa-spinner' ).hide(); 158 jQuery( 'form#' + formId + ' button#process-form' ).prop( 'disabled', false ); 159 jQuery( 'form#' + formId + ' button#process-form label' ).css( 'color', 'white'); 160} 161 162function normalizeForm( formId ){ 163 164 // Field label colors 165 jQuery( 'form#' + formId + ' label' ).each(function() { 166 jQuery( this ).css( 'color', '#606060' ); 167 }); 168 169 // Error messages 170 jQuery( 'form#' + formId + ' .error-msg').html(''); 171 jQuery( 'form#' + formId + ' .error-msg').hide(); 172 jQuery('.error-msg-payment').hide(); 173 jQuery('.error-msg-payment').html(''); 174 175 // Submit button 176 enableFormSubmit( formId ); 177 178} 179 180function luhn_checksum(code) { 181 var len = code.length 182 var parity = len % 2 183 var sum = 0 184 for (var i = len-1; i >= 0; i--) { 185 var d = parseInt(code.charAt(i)) 186 if (i % 2 == parity) { d *= 2 } 187 if (d > 9) { d -= 9 } 188 sum += d 189 } 190 return sum % 10 191} 192 193function luhn_caclulate(partcode) { 194 var checksum = luhn_checksum(partcode + "0") 195 return checksum == 0 ? 0 : 10 - checksum 196} 197 198function luhn_validate(fullcode) { 199 return luhn_checksum(fullcode) == 0 200} 201 202
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.