(function (context, $) { "use strict"; context.JK = context.JK || {}; context.JK.CheckoutOrderScreen = function (app) { var EVENTS = context.JK.EVENTS; var logger = context.JK.logger; var rest = context.JK.Rest(); var jamTrackUtils = context.JK.JamTrackUtils; var checkoutUtils = context.JK.CheckoutUtilsInstance; var $screen = null; var $navigation = null; var $templateOrderContent = null; var $orderPanel = null; var $orderContent = null; var userDetail = null; var step = null; var $backBtn = null; var $orderPrompt = null; var $emptyCartPrompt = null; var $noAccountInfoPrompt = null; function beforeShow() { } function afterShow(data) { beforeShowOrder(); } function beforeHide() { } function beforeShowOrder() { $orderPrompt.addClass('hidden') $emptyCartPrompt.addClass('hidden') $noAccountInfoPrompt.addClass('hidden') $orderPanel.removeClass("hidden") $screen.find(".place-order").addClass('disabled').off('click', placeOrder) $("#order_error").text('').addClass("hidden") step = 3; renderNavigation(); populateOrderPage(); } function populateOrderPage() { clearOrderPage(); rest.getShoppingCarts() .done(function(carts) { rest.getBillingInfo() .done(function(billingInfo) { renderOrderPage(carts, billingInfo) }) .fail(function(jqXHR) { if(jqXHR.status == 404) { // no account for this user $noAccountInfoPrompt.removeClass('hidden') app.notify({ title: "No account information", text: "Please restart the checkout process." }, null, true); } }) }) .fail(app.ajaxError); } function renderOrderPage(carts, recurlyAccountInfo) { logger.debug("rendering order page") var data = {} var sub_total = 0.0 var taxes = 0.0 $.each(carts, function(index, cart) { sub_total += parseFloat(cart.product_info.real_price) }); if(carts.length == 0) { data.grand_total = '-.--' data.sub_total = '-.--' data.taxes = '-.--' data.shipping_handling = '-.--' } else { data.grand_total = 'Calculating...' data.sub_total = '$' + sub_total.toFixed(2) data.taxes = 'Calculating...' data.shipping_handling = '$0.00' } data.carts = carts data.billing_info = recurlyAccountInfo.billing_info data.shipping_info = recurlyAccountInfo.address data.shipping_as_billing = true; //jamTrackUtils.compareAddress(data.billing_info, data.shipping_info); var orderContentHtml = $( context._.template( $templateOrderContent.html(), data, {variable: 'data'} ) ) $orderContent.append(orderContentHtml) $orderPanel.find(".change-payment-info").on('click', moveToPaymentInfo) var $placeOrder = $screen.find(".place-order") if(carts.length == 0) { $orderPrompt.addClass('hidden') $emptyCartPrompt.removeClass('hidden') $noAccountInfoPrompt.addClass('hidden') $placeOrder.addClass('disabled').unbind('click').on('click', false) } else { logger.debug("cart has " + carts.length + " items in it") $orderPrompt.removeClass('hidden') $emptyCartPrompt.addClass('hidden') $noAccountInfoPrompt.addClass('hidden') if(gon.global.purchases_enabled || context.JK.currentUserAdmin) { $placeOrder.removeClass('disabled').unbind('click').on('click', placeOrder) } else { $placeOrder.addClass('disabled').unbind('click').on('click', false) } estimateTaxes(carts, recurlyAccountInfo.billing_info); } } function displayTax(effectiveQuantity, item_tax, total_with_tax) { var totalTax = 0; var totalPrice = 0; var unitTax = item_tax * effectiveQuantity; totalTax += unitTax; var totalUnitPrice = total_with_tax * effectiveQuantity; totalPrice += totalUnitPrice; $screen.find('.order-right-page .order-items-value.taxes').text('$' + totalTax.toFixed(2)) $screen.find('.order-right-page .order-items-value.grand-total').text('$' + totalPrice.toFixed(2)) } function estimateTaxes(carts, billing_info) { var planPricing = {} var priceElement = $screen.find('.order-right-page .plan.jamtrack') if(priceElement.length == 0) { logger.error("unable to find price element for jamtrack"); app.notify({title: "Error Encountered", text: "Unable to find plan info for jam track"}) return false; } logger.debug("creating recurly pricing element for plan: " + gon.recurly_tax_estimate_jam_track_plan) var effectiveQuantity = 0 context._.each(carts, function(cart) { effectiveQuantity += cart.product_info.quantity - cart.product_info.marked_for_redeem }) if (gon.global.estimate_taxes) { var state = billing_info.state; var country = billing_info.country; if (state) { state = state.toLowerCase(); } if (country) { country = country.toLowerCase(); } var taxRate = 0; if (state && country && (state == 'tx' || state == 'texas') && country == 'us') { taxRate = 0.0825; } var unitTax = 1.99 * taxRate; displayTax(effectiveQuantity, unitTax, 1.99 + unitTax) } else { checkoutUtils.configureRecurly() var pricing = context.recurly.Pricing(); pricing.plan_code = gon.recurly_tax_estimate_jam_track_plan; pricing.resolved = false; pricing.effective_quantity = 1 // this is called when the plan is resolved against Recurly. It will have tax info, which is the only way we can get it. pricing.on('change', function(price) { logger.debug("pricing", pricing) displayTax(effectiveQuantity, Number(pricing.price.now.tax), Number(pricing.price.now.total)); }) pricing.attach(priceElement.eq(0)) } } function moveToPaymentInfo() { context.location = '/client#/checkoutPayment'; return false; } function placeOrder(e) { e.preventDefault(); $screen.find(".place-order").off('click').addClass('disabled') $("#order_error").text('').addClass("hidden") rest.placeOrder() .done(moveToThanks) .fail(orderErrorHandling); } function orderErrorHandling(xhr, ajaxOptions, thrownError) { if (xhr && xhr.responseJSON) { var message = "Error submitting payment: " $.each(xhr.responseJSON.errors, function (key, error) { message += key + ": " + error }) $("#order_error").text(message).removeClass("hidden") } else { $("#order_error").text(xhr.responseText).removeClass("hidden") } $screen.find(".place-order").on('click', placeOrder).removeClass('disabled') } function moveToThanks(purchaseResponse) { checkoutUtils.setLastPurchase(purchaseResponse) checkoutUtils.deletePreserveBillingInfo() $("#order_error").addClass("hidden") $orderPanel.addClass("hidden") checkoutUtils.deletePreserveBillingInfo() //$thanksPanel.removeClass("hidden") jamTrackUtils.checkShoppingCart() app.refreshUser() window.location = '/client#/checkoutComplete' } function clearOrderPage() { $orderContent.empty(); } function renderNavigation() { $navigation.html(""); var navigationHtml = $( context._.template( $('#template-checkout-navigation').html(), {current: step, purchases_disable_class: gon.global.purchases_enabled ? 'hidden' : ''}, {variable: 'data'} ) ); $navigation.append(navigationHtml); } function events() { $backBtn.on('click', function(e) { e.preventDefault(); context.location = '/client#/checkoutPayment' }) } function initialize() { var screenBindings = { 'beforeShow': beforeShow, 'afterShow': afterShow, 'beforeHide': beforeHide }; app.bindScreen('checkoutOrder', screenBindings); $screen = $("#checkoutOrderScreen"); $navigation = $screen.find(".checkout-navigation-bar"); $templateOrderContent = $("#template-order-content"); $orderPanel = $screen.find(".order-panel"); $backBtn = $screen.find('.back'); $orderPrompt = $screen.find('.order-prompt'); $emptyCartPrompt = $screen.find('.empty-cart-prompt'); $noAccountInfoPrompt = $screen.find('.no-account-info-prompt'); $orderContent = $orderPanel.find(".order-content"); if ($screen.length == 0) throw "$screen must be specified"; if ($navigation.length == 0) throw "$navigation must be specified"; events(); } this.initialize = initialize; return this; } }) (window, jQuery);