Created
November 25, 2020 18:25
-
-
Save GiovanniCavallari/e41f9a122caae5e2f568f4d3e464268a to your computer and use it in GitHub Desktop.
Fix to MPv1.js for MLM
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| * MPv1 | |
| * Handlers Form Mercado Pago v1 | |
| * @version 1.0.4 | |
| */ | |
| (function () { | |
| var MPv1 = { | |
| debug: false, | |
| gateway_mode: false, | |
| add_truncated_card: true, | |
| site_id: '', | |
| public_key: '', | |
| coupon_of_discounts: { | |
| discount_action_url: '', | |
| payer_email: '', | |
| default: true, | |
| status: true | |
| }, | |
| customer_and_card: { | |
| default: false, | |
| status: false | |
| }, | |
| create_token_on: { | |
| event: true, //if true create token on event, if false create on click and ignore others events. eg: paste or keyup | |
| keyup: false, | |
| paste: true, | |
| }, | |
| inputs_to_create_discount: [ | |
| "couponCode", | |
| "applyCoupon" | |
| ], | |
| inputs_to_create_token: [ | |
| "cardNumber", | |
| "cardExpirationMonth", | |
| "cardExpirationYear", | |
| "cardholderName", | |
| "securityCode", | |
| "docType", | |
| "docNumber" | |
| ], | |
| inputs_to_create_token_customer_and_card: [ | |
| "paymentMethodSelector", | |
| "securityCode" | |
| ], | |
| selectors: { | |
| couponCode: "#couponCode", | |
| applyCoupon: "#applyCouponCard", | |
| mpCouponApplyed: "#mpCouponApplyed", | |
| mpCouponError: "#mpCouponError", | |
| paymentMethodSelector: "#paymentMethodSelector", | |
| pmCustomerAndCards: "#payment-methods-for-customer-and-cards", | |
| pmListOtherCards: "#payment-methods-list-other-cards", | |
| mpSecurityCodeCustomerAndCard: "#mp-securityCode-customer-and-card", | |
| cardNumber: "#cardNumber", | |
| cardExpirationMonth: "#cardExpirationMonth", | |
| cardExpirationYear: "#cardExpirationYear", | |
| cardholderName: "#cardholderName", | |
| securityCode: "#securityCode", | |
| docType: "#docType", | |
| docNumber: "#docNumber", | |
| issuer: "#issuer", | |
| installments: "#installments", | |
| mpDoc: ".mp-doc", | |
| mpIssuer: ".mp-issuer", | |
| mpDocType: ".mp-docType", | |
| mpDocNumber: ".mp-docNumber", | |
| paymentMethodId: "#paymentMethodId", | |
| amount: "#amount", | |
| token: "#token", | |
| campaign_id: "#campaign_id", | |
| campaign: "#campaign", | |
| discount: "#discount", | |
| cardTruncated: "#cardTruncated", | |
| site_id: "#site_id", | |
| CustomerAndCard: '#CustomerAndCard', | |
| MpGatewayMode: '#MpGatewayMode', | |
| boxInstallments: '#mp-box-installments', | |
| boxInstallmentsSelector: '#mp-box-installments-selector', | |
| taxCFT: '#mp-box-input-tax-cft', | |
| taxTEA: '#mp-box-input-tax-tea', | |
| taxTextCFT: '#mp-tax-cft-text', | |
| taxTextTEA: '#mp-tax-tea-text', | |
| box_loading: "#mp-box-loading", | |
| submit: "#btnSubmit", | |
| form: '#mercadopago-form', | |
| formDiv: '#mercadopago-form', | |
| formCoupon: '#mercadopago-form-coupon', | |
| formCustomerAndCard: '#mercadopago-form-customer-and-card', | |
| utilities_fields: "#mercadopago-utilities" | |
| }, | |
| text: { | |
| choose: "Choose", | |
| other_bank: "Other Bank", | |
| discount_info1: "You will save", | |
| discount_info2: "with discount from", | |
| discount_info3: "Total of your purchase:", | |
| discount_info4: "Total of your purchase with discount:", | |
| discount_info5: "*Uppon payment approval", | |
| discount_info6: "Terms and Conditions of Use", | |
| coupon_empty: "Please, inform your coupon code", | |
| apply: "Apply", | |
| remove: "Remove" | |
| }, | |
| paths: { | |
| loading: "images/loading.gif", | |
| check: "images/check.png", | |
| error: "images/error.png" | |
| } | |
| } | |
| MPv1.currencyIdToCurrency = function (currency_id) { | |
| if (currency_id == 'ARS') { | |
| return '$'; | |
| } else if (currency_id == 'BRL') { | |
| return 'R$'; | |
| } else if (currency_id == 'COP') { | |
| return '$'; | |
| } else if (currency_id == 'CLP') { | |
| return '$'; | |
| } else if (currency_id == 'MXN') { | |
| return '$'; | |
| } else if (currency_id == 'VEF') { | |
| return 'Bs'; | |
| } else if (currency_id == 'PEN') { | |
| return 'S/'; | |
| } else { | |
| return '$'; | |
| } | |
| } | |
| MPv1.checkCouponEligibility = function () { | |
| if (document.querySelector(MPv1.selectors.couponCode).value == "") { | |
| // coupon code is empty | |
| document.querySelector(MPv1.selectors.mpCouponApplyed).style.display = 'none'; | |
| document.querySelector(MPv1.selectors.mpCouponError).style.display = 'block'; | |
| document.querySelector(MPv1.selectors.mpCouponError).innerHTML = MPv1.text.coupon_empty; | |
| MPv1.coupon_of_discounts.status = false; | |
| document.querySelector(MPv1.selectors.couponCode).style.background = null; | |
| document.querySelector(MPv1.selectors.applyCoupon).value = MPv1.text.apply; | |
| document.querySelector(MPv1.selectors.discount).value = 0; | |
| MPv1.cardsHandler(); | |
| } else if (MPv1.coupon_of_discounts.status) { | |
| // we already have a coupon set, so we remove it | |
| document.querySelector(MPv1.selectors.mpCouponApplyed).style.display = 'none'; | |
| document.querySelector(MPv1.selectors.mpCouponError).style.display = 'none'; | |
| MPv1.coupon_of_discounts.status = false; | |
| document.querySelector(MPv1.selectors.applyCoupon).style.background = null; | |
| document.querySelector(MPv1.selectors.applyCoupon).value = MPv1.text.apply; | |
| document.querySelector(MPv1.selectors.couponCode).value = ""; | |
| document.querySelector(MPv1.selectors.couponCode).style.background = null; | |
| document.querySelector(MPv1.selectors.discount).value = 0; | |
| MPv1.cardsHandler(); | |
| } else { | |
| // set loading | |
| document.querySelector(MPv1.selectors.mpCouponApplyed).style.display = 'none'; | |
| document.querySelector(MPv1.selectors.mpCouponError).style.display = 'none'; | |
| document.querySelector(MPv1.selectors.couponCode).style.background = "url(" + MPv1.paths.loading + ") 98% 50% no-repeat #fff"; | |
| document.querySelector(MPv1.selectors.applyCoupon).disabled = true; | |
| var url = MPv1.coupon_of_discounts.discount_action_url | |
| var sp = "?"; | |
| //check if there are params in the url | |
| if (url.indexOf("?") >= 0) { | |
| sp = "&" | |
| } | |
| url += sp + "site_id=" + MPv1.site_id | |
| url += "&coupon_id=" + document.querySelector(MPv1.selectors.couponCode).value | |
| url += "&amount=" + document.querySelector(MPv1.selectors.amount).value | |
| url += "&payer=" + MPv1.coupon_of_discounts.payer_email | |
| MPv1.AJAX({ | |
| url: url, | |
| method: "GET", | |
| timeout: 30000, | |
| error: function () { | |
| // request failed | |
| document.querySelector(MPv1.selectors.mpCouponApplyed).style.display = 'none'; | |
| document.querySelector(MPv1.selectors.mpCouponError).style.display = 'none'; | |
| MPv1.coupon_of_discounts.status = false; | |
| document.querySelector(MPv1.selectors.applyCoupon).style.background = null; | |
| document.querySelector(MPv1.selectors.applyCoupon).value = MPv1.text.apply; | |
| document.querySelector(MPv1.selectors.couponCode).value = ""; | |
| document.querySelector(MPv1.selectors.couponCode).style.background = null; | |
| document.querySelector(MPv1.selectors.discount).value = 0; | |
| document.querySelector(MPv1.selectors.applyCoupon).disabled = false; | |
| MPv1.cardsHandler(); | |
| }, | |
| success: function (status, response) { | |
| if (response.status == 200) { | |
| document.querySelector(MPv1.selectors.mpCouponApplyed).style.display = 'block'; | |
| document.querySelector(MPv1.selectors.discount).value = response.response.coupon_amount; | |
| document.querySelector(MPv1.selectors.mpCouponApplyed).innerHTML = | |
| MPv1.text.discount_info1 + " <strong>" + MPv1.currencyIdToCurrency(response.response.currency_id) + " " + | |
| Math.round(response.response.coupon_amount * 100) / 100 + "</strong> " + MPv1.text.discount_info2 + " " + response.response.name + ".<br>" + | |
| MPv1.text.discount_info3 + " <strong>" + MPv1.currencyIdToCurrency(response.response.currency_id) + | |
| " " + Math.round(MPv1.getAmountWithoutDiscount() * 100) / 100 + "</strong><br>" + | |
| MPv1.text.discount_info4 + " <strong>" + MPv1.currencyIdToCurrency(response.response.currency_id) + | |
| " " + Math.round(MPv1.getAmount() * 100) / 100 + "*</strong><br>" + | |
| "<i>" + MPv1.text.discount_info5 + "</i><br>" + | |
| "<a href='https://api.mercadolibre.com/campaigns/" + response.response.id + "/terms_and_conditions?format_type=html' target='_blank'>" + | |
| MPv1.text.discount_info6 + "</a>"; | |
| document.querySelector(MPv1.selectors.mpCouponError).style.display = 'none'; | |
| MPv1.coupon_of_discounts.status = true; | |
| document.querySelector(MPv1.selectors.couponCode).style.background = null; | |
| document.querySelector(MPv1.selectors.couponCode).style.background = "url(" + MPv1.paths.check + ") 98% 50% no-repeat #fff"; | |
| document.querySelector(MPv1.selectors.applyCoupon).value = MPv1.text.remove; | |
| MPv1.cardsHandler(); | |
| document.querySelector(MPv1.selectors.campaign_id).value = response.response.id; | |
| document.querySelector(MPv1.selectors.campaign).value = response.response.name; | |
| } else if (response.status == 400 || response.status == 404) { | |
| document.querySelector(MPv1.selectors.mpCouponApplyed).style.display = 'none'; | |
| document.querySelector(MPv1.selectors.mpCouponError).style.display = 'block'; | |
| document.querySelector(MPv1.selectors.mpCouponError).innerHTML = response.response.message; | |
| MPv1.coupon_of_discounts.status = false; | |
| document.querySelector(MPv1.selectors.couponCode).style.background = null; | |
| document.querySelector(MPv1.selectors.couponCode).style.background = "url(" + MPv1.paths.error + ") 98% 50% no-repeat #fff"; | |
| document.querySelector(MPv1.selectors.applyCoupon).value = MPv1.text.apply; | |
| document.querySelector(MPv1.selectors.discount).value = 0; | |
| MPv1.cardsHandler(); | |
| } | |
| document.querySelector(MPv1.selectors.applyCoupon).disabled = false; | |
| } | |
| }); | |
| } | |
| } | |
| MPv1.getBin = function () { | |
| var cardSelector = document.querySelector(MPv1.selectors.paymentMethodSelector); | |
| if (cardSelector && cardSelector[cardSelector.options.selectedIndex].value != "-1") { | |
| var first_six_digits = cardSelector[cardSelector.options.selectedIndex].getAttribute('first_six_digits'); | |
| if (first_six_digits) { | |
| return first_six_digits; | |
| } | |
| } | |
| var ccNumber = document.querySelector(MPv1.selectors.cardNumber); | |
| return ccNumber.value.replace(/[ .-]/g, '').slice(0, 6); | |
| } | |
| MPv1.clearOptions = function () { | |
| var bin = MPv1.getBin(); | |
| if (bin.length == 0) { | |
| MPv1.hideIssuer(); | |
| var selectorInstallments = document.querySelector(MPv1.selectors.installments), | |
| fragment = document.createDocumentFragment(), | |
| option = new Option(MPv1.text.choose + "...", '-1'); | |
| selectorInstallments.options.length = 0; | |
| fragment.appendChild(option); | |
| selectorInstallments.appendChild(fragment); | |
| selectorInstallments.setAttribute('disabled', 'disabled'); | |
| } | |
| } | |
| MPv1.guessingPaymentMethod = function (event) { | |
| var bin = MPv1.getBin(); | |
| var amount = MPv1.getAmount(); | |
| if (event.type == "keyup") { | |
| if (bin != null && bin.length == 6) { | |
| Mercadopago.getPaymentMethod({ | |
| "bin": bin | |
| }, MPv1.setPaymentMethodInfo); | |
| } | |
| } else { | |
| setTimeout(function () { | |
| if (bin.length >= 6) { | |
| Mercadopago.getPaymentMethod({ | |
| "bin": bin | |
| }, MPv1.setPaymentMethodInfo); | |
| } | |
| }, 100); | |
| } | |
| }; | |
| MPv1.setPaymentMethodInfo = function (status, response) { | |
| if (status == 200) { | |
| //guessing | |
| document.querySelector(MPv1.selectors.paymentMethodId).value = response[0].id; | |
| document.querySelector(MPv1.selectors.cardNumber).style.background = "url(" + response[0].secure_thumbnail + ") 98% 50% no-repeat #fff"; | |
| // check if the security code (ex: Tarshop) is required | |
| var cardConfiguration = response[0].settings; | |
| var bin = MPv1.getBin(); | |
| var amount = MPv1.getAmount(); | |
| Mercadopago.getInstallments({ | |
| "bin": bin, | |
| "amount": amount | |
| }, MPv1.setInstallmentInfo); | |
| // check if the issuer is necessary to pay | |
| var issuerMandatory = false, | |
| additionalInfo = response[0].additional_info_needed; | |
| for (var i = 0; i < additionalInfo.length; i++) { | |
| if (additionalInfo[i] == "issuer_id") { | |
| issuerMandatory = true; | |
| } | |
| } | |
| if (issuerMandatory) { | |
| var payment_method_id = response[0].id; | |
| MPv1.getIssuersPaymentMethod(payment_method_id); | |
| } else { | |
| MPv1.hideIssuer(); | |
| } | |
| } | |
| } | |
| MPv1.changePaymetMethodSelector = function () { | |
| var payment_method_id = document.querySelector(MPv1.selectors.paymentMethodSelector).value; | |
| MPv1.getIssuersPaymentMethod(payment_method_id); | |
| } | |
| /* | |
| * Issuers | |
| */ | |
| MPv1.getIssuersPaymentMethod = function (payment_method_id) { | |
| if (payment_method_id != -1) { | |
| var amount = MPv1.getAmount(); | |
| //flow: MLM mercadopagocard & amex | |
| if (payment_method_id == 'mercadopagocard' || (MPv1.site_id == "MLM" && payment_method_id == 'amex')) { | |
| Mercadopago.getInstallments({ | |
| "payment_method_id": payment_method_id, | |
| "amount": amount | |
| }, MPv1.setInstallmentInfo); | |
| } | |
| Mercadopago.getIssuers(payment_method_id, MPv1.showCardIssuers); | |
| MPv1.addListenerEvent(document.querySelector(MPv1.selectors.issuer), 'change', MPv1.setInstallmentsByIssuerId); | |
| } | |
| } | |
| MPv1.showCardIssuers = function (status, issuers) { | |
| //if the API does not return any bank | |
| if (issuers.length > 0) { | |
| /** INIT Gateway Mode **/ | |
| var list_aggregator = []; | |
| var list_gateway = []; | |
| issuers.forEach(function (issuer) { | |
| if (issuer.processing_mode == 'gateway') { | |
| list_gateway.push(issuer); | |
| } else { | |
| list_aggregator.push(issuer); | |
| } | |
| }); | |
| if (MPv1.gateway_mode) { | |
| issuers = list_gateway; | |
| } else { | |
| issuers = list_aggregator; | |
| } | |
| /** END Gateway Mode **/ | |
| var issuersSelector = document.querySelector(MPv1.selectors.issuer), | |
| fragment = document.createDocumentFragment(); | |
| issuersSelector.options.length = 0; | |
| var option = new Option(MPv1.text.choose + "...", '-1'); | |
| fragment.appendChild(option); | |
| for (var i = 0; i < issuers.length; i++) { | |
| if (issuers[i].name != "default") { | |
| option = new Option(issuers[i].name, issuers[i].id); | |
| } else { | |
| option = new Option("Otro", issuers[i].id); | |
| } | |
| fragment.appendChild(option); | |
| } | |
| issuersSelector.appendChild(fragment); | |
| issuersSelector.removeAttribute('disabled'); | |
| //document.querySelector(MPv1.selectors.issuer).removeAttribute('style'); | |
| } else { | |
| MPv1.hideIssuer(); | |
| } | |
| } | |
| MPv1.setInstallmentsByIssuerId = function (status, response) { | |
| var issuerId = document.querySelector(MPv1.selectors.issuer).value; | |
| var amount = MPv1.getAmount(); | |
| if (issuerId == -1 || issuerId == "") { | |
| return; | |
| } | |
| var params_installments = { | |
| "bin": MPv1.getBin(), | |
| "amount": amount, | |
| "issuer_id": issuerId | |
| } | |
| if (MPv1.site_id == "MLM") { | |
| params_installments = { | |
| "payment_method_id": document.querySelector(MPv1.selectors.paymentMethodSelector).value, | |
| "amount": amount, | |
| "issuer_id": issuerId | |
| } | |
| } | |
| Mercadopago.getInstallments(params_installments, MPv1.setInstallmentInfo); | |
| } | |
| MPv1.hideIssuer = function () { | |
| var $issuer = document.querySelector(MPv1.selectors.issuer); | |
| var opt = document.createElement('option'); | |
| opt.value = "-1"; | |
| opt.innerHTML = MPv1.text.other_bank; | |
| $issuer.innerHTML = ""; | |
| $issuer.appendChild(opt); | |
| $issuer.setAttribute('disabled', 'disabled'); | |
| } | |
| /* | |
| * Installments | |
| */ | |
| MPv1.setInstallmentInfo = function (status, response) { | |
| var selectorInstallments = document.querySelector(MPv1.selectors.installments); | |
| var gateway_mode = MPv1.gateway_mode; | |
| if (response.length > 0) { | |
| var html_option = '<option value="-1">' + MPv1.text.choose + '...</option>'; | |
| payerCosts = response[0].payer_costs; | |
| if (gateway_mode) { | |
| for (var x in response) { | |
| var installments = response[x]; | |
| if (installments.processing_mode == 'gateway') { | |
| payerCosts = installments.payer_costs | |
| document.querySelector(MPv1.selectors.gateway_mode).value = installments.merchant_account_id; | |
| } | |
| } | |
| } | |
| // fragment.appendChild(option); | |
| for (var i = 0; i < payerCosts.length; i++) { | |
| // Resolution 51/2017 | |
| var dataInput = ""; | |
| if (MPv1.site_id == 'MLA') { | |
| var tax = payerCosts[i].labels; | |
| if (tax.length > 0) { | |
| for (var l = 0; l < tax.length; l++) { | |
| if (tax[l].indexOf('CFT_') !== -1) { | |
| dataInput = 'data-tax="' + tax[l] + '"' | |
| } | |
| } | |
| } | |
| } | |
| html_option += '<option value="' + payerCosts[i].installments + '" ' + dataInput + '>' + (payerCosts[i].recommended_message || payerCosts[i].installments) + '</option>'; | |
| } | |
| // not take the user's selection if equal | |
| if (selectorInstallments.innerHTML != html_option) { | |
| selectorInstallments.innerHTML = html_option; | |
| } | |
| selectorInstallments.removeAttribute('disabled'); | |
| MPv1.showTaxes(); | |
| } | |
| } | |
| /* | |
| * Customer & Cards | |
| */ | |
| MPv1.cardsHandler = function () { | |
| var cardSelector = document.querySelector(MPv1.selectors.paymentMethodSelector); | |
| if (cardSelector.options.selectedIndex < 0) { | |
| return; | |
| } | |
| var type_checkout = cardSelector[cardSelector.options.selectedIndex].getAttribute("type_checkout"); | |
| var amount = MPv1.getAmount(); | |
| if (MPv1.site_id == "MLM") { | |
| MPv1.setInstallmentsByIssuerId(); | |
| } | |
| } | |
| /* | |
| * Payment Methods | |
| */ | |
| MPv1.getPaymentMethods = function () { | |
| var fragment = document.createDocumentFragment(); | |
| var paymentMethodsSelector = document.querySelector(MPv1.selectors.paymentMethodSelector) | |
| var mainPaymentMethodSelector = document.querySelector(MPv1.selectors.paymentMethodSelector) | |
| //set loading | |
| mainPaymentMethodSelector.style.background = "url(" + MPv1.paths.loading + ") 95% 50% no-repeat #fff"; | |
| //if customer and card | |
| var paymentCustomerAndCard = document.querySelector(MPv1.selectors.pmCustomerAndCards) | |
| var customerCard = false; | |
| for (var x = 0; paymentMethodsSelector.length > x; x++) { | |
| if (paymentMethodsSelector[x].getAttribute("type_checkout") == 'customer_and_card') { | |
| customerCard = true; | |
| } | |
| } | |
| if (customerCard || MPv1.customer_and_card.status) { | |
| paymentMethodsSelector = document.querySelector(MPv1.selectors.pmListOtherCards) | |
| //clean payment methods | |
| paymentMethodsSelector.innerHTML = ""; | |
| } else { | |
| paymentMethodsSelector.innerHTML = ""; | |
| option = new Option(MPv1.text.choose + "...", '-1'); | |
| fragment.appendChild(option); | |
| } | |
| Mercadopago.getAllPaymentMethods(function (code, payment_methods) { | |
| for (var x = 0; x < payment_methods.length; x++) { | |
| var pm = payment_methods[x]; | |
| if ((pm.payment_type_id == "credit_card" || | |
| pm.payment_type_id == "debit_card" || | |
| pm.payment_type_id == "prepaid_card") && | |
| pm.status == "active") { | |
| option = new Option(pm.name, pm.id); | |
| option.setAttribute("type_checkout", "custom"); | |
| fragment.appendChild(option); | |
| } //end if | |
| } //end for | |
| paymentMethodsSelector.innerHTML = ""; | |
| paymentMethodsSelector.appendChild(fragment); | |
| mainPaymentMethodSelector.style.background = "#fff"; | |
| }); | |
| } | |
| /* | |
| * Functions related to Create Tokens | |
| */ | |
| MPv1.createTokenByEvent = function () { | |
| var $inputs = MPv1.getForm().querySelectorAll('[data-checkout]'); | |
| var $inputs_to_create_token = MPv1.getInputsToCreateToken(); | |
| for (var x = 0; x < $inputs.length; x++) { | |
| var element = $inputs[x]; | |
| //add events only in the required fields | |
| if ($inputs_to_create_token.indexOf(element.getAttribute("data-checkout")) > -1) { | |
| var event = "focusout"; | |
| if (element.nodeName == "SELECT") { | |
| event = "change"; | |
| } | |
| MPv1.addListenerEvent(element, event, MPv1.validateInputsCreateToken); | |
| //for firefox | |
| MPv1.addListenerEvent(element, "blur", MPv1.validateInputsCreateToken); | |
| if (MPv1.create_token_on.keyup) { | |
| MPv1.addListenerEvent(element, "keyup", MPv1.validateInputsCreateToken); | |
| } | |
| if (MPv1.create_token_on.paste) { | |
| MPv1.addListenerEvent(element, "paste", MPv1.validateInputsCreateToken); | |
| } | |
| } | |
| } | |
| } | |
| MPv1.createTokenBySubmit = function () { | |
| MPv1.addListenerEvent(document.querySelector(MPv1.selectors.form), 'submit', MPv1.doPay); | |
| } | |
| var doSubmit = false; | |
| MPv1.doPay = function (event) { | |
| event.preventDefault(); | |
| if (!doSubmit) { | |
| MPv1.createToken(); | |
| return false; | |
| } | |
| } | |
| MPv1.validateInputsCreateToken = function () { | |
| var valid_to_create_token = true; | |
| var $inputs = MPv1.getForm().querySelectorAll('[data-checkout]'); | |
| var $inputs_to_create_token = MPv1.getInputsToCreateToken(); | |
| for (var x = 0; x < $inputs.length; x++) { | |
| var element = $inputs[x]; | |
| //check is a input to create token | |
| if ($inputs_to_create_token.indexOf(element.getAttribute("data-checkout")) > -1) { | |
| if (element.value == -1 || element.value == "") { | |
| valid_to_create_token = false; | |
| } //end if check values | |
| } //end if check data-checkout | |
| }//end for | |
| if (valid_to_create_token) { | |
| MPv1.createToken(); | |
| } | |
| } | |
| MPv1.createToken = function () { | |
| MPv1.hideErrors(); | |
| //show loading | |
| document.querySelector(MPv1.selectors.box_loading).style.background = "url(" + MPv1.paths.loading + ") 0 50% no-repeat #fff"; | |
| //form | |
| var $form = MPv1.getForm(); | |
| Mercadopago.createToken($form, MPv1.sdkResponseHandler); | |
| return false; | |
| } | |
| MPv1.sdkResponseHandler = function (status, response) { | |
| var $form = MPv1.getForm(); | |
| document.querySelector(MPv1.selectors.box_loading).style.background = ""; | |
| if (status != 200 && status != 201) { | |
| MPv1.showErrors(response); | |
| } else { | |
| var token = document.querySelector(MPv1.selectors.token); | |
| token.value = response.id; | |
| if (MPv1.add_truncated_card) { | |
| var card = MPv1.truncateCard(response); | |
| document.querySelector(MPv1.selectors.cardTruncated).value = card; | |
| } | |
| if (!MPv1.create_token_on.event) { | |
| doSubmit = true; | |
| btn = document.querySelector(MPv1.selectors.form); | |
| btn.submit(); | |
| } | |
| } | |
| } | |
| /* | |
| * useful functions | |
| */ | |
| MPv1.resetBackgroundCard = function () { | |
| document.querySelector(MPv1.selectors.paymentMethodSelector).style.background = "no-repeat #fff"; | |
| document.querySelector(MPv1.selectors.cardNumber).style.background = "no-repeat #fff"; | |
| } | |
| MPv1.setForm = function () { | |
| if (MPv1.customer_and_card.status) { | |
| document.querySelector(MPv1.selectors.formDiv).style.display = 'none'; | |
| document.querySelector(MPv1.selectors.mpSecurityCodeCustomerAndCard).removeAttribute('style'); | |
| } else { | |
| document.querySelector(MPv1.selectors.mpSecurityCodeCustomerAndCard).style.display = 'none'; | |
| document.querySelector(MPv1.selectors.formDiv).removeAttribute('style'); | |
| } | |
| Mercadopago.clearSession(); | |
| if (MPv1.create_token_on.event) { | |
| MPv1.createTokenByEvent(); | |
| MPv1.validateInputsCreateToken(); | |
| } | |
| document.querySelector(MPv1.selectors.CustomerAndCard).value = MPv1.customer_and_card.status; | |
| } | |
| MPv1.getForm = function () { | |
| if (MPv1.customer_and_card.status) { | |
| return document.querySelector(MPv1.selectors.formCustomerAndCard); | |
| } else { | |
| return document.querySelector(MPv1.selectors.form); | |
| } | |
| } | |
| MPv1.getInputsToCreateToken = function () { | |
| if (MPv1.customer_and_card.status) { | |
| return MPv1.inputs_to_create_token_customer_and_card; | |
| } else { | |
| return MPv1.inputs_to_create_token; | |
| } | |
| } | |
| MPv1.truncateCard = function (response_card_token) { | |
| var first_six_digits; | |
| var last_four_digits; | |
| if (MPv1.customer_and_card.status) { | |
| var cardSelector = document.querySelector(MPv1.selectors.paymentMethodSelector); | |
| first_six_digits = cardSelector[cardSelector.options.selectedIndex].getAttribute("first_six_digits").match(/.{1,4}/g) | |
| last_four_digits = cardSelector[cardSelector.options.selectedIndex].getAttribute("last_four_digits") | |
| } else { | |
| first_six_digits = response_card_token.first_six_digits.match(/.{1,4}/g) | |
| last_four_digits = response_card_token.last_four_digits | |
| } | |
| var card = first_six_digits[0] + " " + first_six_digits[1] + "** **** " + last_four_digits; | |
| return card; | |
| } | |
| MPv1.getAmount = function () { | |
| return document.querySelector(MPv1.selectors.amount).value - document.querySelector(MPv1.selectors.discount).value; | |
| } | |
| MPv1.getAmountWithoutDiscount = function () { | |
| return document.querySelector(MPv1.selectors.amount).value; | |
| } | |
| /* | |
| * Show errors | |
| */ | |
| MPv1.showErrors = function (response) { | |
| var $form = MPv1.getForm(); | |
| for (var x = 0; x < response.cause.length; x++) { | |
| var error = response.cause[x]; | |
| var $span = $form.querySelector('#mp-error-' + error.code); | |
| if ($span) { | |
| var $input = $form.querySelector($span.getAttribute("data-main")); | |
| $span.style.display = 'inline-block'; | |
| $input.classList.add("mp-error-input"); | |
| } | |
| } | |
| return; | |
| } | |
| MPv1.hideErrors = function () { | |
| for (var x = 0; x < document.querySelectorAll('[data-checkout]').length; x++) { | |
| var $field = document.querySelectorAll('[data-checkout]')[x]; | |
| $field.classList.remove("mp-error-input"); | |
| } //end for | |
| for (var x = 0; x < document.querySelectorAll('.mp-error').length; x++) { | |
| var $span = document.querySelectorAll('.mp-error')[x]; | |
| $span.style.display = 'none'; | |
| } | |
| return; | |
| } | |
| /* | |
| * Add events to guessing | |
| */ | |
| MPv1.addListenerEvent = function (el, eventName, handler) { | |
| if (el.addEventListener) { | |
| el.addEventListener(eventName, handler); | |
| } else { | |
| el.attachEvent('on' + eventName, function () { | |
| handler.call(el); | |
| }); | |
| } | |
| }; | |
| MPv1.InitializeEvents = function () { | |
| MPv1.addListenerEvent(document.querySelector(MPv1.selectors.cardNumber), 'keyup', MPv1.guessingPaymentMethod); | |
| MPv1.addListenerEvent(document.querySelector(MPv1.selectors.cardNumber), 'keyup', MPv1.clearOptions); | |
| MPv1.addListenerEvent(document.querySelector(MPv1.selectors.cardNumber), 'change', MPv1.guessingPaymentMethod); | |
| } | |
| MPv1.showTaxes = function () { | |
| var selectorIsntallments = document.querySelector(MPv1.selectors.installments); | |
| var tax = selectorIsntallments.options[selectorIsntallments.selectedIndex].getAttribute('data-tax'); | |
| var cft = "" | |
| var tea = "" | |
| if (tax != null) { | |
| var tax_split = tax.split('|'); | |
| cft = tax_split[0].replace('_', ' '); | |
| tea = tax_split[1].replace('_', ' '); | |
| if (cft == "CFT 0,00%" && tea == "TEA 0,00%") { | |
| cft = "" | |
| tea = "" | |
| } | |
| } | |
| document.querySelector(MPv1.selectors.taxTextCFT).innerHTML = cft; | |
| document.querySelector(MPv1.selectors.taxTextTEA).innerHTML = tea; | |
| } | |
| /* | |
| * Utilities | |
| */ | |
| MPv1.referer = (function () { | |
| var referer = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port : ''); | |
| return referer; | |
| })(); | |
| MPv1.AJAX = function (options) { | |
| var useXDomain = !!window.XDomainRequest; | |
| var req = useXDomain ? new XDomainRequest() : new XMLHttpRequest() | |
| var data; | |
| options.url += (options.url.indexOf("?") >= 0 ? "&" : "?") + "referer=" + escape(MPv1.referer); | |
| options.requestedMethod = options.method; | |
| if (useXDomain && options.method == "PUT") { | |
| options.method = "POST"; | |
| options.url += "&_method=PUT"; | |
| } | |
| req.open(options.method, options.url, true); | |
| req.timeout = options.timeout || 1000; | |
| if (window.XDomainRequest) { | |
| req.onload = function () { | |
| data = JSON.parse(req.responseText); | |
| if (typeof options.success === "function") { | |
| options.success(options.requestedMethod === 'POST' ? 201 : 200, data); | |
| } | |
| }; | |
| req.onerror = req.ontimeout = function () { | |
| if (typeof options.error === "function") { | |
| options.error(400, {user_agent: window.navigator.userAgent, error: "bad_request", cause: []}); | |
| } | |
| }; | |
| req.onprogress = function () {}; | |
| } else { | |
| req.setRequestHeader('Accept', 'application/json'); | |
| if (options.contentType) { | |
| req.setRequestHeader('Content-Type', options.contentType); | |
| } else { | |
| req.setRequestHeader('Content-Type', 'application/json'); | |
| } | |
| req.onreadystatechange = function () { | |
| if (this.readyState === 4) { | |
| if (this.status >= 200 && this.status < 400) { | |
| // Success! | |
| data = JSON.parse(this.responseText); | |
| if (typeof options.success === "function") { | |
| options.success(this.status, data); | |
| } | |
| } else if (this.status >= 400) { | |
| data = JSON.parse(this.responseText); | |
| if (typeof options.error === "function") { | |
| options.error(this.status, data); | |
| } | |
| } else if (typeof options.error === "function") { | |
| options.error(503, {}); | |
| } | |
| } | |
| }; | |
| } | |
| if (options.method === 'GET' || options.data == null || options.data == undefined) { | |
| req.send(); | |
| } else { | |
| req.send(JSON.stringify(options.data)); | |
| } | |
| } | |
| /* | |
| * Initialization function | |
| */ | |
| MPv1.Initialize = function (site_id, public_key, coupon_mode, discount_action_url, payer_email) { | |
| //sets | |
| MPv1.site_id = site_id | |
| MPv1.public_key = public_key | |
| MPv1.coupon_of_discounts.default = coupon_mode | |
| MPv1.coupon_of_discounts.discount_action_url = discount_action_url | |
| MPv1.coupon_of_discounts.payer_email = payer_email | |
| Mercadopago.setPublishableKey(MPv1.public_key); | |
| //Initialize events | |
| MPv1.InitializeEvents(); | |
| // flow coupon of discounts | |
| if (MPv1.coupon_of_discounts.default) { | |
| MPv1.addListenerEvent(document.querySelector(MPv1.selectors.applyCoupon), 'click', MPv1.checkCouponEligibility); | |
| } else { | |
| document.querySelector(MPv1.selectors.formCoupon).style.display = 'none'; | |
| } | |
| //flow: customer & cards | |
| var selectorPmCustomerAndCards = document.querySelector(MPv1.selectors.pmCustomerAndCards); | |
| if (selectorPmCustomerAndCards && MPv1.customer_and_card.default && selectorPmCustomerAndCards.childElementCount > 0) { | |
| MPv1.addListenerEvent(document.querySelector(MPv1.selectors.paymentMethodSelector), 'change', MPv1.cardsHandler); | |
| MPv1.cardsHandler(); | |
| } else { | |
| //if customer & cards is disabled | |
| //or customer does not have cards | |
| MPv1.customer_and_card.status = false; | |
| document.querySelector(MPv1.selectors.formCustomerAndCard).style.display = 'none'; | |
| } | |
| if (MPv1.create_token_on.event) { | |
| MPv1.createTokenByEvent(); | |
| } else { | |
| MPv1.createTokenBySubmit() | |
| } | |
| //flow: MLM | |
| if (MPv1.site_id != "MLM") { | |
| Mercadopago.getIdentificationTypes(); | |
| } | |
| if (MPv1.site_id == "MLM") { | |
| //hide documento for mex | |
| document.querySelector(MPv1.selectors.mpDoc).style.display = 'none'; | |
| // document.querySelector(MPv1.selectors.mpPaymentMethodSelector).removeAttribute('style'); | |
| if (!MPv1.customer_and_card.status) { | |
| document.querySelector(MPv1.selectors.mpSecurityCodeCustomerAndCard).style.display = 'none'; | |
| } | |
| //document.querySelector(MPv1.selectors.formCustomerAndCard).removeAttribute('style'); | |
| //removing not used fields for this country | |
| if (MPv1.inputs_to_create_token.includes("docType")) { | |
| MPv1.inputs_to_create_token.splice(MPv1.inputs_to_create_token.indexOf("docType"), 1); | |
| } | |
| if (MPv1.inputs_to_create_token.includes("docNumber")) { | |
| MPv1.inputs_to_create_token.splice(MPv1.inputs_to_create_token.indexOf("docNumber"), 1); | |
| } | |
| MPv1.addListenerEvent(document.querySelector(MPv1.selectors.paymentMethodSelector), 'change', MPv1.changePaymetMethodSelector); | |
| //get payment methods and populate selector | |
| MPv1.getPaymentMethods(); | |
| } | |
| //flow: MLB AND MCO | |
| if (MPv1.site_id == "MLB") { | |
| document.querySelector(MPv1.selectors.mpDocType).style.display = 'none'; | |
| document.querySelector(MPv1.selectors.mpIssuer).style.display = 'none'; | |
| //ajust css | |
| document.querySelector(MPv1.selectors.docNumber).classList.remove("mp-col-75"); | |
| document.querySelector(MPv1.selectors.docNumber).classList.add("mp-col-100"); | |
| } else if (MPv1.site_id == "MCO") { | |
| document.querySelector(MPv1.selectors.mpIssuer).style.display = 'none'; | |
| } else if (MPv1.site_id == "MLA") { | |
| document.querySelector(MPv1.selectors.boxInstallmentsSelector).classList.remove("mp-col-100"); | |
| document.querySelector(MPv1.selectors.boxInstallmentsSelector).classList.add("mp-col-70"); | |
| document.querySelector(MPv1.selectors.taxCFT).style.display = 'block'; | |
| document.querySelector(MPv1.selectors.taxTEA).style.display = 'block'; | |
| MPv1.addListenerEvent(document.querySelector(MPv1.selectors.installments), 'change', MPv1.showTaxes); | |
| } else if (MPv1.site_id == "MLC") { | |
| document.querySelector(MPv1.selectors.mpIssuer).style.display = 'none'; | |
| } | |
| if (MPv1.debug) { | |
| document.querySelector(MPv1.selectors.utilities_fields).style.display = 'inline-block'; | |
| console.log(MPv1); | |
| } | |
| document.querySelector(MPv1.selectors.site_id).value = MPv1.site_id; | |
| document.querySelector(MPv1.selectors.formCustomerAndCard).style.display = 'none'; | |
| //set form for basic ou customer & cards | |
| // MPv1.setForm(); | |
| return; | |
| } | |
| this.MPv1 = MPv1; | |
| }).call(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment