(function (win) { if (!(win.postMessage && win.localStorage && win.sessionStorage && win.JSON && win.parent)) { return; } var origin = 'https://www.simplii.com' , allowRequest = true , requestTimeout = 300 , allowOriginRegex = /^https:\/\/(.+\.)?simplii.com\/$/ , localeRegex = /^(en|fr)$|(en|fr)(?=_CA)/i , envRegex = /https:\/\/(pilot.)?(www\.simplii\.com)/ , approot = '/ebm-resources/public/simplii/online-banking/client/index.html' , legacyApproot = '/ebm-resources/public/client/web/index.html' , host = win.location.protocol + '//' + win.location.host + approot , legacyHost = win.location.protocol + '//' + win.location.host + legacyApproot , locale = 'en' , queryParams = null , storage = Storage() , maxNumOfAllowableSavedCards = 10 , maxSavedCardsReachedErrorCode = '0006' , legacySavedCardCookieName = 'cibc.cardNumber' , storeKeys = { 'token': 'session_token' , 'bankCards': '/api/v1/bankCards' , 'remember': 'saveCard' , 'cardnum': 'bcs' , 'cardData': 'cardData' } , bankCardsModelKey = 'bank-cards' , fallbackCookieName = 'bankCardsApi' , t_o_dom = 'w-profiling.simplii.com' , t_s_o_id = '9y3flihj' , t_p_o_id = '3dj9ki1x' , t_pg_id = '1021' , t_pr_id = '' , isLocalhost = false ; // Usage // storage.setItem(key, value) // usage // storage.setItem(key, value, {driver: 'session'}) // default // storage.setItem(key, value, {driver: 'local'}) // storage.getItem(key) // usage // storage.getItem(key, {driver: 'session'}) // default // storage.getItem(key, {driver: 'local'}) function Storage() { var namespace = 'banking:' // NOTE: banking: [default] , driver = { 'session': 'sessionStorage', 'local': 'localStorage' } ; function type(options) { options = options || {}; return (typeof options === 'object' && driver[options.driver] && win[driver[options.driver]]) || win.sessionStorage; } function getKey(key, options) { // Option to override namespace with the exception of session token // shared across multiple apps. options = options || {}; return (key === 'token') ? 'ebanking:' + storeKeys[key] : ((options.namespace || namespace) + (storeKeys[key] || key)); } function setCookie (cookieParams) { var { name, cookieValue, expiry = null, domain = null, URIencode = true, isSecure = false, } = cookieParams if (typeof cookieValue !== 'string') { cookieValue = JSON.stringify(cookieValue) } if (URIencode) { cookieValue = encodeURIComponent(cookieValue) } var cookieString = name + '=' + cookieValue + ';path=/'; if (domain) { cookieString += ';domain=' + domain } if (expiry) { cookieString += ';expires=' + expiry } if (isSecure) { cookieString += ';secure' } document.cookie = cookieString } function getCookieValue (name, URIdecode = true) { var cookieRegex = new RegExp('(?:^|;)?(' + name + '=([^;]+))(?:;|$)') try { var cookieValue = document.cookie.match(cookieRegex).pop() if (URIdecode) { cookieValue = decodeURIComponent(cookieValue) } try { // JSON.parse() will fail if cookieValue is a simple string i.e. "Hello" return JSON.parse(cookieValue) } catch { return ((typeof cookieValue === 'string') && cookieValue) || undefined } } catch { return undefined } } return { getItem: function (key, options) { key = getKey(key, options); var storage = type(options); return storage.getItem(key); }, setItem: function (key, value, options) { key = getKey(key, options); var storage = type(options); try { storage.setItem(key, value); } catch (e) { // Some incompatibility issues in private mode. } }, removeItem: function (key, options) { key = getKey(key, options); var storage = type(options); return storage.removeItem(key); }, getSavedCards: function () { var bankCards = localStorage.getItem('banking:/api/v1/bankCards'); if (bankCards) { bankCards = JSON.parse(bankCards)['bank-cards']; } else { bankCards = []; } if (isSafari()) { // for Safari, we use cookie instead of localStorage since // the latter can't be read from an iFrame on cibc.com // note for legacy support reasons we only encode/decode the description on this cookie, instead of the whole thing var savedCardsCookie = getCookieValue('bankCardsApi', false) if (typeof savedCardsCookie === 'object' && savedCardsCookie['bank-cards'] && savedCardsCookie['bank-cards'].length) { bankCards = savedCardsCookie['bank-cards']; bankCards.forEach(card => { if (card.description && card.description.length) { card.description = decodeURIComponent(card.description); } }) } else { bankCards = []; } } return bankCards; }, setSavedCards: function (bankCards) { // Safari cannot load values from localStorage in an iFrame (i.e., what happens on cibc.com // sign on form), so we have to store savedCards in a cookie instead // note for legacy support reasons we only encode/decode the description on this cookie, instead of the whole thing if (isSafari()) { var safariSavedCards = { 'bank-cards': bankCards.map(card => { var newCard = JSON.parse(JSON.stringify(card)) // clone card so we don't mutate original if (newCard.description && newCard.description.length) { newCard.description = encodeURIComponent(newCard.description) } return newCard }) } var date = new Date() date.setTime(date.getTime() + (365 * 24 * 60 * 60 * 1000)) // we set 1 year expiry although Safari will auto-shorten this to 1 week // domain isn't really required on the cookie, but we have to set it for backwards compatibility with legacy olbtxn implementation var cookieParams = { name: 'bankCardsApi', cookieValue: safariSavedCards, date: date.toUTCString(), domain: '.simplii.com', URIencode: false } // //fix for local cookie domain when testing in safari locally. cookie won't save in safari unless domain is empty // if (process.env.NODE_ENV === 'development') { // delete cookieParams.domain // } setCookie(cookieParams) } else { // for browsers other than Safari, use localStorage as normal let cardPath = 'banking:/api/v1/bankCards' if(isLocalhost){ cardPath = 'banking-dev:/api/v1/bankCards' } localStorage.setItem( cardPath, JSON.stringify({ 'bank-cards': bankCards }) ) } } } } // https://tc39.github.io/ecma262/#sec-array.prototype.find if (!Array.prototype.find) { Object.defineProperty(Array.prototype, 'find', { value: function (predicate) { if (this === null) { throw new TypeError('"this" is null or not defined'); } var o = Object(this); var len = o.length >>> 0; if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } var thisArg = arguments[1]; var k = 0; while (k < len) { var kValue = o[k]; if (predicate.call(thisArg, kValue, k, o)) { return kValue; } k++; } return undefined; } }); } function _obscure(value) { value = value.replace(/\s/g, ''); return value.substring(0, 4) + '********' + value.substring(12); } function _saveCard(card) { var store = storage.getItem('bankCards', { driver: 'local' }); if (!store) { var useSavedCardsCookie = false , savedCardsCookieRegex = new RegExp('(?:^|;)?(' + fallbackCookieName + '=([^;]+))(?:;|$)') , savedCardsCookie = document.cookie.match(savedCardsCookieRegex); if ((navigator.userAgent.match(/safari/i) && !navigator.userAgent.match(/chrome/i)) || navigator.userAgent.match(/CriOS/i)) { if (savedCardsCookie && savedCardsCookie.length) { useSavedCardsCookie = true; store = savedCardsCookie[2]; } } else { // Set empty data store store = JSON.stringify({ 'bank-cards': [] }); } } var data = JSON.parse(store); if (data && data['bank-cards']) { // EB3 QC#3122: If card has been saved previously, do not update description // But we do want to update lastSignOn (value and isEncrypted will not have changed) var updateCard = false; data['bank-cards'].forEach(function (item) { if (item.description && item.description.length) { item.description = decodeURIComponent(item.description); } if (item.value === card.value) { updateCard = true; item.lastSignOn = (new Date()).getTime(); } }); if (!updateCard) { data['bank-cards'].push(card); } storage.setItem('bankCards', JSON.stringify(data), { driver: 'local' }); } } function _xhr(options) { var loginObj = { card: { value: options.params.cardnum, description: "", encrypted: (options.params.encrypted || false), encrypt: (options.params.encrypt || false) }, password: options.params.password, pageId: options.params.pageId || "", profilingId: options.params.profilingId || "" }; var data = !options.url.match('filteredAccounts') ? JSON.stringify(loginObj) : ''; var xhr = win.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); xhr.open(options.request, options.url); xhr.onreadystatechange = function () { if (xhr.readyState > 3) { if (xhr.status == 200 || xhr.status == 204) { typeof options.success === 'function' && options.success(xhr.responseText && JSON.parse(xhr.responseText), 'success', xhr); } else { typeof options.error === 'function' && options.error(xhr.responseText && JSON.parse(xhr.responseText), 'error', xhr); } typeof options.done === 'function' && options.done(xhr.responseText && JSON.parse(xhr.responseText), 'done', xhr); } }; xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.setRequestHeader('Accept', 'application/vnd.api+json'); xhr.setRequestHeader('Accept-Language', 'en'); xhr.setRequestHeader('Content-Type', 'application/vnd.api+json'); xhr.setRequestHeader('WWW-Authenticate', (options.headers && options.headers.auth) || 'CardAndPassword'); xhr.setRequestHeader('brand', 'simplii'); if (options.headers && options.headers.token && !!options.headers.token.trim()) { xhr.setRequestHeader('X-Auth-Token', options.headers.token); } options.request == 'POST' ? xhr.send(data) : xhr.send(); return xhr; } // TODO possibly throw away?? function _auth(options) { return _xhr({ url: '/ebm-anp/api/v1/json/sessions', request: 'POST', params: options.params, headers: options.headers, success: options.success, error: options.error }); } function _delay(request) { if (allowRequest) { allowRequest = false; 'function' === typeof request && request(); setTimeout(function () { allowRequest = true }, requestTimeout) } } function _generateUUID() { var d = new Date().getTime(); if (typeof win.performance !== 'undefined' && typeof win.performance.now === 'function') { d += win.performance.now(); } return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = (d + Math.random() * 16) % 16 | 0; d = Math.floor(d / 16); return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); }); } function init_t_check(pg_id) { var pr_id = _generateUUID(); var o_id = isEnv ? t_p_o_id : t_s_o_id; try { win.parent.postMessage(JSON.stringify({ method: 'tmx_init', data: [t_o_dom, o_id, pr_id, pg_id] // these args will be spread into window.tm.file() }), origin) t_pr_id = pr_id; } catch (err) { } } function loadQueryParams() { var params = {} , queryStr = win.location.href.split('?')[1] , queryArr = queryStr.split('&') ; for (var i = 0; i < queryArr.length; i++) { params[queryArr[i].split('=')[0]] = unescape(queryArr[i].split('=')[1]); } return params; } function migrateSaveCardCookieName() { if ((navigator.userAgent.match(/safari/i) && !navigator.userAgent.match(/chrome/i)) || navigator.userAgent.match(/CriOS/i)) { var oldCookieName = '/api/v1/bankCards'; var savedCardsCookieRegex = new RegExp('(?:^|;)?(' + oldCookieName + '=([^;]+))(?:;|$)') , savedCardsCookie = document.cookie.match(savedCardsCookieRegex); if (savedCardsCookie && savedCardsCookie.length === 3) { var date = new Date(); date.setTime(date.getTime() + (365 * 24 * 60 * 60 * 1000)); document.cookie = fallbackCookieName + '=' + savedCardsCookie[2] + ';path=/;domain=.simplii.com;expires=' + date.toUTCString(); document.cookie = oldCookieName + '=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT'; } } } function migrateBankCards(options) { options = options || {}; var escapedCookieName = legacySavedCardCookieName.replace(/[.]/g, '\\$&') , savedCardsCookieRegex = new RegExp('(?:^|;)?(' + escapedCookieName + '=([^;]+))(?:;|$)') , savedCardsCookie = document.cookie.match(savedCardsCookieRegex) ; if (savedCardsCookie && savedCardsCookie.length) { _xhr({ url: '/ebm-anp/api/v1/json/migratedBankCards', request: 'GET', params: {}, success: function (data, textStatus, xhr) { if (data && data['migratedBankCards'].length) { var store = storage.getItem('bankCards', { driver: 'local' }); store = store && JSON.parse(store); if (store && store['bank-cards'] && store['bank-cards'].length) { var migrateCards = data['migratedBankCards']; store['bank-cards'].forEach(function (card, index, bankCards) { migrateCards = migrateCards.filter(function (migrateCard, index) { if (card.value != migrateCard.value) { migrateCard.id = bankCards.length + index + 1; migrateCard.lastSignOn = null; return true; } }); }); store['bank-cards'] = store['bank-cards'].concat(migrateCards); storage.setItem('bankCards', JSON.stringify(store), { driver: 'local' }); } else { data['migratedBankCards'].forEach(function (migrateCard) { migrateCard.lastSignOn = null; }); storage.setItem('bankCards', JSON.stringify({ 'bank-cards': data['migratedBankCards'] }), { driver: 'local' }); } if ((navigator.userAgent.match(/safari/i) && !navigator.userAgent.match(/chrome/i)) || navigator.userAgent.match(/CriOS/i)) { var date = new Date(); date.setTime(date.getTime() + (365 * 24 * 60 * 60 * 1000)); document.cookie = fallbackCookieName + '=' + JSON.stringify({ 'bank-cards': data['migratedBankCards'] }) + ';path=/;domain=.simplii.com;expires=' + date.toUTCString(); } } document.cookie = legacySavedCardCookieName + '=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT'; }, done: options.done }); } else { 'function' === typeof options.done && options.done(); } } function killSessionRequest(options) { options = options || {}; try { _xhr({ url: '/ebm-anp/api/v1/json/sessions', request: 'DELETE', headers: { token: JSON.parse(storage.getItem('token')) }, params: options.params, success: options.success, error: options.error, done: options.done }); } catch (err) { 'function' === typeof options.done && options.done(); } storage.removeItem('token', { driver: 'session' }); } function isSafari() { return (navigator.userAgent.match(/safari/i) && !navigator.userAgent.match(/chrome/i)) || navigator.userAgent.match(/CriOS/i); } function setSafariCookie(name, value) { document.cookie = name + '=' + encodeURIComponent(value) + ';path=/'; } function setSessionTokenInStorage(sessionToken) { var token = JSON.stringify(sessionToken) storage.setItem('token', token); if (isSafari()) { setSafariCookie('ebanking:session_token', token); } } function setCardInfoInSessionStorage(cardNumber, encryptedCardValue) { let cardData = JSON.stringify({ cardNumber: cardNumber || null, encryptedCardValue: encryptedCardValue || null }) storage.setItem('cardData', cardData); if (isSafari()) { setSafariCookie('banking:cardData', cardData); } } //copying the logic to save the card over to here instead of the vue app handling it. function setCardInfoInLocalStorage(cardNumber, encryptedCardValue, description) { function lookupCardInListByValue (cardList, cardValueToCompareAgainst) { cardList = cardList || [] return cardList.some( card => card.value === cardValueToCompareAgainst ) } function maskCardNumber (cardNumber) { var lengthToShow = Math.floor(cardNumber.length / 4) var mask = '*'.repeat(cardNumber.length - lengthToShow * 2) var maskCardNumber = cardNumber.substring(0, lengthToShow) + mask + cardNumber.substring(cardNumber.length - lengthToShow) return maskCardNumber } function isPreviouslySavedCardInStorage () { return lookupCardInListByValue(storage.getSavedCards(), encryptedCardValue) } return new Promise (function (resolve) { if (isPreviouslySavedCardInStorage() === false) { var maskedCardNumber = maskCardNumber(cardNumber); var savedCards = storage.getSavedCards(); var label = maskedCardNumber; //.com looks for the label property for the dropdown display string var label = description !== '' ? description + ' ' + '(' + label + ')' : maskedCardNumber savedCards.push({ value: encryptedCardValue, lastSignOn: Date.now(), isEncrypted: true, description: description, maskedCardNumber: maskedCardNumber, label: label }) storage.setSavedCards(savedCards) } resolve(); }) } function signOnRequest(params) { if (!params.remember || (params.remember && params.cardslen < maxNumOfAllowableSavedCards)) { //set start time for mPulse login tracking storage.setItem('aem-signon-start', Date.now(), { driver: 'local' }); if (t_pg_id && t_pr_id) { params.pageId = t_pg_id; params.profilingId = t_pr_id; } _auth({ params: params, success: function (data, textStatus, xhr) { var promise = Promise.resolve(); setSessionTokenInStorage(xhr.getResponseHeader('X-Auth-Token')) if (params.remember) { if (data && data.card && data.card.value) { promise = setCardInfoInLocalStorage(params.cardnum, data.card.value, params.description); } } //promisifying just in case promise.then(function() { document.cookie = 'ssoToken=' + xhr.getResponseHeader('X-Auth-Token') + ';path=/;domain=.simplii.com'; if (data.cdiRequired) { storage.setItem('cdiRequired', data.cdiRequired); if (isSafari()) { document.cookie = 'cdiRequired=' + data.cdiRequired + ';path=/;domain=.simplii.com'; } } if (params.encrypted) { var encryptedCardData = JSON.stringify({ id: params.cardnum, value: params.cardnum }) // store card info so ember sso route can update last sign on timestamp storage.setItem('cardnum', encryptedCardData); if (isSafari()) { setSafariCookie('banking:bcs', encryptedCardData); } } win.parent.postMessage(JSON.stringify({ method: 'redirect', data: host + '#/accounts/interstitial-redirect?locale=' + locale }), origin); }); }, error: function (data, textStatus, xhr) { try { var otvc = void 0; if (xhr.status === 401) { otvc = data.entitlements.find(function (entitlement) { return entitlement === 'CHOOSE_OTVC_CHANNEL'; }); } else { otvc = data.problems.find(function (problem) { return xhr.status === 403 && (/^506(2|4|6|7)$/).test(problem.code); }); } if (otvc) { setSessionTokenInStorage(xhr.getResponseHeader('X-Auth-Token')); if (params.encrypted) { setCardInfoInSessionStorage(null, params.cardnum); } else { setCardInfoInSessionStorage(params.cardnum); } var headers = { 'X-Auth-Token': xhr.getResponseHeader('X-Auth-Token'), 'WWW-Authenticate': xhr.getResponseHeader('WWW-Authenticate'), 'Content-Type': xhr.getResponseHeader('Content-Type'), 'Local-DateTime': xhr.getResponseHeader('Local-DateTime') } var otvcResponseData = JSON.stringify({ data: data, status: xhr.status, headers: headers }) storage.setItem('otvcResponse', otvcResponseData); if (isSafari()) { setSafariCookie('banking:otvcResponse', otvcResponseData); } win.parent.postMessage(JSON.stringify({ method: 'redirect', data: host + '#/auth/signon-otvc?locale=' + locale }), origin); } else { var problemsData = JSON.stringify(data.problems) storage.setItem('problems', problemsData); if (isSafari()) { setSafariCookie('banking:problems', problemsData); } var msgId = data.problems[0].code || '0001' win.parent.postMessage(JSON.stringify({ method: 'redirect', data: host + '#/auth/signon?msgId=' + msgId + '&locale=' + locale }), origin); } } catch (err) { win.parent.postMessage(JSON.stringify({ method: 'redirect', data: host + '#/auth/signon?msgId=0001&locale=' + locale }), origin); } } }); } else { win.parent.postMessage(JSON.stringify({ method: 'redirect', data: host + '#/auth/signon?msgId=' + maxSavedCardsReachedErrorCode + '&locale=' + locale }), origin); } } function prefillRequest(params) { if (params.bypass) { _xhr({ url: '/ebm-anp/api/v1/profile/json/prefillData', request: 'GET', params: params, headers: { token: JSON.parse(storage.getItem('token')) }, success: function (data, textStatus, xhr) { win.parent.postMessage(JSON.stringify({ method: 'anp:profile', data: data }), origin); } }); } else { _auth({ params: params, headers: { auth: 'CardAndPasswordPrefill' }, success: function (data, textStatus, xhr) { storage.setItem('token', JSON.stringify(xhr.getResponseHeader('X-Auth-Token'))); if (params.remember) { if (data && data.card && data.card.value) { _saveCard({ value: data.card.value, lastSignOn: Date.now(), isEncrypted: true, maskedCardNumber: _obscure(params.cardnum), description: params.description }); } } _xhr({ url: '/ebm-anp/api/v1/profile/json/prefillData', request: 'GET', headers: { token: JSON.parse(storage.getItem('token')) }, params: params, success: function (data, textStatus, xhr) { win.parent.postMessage(JSON.stringify({ method: 'anp:profile', data: data }), origin); killSessionRequest({ params: params }); } }); } }); } } function onMessage(e) { var payload = typeof e.data === 'string' ? JSON.parse(e.data) : e.data; isLocalhost = e.origin.includes("localhost") switch (payload.method) { case 'get': cleanBankCards(); var data = storage.getItem(payload.key, { driver: 'local' }); // FALLBACK FOR SAFARI var savedCardsCookieRegex = new RegExp('(?:^|;)?(' + fallbackCookieName + '=([^;]+))(?:;|$)') , savedCardsCookie = document.cookie.match(savedCardsCookieRegex); if ((navigator.userAgent.match(/safari/i) && !navigator.userAgent.match(/chrome/i)) || navigator.userAgent.match(/CriOS/i)) { if (!data && savedCardsCookie && savedCardsCookie.length) { data = JSON.parse(savedCardsCookie[2]); data['bank-cards'].forEach(function (card) { if (card.description && card.description.length) { card.description = decodeURIComponent(card.description); } if (card.label && card.label.length) { card.label = decodeURIComponent(card.label); } }); } } win.parent.postMessage(JSON.stringify({ method: 'post', data: data }), origin); break; case 'remove': var store = storage.getItem(payload.key, { driver: 'local' }); // FALLBACK FOR SAFARI var useSavedCardsCookie = false , savedCardsCookieRegex = new RegExp('(?:^|;)?(' + fallbackCookieName + '=([^;]+))(?:;|$)') , savedCardsCookie = document.cookie.match(savedCardsCookieRegex); if ((navigator.userAgent.match(/safari/i) && !navigator.userAgent.match(/chrome/i)) || navigator.userAgent.match(/CriOS/i)) { if (!store && savedCardsCookie && savedCardsCookie.length) { useSavedCardsCookie = true; store = JSON.parse(savedCardsCookie[2]); store['bank-cards'].forEach(function (card) { if (card.description && card.description.length) { card.description = decodeURIComponent(card.description); } }); store = JSON.stringify(store); } } if (!store) { return; } var data = JSON.parse(store); if (data && data['bank-cards']) { data['bank-cards'] = data['bank-cards'].filter(function (card) { return card.value !== payload.data.value; }); } if (!useSavedCardsCookie) { storage.setItem(payload.key, JSON.stringify(data), { driver: 'local' }); } win.parent.postMessage(JSON.stringify({ method: 'post', data: data }), origin); if (useSavedCardsCookie) { data['bank-cards'].forEach(function (card) { if (card.description && card.description.length) { card.description = encodeURIComponent(card.description); } }); var date = new Date(); date.setTime(date.getTime() + (365 * 24 * 60 * 60 * 1000)); document.cookie = fallbackCookieName + '=' + JSON.stringify(data) + ';path=/;domain=.simplii.com;expires=' + date.toUTCString(); } break; case 'ui:register': killSessionRequest(); storage.setItem('cardnum', JSON.stringify(payload.data.cardnum || '')); win.parent.postMessage(JSON.stringify({ method: 'redirect', data: host+'#/auth/register/card-info?locale='+locale }), origin); break; case 'ui:password': killSessionRequest(); storage.setItem('cardnum', JSON.stringify(payload.data.cardnum || '')); win.parent.postMessage(JSON.stringify({ method: 'redirect', data: host + '#/auth/new-password/card-info?locale=' + locale }), origin); break; case 'ui:login': killSessionRequest({ done: function () { _delay(signOnRequest(payload.data)); } }); break; case 'ui:prefill': _delay(prefillRequest(payload.data)); break; } } function cleanBankCards() { var savedCards = JSON.parse(storage.getItem('bankCards', { driver: 'local' })); if (savedCards) { var filteredSavedCards = savedCards['bank-cards'].filter(function (card, index, arr) { if (card.maskedCardNumber && card.maskedCardNumber.length <= 16) { return card; } else if (!card.maskedCardNumber && card.label) { return card; } }); storage.removeItem('bankCards', { driver: 'local' }); storage.setItem('bankCards', JSON.stringify({ "bank-cards": filteredSavedCards }), { driver: 'local' }); } } // Setup postMessage event listeners if (win.addEventListener) { win.addEventListener('message', onMessage, false); } else { win.attachEvent('onmessage', onMessage); } try { origin = allowOriginRegex.test(document.referrer) ? document.referrer : origin; queryParams = loadQueryParams(); locale = queryParams.locale && localeRegex.exec(queryParams.locale)[0]; isEnv = envRegex.test(document.referrer); } catch (err) { } locale && storage.setItem('locale', JSON.stringify(locale)); migrateSaveCardCookieName(); migrateBankCards({ done: function () { win.parent.postMessage(JSON.stringify({ method: 'ui:ready', data: { status: 1 } }), origin); } }); init_t_check(t_pg_id); })(window);