var PCP_PAYMENT_ITEMTYPE = 50; var PCP_PAYPAL = "paypal"; var PCP_CARD = "card"; var W_LEFT = (screen.width/2) - 250; var W_TOP = (screen.height/2) - 375; var TARGET_ELEMENT = "paypal-button-container"; Fluid.resources.addPluginListener('beforeSubmitEndOrder', function(ev, data, oneStepCheckout) { if (typeof data.preventSubmit != "undefined" && data.preventSubmit) { return false; } if (data.find('.paymentSystemSelector:checked').length == 0) { return false; } var selected = data.find('.paymentSystemSelector:checked'); if (selected.attr("data-itemType") == PCP_PAYMENT_ITEMTYPE) { ev.preventDefault(); data.preventSubmit = true; var paymentType = selected.attr("data-method") || ""; if (paymentType == PCP_PAYPAL) { runPayPal(); } else if (paymentType == PCP_CARD) { runAdvancedCards(); } else { redirectToDeniedOrder(); } } }, true); var runPayPal = function() { document.getElementById(TARGET_ELEMENT).style.display = "block"; document.body.style.overflow = 'hidden'; $.post('/checkout/endOrder', {}, function(response) { if (response.statusCode == 200 && response.response.data.status == "CREATED" && response.response.data.links.length) { var links = response.response.data.links.filter(function(el){ return el.rel == "approve" }); if (links.length) { var approveUrl = links[0].href; alert(languageSheet.PPCP_CompletePurchase); pp = window.open(approveUrl); var timer = setInterval(function() { if(pp.closed) { clearInterval(timer); document.body.style.overflow = ''; document.getElementById(TARGET_ELEMENT).style.display = "none"; var data = JSON.stringify({ "orderId":response.response.data.id, "paypalCommerce":true }); $.ajax({ type: "POST", url: "/checkout/asyncOrder", data: data, success: function(response){ if (response.error) { redirectToDeniedOrder(); } else { redirectToConfirmOrder(response.transactionId); } }, error:function(response){ redirectToDeniedOrder(); }, contentType: "application/json", dataType: "json" }); } }, 500); } else { redirectToDeniedOrder(); } } else { redirectToDeniedOrder(); } }); }; var runAdvancedCards = function() { var loadScript = function(response) { script = document.createElement('script'); script.type = 'text/javascript'; script.async = true; script.onload = function(){ if (typeof paypal !== 'undefined') { loadPaymentForm(); } else { redirectToDeniedOrder(); } }; script.src = response.src; script.setAttribute('data-client-token', response.clientToken); script.setAttribute('data-partner-attribution-id', response.bnCode); document.getElementsByTagName('head')[0].appendChild(script); }; var loadPaymentForm = function() { if (paypal.HostedFields.isEligible() === true) { $('#modal-paypal-container').css("display","none"); $('#paypalLoading').css("display","none"); paypal.HostedFields.render({ createOrder: () => { return fetch("/checkout/endOrder", { method: 'post', headers: { 'content-type': 'application/json' } }).then(function(res) { return res.json(); }).then(function(data) { return data.response.data.id; }); }, styles: getPaymentCardStyles(), fields: getPaymentCardFields() }) .then((hostedFields) => { hostedFields.on('focus', function(event){ if (event.fields[event.emittedBy].isValid) { hostedFields.removeClass(event.emittedBy, 'validation-error'); } }); hostedFields.on('blur', function(event){ if (event.fields[event.emittedBy].isValid) { hostedFields.removeClass(event.emittedBy, 'validation-error'); } }); document.querySelector('#paypalCommerce-card-form').addEventListener('submit', (event) => { $('#modal-paypal-container').css("display","block"); $('#paypalLoading').css("display","block"); $('#ppcpAdvancedCardsBtn').prop("disabled", true); event.preventDefault(); var state = hostedFields.getState(); var formValid = Object.keys(state.fields).every(function(key){ return state.fields[key].isValid; }); if (formValid) { hostedFields.submit({ contingencies:['SCA_WHEN_REQUIRED'] }).then(payload => { if (payload.liabilityShift !== undefined && payload.liabilityShift != null) { if (payload.liabilityShift != 'YES' && payload.liabilityShift != 'POSSIBLE') { redirectToDeniedOrder(); return; } } return fetch('/checkout/asyncOrder', { method: 'POST', body: JSON.stringify({paypalCommerce:true, orderId:payload.orderId}) }).then(response => { return response.json(); }).then(function(data){ if (data.error) { redirectToDeniedOrder(); } else { redirectToConfirmOrder(data.transactionId); } }); }); } else { if (state.fields.number.isEmpty || !state.fields.number.isValid) { hostedFields.addClass('number', 'validation-error'); } if (state.fields.expirationDate.isEmpty || !state.fields.expirationDate.isValid) { hostedFields.addClass('expirationDate', 'validation-error'); } if (state.fields.cvv.isEmpty || !state.fields.cvv.isValid) { hostedFields.addClass('cvv', 'validation-error'); } $('#ppcpAdvancedCardsBtn').prop("disabled", false); $('#modal-paypal-container').css("display","none"); $('#paypalLoading').css("display","none"); } }); }); } else { redirectToDeniedOrder(); } } var onLoadModal = function() { var data = JSON.stringify({ "action":"getClientToken", "paypalCommerce":true }); $.ajax({ type: "POST", url: "/checkout/asyncOrder", data: data, success: function(response){ if (response.error) { redirectToDeniedOrder(); } else { loadScript(response); } }, error:function(response){ redirectToDeniedOrder(); }, contentType: "application/json", dataType: "json" }); }; $('').appendTo($(document.body)).box({ uid: 'modalPayPalForm', triggerOnClick: false, showFooter: false, source: '/snippets/paypal', type: 'url', callback : onLoadModal() }); }; var redirectToDeniedOrder = function() { window.location.href = "/checkout/deniedOrder"; }; var redirectToConfirmOrder = function(transactionId) { window.location.href = "/checkout/confirmOrder?pcp=1&transactionId=" + transactionId; }; var getPaymentCardStyles = function() { if (typeof paymentCardStyles != "undefined") { return paymentCardStyles; } else { return { 'input': { 'font-size': '20px', 'font-family': 'Calibri', 'color': '#3a3a3a' }, ':focus': { 'color': 'black' } } } } var getPaymentCardFields = function() { if (typeof paymentCardFields != "undefined") { return paymentCardFields; } else { return { number: { selector: '#card-number', placeholder: '4111 1111 1111 1111', }, cvv: { selector: '#cvv', placeholder: '111', }, expirationDate: { selector: '#expiration-date', placeholder: 'mm/yyyy', } } } }