PageSourceSearch

https://www.cooleffect.org/lib/content/wp-content/themes/cooleffect/js/donate.js?t=1684268923&ver=1.2

js cooleffect.org collected 2026-10-03 20:54:45 UTC 7,371 bytes, 202 lines download raw bytes

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.