521 lines
16 KiB
JavaScript
521 lines
16 KiB
JavaScript
/* global edd_scripts, edd_global_vars */
|
|
|
|
/**
|
|
* Internal dependencies.
|
|
*/
|
|
import { recalculateTaxes } from './checkout/utils.js';
|
|
|
|
jQuery( document ).ready( function( $ ) {
|
|
// Hide unneeded elements. These are things that are required in case JS breaks or isn't present
|
|
$( '.edd-no-js' ).hide();
|
|
$( 'a.edd-add-to-cart' ).addClass( 'edd-has-js' );
|
|
|
|
// Send Remove from Cart requests
|
|
$( document.body ).on( 'click.eddRemoveFromCart', '.edd-remove-from-cart', function( event ) {
|
|
const $this = $( this ),
|
|
item = $this.data( 'cart-item' ),
|
|
action = $this.data( 'action' ),
|
|
id = $this.data( 'download-id' ),
|
|
nonce = $this.data( 'nonce' ),
|
|
data = {
|
|
action: action,
|
|
cart_item: item,
|
|
nonce: nonce,
|
|
timestamp: $this.data( 'timestamp' ),
|
|
token: $this.data( 'token' )
|
|
};
|
|
|
|
$.ajax( {
|
|
type: 'POST',
|
|
data: data,
|
|
dataType: 'json',
|
|
url: edd_scripts.ajaxurl,
|
|
xhrFields: {
|
|
withCredentials: true,
|
|
},
|
|
success: function( response ) {
|
|
if ( response.removed ) {
|
|
if ( ( parseInt( edd_scripts.position_in_cart, 10 ) === parseInt( item, 10 ) ) || edd_scripts.has_purchase_links ) {
|
|
window.location = window.location;
|
|
return false;
|
|
}
|
|
|
|
// Remove the selected cart item
|
|
$( '.edd-cart' ).each( function() {
|
|
$( this ).find( "[data-cart-item='" + item + "']" ).parent().remove();
|
|
} );
|
|
|
|
//Reset the data-cart-item attributes to match their new values in the EDD session cart array
|
|
$( '.edd-cart' ).each( function() {
|
|
let cart_item_counter = 0;
|
|
$( this ).find( '[data-cart-item]' ).each( function() {
|
|
$( this ).attr( 'data-cart-item', cart_item_counter );
|
|
cart_item_counter = cart_item_counter + 1;
|
|
} );
|
|
} );
|
|
|
|
// Check to see if the purchase form(s) for this download is present on this page
|
|
if ( $( '[id^=edd_purchase_' + id + ']' ).length ) {
|
|
$( '[id^=edd_purchase_' + id + '] .edd_go_to_checkout' ).hide();
|
|
$( '[id^=edd_purchase_' + id + '] a.edd-add-to-cart' ).show().removeAttr( 'data-edd-loading' );
|
|
if ( edd_scripts.quantities_enabled === '1' ) {
|
|
$( '[id^=edd_purchase_' + id + '] .edd_download_quantity_wrapper' ).show();
|
|
}
|
|
}
|
|
|
|
$( 'span.edd-cart-quantity' ).text( response.cart_quantity );
|
|
$( document.body ).trigger( 'edd_quantity_updated', [ response.cart_quantity ] );
|
|
if ( edd_scripts.taxes_enabled ) {
|
|
$( '.cart_item.edd_subtotal span' ).html( response.subtotal );
|
|
$( '.cart_item.edd_cart_tax span' ).html( response.tax );
|
|
}
|
|
|
|
$( '.cart_item.edd_total span' ).html( response.total );
|
|
|
|
if ( response.cart_quantity === 0 ) {
|
|
$( '.cart_item.edd_subtotal,.edd-cart-number-of-items,.cart_item.edd_checkout,.cart_item.edd_cart_tax,.cart_item.edd_total' ).hide();
|
|
$( '.edd-cart' ).each( function() {
|
|
const cart_wrapper = $( this ).parent();
|
|
if ( cart_wrapper.length ) {
|
|
cart_wrapper.addClass( 'cart-empty' );
|
|
cart_wrapper.removeClass( 'cart-not-empty' );
|
|
}
|
|
|
|
$( this ).append( '<li class="cart_item empty">' + edd_scripts.empty_cart_message + '</li>' );
|
|
} );
|
|
}
|
|
|
|
$( document.body ).trigger( 'edd_cart_item_removed', [ response ] );
|
|
}
|
|
},
|
|
} ).fail( function( response ) {
|
|
if ( window.console && window.console.log ) {
|
|
console.log( response );
|
|
}
|
|
} ).done( function( response ) {
|
|
|
|
} );
|
|
|
|
return false;
|
|
} );
|
|
|
|
// Send Add to Cart request
|
|
$( document.body ).on( 'click.eddAddToCart', '.edd-add-to-cart', function( e ) {
|
|
e.preventDefault();
|
|
|
|
var $this = $( this ),
|
|
form = $this.closest( 'form' );
|
|
|
|
// Disable button, preventing rapid additions to cart during ajax request
|
|
$this.prop( 'disabled', true );
|
|
|
|
const $spinner = $this.find( '.edd-loading' );
|
|
const container = $this.closest( 'div' );
|
|
|
|
// Show the spinner
|
|
$this.attr( 'data-edd-loading', '' );
|
|
|
|
var form = $this.parents( 'form' ).last();
|
|
const download = $this.data( 'download-id' );
|
|
const variable_price = $this.data( 'variable-price' );
|
|
const price_mode = $this.data( 'price-mode' );
|
|
const nonce = $this.data( 'nonce' );
|
|
const item_price_ids = [];
|
|
let free_items = true;
|
|
|
|
if ( variable_price === 'yes' ) {
|
|
if ( form.find( '.edd_price_option_' + download + '[type="hidden"]' ).length > 0 ) {
|
|
item_price_ids[ 0 ] = $( '.edd_price_option_' + download, form ).val();
|
|
if ( form.find( '.edd-submit' ).data( 'price' ) && form.find( '.edd-submit' ).data( 'price' ) > 0 ) {
|
|
free_items = false;
|
|
}
|
|
} else {
|
|
if ( ! form.find( '.edd_price_option_' + download + ':checked', form ).length ) {
|
|
// hide the spinner
|
|
$this.removeAttr( 'data-edd-loading' );
|
|
alert( edd_scripts.select_option );
|
|
e.stopPropagation();
|
|
$this.prop( 'disabled', false );
|
|
return false;
|
|
}
|
|
|
|
form.find( '.edd_price_option_' + download + ':checked', form ).each( function( index ) {
|
|
item_price_ids[ index ] = $( this ).val();
|
|
|
|
// If we're still only at free items, check if this one is free also
|
|
if ( true === free_items ) {
|
|
const item_price = $( this ).data( 'price' );
|
|
if ( item_price && item_price > 0 ) {
|
|
// We now have a paid item, we can't use add_to_cart
|
|
free_items = false;
|
|
}
|
|
}
|
|
} );
|
|
}
|
|
} else {
|
|
item_price_ids[ 0 ] = download;
|
|
if ( $this.data( 'price' ) && $this.data( 'price' ) > 0 ) {
|
|
free_items = false;
|
|
}
|
|
}
|
|
|
|
// If we've got nothing but free items being added, change to add_to_cart
|
|
if ( free_items ) {
|
|
form.find( '.edd_action_input' ).val( 'add_to_cart' );
|
|
}
|
|
|
|
if ( 'straight_to_gateway' === form.find( '.edd_action_input' ).val() ) {
|
|
form.submit();
|
|
return true; // Submit the form
|
|
}
|
|
|
|
const action = $this.data( 'action' );
|
|
const data = {
|
|
action: action,
|
|
download_id: download,
|
|
price_ids: item_price_ids,
|
|
post_data: $( form ).serialize(),
|
|
nonce: nonce,
|
|
};
|
|
|
|
$.ajax( {
|
|
type: 'POST',
|
|
data: data,
|
|
dataType: 'json',
|
|
url: edd_scripts.ajaxurl,
|
|
xhrFields: {
|
|
withCredentials: true,
|
|
},
|
|
success: function( response ) {
|
|
const store_redirect = edd_scripts.redirect_to_checkout === '1';
|
|
const item_redirect = form.find( '#edd_redirect_to_checkout' ).val() === '1';
|
|
|
|
if ( ( store_redirect && item_redirect ) || ( ! store_redirect && item_redirect ) ) {
|
|
window.location = edd_scripts.checkout_page;
|
|
} else {
|
|
// Add the new item to the cart widget
|
|
if ( edd_scripts.taxes_enabled === '1' ) {
|
|
$( '.cart_item.edd_subtotal' ).show();
|
|
$( '.cart_item.edd_cart_tax' ).show();
|
|
}
|
|
|
|
$( '.cart_item.edd_total' ).show();
|
|
$( '.cart_item.edd_checkout' ).show();
|
|
|
|
if ( $( '.cart_item.empty' ).length ) {
|
|
$( '.cart_item.empty' ).hide();
|
|
}
|
|
|
|
$( '.widget_edd_cart_widget .edd-cart' ).each( function( cart ) {
|
|
const target = $( this ).find( '.edd-cart-meta:first' );
|
|
$( response.cart_item ).insertBefore( target );
|
|
|
|
const cart_wrapper = $( this ).parent();
|
|
if ( cart_wrapper.length ) {
|
|
cart_wrapper.addClass( 'cart-not-empty' );
|
|
cart_wrapper.removeClass( 'cart-empty' );
|
|
}
|
|
} );
|
|
|
|
// Update the totals
|
|
if ( edd_scripts.taxes_enabled === '1' ) {
|
|
$( '.edd-cart-meta.edd_subtotal span' ).html( response.subtotal );
|
|
$( '.edd-cart-meta.edd_cart_tax span' ).html( response.tax );
|
|
}
|
|
|
|
$( '.edd-cart-meta.edd_total span' ).html( response.total );
|
|
|
|
// Update the cart quantity
|
|
const items_added = $( '.edd-cart-item-title', response.cart_item ).length;
|
|
|
|
$( 'span.edd-cart-quantity' ).each( function() {
|
|
$( this ).text( response.cart_quantity );
|
|
$( document.body ).trigger( 'edd_quantity_updated', [ response.cart_quantity ] );
|
|
} );
|
|
|
|
// Show the "number of items in cart" message
|
|
if ( $( '.edd-cart-number-of-items' ).css( 'display' ) === 'none' ) {
|
|
$( '.edd-cart-number-of-items' ).show( 'slow' );
|
|
}
|
|
|
|
if ( variable_price === 'no' || price_mode !== 'multi' ) {
|
|
// Switch purchase to checkout if a single price item or variable priced with radio buttons
|
|
$( 'a.edd-add-to-cart', container ).toggle();
|
|
$( '.edd_go_to_checkout', container ).css( 'display', 'inline-block' );
|
|
}
|
|
|
|
if ( price_mode === 'multi' ) {
|
|
// remove spinner for multi
|
|
$this.removeAttr( 'data-edd-loading' );
|
|
}
|
|
|
|
// Update all buttons for same download
|
|
if ( $( '.edd_download_purchase_form' ).length && ( variable_price === 'no' || ! form.find( '.edd_price_option_' + download ).is( 'input:hidden' ) ) ) {
|
|
const parent_form = $( '.edd_download_purchase_form *[data-download-id="' + download + '"]' ).parents( 'form' );
|
|
$( 'a.edd-add-to-cart', parent_form ).hide();
|
|
if ( price_mode !== 'multi' ) {
|
|
parent_form.find( '.edd_download_quantity_wrapper' ).slideUp();
|
|
}
|
|
$( '.edd_go_to_checkout', parent_form ).show().removeAttr( 'data-edd-loading' );
|
|
}
|
|
|
|
if ( response !== 'incart' ) {
|
|
// Show the added message
|
|
$( '.edd-cart-added-alert', container ).fadeIn();
|
|
setTimeout( function() {
|
|
$( '.edd-cart-added-alert', container ).fadeOut();
|
|
}, 3000 );
|
|
}
|
|
|
|
// Re-enable the add to cart button
|
|
$this.prop( 'disabled', false );
|
|
|
|
$( document.body ).trigger( 'edd_cart_item_added', [ response ] );
|
|
}
|
|
},
|
|
} ).fail( function( response ) {
|
|
if ( window.console && window.console.log ) {
|
|
console.log( response );
|
|
}
|
|
} ).done( function( response ) {
|
|
|
|
} );
|
|
|
|
return false;
|
|
} );
|
|
|
|
// Show the login form on the checkout page
|
|
$( '#edd_checkout_form_wrap' ).on( 'click', '.edd_checkout_register_login', function() {
|
|
const $this = $( this ),
|
|
data = {
|
|
action: $this.data( 'action' ),
|
|
nonce: $this.data( 'nonce' ),
|
|
};
|
|
|
|
// Show the ajax loader
|
|
$( '.edd-cart-ajax' ).show();
|
|
|
|
$.post( edd_scripts.ajaxurl, data, function( checkout_response ) {
|
|
$( '#edd_checkout_login_register' ).html( edd_scripts.loading );
|
|
$( '#edd_checkout_login_register' ).html( checkout_response );
|
|
// Hide the ajax loader
|
|
$( '.edd-cart-ajax' ).hide();
|
|
} );
|
|
return false;
|
|
} );
|
|
|
|
// Process the login form via ajax
|
|
$( document ).on( 'click', '#edd_purchase_form #edd_login_fields input[type=submit]', function( e ) {
|
|
e.preventDefault();
|
|
|
|
const complete_purchase_val = $( this ).val();
|
|
|
|
$( this ).attr( 'data-original-value', complete_purchase_val );
|
|
|
|
$( this ).val( edd_global_vars.purchase_loading );
|
|
|
|
$( this ).after( '<span class="edd-loading-ajax edd-loading"></span>' );
|
|
|
|
const data = {
|
|
action: 'edd_process_checkout_login',
|
|
edd_ajax: 1,
|
|
edd_user_login: $( '#edd_login_fields #edd_user_login' ).val(),
|
|
edd_user_pass: $( '#edd_login_fields #edd_user_pass' ).val(),
|
|
edd_login_nonce: $( '#edd_login_nonce' ).val(),
|
|
};
|
|
|
|
$.post( edd_global_vars.ajaxurl, data, function( data ) {
|
|
if ( $.trim( data ) === 'success' ) {
|
|
$( '.edd_errors' ).remove();
|
|
window.location = edd_scripts.checkout_page;
|
|
} else {
|
|
$( '#edd_login_fields input[type=submit]' ).val( complete_purchase_val );
|
|
$( '.edd-loading-ajax' ).remove();
|
|
$( '.edd_errors' ).remove();
|
|
$( '#edd-user-login-submit' ).before( data );
|
|
}
|
|
} );
|
|
} );
|
|
|
|
// Load the fields for the selected payment method
|
|
$(document).on('change', 'select#edd-gateway, input.edd-gateway', function (e) {
|
|
const payment_mode = $( '#edd-gateway option:selected, input.edd-gateway:checked' ).val();
|
|
|
|
if ( payment_mode === '0' ) {
|
|
return false;
|
|
}
|
|
|
|
edd_load_gateway( payment_mode );
|
|
|
|
return false;
|
|
} );
|
|
|
|
// Auto load first payment gateway
|
|
if ( edd_scripts.is_checkout === '1' ) {
|
|
let chosen_gateway = false;
|
|
let ajax_needed = false;
|
|
|
|
if ( $( 'select#edd-gateway, input.edd-gateway' ).length ) {
|
|
chosen_gateway = $( "meta[name='edd-chosen-gateway']" ).attr( 'content' );
|
|
ajax_needed = true;
|
|
}
|
|
|
|
if ( ! chosen_gateway ) {
|
|
chosen_gateway = edd_scripts.default_gateway;
|
|
}
|
|
|
|
if ( ajax_needed ) {
|
|
// If we need to ajax in a gateway form, send the requests for the POST.
|
|
setTimeout( function() {
|
|
edd_load_gateway( chosen_gateway );
|
|
}, 200 );
|
|
} else {
|
|
// The form is already on page, just trigger that the gateway is loaded so further action can be taken.
|
|
$( 'body' ).trigger( 'edd_gateway_loaded', [ chosen_gateway ] );
|
|
}
|
|
}
|
|
|
|
// Process checkout
|
|
$( document ).on( 'click', '#edd_purchase_form #edd_purchase_submit [type=submit]', function( e ) {
|
|
const eddPurchaseform = document.getElementById( 'edd_purchase_form' );
|
|
|
|
if ( typeof eddPurchaseform.checkValidity === 'function' && false === eddPurchaseform.checkValidity() ) {
|
|
return;
|
|
}
|
|
|
|
e.preventDefault();
|
|
|
|
const complete_purchase_val = $( this ).val();
|
|
|
|
$( this ).val( edd_global_vars.purchase_loading );
|
|
|
|
$( this ).prop( 'disabled', true );
|
|
|
|
$( this ).after( '<span class="edd-loading-ajax edd-loading"></span>' );
|
|
|
|
$.post( edd_global_vars.ajaxurl, $( '#edd_purchase_form' ).serialize() + '&action=edd_process_checkout&edd_ajax=true', function( data ) {
|
|
if ( $.trim( data ) === 'success' ) {
|
|
$( '.edd_errors' ).remove();
|
|
$( '.edd-error' ).hide();
|
|
$( eddPurchaseform ).submit();
|
|
} else {
|
|
$( '#edd-purchase-button' ).val( complete_purchase_val );
|
|
$( '.edd-loading-ajax' ).remove();
|
|
$( '.edd_errors' ).remove();
|
|
$( '.edd-error' ).hide();
|
|
$( edd_global_vars.checkout_error_anchor ).before( data );
|
|
$( '#edd-purchase-button' ).prop( 'disabled', false );
|
|
|
|
$( document.body ).trigger( 'edd_checkout_error', [ data ] );
|
|
}
|
|
} );
|
|
} );
|
|
|
|
// Update state field
|
|
$( document.body ).on( 'change', '#edd_cc_address input.card_state, #edd_cc_address select, #edd_address_country', update_state_field );
|
|
|
|
function update_state_field() {
|
|
const $this = $( this );
|
|
let $form;
|
|
const is_checkout = typeof edd_global_vars !== 'undefined';
|
|
let field_name = 'card_state';
|
|
if ( $( this ).attr( 'id' ) === 'edd_address_country' ) {
|
|
field_name = 'edd_address_state';
|
|
}
|
|
|
|
let state_inputs = document.getElementById( field_name );
|
|
|
|
if ( 'card_state' !== $this.attr( 'id' ) && null != state_inputs ) {
|
|
const nonce = $( this ).data( 'nonce' );
|
|
|
|
// If the country field has changed, we need to update the state/province field
|
|
const postData = {
|
|
action: 'edd_get_shop_states',
|
|
country: $this.val(),
|
|
field_name: field_name,
|
|
nonce: nonce,
|
|
};
|
|
|
|
$.ajax( {
|
|
type: 'POST',
|
|
data: postData,
|
|
url: edd_scripts.ajaxurl,
|
|
xhrFields: {
|
|
withCredentials: true,
|
|
},
|
|
success: function( response ) {
|
|
if ( is_checkout ) {
|
|
$form = $( '#edd_purchase_form' );
|
|
} else {
|
|
$form = $this.closest( 'form' );
|
|
}
|
|
|
|
const state_inputs = 'input[name="card_state"], select[name="card_state"], input[name="edd_address_state"], select[name="edd_address_state"]';
|
|
|
|
if ( 'nostates' === $.trim( response ) ) {
|
|
const text_field = '<input type="text" id="' + field_name + '" name="card_state" class="card-state edd-input required" value=""/>';
|
|
$form.find( state_inputs ).replaceWith( text_field );
|
|
} else {
|
|
$form.find( state_inputs ).replaceWith( response );
|
|
}
|
|
|
|
if ( is_checkout ) {
|
|
$( document.body ).trigger( 'edd_cart_billing_address_updated', [ response ] );
|
|
}
|
|
},
|
|
} ).fail( function( data ) {
|
|
if ( window.console && window.console.log ) {
|
|
console.log( data );
|
|
}
|
|
} ).done( function( data ) {
|
|
if ( is_checkout ) {
|
|
recalculateTaxes();
|
|
}
|
|
} );
|
|
} else if ( is_checkout ) {
|
|
recalculateTaxes();
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// Backwards compatibility. Assign function to global namespace.
|
|
window.update_state_field = update_state_field;
|
|
|
|
// If is_checkout, recalculate sales tax on postalCode change.
|
|
$( document.body ).on( 'change', '#edd_cc_address input[name=card_zip]', function() {
|
|
if ( typeof edd_global_vars !== 'undefined' ) {
|
|
recalculateTaxes();
|
|
}
|
|
} );
|
|
} );
|
|
|
|
// Load a payment gateway
|
|
function edd_load_gateway( payment_mode ) {
|
|
// Show the ajax loader
|
|
jQuery( '.edd-cart-ajax' ).show();
|
|
jQuery( '#edd_purchase_form_wrap' ).html( '<span class="edd-loading-ajax edd-loading"></span>' );
|
|
|
|
const nonce = document.getElementById( 'edd-gateway-' + payment_mode ).getAttribute( 'data-' + payment_mode + '-nonce' );
|
|
let url = edd_scripts.ajaxurl;
|
|
|
|
if ( url.indexOf( '?' ) > 0 ) {
|
|
url = url + '&';
|
|
} else {
|
|
url = url + '?';
|
|
}
|
|
|
|
url = url + 'payment-mode=' + payment_mode;
|
|
|
|
jQuery.post( url, { action: 'edd_load_gateway', edd_payment_mode: payment_mode, nonce: nonce },
|
|
function( response ) {
|
|
jQuery( '#edd_purchase_form_wrap' ).html( response );
|
|
jQuery( '.edd-no-js' ).hide();
|
|
jQuery( 'body' ).trigger( 'edd_gateway_loaded', [ payment_mode ] );
|
|
}
|
|
);
|
|
}
|
|
|
|
// Backwards compatibility. Assign function to global namespace.
|
|
window.edd_load_gateway = edd_load_gateway;
|