$(function () { window['_QuickCheckout'] = new Vue({ data: window['_QuickCheckoutData'], el: '.quick-checkout', template: '#quick-checkout', mounted: function () { var self = this; self.payment(); if ($.fn.datetimepicker) { $(self.$el).find('.date').datetimepicker({ pickTime: false }); $(self.$el).find('.datetime').datetimepicker({ pickDate: true, pickTime: true }); $(self.$el).find('.time').datetimepicker({ pickDate: false }); $(self.$el).find('.date, .datetime, .time').on('dp.change', function (event) { $(event.target).find('input')[0].dispatchEvent(new Event('change')); }); } $(self.$el).find('[placeholder]').each(function () { $(this).attr('placeholder', he.decode($(this).attr('placeholder'))); }); $(self.$el).find('[data-toggle="tooltip-hover"]').tooltip(({ container: 'body' })); Journal.tableScroll(); }, updated: function () { var self = this; if ($.fn.datetimepicker) { $(self.$el).find('.date').datetimepicker({ pickTime: false }); $(self.$el).find('.datetime').datetimepicker({ pickDate: true, pickTime: true }); $(self.$el).find('.time').datetimepicker({ pickDate: false }); $(self.$el).find('.date, .datetime, .time').on('dp.change', function (event) { $(event.target).find('input')[0].dispatchEvent(new Event('change')); }); } $(self.$el).find('[placeholder]').each(function () { $(this).attr('placeholder', he.decode($(this).attr('placeholder'))); }); Journal.tableScroll(); }, beforeUpdate: function () { if ($.fn.datetimepicker) { $(this.$el).find('.date, .datetime, .time').each(function () { $(this).datetimepicker('hide').datetimepicker('destroy'); }); } }, beforeDestroy: function () { if ($.fn.datetimepicker) { $(this.$el).find('.date, .datetime, .time').each(function () { $(this).datetimepicker('hide').datetimepicker('destroy'); }); } }, methods: { forceLoadingOverlay: function () { loader('.quick-checkout-wrapper', true); }, saveDateTime: function (path, key, event) { this.order_data[path][key] = event.target.value; }, ajax: function (obj) { if (obj.data && obj.data.order_data) { obj.data = JSON.parse(JSON.stringify(obj.data)); obj.data.order_data.products = undefined; } return $.ajax($.extend({ cache: false, type: 'post', dataType: 'json', beforeSend: function () { $('#quick-checkout-button-confirm, #button-login').jbutton('loading'); }, error: function (xhr, ajaxOptions, thrownError) { $('#quick-checkout-button-confirm, #button-login').jbutton('reset'); loader('.quick-checkout-wrapper', false); if (xhr.statusText !== 'abort') { console.warn(thrownError + '\r\n' + xhr.statusText + '\r\n' + xhr.responseText); } } }, obj)); }, payment: function () { if (window['_QuickCheckoutAjaxPayment']) { window['_QuickCheckoutAjaxPayment'].abort(); } // don't load payments defined in admin as popup loadable if (this.quickCheckoutPaymentsPopup && this.quickCheckoutPaymentsPopup.includes(this.order_data.payment_code)) { loader('.quick-checkout-wrapper', false); $('#quick-checkout-button-confirm, #button-login').jbutton('reset'); $('.quick-checkout-payment').html(''); return; } window['_QuickCheckoutPaymentData'] = {}; $('.quick-checkout-payment').find('input[type="text"], input[type="checkbox"], input[type="radio"], select').each(function () { window['_QuickCheckoutPaymentData'][$(this).attr('name')] = $(this).val(); }); $('.quick-checkout-payment').append('
'); window['_QuickCheckoutAjaxPayment'] = this.ajax({ type: 'get', dataType: 'html', url: 'index.php?route=journal3/checkout/payment', success: function (data) { $('.quick-checkout-payment').html(data); $.each(window['_QuickCheckoutPaymentData'], function (k, v) { $('.quick-checkout-payment').find('[name="' + k + '"]').val(v); }); window['_QuickCheckoutAjaxPayment'] = null; $('#quick-checkout-button-confirm, #button-login').jbutton('reset'); loader('.quick-checkout-wrapper', false); } }) }, paymentIframe: function () { var $html = $('html'); var $body = $('body'); // remove details from one page checkout page so javascript payment scripts are reinitialized $('.journal-loading-overlay').remove(); $('.quick-checkout-payment').html(''); // generate popup markup var html = ''; html += ''; // show modal $('.popup-wrapper').remove(); $body.append(html); setTimeout(function () { $html.addClass('popup-open popup-center'); $('.popup-checkout-payment .popup-close').on('click', function () { $('#quick-checkout-button-confirm, #button-login').jbutton('reset'); }); }, 10); if (window['_QuickCheckoutAjaxPaymentIframe']) { window['_QuickCheckoutAjaxPaymentIframe'].abort(); } window['_QuickCheckoutAjaxPaymentIframe'] = this.ajax({ type: 'get', dataType: 'html', url: 'index.php?route=journal3/checkout/payment', success: function (data) { $('.popup-checkout-payment .popup-content').html(data); $('.popup-checkout-payment').addClass('popup-checkout-loaded'); window['_QuickCheckoutAjaxPaymentIframe'] = null; setTimeout(function () { $('#quick-checkout-button-confirm, #button-login').jbutton('reset'); }, 100); } }); }, updateCartItemQuantity: function (index, value) { this.$data.products[index].quantity = parseInt(this.$data.products[index].quantity) + parseInt(value); this.updateCartItem(this.$data.products[index]); }, updateCartItemQuantityValue: function (index, value) { this.$data.products[index].quantity = parseInt(value); this.updateCartItem(this.$data.products[index]); }, updateCartItem: function (product) { var self = this; this.ajax({ url: 'index.php?route=journal3/checkout/cart_update', data: { checkout_id: this.checkout_id, key: product.cart_id, quantity: product.quantity, account: this.account, order_data: this.order_data, password: this.password, password2: this.password2, same_address: this.same_address, newsletter: this.newsletter, privacy: this.privacy, agree: this.agree, payment_address_type: this.payment_address_type, shipping_address_type: this.shipping_address_type, coupon: this.coupon, voucher: this.voucher, reward: this.reward }, success: function (json) { self.update(json); } }); }, deleteCartItem: function (product) { var self = this; this.ajax({ url: 'index.php?route=journal3/checkout/cart_delete', data: { checkout_id: this.checkout_id, key: product.cart_id, account: this.account, order_data: this.order_data, password: this.password, password2: this.password2, same_address: this.same_address, newsletter: this.newsletter, privacy: this.privacy, agree: this.agree, payment_address_type: this.payment_address_type, shipping_address_type: this.shipping_address_type, coupon: this.coupon, voucher: this.voucher, reward: this.reward }, success: function (json) { self.update(json); } }); }, applyCoupon: function () { this.save(); }, applyVoucher: function () { this.save(); }, applyReward: function () { this.save(); }, changeAddressType: function (type, value) { if (value === 'new') { this.$data.order_data[type + '_address_id'] = ''; } else { this.$data.order_data[type + '_address_id'] = this.default_address_id; } }, save: function (confirm) { this.error = {}; if (window['_QuickCheckoutAjaxSave']) { window['_QuickCheckoutAjaxSave'].abort(); } if (confirm) { loader('.quick-checkout-wrapper', true); } var data = JSON.parse(JSON.stringify({ checkout_id: this.checkout_id, account: this.account, order_data: this.order_data, password: this.password, password2: this.password2, same_address: this.same_address, newsletter: this.newsletter, privacy: this.privacy, agree: this.agree, payment_address_type: this.payment_address_type, shipping_address_type: this.shipping_address_type, coupon: this.coupon, voucher: this.voucher, reward: this.reward })); data['order_data']['comment'] = $('.section-comments textarea').val(); data['captcha'] = $('[name="captcha"]').val(); data['g-recaptcha-response'] = $('[name="g-recaptcha-response"]').val(); window['_QuickCheckoutAjaxSave'] = this.ajax({ url: 'index.php?route=journal3/checkout/save' + (confirm ? '&confirm=true' : ''), data: data, success: function (json) { window['_QuickCheckoutAjaxSave'] = null; this.update(json, confirm); }.bind(this) }); }, update: function (json, confirm) { if (json.response.redirect) { window.location = json.response.redirect; } else { this.custom_fields = json.response.custom_fields; this.shipping_methods = json.response.shipping_methods; this.payment_methods = json.response.payment_methods; this.shipping_zones = json.response.shipping_zones; this.payment_zones = json.response.payment_zones; this.order_data.shipping_code = json.response.order_data.shipping_code; this.order_data.payment_code = json.response.order_data.payment_code; this.order_data.shipping_country_id = json.response.order_data.shipping_country_id; this.order_data.payment_country_id = json.response.order_data.payment_country_id; this.order_data.shipping_zone_id = json.response.order_data.shipping_zone_id; this.order_data.payment_zone_id = json.response.order_data.payment_zone_id; this.totals = json.response.totals; this.products = json.response.products; this.stock_warning = json.response.stock_warning; this.vouchers = json.response.vouchers; this.$data.total = json.response.total; this.session = json.response.session; this.error = json.response.error; this.coupon_message = json.response.coupon_message; this.voucher_message = json.response.voucher_message; this.reward_message = json.response.reward_message; $('#cart-total').html(json.response.total); $('.cart-content > ul').html($(json.response.cart).find('.cart-content > ul').html()); $('#cart-items.count-badge').html(json.response.total_items); if (json.response.error) { $('#quick-checkout-button-confirm').jbutton('reset'); loader('.quick-checkout-wrapper', false); try { console.error(JSON.stringify(json.response.error, null, 2)); } catch (e) { } if (json.response.error.payment_code) { alert(json.response.error.payment_code); } if (json.response.error.shipping_code) { alert(json.response.error.shipping_code); } if (json.response.error.total_mismatch) { alert(json.response.error.total_mismatch); window.location.reload(); } setTimeout(function () { try { $('html, body').animate({ scrollTop: $('.left .form-group .text-danger').closest('.form-group').offset().top - 50 }, 'slow'); } catch (e) { } }, 300); } else { if (confirm) { var btns = ['input[type="button"]', 'input[type="submit"]', 'button[type="submit"]', '#button-confirm', '.buttons a']; var $btn = $('.quick-checkout-payment').find(btns.join(', ')).first(); if ((this.quickCheckoutPaymentsPopup && this.quickCheckoutPaymentsPopup.includes(this.order_data.payment_code)) || !$btn.length) { this.paymentIframe(); } else { if ($btn.attr('href')) { window.location = $btn.attr('href'); } else { $btn.trigger('click'); } } } else { this.payment(); } } } }, login: function () { var data = { email: this.login_email, password: this.login_password }; this.ajax({ url: Journal['loginUrl'], data: data, success: function (json) { if (json.status === 'success') { parent.window.location.reload(); } else { $('#quick-checkout-button-confirm, #button-login').jbutton('reset'); if (json.response.warning) { alert(json.response.warning); } } } }); }, srcSet: function (image, image2x) { return image + ' 1x, ' + image2x + ' 2x' }, upload: function (path, key, event) { var node = this; $('#form-upload').remove(); $('body').prepend(''); $('#form-upload input[name=\'file\']').trigger('click'); if (typeof timer != 'undefined') { clearInterval(timer); } timer = setInterval(function () { if ($('#form-upload input[name=\'file\']').val() != '') { clearInterval(timer); $.ajax({ url: 'index.php?route=tool/upload', type: 'post', dataType: 'json', data: new FormData($('#form-upload')[0]), cache: false, contentType: false, processData: false, beforeSend: function () { $('#quick-checkout-button-confirm, #button-login, .custom-field button').jbutton('loading'); }, complete: function () { $('#quick-checkout-button-confirm, #button-login, .custom-field button').jbutton('reset'); }, success: function (json) { $('.text-danger').remove(); if (json['error']) { alert(json['error']); } if (json['success']) { node.order_data[path][key] = json['code']; node.save(); alert(json['success']); } }, error: function (xhr, ajaxOptions, thrownError) { alert(thrownError + '\r\n' + xhr.statusText + '\r\n' + xhr.responseText); } }); } }, 500); } }, watch: { order_data: { handler: function () { var self = this; clearTimeout(this.timeout); if (!window['_QuickCheckoutAjaxSave']) { this.timeout = setTimeout(function () { self.save(); }, 700); } }, deep: true } } }); }); $(document).ajaxSuccess(function (event, xhr, settings, data) { if (settings.dataType === 'json') { if (data && data.error) { $('#quick-checkout-button-confirm').jbutton('reset'); _QuickCheckout.payment(); } } }); function triggerLoadingOn() { $('#quick-checkout-button-confirm, #button-login').jbutton('loading'); } function triggerLoadingOff() { $('#quick-checkout-button-confirm, #button-login').jbutton('reset'); loader('.quick-checkout-wrapper', false); }