/*
* Payment-UXE
*/
/*
* Payment-UXE
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b)
if (b.hasOwnProperty(p))
d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var baseUrl = 'https://paymentuxe-prod.cloud.motorola.net';
/* jshint ignore:start */
// ADDED TO PROJECT TO SATISFY JSON STRINGIFY/PARSE IMPLEMENTATIONS ON OLD BROWSERS
/*jslint
eval, for, this
*/
/*property
JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
lastIndex, length, parse, prototype, push, replace, slice, stringify,
test, toJSON, toString, valueOf
*/
if (typeof JSON !== "object") {
JSON = {};
}
(function () {
"use strict";
var rx_one = /^[\],:{}\s]*$/;
var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
function f(n) {
// Format integers to have at least two digits.
return (n < 10)
? "0" + n
: n;
}
function this_value() {
return this.valueOf();
}
if (typeof Date.prototype.toJSON !== "function") {
Date.prototype.toJSON = function () {
return isFinite(this.valueOf())
? (this.getUTCFullYear()
+ "-"
+ f(this.getUTCMonth() + 1)
+ "-"
+ f(this.getUTCDate())
+ "T"
+ f(this.getUTCHours())
+ ":"
+ f(this.getUTCMinutes())
+ ":"
+ f(this.getUTCSeconds())
+ "Z")
: null;
};
Boolean.prototype.toJSON = this_value;
Number.prototype.toJSON = this_value;
String.prototype.toJSON = this_value;
}
var gap;
var indent;
var meta;
var rep;
function quote(string) {
rx_escapable.lastIndex = 0;
return rx_escapable.test(string)
? "\"" + string.replace(rx_escapable, function (a) {
var c = meta[a];
return typeof c === "string"
? c
: "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
}) + "\""
: "\"" + string + "\"";
}
function str(key, holder) {
var i; // The loop counter.
var k; // The member key.
var v; // The member value.
var length;
var mind = gap;
var partial;
var value = holder[key];
if (value
&& typeof value === "object"
&& typeof value.toJSON === "function") {
value = value.toJSON(key);
}
if (typeof rep === "function") {
value = rep.call(holder, key, value);
}
switch (typeof value) {
case "string":
return quote(value);
case "number":
return (isFinite(value))
? String(value)
: "null";
case "boolean":
case "null":
return String(value);
case "object":
if (!value) {
return "null";
}
gap += indent;
partial = [];
if (Object.prototype.toString.apply(value) === "[object Array]") {
length = value.length;
for (i = 0; i < length; i += 1) {
partial[i] = str(i, value) || "null";
}
v = partial.length === 0
? "[]"
: gap
? ("[\n"
+ gap
+ partial.join(",\n" + gap)
+ "\n"
+ mind
+ "]")
: "[" + partial.join(",") + "]";
gap = mind;
return v;
}
if (rep && typeof rep === "object") {
length = rep.length;
for (i = 0; i < length; i += 1) {
if (typeof rep[i] === "string") {
k = rep[i];
v = str(k, value);
if (v) {
partial.push(quote(k) + ((gap)
? ": "
: ":") + v);
}
}
}
}
else {
for (k in value) {
if (Object.prototype.hasOwnProperty.call(value, k)) {
v = str(k, value);
if (v) {
partial.push(quote(k) + ((gap)
? ": "
: ":") + v);
}
}
}
}
v = partial.length === 0
? "{}"
: gap
? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
: "{" + partial.join(",") + "}";
gap = mind;
return v;
}
}
if (typeof JSON.stringify !== "function") {
meta = {
"\b": "\\b",
"\t": "\\t",
"\n": "\\n",
"\f": "\\f",
"\r": "\\r",
"\"": "\\\"",
"\\": "\\\\"
};
JSON.stringify = function (value, replacer, space) {
var i;
gap = "";
indent = "";
if (typeof space === "number") {
for (i = 0; i < space; i += 1) {
indent += " ";
}
}
else if (typeof space === "string") {
indent = space;
}
rep = replacer;
if (replacer && typeof replacer !== "function" && (typeof replacer !== "object"
|| typeof replacer.length !== "number")) {
throw new Error("JSON.stringify");
}
return str("", { "": value });
};
}
if (typeof JSON.parse !== "function") {
JSON.parse = function (text, reviver) {
var j;
function walk(holder, key) {
var k;
var v;
var value = holder[key];
if (value && typeof value === "object") {
for (k in value) {
if (Object.prototype.hasOwnProperty.call(value, k)) {
v = walk(value, k);
if (v !== undefined) {
value[k] = v;
}
else {
delete value[k];
}
}
}
}
return reviver.call(holder, key, value);
}
text = String(text);
rx_dangerous.lastIndex = 0;
if (rx_dangerous.test(text)) {
text = text.replace(rx_dangerous, function (a) {
return ("\\u"
+ ("0000" + a.charCodeAt(0).toString(16)).slice(-4));
});
}
if (rx_one.test(text
.replace(rx_two, "@@")
.replace(rx_three, "]")
.replace(rx_four, ""))) {
j = eval("(" + text + ")");
return (typeof reviver === "function")
? walk({ "": j }, "")
: j;
}
throw new SyntaxError("JSON.parse");
};
}
}());
/* jshint ignore:end */
!function (e) {
function n() { }
function t(e, n) { return function () { e.apply(n, arguments); }; }
function o(e) {
if ("object" != typeof this)
throw new TypeError("Promises must be constructed via new");
if ("function" != typeof e)
throw new TypeError("not a function");
this._state = 0, this._handled = !1, this._value = void 0, this._deferreds = [], s(e, this);
}
function i(e, n) {
for (; 3 === e._state;)
e = e._value;
return 0 === e._state ? void e._deferreds.push(n) : (e._handled = !0, void o._immediateFn(function () {
var t = 1 === e._state ? n.onFulfilled : n.onRejected;
if (null === t)
return void (1 === e._state ? r : u)(n.promise, e._value);
var o;
try {
o = t(e._value);
}
catch (i) {
return void u(n.promise, i);
}
r(n.promise, o);
}));
}
function r(e, n) {
try {
if (n === e)
throw new TypeError("A promise cannot be resolved with itself.");
if (n && ("object" == typeof n || "function" == typeof n)) {
var i = n.then;
if (n instanceof o)
return e._state = 3, e._value = n, void f(e);
if ("function" == typeof i)
return void s(t(i, n), e);
}
e._state = 1, e._value = n, f(e);
}
catch (r) {
u(e, r);
}
}
function u(e, n) { e._state = 2, e._value = n, f(e); }
function f(e) {
2 === e._state && 0 === e._deferreds.length && o._immediateFn(function () { e._handled || o._unhandledRejectionFn(e._value); });
for (var n = 0, t = e._deferreds.length; n < t; n++)
i(e, e._deferreds[n]);
e._deferreds = null;
}
function c(e, n, t) { this.onFulfilled = "function" == typeof e ? e : null, this.onRejected = "function" == typeof n ? n : null, this.promise = t; }
function s(e, n) {
var t = !1;
try {
e(function (e) { t || (t = !0, r(n, e)); }, function (e) { t || (t = !0, u(n, e)); });
}
catch (o) {
if (t)
return;
t = !0, u(n, o);
}
}
var a = setTimeout;
o.prototype["catch"] = function (e) { return this.then(null, e); }, o.prototype.then = function (e, t) { var o = new this.constructor(n); return i(this, new c(e, t, o)), o; }, o.all = function (e) {
var n = Array.prototype.slice.call(e);
return new o(function (e, t) {
function o(r, u) {
try {
if (u && ("object" == typeof u || "function" == typeof u)) {
var f = u.then;
if ("function" == typeof f)
return void f.call(u, function (e) { o(r, e); }, t);
}
n[r] = u, 0 === --i && e(n);
}
catch (c) {
t(c);
}
}
if (0 === n.length)
return e([]);
for (var i = n.length, r = 0; r < n.length; r++)
o(r, n[r]);
});
}, o.resolve = function (e) { return e && "object" == typeof e && e.constructor === o ? e : new o(function (n) { n(e); }); }, o.reject = function (e) { return new o(function (n, t) { t(e); }); }, o.race = function (e) {
return new o(function (n, t) {
for (var o = 0, i = e.length; o < i; o++)
e[o].then(n, t);
});
}, o._immediateFn = "function" == typeof setImmediate && function (e) { setImmediate(e); } || function (e) { a(e, 0); }, o._unhandledRejectionFn = function (e) { "undefined" != typeof console && console && console.warn("Possible Unhandled Promise Rejection:", e); }, o._setImmediateFn = function (e) { o._immediateFn = e; }, o._setUnhandledRejectionFn = function (e) { o._unhandledRejectionFn = e; }, "undefined" != typeof module && module.exports ? module.exports = o : e.Promise || (e.Promise = o);
}(this);
///
var Utils;
(function (Utils) {
var Request = (function () {
function Request(args) {
this.args = args;
}
Request.prototype.buildRequest = function () {
var xhr = new XMLHttpRequest();
// Scaffold props
this.args.method = this.args.method || 'GET';
this.args.url = this.args.url || '';
this.args.async = this.args.async !== false ? true : false;
this.args.headers = this.args.headers || {};
// Open request
xhr.open(this.args.method, this.args.url, this.args.async);
// Set Headers
var headers = this.args.headers;
for (var header in headers) {
xhr.setRequestHeader(header, headers[header]);
}
return xhr;
};
Request.prototype.buildPromise = function (xhr) {
return new Promise(function (resolve, reject) {
xhr.onload = function () {
if (xhr.readyState !== 4) {
return;
}
switch (xhr.status) {
case 200:
resolve(xhr);
break;
default:
reject(xhr);
break;
}
};
});
};
Request.prototype.execute = function () {
var xhr = this.buildRequest();
var promise = this.buildPromise(xhr);
xhr.send(this.args.body);
return promise;
};
return Request;
}());
Utils.Request = Request;
})(Utils || (Utils = {}));
///
var payment;
(function (payment) {
var integration;
(function (integration) {
var IntegrationRequest = (function () {
function IntegrationRequest(url, payload) {
this.request = new Utils.Request({
url: url,
method: IntegrationRequest.HTTP_METHOD,
body: JSON.stringify(payload),
headers: IntegrationRequest.HEADERS
});
}
IntegrationRequest.prototype.resolve = function (resolve, reject, xmlHttpResponse) {
try {
var response = JSON.parse(xmlHttpResponse.responseText);
resolve(response);
}
catch (e) {
reject();
}
};
IntegrationRequest.prototype.execute = function () {
var _this = this;
return new Promise(function (resolver, rejecter) {
_this.request.execute()
.then(function (response) { _this.resolve(resolver, rejecter, response); })
.catch(function (response) { _this.resolve(resolver, rejecter, response); });
});
};
IntegrationRequest.HTTP_METHOD = 'POST';
IntegrationRequest.HEADERS = {
'Content-Type': 'application/json; charset=utf-8',
'Accept': 'application/json, text/javascript',
};
return IntegrationRequest;
}());
integration.IntegrationRequest = IntegrationRequest;
})(integration = payment.integration || (payment.integration = {}));
})(payment || (payment = {}));
(function (payment) {
var integration;
(function (integration) {
var PaymentRequest = (function (_super) {
__extends(PaymentRequest, _super);
function PaymentRequest(baseUrl, payload) {
return _super.call(this, baseUrl.concat('/payment'), payload) || this;
}
return PaymentRequest;
}(integration.IntegrationRequest));
integration.PaymentRequest = PaymentRequest;
var V2PaymentRequestWithBody = (function (_super) {
__extends(V2PaymentRequestWithBody, _super);
function V2PaymentRequestWithBody(baseUrl, payload) {
return _super.call(this, baseUrl.concat('/v2/payment'), payload) || this;
}
return V2PaymentRequestWithBody;
}(integration.IntegrationRequest));
integration.V2PaymentRequestWithBody = V2PaymentRequestWithBody;
})(integration = payment.integration || (payment.integration = {}));
})(payment || (payment = {}));
(function (payment) {
var integration;
(function (integration) {
var AuthorizePaymentRequest = (function (_super) {
__extends(AuthorizePaymentRequest, _super);
function AuthorizePaymentRequest(baseUrl, payload) {
return _super.call(this, baseUrl.concat('/payment/authorize'), payload) || this;
}
return AuthorizePaymentRequest;
}(integration.IntegrationRequest));
integration.AuthorizePaymentRequest = AuthorizePaymentRequest;
})(integration = payment.integration || (payment.integration = {}));
})(payment || (payment = {}));
// TODO Remove this when implementation in typescript is done
var payment = payment || {};
payment.integration = payment.integration || {};
(function () {
var executeBeforeRequest;
var executeAfterRequest;
var self = payment.integration;
var DISPLAY_TYPE_IFRAME = 'iframe';
self.sendCheckoutRequest = sendCheckoutRequest;
self.sendAuthorizeRequest = sendAuthorizeRequest;
self.injectFingerprint = injectFingerprint;
function sendCheckoutRequest(payload, containerHtmlElementId, startPartnerFunction, endPartnerFunction) {
executeBeforeRequest = startPartnerFunction;
executeAfterRequest = endPartnerFunction;
executeCheckout(payload, containerHtmlElementId);
}
function executeCheckout(payload, containerHtmlElementId) {
if (executeBeforeRequest) {
executeBeforeRequest();
}
var fingerprintElement = document.getElementById('payment-uxe-fingerprint');
if (fingerprintElement) {
payload.sessionId = fingerprintElement.value;
}
var promise;
//If the request is sending the cartId, should follow the old flow
if (payload['cartId'] != '') {
promise = new payment.integration.PaymentRequest(baseUrl, payload).execute();
}
else {
delete (payload['cartId']);
console.log(payload);
promise = new payment.integration.V2PaymentRequestWithBody(baseUrl, payload).execute();
}
promise
.then(function (response) {
var redirectUrl = response.redirectUrl;
var integrationParameters = response.integrationParameters;
var integrationMethod = response.integrationMethod;
var callbackParameters = response.callbackParameters;
if (integrationParameters && integrationMethod === 'form') {
submitForm(redirectUrl, integrationParameters, 'post', containerHtmlElementId);
}
else {
if (callbackParameters && integrationMethod === 'form') {
submitForm(redirectUrl, callbackParameters, 'post', containerHtmlElementId);
}
else {
if (integrationParameters && integrationMethod === 'affirm') {
submitAffirm(integrationParameters);
}
else {
window.location = redirectUrl;
}
}
}
})
.catch(function () {
// TODO Implement error handling
});
}
function sendAuthorizeRequest(payload, containerHtmlElementId, startPartnerFunction, endPartnerFunction) {
executeBeforeRequest = startPartnerFunction;
executeAfterRequest = endPartnerFunction;
executeAuthorize(payload, containerHtmlElementId);
}
function executeAuthorize(payload, containerHtmlElementId) {
if (executeBeforeRequest) {
executeBeforeRequest();
}
var promise = new payment.integration.AuthorizePaymentRequest(baseUrl, payload).execute();
promise
.then(function (response) {
var redirectUrl = response.redirectUrl;
var integrationParameters = response.integrationParameters;
var integrationMethod = response.integrationMethod;
var callbackParameters = response.callbackParameters;
if (integrationParameters && integrationMethod === 'form') {
submitForm(redirectUrl, integrationParameters, 'post', containerHtmlElementId);
}
else {
if (callbackParameters && integrationMethod === 'form') {
submitForm(redirectUrl, callbackParameters, 'post', containerHtmlElementId);
}
else {
window.location = redirectUrl;
}
}
})
.catch(function () {
// TODO Implement error handling
});
}
function submitForm(action, params, method, containerHtmlElementId) {
removeElementFromDOM('paymentDataSendForm');
removeElementFromDOM('paymentGatewayIFrame');
var form = document.createElement('form');
form.setAttribute('id', 'paymentDataSendForm');
form.setAttribute('method', method || 'post');
form.setAttribute('action', action);
for (var key in params) {
if (params.hasOwnProperty(key)) {
var hiddenField = document.createElement('input');
hiddenField.setAttribute('type', 'hidden');
hiddenField.setAttribute('name', key);
hiddenField.setAttribute('value', params[key]);
form.appendChild(hiddenField);
}
}
if (params.displayType === DISPLAY_TYPE_IFRAME && containerHtmlElementId) {
createIFrameAndAttachToForm(containerHtmlElementId, form);
}
if (document.getElementById('paymentGatewayIFrame') && executeAfterRequest) {
document.getElementById('paymentGatewayIFrame').onload = function () {
executeAfterRequest();
};
}
document.body.appendChild(form);
form.submit();
}
function submitAffirm(integrationParameters) {
var affirmConfig = {
publicApiKey: integrationParameters.config.public_api_key,
script: integrationParameters.config.script
};
injectAffirmObjects(affirmConfig);
affirm.checkout(integrationParameters.checkout);
affirm.ui.ready(function () {
affirm.ui.error.on("close", function () {
window.location = integrationParameters.checkout.merchant.user_cancel_url;
});
});
affirm.checkout.post();
}
function removeElementFromDOM(elementId) {
var element = document.getElementById(elementId);
if (element) {
element.remove();
}
}
function createIFrameAndAttachToForm(containerId, form) {
var iframe = document.createElement('iframe');
iframe.setAttribute('id', 'paymentGatewayIFrame');
iframe.setAttribute('name', 'paymentGatewayIFrame');
iframe.setAttribute('width', '100%');
iframe.setAttribute('height', '100%');
iframe.setAttribute('style', 'border: none');
document.getElementById(containerId).appendChild(iframe);
form.setAttribute('target', 'paymentGatewayIFrame');
}
function injectAffirmObjects(affirmConfig) {
(function (l, g, m, e, a, f, b) {
var d, c = l[m] || {}, h = document.createElement(f), n = document.getElementsByTagName(f)[0], k = function (a, b, c) { return function () { a[b]._.push([c, arguments]); }; };
c[e] = k(c, e, "set");
d = c[e];
c[a] = {};
c[a]._ = [];
d._ = [];
c[a][b] = k(c, a, b);
a = 0;
for (b = "set add save post open empty reset on off trigger ready setProduct".split(" "); a < b.length; a++)
d[b[a]] = k(c, e, b[a]);
a = 0;
for (b = ["get", "token", "url", "items"]; a < b.length; a++)
d[b[a]] = function () { };
h.async = !0;
h.src = g[f];
n.parentNode.insertBefore(h, n);
delete g[f];
d(g);
l[m] = c;
})(window, affirmConfig, "affirm", "checkout", "ui", "script", "ready");
}
function injectFingerprint(country) {
injectCybersourceFingerprint(country);
}
function injectCybersourceFingerprint(country) {
if (!country) {
return;
}
var endpoint = baseUrl.concat('/payment/cybersource/fingerprint/').concat(country);
var response = new Utils.Request({ url: endpoint, method: 'GET' }).execute();
response
.then(function (response) {
var wrapper = document.createElement('div');
wrapper.innerHTML = response.responseText;
document.body.append(wrapper.firstElementChild);
})
.catch(function (data) {
console.error(data.responseText);
});
}
})();