FruitBank/Presentation/Nop.Web/wwwroot/js/public.onepagecheckout.js

809 lines
23 KiB
JavaScript

/*
** nopCommerce one page checkout
*/
var Checkout = {
loadWaiting: false,
failureUrl: false,
init: function (failureUrl) {
this.loadWaiting = false;
this.failureUrl = failureUrl;
Accordion.disallowAccessToNextSections = true;
},
ajaxFailure: function () {
location.href = Checkout.failureUrl;
},
_disableEnableAll: function (element, isDisabled) {
var descendants = element.find('*');
$(descendants).each(function () {
if (isDisabled) {
$(this).prop("disabled", true);
} else {
$(this).prop("disabled", false);
}
});
if (isDisabled) {
element.prop("disabled", true);
} else {
$(this).prop("disabled", false);
}
},
setLoadWaiting: function (step, keepDisabled) {
var container;
if (step) {
if (this.loadWaiting) {
this.setLoadWaiting(false);
}
container = $('#' + step + '-buttons-container');
container.addClass('disabled');
container.css('opacity', '.5');
this._disableEnableAll(container, true);
$('#' + step + '-please-wait').show();
} else {
if (this.loadWaiting) {
container = $('#' + this.loadWaiting + '-buttons-container');
var isDisabled = keepDisabled ? true : false;
if (!isDisabled) {
container.removeClass('disabled');
container.css('opacity', '1');
}
this._disableEnableAll(container, isDisabled);
$('#' + this.loadWaiting + '-please-wait').hide();
}
}
this.loadWaiting = step;
},
gotoSection: function (section) {
section = $('#opc-' + section);
section.addClass('allow');
Accordion.openSection(section);
},
back: function () {
if (this.loadWaiting) return;
Accordion.openPrevSection(true, true);
},
setStepResponse: function(response) {
if (response.update_section) {
$('#checkout-' + response.update_section.name + '-load').html(response.update_section.html);
}
if (response.allow_sections) {
response.allow_sections.each(function(e) {
$('#opc-' + e).addClass('allow');
});
}
//TODO move it to a new method
if ($("#billing-address-select").length > 0) {
Billing.newAddress(!$('#billing-address-select').val());
} else {
Billing.newAddress(true);
}
if ($("#shipping-address-select").length > 0) {
Shipping.newAddress(response.selected_id == undefined ? $('#shipping-address-select').val() : response.selected_id, $('#billing-address-select').children("option:selected").val());
}
if (response.goto_section) {
Checkout.gotoSection(response.goto_section);
return true;
}
if (response.redirect) {
location.href = response.redirect;
return true;
}
return false;
}
};
var Billing = {
form: false,
saveUrl: false,
disableBillingAddressCheckoutStep: false,
guest: false,
selectedStateId: 0,
init: function(form, saveUrl, disableBillingAddressCheckoutStep, guest) {
this.form = form;
this.saveUrl = saveUrl;
this.disableBillingAddressCheckoutStep = disableBillingAddressCheckoutStep;
this.guest = guest;
},
newAddress: function(isNew) {
$('#save-billing-address-button').hide();
if (isNew) {
$('#billing-new-address-form').show();
$('#edit-billing-address-button').hide();
$('#delete-billing-address-button').hide();
} else {
$('#billing-new-address-form').hide();
$('#edit-billing-address-button').show();
$('#delete-billing-address-button').show();
}
$(document).trigger({ type: "onepagecheckout_billing_address_new" });
Billing.initializeCountrySelect();
},
setDefaultCountry: function (defaultCountry) {
$('#opc-billing select[data-trigger="country-select"] option[value="' + defaultCountry + '"]').prop('selected', true);
$('#opc-billing select[data-trigger="country-select"] option:selected').change()
},
resetSelectedAddress: function() {
var selectElement = $('#billing-address-select');
if (selectElement) {
selectElement.val('');
}
$(document).trigger({ type: "onepagecheckout_billing_address_reset" });
},
save: function() {
if (Checkout.loadWaiting !== false) return;
Checkout.setLoadWaiting('billing');
$.ajax({
cache: false,
url: this.saveUrl,
data: $(this.form).serialize(),
type: "POST",
success: this.nextStep,
complete: this.resetLoadWaiting,
error: Checkout.ajaxFailure
});
},
resetLoadWaiting: function() {
Checkout.setLoadWaiting(false);
},
nextStep: function(response) {
//ensure that response.wrong_billing_address is set
//if not set, "true" is the default value
if (typeof response.wrong_billing_address === 'undefined') {
response.wrong_billing_address = false;
}
if (Billing.disableBillingAddressCheckoutStep) {
if (response.wrong_billing_address) {
Accordion.showSection('#opc-billing');
} else {
Accordion.hideSection('#opc-billing');
}
}
if (response.error) {
if (typeof response.message === 'string') {
alert(response.message);
} else {
alert(response.message.join("\n"));
}
return false;
}
Checkout.setStepResponse(response);
Billing.initializeCountrySelect();
},
initializeCountrySelect: function() {
if ($('#opc-billing').has('select[data-trigger="country-select"]')) {
$('#opc-billing select[data-trigger="country-select"]').countrySelect();
}
},
editAddress: function(url) {
Billing.resetBillingForm();
//Billing.initializeStateSelect();
var prefix = 'BillingNewAddress_';
var selectedItem = $('#billing-address-select').children("option:selected").val();
$.ajax({
cache: false,
type: "GET",
url: url,
data: {
addressId: selectedItem,
},
success: function (data, textStatus, jqXHR) {
$.each(data, function (id, value) {
if (value === null)
return;
if (id.indexOf("CustomAddressAttributes") >= 0 && Array.isArray(value)) {
$.each(value, function (i, customAttribute) {
if (customAttribute.DefaultValue) {
$(`#${customAttribute.ControlId}`).val(
customAttribute.DefaultValue
);
} else {
$.each(customAttribute.Values, function (j, attributeValue) {
if (attributeValue.IsPreSelected) {
$(`#${customAttribute.ControlId}`).val(attributeValue.Id);
$(
`#${customAttribute.ControlId}_${attributeValue.Id}`
).prop("checked", attributeValue.Id);
}
});
}
});
return;
}
var val = $(`#${prefix}${id}`).val(value);
if (id.indexOf("CountryId") >= 0) {
val.trigger("change");
}
if (id.indexOf("StateProvinceId") >= 0) {
Billing.setSelectedStateId(value);
}
});
},
complete: function (jqXHR, textStatus) {
$("#billing-new-address-form").show();
$("#edit-billing-address-button").hide();
$("#delete-billing-address-button").hide();
$("#save-billing-address-button").show();
},
error: Checkout.ajaxFailure,
});
},
saveEditAddress: function(url) {
var selectedId;
$.ajax({
cache: false,
url: url + '?opc=true',
data: $(this.form).serialize(),
type: "POST",
success: function (response) {
if (response.error) {
alert(response.message);
return false;
} else {
selectedId = response.selected_id;
Checkout.setStepResponse(response);
Billing.resetBillingForm();
}
},
complete: function() {
var selectElement = $('#billing-address-select');
if (selectElement && selectedId) {
selectElement.val(selectedId);
}
},
error: Checkout.ajaxFailure
});
},
deleteAddress: function (url) {
var selectedAddress = $('#billing-address-select').children("option:selected").val();
$.ajax({
cache: false,
type: "GET",
url: url,
data: {
"addressId": selectedAddress,
"opc": 'true'
},
success: function (response) {
Checkout.setStepResponse(response);
},
error: Checkout.ajaxFailure
});
},
setSelectedStateId: function (id) {
this.selectedStateId = id;
},
resetBillingForm: function() {
$(':input', '#billing-new-address-form')
.not(':button, :submit, :reset, :hidden')
.removeAttr('checked').removeAttr('selected')
$(':input', '#billing-new-address-form')
.not(':checkbox, :radio, select')
.val('');
$('.address-id', '#billing-new-address-form').val('0');
$('select option[value="0"]', '#billing-new-address-form').prop('selected', true);
}
};
var Shipping = {
form: false,
saveUrl: false,
init: function (form, saveUrl) {
this.form = form;
this.saveUrl = saveUrl;
},
newAddress: function (id, billingAddressId) {
isNew = !id;
if (isNew) {
this.resetSelectedAddress();
$('#shipping-new-address-form').show();
$('#edit-shipping-address-button').hide();
$('#delete-shipping-address-button').hide();
} else {
$('#shipping-new-address-form').hide();
if (id == billingAddressId || (id != undefined && billingAddressId == undefined)) {
$('#edit-shipping-address-button').hide();
$("#save-shipping-address-button").hide();
$('#delete-shipping-address-button').hide();
} else {
$("#save-shipping-address-button").hide();
$('#edit-shipping-address-button').show();
$('#delete-shipping-address-button').show();
}
}
$(document).trigger({ type: "onepagecheckout_shipping_address_new" });
Shipping.initializeCountrySelect();
},
resetSelectedAddress: function () {
var selectElement = $('#shipping-address-select');
if (selectElement) {
selectElement.val('');
}
$(document).trigger({ type: "onepagecheckout_shipping_address_reset" });
},
editAddress: function (url) {
Shipping.resetShippingForm();
var prefix = 'ShippingNewAddress_';
var selectedItem = $('#shipping-address-select').children("option:selected").val();
$.ajax({
cache: false,
type: "GET",
url: url,
data: {
addressId: selectedItem,
},
success: function (data, textStatus, jqXHR) {
$.each(data, function (id, value) {
if (value === null)
return;
if (id.indexOf("CustomAddressAttributes") >= 0 && Array.isArray(value)) {
$.each(value, function (i, customAttribute) {
if (customAttribute.DefaultValue) {
$(`#${customAttribute.ControlId}`).val(
customAttribute.DefaultValue
);
} else {
$.each(customAttribute.Values, function (j, attributeValue) {
if (attributeValue.IsPreSelected) {
$(`#${customAttribute.ControlId}`).val(attributeValue.Id);
$(
`#${customAttribute.ControlId}_${attributeValue.Id}`
).prop("checked", attributeValue.Id);
}
});
}
});
return;
}
var val = $(`#${prefix}${id}`).val(value);
if (id.indexOf("CountryId") >= 0) {
val.trigger("change");
}
if (id.indexOf("StateProvinceId") >= 0) {
Billing.setSelectedStateId(value);
}
});
},
complete: function (jqXHR, textStatus) {
$("#shipping-new-address-form").show();
$("#edit-shipping-address-button").hide();
$("#delete-shipping-address-button").hide();
$("#save-shipping-address-button").show();
},
error: Checkout.ajaxFailure,
});
},
saveEditAddress: function (url) {
var selectedId;
$.ajax({
cache: false,
url: url + '?opc=true',
data: $(this.form).serialize(),
type: "POST",
success: function (response) {
if (response.error) {
alert(response.message);
return false;
} else {
selectedId = response.selected_id;
Checkout.setStepResponse(response);
Shipping.resetShippingForm();
}
},
complete: function () {
var selectElement = $('#shipping-address-select');
if (selectElement && selectedId) {
selectElement.val(selectedId);
}
},
error: Checkout.ajaxFailure
});
},
deleteAddress: function (url) {
var selectedAddress = $('#shipping-address-select').children("option:selected").val();
$.ajax({
cache: false,
type: "GET",
url: url,
data: {
"addressId": selectedAddress,
"opc": 'true'
},
success: function (response) {
Checkout.setStepResponse(response);
},
error: Checkout.ajaxFailure
});
},
save: function () {
if (Checkout.loadWaiting !== false) return;
Checkout.setLoadWaiting('shipping');
$.ajax({
cache: false,
url: this.saveUrl,
data: $(this.form).serialize(),
type: "POST",
success: this.nextStep,
complete: this.resetLoadWaiting,
error: Checkout.ajaxFailure
});
},
resetLoadWaiting: function () {
Checkout.setLoadWaiting(false);
},
nextStep: function (response) {
if (response.error) {
if (typeof response.message === 'string') {
alert(response.message);
} else {
alert(response.message.join("\n"));
}
return false;
}
Checkout.setStepResponse(response);
},
initializeCountrySelect: function () {
if ($('#opc-shipping').has('select[data-trigger="country-select"]')) {
$('#opc-shipping select[data-trigger="country-select"]').countrySelect();
}
},
resetShippingForm: function () {
$(':input', '#shipping-new-address-form')
.not(':button, :submit, :reset, :hidden')
.removeAttr('checked').removeAttr('selected')
$(':input', '#shipping-new-address-form')
.not(':checkbox, :radio, select')
.val('');
$('.address-id', '#shipping-new-address-form').val('0');
$('select option[value="0"]', '#shipping-new-address-form').prop('selected', true);
}
};
var ShippingMethod = {
form: false,
saveUrl: false,
localized_data: false,
init: function (form, saveUrl, localized_data) {
this.form = form;
this.saveUrl = saveUrl;
this.localized_data = localized_data;
},
validate: function () {
var methods = document.getElementsByName('shippingoption');
if (methods.length === 0) {
alert(this.localized_data.NotAvailableMethodsError);
return false;
}
for (var i = 0; i < methods.length; i++) {
if (methods[i].checked) {
return true;
}
}
alert(this.localized_data.SpecifyMethodError);
return false;
},
save: function () {
if (Checkout.loadWaiting !== false) return;
if (this.validate()) {
Checkout.setLoadWaiting('shipping-method');
$.ajax({
cache: false,
url: this.saveUrl,
data: $(this.form).serialize(),
type: "POST",
success: this.nextStep,
complete: this.resetLoadWaiting,
error: Checkout.ajaxFailure
});
}
},
resetLoadWaiting: function () {
Checkout.setLoadWaiting(false);
},
nextStep: function (response) {
if (response.error) {
if (typeof response.message === 'string') {
alert(response.message);
} else {
alert(response.message.join("\n"));
}
return false;
}
Checkout.setStepResponse(response);
}
};
var PaymentMethod = {
form: false,
saveUrl: false,
localized_data: false,
init: function (form, saveUrl, localized_data) {
this.form = form;
this.saveUrl = saveUrl;
this.localized_data = localized_data;
},
toggleUseRewardPoints: function (useRewardPointsInput) {
if (useRewardPointsInput.checked) {
$('#payment-method-block').hide();
}
else {
$('#payment-method-block').show();
}
},
validate: function () {
var methods = document.getElementsByName('paymentmethod');
if (methods.length === 0) {
alert(this.localized_data.NotAvailableMethodsError);
return false;
}
for (var i = 0; i < methods.length; i++) {
if (methods[i].checked) {
return true;
}
}
alert(this.localized_data.SpecifyMethodError);
return false;
},
save: function () {
if (Checkout.loadWaiting !== false) return;
if (this.validate()) {
Checkout.setLoadWaiting('payment-method');
$.ajax({
cache: false,
url: this.saveUrl,
data: $(this.form).serialize(),
type: "POST",
success: this.nextStep,
complete: this.resetLoadWaiting,
error: Checkout.ajaxFailure
});
}
},
resetLoadWaiting: function () {
Checkout.setLoadWaiting(false);
},
nextStep: function (response) {
if (response.error) {
if (typeof response.message === 'string') {
alert(response.message);
} else {
alert(response.message.join("\n"));
}
return false;
}
Checkout.setStepResponse(response);
}
};
var PaymentInfo = {
form: false,
saveUrl: false,
init: function (form, saveUrl) {
this.form = form;
this.saveUrl = saveUrl;
},
save: function () {
if (Checkout.loadWaiting !== false) return;
Checkout.setLoadWaiting('payment-info');
$.ajax({
cache: false,
url: this.saveUrl,
data: $(this.form).serialize(),
type: "POST",
success: this.nextStep,
complete: this.resetLoadWaiting,
error: Checkout.ajaxFailure
});
},
resetLoadWaiting: function () {
Checkout.setLoadWaiting(false);
},
nextStep: function (response) {
if (response.error) {
if (typeof response.message === 'string') {
alert(response.message);
} else {
alert(response.message.join("\n"));
}
return false;
}
Checkout.setStepResponse(response);
}
};
var ConfirmOrder = {
form: false,
saveUrl: false,
isSuccess: false,
isCaptchaEnabled: false,
isReCaptchaV3: false,
recaptchaPublicKey: "",
div: false,
init: function (saveUrl, successUrl, isCaptchaEnabled, isReCaptchaV3, recaptchaPublicKey, div) {
this.div = div;
this.saveUrl = saveUrl;
this.successUrl = successUrl;
this.isCaptchaEnabled = isCaptchaEnabled;
this.isReCaptchaV3 = isReCaptchaV3;
this.recaptchaPublicKey = recaptchaPublicKey;
},
save: async function () {
if (Checkout.loadWaiting !== false) return;
//terms of service
var termOfServiceOk = true;
if ($('#termsofservice').length > 0) {
//terms of service element exists
if (!$('#termsofservice').is(':checked')) {
$("#terms-of-service-warning-box").dialog();
termOfServiceOk = false;
} else {
termOfServiceOk = true;
}
}
if (termOfServiceOk) {
Checkout.setLoadWaiting('confirm-order');
var postData = {};
if (ConfirmOrder.isCaptchaEnabled) {
var captchaTok = await ConfirmOrder.getCaptchaToken('OpcConfirmOrder');
postData['g-recaptcha-response'] = captchaTok;
}
addAntiForgeryToken(postData);
$.ajax({
cache: false,
url: this.saveUrl,
data: postData,
type: "POST",
success: this.nextStep,
complete: this.resetLoadWaiting,
error: Checkout.ajaxFailure
});
} else {
return false;
}
},
getCaptchaToken: async function (action) {
var recaptchaToken = ''
if (ConfirmOrder.isReCaptchaV3) {
grecaptcha.ready(() => {
grecaptcha.execute(this.recaptchaPublicKey, { action: action }).then((token) => {
recaptchaToken = token;
});
});
while (recaptchaToken == '') {
await new Promise(t => setTimeout(t, 100));
}
} else {
recaptchaToken = $(this.div).find('.captcha-box textarea[name="g-recaptcha-response"]').val();
}
return recaptchaToken;
},
resetLoadWaiting: function (transport) {
Checkout.setLoadWaiting(false, ConfirmOrder.isSuccess);
},
nextStep: function (response) {
if (response.error) {
if (typeof response.message === 'string') {
alert(response.message);
} else {
alert(response.message.join("\n"));
}
return false;
}
if (response.redirect) {
ConfirmOrder.isSuccess = true;
location.href = response.redirect;
return;
}
if (response.success) {
ConfirmOrder.isSuccess = true;
window.location = ConfirmOrder.successUrl;
}
Checkout.setStepResponse(response);
}
};