{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 4e6a5d7d7864fdd4501a","webpack:///./app/fields.js","webpack:///./app/events.js","webpack:///./app/message.js","webpack:///./app/style.js","webpack:///./app/errors.js","webpack:///./app/polyfills/classList.js","webpack:///./app/brands.js","webpack:///./app/remote/controller.js","webpack:///./app/remote/view.js","webpack:///./app/format.js","webpack:///./app/remote/index.js","webpack:///./app/tokenization.js","webpack:///./app/validator.js"],"names":["Fields","CARD_NUMBER","CVV","EXPIRY","module","exports","Events","checkOrigin","event","expected","origin","message","blur","focus","empty","complete","brand","error","value","input","change","require","Message","create","details","_generic","updateCvvPresent","updateIFrame","type","inputHeight","changeValue","newValue","autofill","callback","eventName","registerCallback","brandChange","askForBrand","askerField","asker","beginTokenization","tokenResponse","result","code","errorOrToken","last4","expiryMonth","expiryYear","token","validationRequest","validationResponse","field","valid","clear","update","name","Style","supportedClassProperties","supportedStyleProperties","supportedCSSProperties","supportedPseudoClasses","getDefaultCustomClasses","base","validateStyleArgument","styles","errors","group","hasOwnProperty","indexOf","push","rule","subRule","buildRuleStringFromStyle","style","rules","color","fontFamily","fontStyle","fontSize","textDecoration","fontWeight","paddingLeft","paddingTop","paddingRight","paddingBottom","padding","Errors","errorDetails","CardNumberInvalid","CvvNotSet","ExpiryIsInThePast","ExpiryIsNotSet","TokenizationValidationFailed","TokenizationFailed","TokenizationNoResponse","regExp","RegExp","forEach","list","fn","scope","i","length","call","ClassList","element","prototype","add","arguments","contains","className","remove","replace","toggle","test","oldName","newName","Element","Object","defineProperty","get","window","DOMTokenList","Brands","Names","Unknown","Amex","Diners","Discover","JCB","Mastercard","Maestro","Visa","CardBrands","brandPattern","cardPattern","spaces","lengths","cvvLength","cardBrand","cardNumber","toString","brandName","cardBrandByName","Format","Tokenization","Validator","Controller","view","self","previousValue","acceptedBrands","validation","state","dirty","tokenValidation","getToken","bind","receiveMessage","render","e","target","updateState","status","trigger","msg","height","postMessage","updateBrand","fieldHasChanged","sendCurrentBrand","triggerValidation","oldValidation","isValid","checkForBrandUpdate","oldBrand","cvvIsPresent","validate","validator","validateCardNumber","validateCvv","validateExpiry","shouldUpdateCursor","oldValue","cvv","expiry","cursorPosition","getCursorPosition","setCursorPosition","addStyles","errorMsg","removeStyles","registerCallbacks","placeholder","brands","checkForCvv","beginFieldValidation","respondToValidationRequest","completeFieldValidation","card","res","success","sourcePageOrigin","data","String","JSON","parse","err","sourceWindow","source","View","$input","$hiddenInput1","$hiddenInput2","sourcePageUrl","addEventListener","DocumentTouch","document","_init","_getUrlParameter","location","search","checkInput","createElement","setAttribute","id","autocorrect","autocapitalize","spellcheck","autocomplete","boxSizing","width","border","overflow","backgroundColor","savedColor","documentElement","scrollHeight","body","appendChild","createHiddenInput","position","top","left","tabIndex","_initAutofillInputs","_resetAutofillInputs","parentNode","removeChild","windowLocationSearch","sParam","sPageURL","decodeURIComponent","substring","sURLVariables","split","sParameterName","undefined","addStylesForCssClass","cssClass","styleSheet","querySelector","sheet","insertRule","hoverRules","focusRules","_addStyles","_removeStyles","cssRules","deleteRule","_addCssClass","classList","_removeCssClass","_updatePlaceholder","_error","str","console","_noOutline","outline","_autofillStyle","setProperty","_removeAutofillStyle","viewCmd","parameter","viewCommands","init","initAutofillInputs","resetAutofillInputs","updatePlaceholder","addCssClass","removeCssClass","autofillStyle","removeAutofillStyle","noOutline","encodedMessage","stringify","frames","targetFrame","queryString","cvvFound","handler","domEvent","createEvent","initEvent","dispatchEvent","selectionEnd","selection","sel","createRange","selLen","text","moveStart","setTimeout","setSelectionRange","createTextRange","range","collapse","moveEnd","select","formatted","trim","maxLength","Math","max","apply","start","end","oldPosition","formattedValue","isNaN","newPosition","numValuesBeforeCursor","lengthOfFormatted","charsCount","parseInt","slice","EXPIRY_SEPARATOR","appendSeparator","expiryParts","month","year","oldMonth","MAX_MONTH","controller","tokenizationURL","formattedData","_formatData","isIE9","XDomainRequest","xhr","XMLHttpRequest","open","setRequestHeader","timeout","onload","request","currentTarget","responseText","number","substr","expiry_month","expiry_year","onerror","ontimeout","send","monthYear","dataObject","cvd","isValidCardNumber","isValidLength","isValidLuhn","sum","alternate","n","isValidExpiryField","expiryField","expiryLength","isValidMonth","january","december","isValidExpiry","today","Date","setFullYear","getDate"],"mappings":"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","file":"customcheckoutremote.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"customcheckoutremote\"] = factory();\n\telse\n\t\troot[\"customcheckoutremote\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 13);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4e6a5d7d7864fdd4501a","var Fields = {\n CARD_NUMBER: 'card-number',\n CVV: 'cvv',\n EXPIRY: 'expiry',\n};\n\nmodule.exports = Fields;\n\n\n// WEBPACK FOOTER //\n// ./app/fields.js","var Events = {\n\n checkOrigin: function(event, expected) {\n if(!event) return false;\n \n // Ensure correct origin\n if (event.origin !== expected) {\n return false;\n }\n return true;\n },\n\n message: 'message',\n blur: 'blur',\n focus: 'focus',\n empty: 'empty',\n complete: 'complete',\n brand: 'brand',\n error: 'error',\n value: 'value',\n input: 'input',\n change: 'change',\n};\n\nmodule.exports = Events;\n\n\n// WEBPACK FOOTER //\n// ./app/events.js","/* \nMethods for easily creating strictly formatted messages that can be passed \nbetween iframes and the source page. \n*/\nconst Events = require('../app/events.js');\n\nvar Message = {\n\n // Used on field/iframe creation\n // details are e.g. style, placeholder, classes\n create: function(details) {\n return this._generic('create', details);\n },\n\n // Sent from the cvv iframe to the card number and expiry iframes, to\n // indicate that cvv is being used on the page. \n updateCvvPresent: function() {\n return this._generic('cvvPresent');\n },\n\n // sent back from an iFrame to the source window after creation. \n // used to update the dimensions of the iFrame to fit the created input.\n updateIFrame: function(type, inputHeight) {\n return this._generic('updateIFrame', { type: type, inputHeight: inputHeight} );\n },\n\n changeValue: function(newValue, autofill) {\n return this._generic('changeValue', { newValue: newValue, autofill: autofill });\n },\n\n callback: function(eventName, event) {\n const details = {\n eventName: eventName,\n event: event,\n };\n return this._generic('callbackEvent', details);\n },\n\n // Sent from source window to the iFrames to set up an \n // event callback that can be triggered on the iframe, \n // back to the source.\n registerCallback: function(eventName) {\n const details = {\n eventName: eventName,\n };\n return this._generic('registerCallback', details);\n },\n\n // Sent from the card number window to the cvv window when the card brand\n // changes, so that cvv can validate against the current brand.\n brandChange: function(brand) {\n const details = {\n brand: brand,\n };\n return this._generic('brandChange', details);\n },\n\n // Sent from the card number to the cvv window when cvv asks for it (as opposed\n // to when brand changes -- above). Needed in the case that cvv has been mounted\n // or re-mounted after the brand has been updated.\n askForBrand: function(askerField) {\n const details = {\n asker: askerField,\n };\n return this._generic('askForBrand', details);\n },\n\n // Sent from the source window to the card number iframe to start the \n // tokenization process (validation and ajax request).\n beginTokenization: function() {\n return this._generic('beginTokenization');\n },\n\n tokenResponse: function(result, code, errorOrToken, last4, expiryMonth, expiryYear) {\n let details = { event: {} };\n details.event.code = code;\n if(result === Events.error) {\n details.event.error = errorOrToken;\n } else {\n details.event.token = errorOrToken;\n details.event.last4 = last4;\n details.event.expiryMonth = expiryMonth;\n details.event.expiryYear = expiryYear;\n }\n return this._generic('tokenResponse', details);\n },\n\n // Sent from one iframe input to another requesting validation information.\n validationRequest: function() {\n return this._generic('validationRequest');\n },\n\n // Sent from one iframe back to the one that requested validation information.\n // If valid, message includes the value of the field.\n validationResponse: function(field, valid, value) {\n const details = {\n field: field,\n valid: valid, \n value: value, \n };\n return this._generic('validationResponse', details);\n },\n\n // Sent from one iframe input to another requesting input focus.\n focus: function() {\n return this._generic('focus');\n },\n\n // Sent from one iframe input to another requesting input blur.\n blur: function() {\n return this._generic('blur');\n },\n\n // Sent from one iframe input to another requesting input clear.\n clear: function() {\n return this._generic('clear');\n },\n\n // Used to update field/iframe\n // details are e.g. style, placeholder, classes\n update: function(details) {\n return this._generic('update', details);\n },\n\n // Create an empty named message\n _generic: function(name, details) {\n return {\n name: name,\n details: details,\n };\n },\n};\n\nmodule.exports = Message;\n\n\n// WEBPACK FOOTER //\n// ./app/message.js","let Style = {\n supportedClassProperties: ['base', 'complete', 'error', 'empty', 'focus'],\n supportedStyleProperties: ['base', 'complete', 'error', 'empty'],\n supportedCSSProperties: ['color', 'fontFamily', 'fontSize', 'fontStyle', \n 'textDecoration', 'fontWeight', 'paddingLeft', 'paddingTop', 'paddingRight',\n 'paddingBottom', 'padding'],\n supportedPseudoClasses: [':hover', ':focus'],\n\n getDefaultCustomClasses: function() {\n return {\n base: 'bambora-checkoutfield',\n complete: 'bambora-checkoutfield-complete',\n empty: 'bambora-checkoutfield-empty',\n focus: 'bambora-checkoutfield-focus',\n error: 'bambora-checkoutfield-error',\n };\n },\n\n // Parse the argument of style information passed in and return an array of \n // errors present (if any).\n validateStyleArgument: function(styles) {\n let errors = [];\n for (let group in styles) {\n if (styles.hasOwnProperty(group)) {\n if (this.supportedStyleProperties.indexOf(group) <= -1) {\n errors.push(`'${group}' is not a supported style group`);\n \n } else {\n if (typeof styles[group] !== 'object') {\n errors.push(`style group '${group}' must be an object`);\n continue;\n }\n\n for (let rule in styles[group]) {\n if (styles[group].hasOwnProperty(rule)) {\n if (this.supportedCSSProperties.indexOf(rule) <= -1 && \n this.supportedPseudoClasses.indexOf(rule) <= -1) {\n errors.push(`'${rule}' is not a supported style setting`);\n \n } else if (this.supportedPseudoClasses.indexOf(rule) > -1) {\n if (typeof styles[group][rule] !== 'object') {\n errors.push(`style property ${rule} must be an object`);\n continue;\n }\n\n for (let subRule in styles[group][rule]) {\n if (styles[group][rule].hasOwnProperty(subRule)) {\n if (this.supportedCSSProperties.indexOf(subRule) <= -1) {\n errors.push(`${subRule} is not a supported nested style setting`);\n\n } else {\n if (typeof styles[group][rule][subRule] !== 'string') {\n errors.push(`style property ${subRule} must be an object`);\n }\n }\n }\n }\n } else {\n if (typeof styles[group][rule] !== 'string') {\n errors.push(`style property ${rule} must be a string`);\n }\n }\n }\n }\n }\n }\n }\n return errors;\n },\n\n buildRuleStringFromStyle: function(style) {\n let rules = '';\n\n if (style.color) {\n rules += `color: ${style.color}; `;\n }\n\n if (style.fontFamily) {\n rules += `font-family: ${style.fontFamily}; `;\n }\n\n if (style.fontStyle) {\n rules += `font-style: ${style.fontStyle};`;\n }\n\n if (style.fontSize) {\n rules += `font-size: ${style.fontSize}; `;\n }\n\n if (style.textDecoration) {\n rules += `text-decoration: ${style.textDecoration}; `;\n }\n\n if (style.fontWeight) {\n rules += `font-weight: ${style.fontWeight}; `;\n }\n\n if (style.paddingLeft) {\n rules += `padding-left: ${style.paddingLeft}; `; \n }\n\n if (style.paddingTop) {\n rules += `padding-top: ${style.paddingTop}; `;\n }\n\n if (style.paddingRight) {\n rules += `padding-right: ${style.paddingRight}; `;\n }\n\n if (style.paddingBottom) {\n rules += `padding-bottom: ${style.paddingBottom}; `;\n }\n\n if (style.padding) {\n rules += `padding: ${style.padding}; `;\n }\n\n return rules;\n },\n\n};\n\nmodule.exports = Style;\n\n\n\n// WEBPACK FOOTER //\n// ./app/style.js","let Errors = {\n errorDetails: function (field, error) {\n return {\n field: field,\n type: error.type,\n message: error.message,\n };\n },\n\n CardNumberInvalid: { type: 'CardNumberInvalid', message: 'Your card number is invalid.' },\n\n CvvNotSet: { type: 'CvvNotSet', message: 'Your card\\'s security code is incomplete.' },\n\n ExpiryIsInThePast: { type: 'ExpiryIsInThePast', message: 'Your card\\'s expiration date is in the past.' },\n ExpiryIsNotSet: { type: 'ExpiryIsNotSet', message: 'Your card\\'s expiration date is incomplete.' },\n\n TokenizationValidationFailed: { type: 'TokenizationValidationFailed', message: 'Your card information is invalid or incomplete.' },\n TokenizationFailed: { type: 'TokenizationFailed', message: 'We are unable to complete your transaction at this time.' },\n TokenizationNoResponse: { type: 'TokenizationNoResponse', message: 'Your connection to our servers is timing out.' },\n};\n\nmodule.exports = Errors;\n\n\n\n// WEBPACK FOOTER //\n// ./app/errors.js","// Source: https://gist.github.com/k-gun/c2ea7c49edf7b757fe9561ba37cb19ca\n;(function() {\n // helpers\n var regExp = function(name) {\n return new RegExp('(^| )'+ name +'( |$)');\n };\n var forEach = function(list, fn, scope) {\n for (var i = 0; i < list.length; i++) {\n fn.call(scope, list[i]);\n }\n };\n\n // class list object with basic methods\n function ClassList(element) {\n this.element = element;\n }\n\n ClassList.prototype = {\n add: function() {\n forEach(arguments, function(name) {\n if (!this.contains(name)) {\n this.element.className += this.element.className.length > 0 ? ' ' + name : name;\n }\n }, this);\n },\n remove: function() {\n forEach(arguments, function(name) {\n this.element.className =\n this.element.className.replace(regExp(name), ' ');\n }, this);\n },\n toggle: function(name) {\n return this.contains(name) \n ? (this.remove(name), false) : (this.add(name), true);\n },\n contains: function(name) {\n return regExp(name).test(this.element.className);\n },\n // bonus..\n replace: function(oldName, newName) {\n this.remove(oldName), this.add(newName);\n }\n };\n\n // IE8/9, Safari\n if (!('classList' in Element.prototype)) {\n Object.defineProperty(Element.prototype, 'classList', {\n get: function() {\n return new ClassList(this);\n }\n });\n }\n\n // replace() support for others\n if (window.DOMTokenList && DOMTokenList.prototype.replace == null) {\n DOMTokenList.prototype.replace = ClassList.prototype.replace;\n }\n})();\n\n\n\n// WEBPACK FOOTER //\n// ./app/polyfills/classList.js","let Brands = {\n Names: {\n Unknown: 'unknown',\n Amex: 'amex',\n Diners: 'diners',\n Discover: 'discover',\n JCB: 'jcb',\n Mastercard: 'mastercard',\n Maestro: 'maestro',\n Visa: 'visa',\n },\n};\n\nBrands.CardBrands = {\n [Brands.Names.Visa]: {\n brand: Brands.Names.Visa,\n brandPattern: /^4.*$/,\n cardPattern: /^4\\d*$/,\n spaces: [4, 8, 12],\n lengths: [13, 16, 18, 19],\n cvvLength: 3,\n },\n [Brands.Names.Mastercard]: {\n brand: Brands.Names.Mastercard,\n brandPattern: /^(5[1-5]|2[2-7]).*$/,\n cardPattern: /^(5[1-5]|222[1-9]|2[3-6]|27[0-1]|2720)\\d*$/,\n spaces: [4, 8, 12],\n lengths: [16],\n cvvLength: 3,\n },\n [Brands.Names.Amex]: {\n brand: Brands.Names.Amex,\n brandPattern: /^(34|37).*$/,\n cardPattern: /^3[47]\\d*$/,\n spaces: [4, 10],\n lengths: [15],\n cvvLength: 4,\n },\n [Brands.Names.Diners]: {\n brand: Brands.Names.Diners,\n brandPattern: /^(3[0689]).*$/,\n cardPattern: /^3(0[0-5]|[689])\\d*$/,\n spaces: [4, 10],\n lengths: [14],\n cvvLength: 3,\n },\n [Brands.Names.Discover]: {\n brand: Brands.Names.Discover,\n brandPattern: /^(60|64|65|622).*$/,\n cardPattern: /^(6011|65|64[4-9])\\d*$/,\n spaces: [4, 8, 12],\n lengths: [16],\n cvvLength: 3,\n },\n [Brands.Names.JCB]: {\n brand: Brands.Names.JCB,\n brandPattern: /^(18|21|35).*$/,\n cardPattern: /^(2131|1800|35)\\d*$/,\n spaces: [4, 8, 12],\n lengths: [16],\n cvvLength: 3,\n },\n [Brands.Names.Maestro]: {\n brand: Brands.Names.Maestro,\n brandPattern: /^(5[06-9]|6[237])\\d*$/,\n cardPattern: /^(5[06-9]|6[237])\\d*$/,\n spaces: [4, 8, 12],\n lengths: [12, 13, 14, 15, 16, 17, 18, 19],\n cvvLength: 3,\n },\n [Brands.Names.Unknown]: {\n brand: Brands.Names.Unknown,\n brandPattern: /^.*$/,\n cardPattern: /^.\\d$/,\n spaces: [4, 8, 12],\n lengths: [19],\n cvvLength: 4,\n },\n};\n\nBrands.cardBrand = function (cardNumber) {\n cardNumber = cardNumber ? cardNumber.toString().replace(/\\s/g, '') : '';\n\n for (let brandName in Brands.CardBrands) {\n let cardBrand = Brands.CardBrands[brandName];\n\n if (cardBrand.brandPattern.test(cardNumber)) {\n return cardBrand;\n }\n }\n return Brands.CardBrands[Brands.Names.Unknown];\n};\n\nBrands.cardBrandByName = function (brandName) {\n let brand = Brands.CardBrands[brandName];\n if (brand) {\n return brand;\n }\n return Brands.CardBrands[Brands.Names.Unknown];\n};\n\nmodule.exports = Brands;\n\n\n\n// WEBPACK FOOTER //\n// ./app/brands.js","/* global REMOTE_ORIGIN */\n\nconst Brands = require('../brands.js');\nconst Errors = require('../errors.js');\nconst Events = require('../events.js');\nconst Fields = require('../fields.js');\nconst Format = require('../format.js');\nconst Message = require('../message.js');\nconst Tokenization = require('../tokenization.js');\nconst Style = require('../style.js');\nconst Validator = require('../validator.js');\n\n/* Constructor */\nfunction Controller (view) {\n var self = this;\n self.view = view;\n\n self.type = null; // the type of this field\n self.value = null; // the current value of this input (updated on input)\n self.previousValue = null; // the previous value of this input (updated on input)\n self.brand = Brands.Names.Unknown; // applies to card number and cvv\n self.acceptedBrands = null; \n self.validation = null;\n self.styles = {};\n self.state = { \n dirty: false, // true if input has been updated\n empty: null,\n complete: null,\n error: null,\n };\n\n // Holds validation status of all fields during tokenization. \n self.tokenValidation = {};\n self.tokenValidation[Fields.CARD_NUMBER] = null;\n self.tokenValidation[Fields.CVV] = null;\n self.tokenValidation[Fields.EXPIRY] = null;\n\n // add methods from other modules (not called directly to maintain testability)\n self.getToken = Tokenization.getToken.bind(Tokenization);\n\n // link message eventListener callback to the view immediately\n self.view.bind('message', function(event) {\n self.receiveMessage(event);\n });\n\n self.view.render('init');\n\n self.view.bind(Events.focus, () => {\n self.view.render('noOutline');\n });\n\n // add hidden inputs to capture and pass along autofill values\n self.view.render('initAutofillInputs');\n self.view.bind(Events.input, e => {\n if (e.target.value == '') {\n self.view.render('resetAutofillInputs');\n }\n });\n\n self.type = self.view.type;\n}\n\nController.prototype.updateState = function(state, status) {\n const self = this;\n\n if (state === 'empty') {\n if (self.state.empty !== status) {\n self.state.empty = status;\n self.view.trigger(Events.empty);\n\n if (self.state.empty === true) {\n\n self.view.render('addCssClass', 'empty');\n } else {\n self.view.render('removeCssClass', 'empty');\n }\n }\n\n } else if (state === 'complete') {\n if (self.state.complete !== status) {\n self.state.complete = status;\n if (self.state.complete === true) {\n self.state.error = false;\n }\n self.view.trigger(Events.complete);\n\n if (self.state.complete === true) {\n self.view.render('addCssClass', 'complete');\n self.view.render('removeCssClass', 'error');\n } else {\n self.view.render('removeCssClass', 'complete');\n self.view.render('removeAutofillStyle');\n }\n }\n\n } else if (state === 'error') {\n if (self.state.error !== status) {\n if (!self.state.dirty) {\n return;\n } \n self.state.error = true; \n self.view.trigger(Events.error);\n\n self.view.render('addCssClass', 'error');\n }\n }\n\n const msg = Message.updateIFrame(self.type, self.view.height + 'px');\n self.view.postMessage(msg, 'source');\n};\n\nController.prototype.updateBrand = function(details) {\n const self = this;\n\n if (self.type !== Fields.CVV) {\n self.view.render('error', 'updateBrand() should only be called on the cvv');\n return false;\n }\n\n self.brand = details.brand;\n self.fieldHasChanged(false);\n};\n\nController.prototype.sendCurrentBrand = function(details) {\n const self = this;\n self.view.postMessage(Message.brandChange(self.brand), details.asker);\n};\n\nController.prototype.changeValue = function(details) {\n const self = this;\n if (details.autofill) {\n self.view.render('autofillStyle');\n }\n self.value = details.newValue;\n self.fieldHasChanged(false);\n};\n\nController.prototype.triggerValidation = function(oldValidation) {\n const self = this;\n\n if (oldValidation === null && self.validation.isValid) {\n self.updateState('complete', true);\n } else if (oldValidation === null && self.validation.error) {\n self.updateState('error');\n } else if (oldValidation.error && self.validation.isValid) {\n self.updateState('complete', true);\n } else if (oldValidation.error && self.validation.error.message !== oldValidation.error.message) {\n self.updateState('error');\n } else if (oldValidation.isValid && self.validation.error) {\n self.updateState('complete', false); // incomplete, then error. in case of input not dirty\n self.updateState('error');\n }\n};\n\nController.prototype.checkForBrandUpdate = function() {\n const self = this;\n const oldBrand = self.brand;\n const cardBrand = Brands.cardBrand(self.value);\n self.brand = cardBrand.brand;\n\n if (oldBrand !== self.brand) {\n self.view.trigger(Events.brand);\n if (self.cvvIsPresent()) {\n const msg = Message.brandChange(self.brand);\n self.view.postMessage(msg, Fields.CVV);\n }\n }\n return cardBrand;\n};\n\nController.prototype.validate = function() {\n const self = this;\n let validator = new Validator();\n if (self.type === Fields.CARD_NUMBER) {\n self.validation = validator.validateCardNumber(self.value, self.acceptedBrands);\n } else if (self.type === Fields.CVV) {\n self.validation = validator.validateCvv(self.value, Brands.cardBrandByName(self.brand));\n } else {\n self.validation = validator.validateExpiry(self.value);\n }\n};\n\n// Note: Cursor positioning is finicky and behaves differently in different \n// browsers, ensures changes to related code are tested in all supported browsers.\nController.prototype.fieldHasChanged = function(shouldUpdateCursor) {\n const self = this;\n const oldValue = self.value;\n\n let cardBrand;\n if (self.type === Fields.CARD_NUMBER) {\n cardBrand = self.checkForBrandUpdate();\n self.value = Format.cardNumber(self.value, cardBrand);\n } else if (self.type === Fields.CVV) {\n cardBrand = Brands.cardBrandByName(self.brand);\n self.value = Format.cvv(self.value, cardBrand);\n } else if (self.type === Fields.EXPIRY) {\n self.value = Format.expiry(self.value);\n }\n\n let cursorPosition = self.view.getCursorPosition();\n self.view.trigger(Events.value, self.value);\n\n if (shouldUpdateCursor && self.value) {\n // For older Android Browsers we need to handle entering input for the first time\n if (!self.previousValue) {\n cursorPosition = self.value.length;\n }\n\n cursorPosition = Format.cursorPosition(cursorPosition, oldValue, self.value);\n self.view.setCursorPosition(cursorPosition);\n }\n\n const oldValidation = self.validation;\n self.validate();\n self.triggerValidation(oldValidation);\n\n self.updateState('empty', !self.value);\n};\n\n\nController.prototype.addStyles = function(styles) {\n const self = this;\n\n const errors = Style.validateStyleArgument(styles);\n if (errors.length > 0) {\n errors.forEach(errorMsg => {\n self.view.render('error', errorMsg);\n });\n }\n\n self.styles = styles;\n self.view.render('addStyles', styles);\n self.view.render('addCssClass', 'base');\n};\n\nController.prototype.removeStyles = function() {\n const self = this;\n\n self.styles = null;\n self.view.render('removeStyles', null);\n self.view.render('removeCssClass', 'base');\n};\n\n// Updates view and posts message to iframe based on details passed in to\n// #create() library method call.\nController.prototype.create = function(details) {\n const self = this;\n\n self.registerCallbacks();\n\n if (details.style) {\n self.addStyles(details.style);\n }\n\n if (details.placeholder) {\n self.view.render('updatePlaceholder', details.placeholder);\n }\n\n if (details.brands) {\n if (self.type !== Fields.CARD_NUMBER) {\n self.view.render('error', `Can only pass 'brand' option for ${Fields.CARD_NUMBER} input`);\n } else {\n self.acceptedBrands = details.brands;\n }\n }\n \n self.view.bind(Events.input, function(event) {\n self.previousValue = self.value;\n self.value = event.target.value;\n self.fieldHasChanged(true);\n });\n\n self.view.bind(Events.blur, (event) => {\n if (self.state.dirty === false && event.target.value !== '') {\n self.state.dirty = true;\n self.validation = null;\n self.fieldHasChanged(false);\n }\n });\n\n self.updateState('empty', true);\n\n // if this is the cvv, initialize the current brand\n if (self.type === Fields.CVV) {\n self.view.postMessage(Message.askForBrand(self.type), Fields.CARD_NUMBER);\n }\n};\n\nController.prototype.registerCallbacks = function() {\n var self = this;\n\n self.view.bind(Events.blur, () => {\n self.view.postMessage(\n Message.callback(Events.blur, { field: self.type }), \n 'source'\n );\n });\n\n self.view.bind(Events.focus, () => {\n self.view.postMessage(\n Message.callback(Events.focus, { field: self.type }), \n 'source'\n );\n });\n\n self.view.bind(Events.empty, () => {\n self.view.postMessage(\n Message.callback(Events.empty, { field: self.type, empty: self.state.empty }), \n 'source'\n );\n });\n\n self.view.bind(Events.complete, () => {\n self.view.postMessage(\n Message.callback(Events.complete, { field: self.type, complete: self.state.complete }), \n 'source'\n );\n });\n\n self.view.bind(Events.brand, () => {\n self.view.postMessage(\n Message.callback(Events.brand, { field: self.type, brand: self.brand }),\n 'source'\n );\n });\n\n self.view.bind(Events.error, () => {\n self.view.postMessage(\n Message.callback(Events.error, { \n field: self.type, \n type: self.validation.error.type, \n message: self.validation.error.message,\n }),\n 'source'\n );\n });\n};\n\nController.prototype.cvvIsPresent = function() {\n const self = this;\n return self.view.checkForCvv();\n};\n\n// Coordinates validation of all fields for tokenization. This function should \n// only ever be called on a type: CARD_NUMBER instance of the script. First validates\n// the card input, and then sends messages to the other iframes requesting \n// validation information. Tokenization is continued once they have responded \n// in #completeFieldValidation().\nController.prototype.beginFieldValidation = function() {\n var self = this;\n\n // tokenization should only ever be called on the CARD_NUMBER iframe\n if (self.type !== Fields.CARD_NUMBER) {\n self.view.render('error', 'createToken() should only be called on the card number');\n return false;\n }\n\n self.state.dirty = true;\n\n // first check cvv and expiry by posting messages to their iframes\n // need to unset current validation info\n self.tokenValidation[Fields.CARD_NUMBER] = null;\n self.tokenValidation[Fields.EXPIRY] = null;\n if (self.cvvIsPresent()) {\n self.tokenValidation[Fields.CVV] = null;\n } else {\n self.tokenValidation[Fields.CVV] = 'not-present';\n }\n \n const msg = Message.validationRequest();\n self.view.postMessage(msg, Fields.EXPIRY);\n if (self.cvvIsPresent()) {\n self.view.postMessage(msg, Fields.CVV);\n }\n\n // check card while waiting for a response from cvv and expiry\n self.validate();\n if (self.validation.isValid) {\n self.tokenValidation[Fields.CARD_NUMBER] = {valid: true, value: self.value};\n } else {\n self.updateState('error');\n self.tokenValidation[Fields.CARD_NUMBER] = {valid: false, value: null};\n }\n\n // cvv and expiry will be validated and return messages of type\n // 'validationResponse', then tokenization will continue.\n};\n\n// Validate this field and send the result back to the iframe that requested it \n// (will always be card). This method should ever be called on CARD_NUMBER, since it\n// doesn't need to send its validation to any other field.\nController.prototype.respondToValidationRequest = function() {\n const self = this;\n\n if (self.type === Fields.CARD_NUMBER) {\n self.view.render(Events.error, 'respondToValidationRequest() should never be called on card');\n return false;\n }\n\n self.validate();\n\n let msg;\n if (self.validation.isValid) {\n msg = Message.validationResponse(self.type, true, self.value);\n } else {\n self.view.trigger(Events.error);\n msg = Message.validationResponse(self.type, false, null);\n }\n \n self.view.postMessage(msg, Fields.CARD_NUMBER);\n};\n\n// Receive the validation sent by the above method. If everything is all good, \n// we can tokenize, otherwise we return an error.\nController.prototype.completeFieldValidation = function(details) {\n const self = this;\n\n if (self.type !== Fields.CARD_NUMBER) {\n self.view.render(Events.error, 'completeFieldValidation() should only ever get called by card');\n return false; \n }\n\n const type = details.field;\n self.tokenValidation[type] = { \n valid: details.valid,\n value: details.value,\n };\n\n // this block will only be called after all validation has occured \n if (self.tokenValidation[Fields.CARD_NUMBER] !== null && \n self.tokenValidation[Fields.CVV] !== null &&\n self.tokenValidation[Fields.EXPIRY] !== null) {\n\n // if any are invalid\n if (self.tokenValidation[Fields.CARD_NUMBER].valid === false || \n self.tokenValidation[Fields.CVV].valid === false ||\n self.tokenValidation[Fields.EXPIRY].valid === false) {\n const msg = Message.tokenResponse(Events.error, null, Errors.errorDetails('token', Errors.TokenizationValidationFailed));\n self.view.postMessage(msg, 'source'); \n } else {\n\n let card = {};\n card[Fields.CARD_NUMBER] = self.value;\n card[Fields.EXPIRY] = self.tokenValidation[Fields.EXPIRY].value;\n\n if (self.cvvIsPresent()) {\n card[Fields.CVV] = self.tokenValidation[Fields.CVV].value;\n }\n\n // Need to call tokenization and return that info here\n var callback = function(res) {\n let msg;\n if (res.success) {\n msg = Message.tokenResponse('success', res.code, res.token, res.last4, res.expiryMonth, res.expiryYear);\n } else {\n msg = Message.tokenResponse(Events.error, res.code, res.error);\n }\n self.view.postMessage(msg, 'source');\n };\n\n self.getToken(card, callback);\n }\n }\n};\n\nController.prototype.receiveMessage = function(event) {\n const self = this;\n\n if (!Events.checkOrigin(event, self.view.sourcePageOrigin) && \n !Events.checkOrigin(event, REMOTE_ORIGIN)) {\n return false;\n }\n \n let message = event.data;\n if (typeof message === 'string' || message instanceof String) {\n try {\n message = JSON.parse(message);\n } catch (err) {\n self.view.render('error', `Could not parse message: ${err.name} - ${err.message}`);\n }\n\n }\n var name = message.name;\n var details = message.details;\n\n if (name === 'create') {\n self.view.sourceWindow = event.source;\n self.create(details);\n } else if (name === 'brandChange') {\n self.updateBrand(details);\n } else if (name === 'askForBrand') {\n self.sendCurrentBrand(details);\n } else if (name === 'beginTokenization') { \n self.beginFieldValidation(details);\n } else if (name === 'validationRequest') {\n self.respondToValidationRequest(details);\n } else if (name === 'validationResponse') {\n self.completeFieldValidation(details);\n } else if (name === 'focus') {\n self.focus();\n } else if (name === 'blur') {\n self.blur();\n } else if (name === 'clear') {\n self.clear();\n } else if (name === 'update') {\n self.update(details);\n } else if (name === 'changeValue') {\n self.changeValue(details);\n } else {\n return false;\n }\n\n return true;\n};\n\nController.prototype.focus = function() {\n this.view.focus();\n};\n\nController.prototype.blur = function() {\n this.view.blur();\n};\n\nController.prototype.clear = function() {\n this.view.clear();\n};\n\nController.prototype.update = function(details) {\n const self = this;\n\n if (details.style) {\n self.removeStyles();\n self.addStyles(details.style);\n }\n\n if (details.placeholder) {\n self.view.render('updatePlaceholder', details.placeholder);\n }\n\n if (details.brands) {\n if (self.type !== Fields.CARD_NUMBER) {\n self.view.render('error', `Can only pass 'brand' option for ${Fields.CARD_NUMBER} input`);\n } else {\n self.acceptedBrands = details.brands;\n }\n }\n};\n\nmodule.exports = Controller;\n\n\n\n// WEBPACK FOOTER //\n// ./app/remote/controller.js","/* global REMOTE_PAGE_URL, DocumentTouch */\nrequire('../polyfills/classList.js');\n\nconst Events = require('../events.js');\nconst Fields = require('../fields.js');\nconst Style = require('../style.js');\nconst Message = require('../message.js');\n\n/* Constructor */\n\nfunction View() {\n this.type = null; // string for input type \n this.$input = null; // the dom object for the input field\n this.empty = true; // the empty state of the input field\n this.height = null;\n\n this.$hiddenInput1 = null; // used to capture autofill info\n this.$hiddenInput2 = null;\n \n this.sourcePageUrl = null;\n this.sourcePageOrigin = null;\n\n this.sourceWindow = null; // message passing. \n\n // fix tabstop bug in some browsers\n window.addEventListener('focus', () => {\n if (('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) { \n // Touch events are supported. Don't autofocus the input.\n } else {\n this.$input.focus();\n }\n });\n}\n\n/* Render methods */\n\nView.prototype._init = function() {\n var self = this;\n this.type = self._getUrlParameter(window.location.search, 'type');\n this.sourcePageUrl = self._getUrlParameter(window.location.search, 'source');\n this.sourcePageOrigin = self._getUrlParameter(window.location.search, 'origin');\n\n // If 'tel' is a supported type, we'll use it.\n function checkInput(type) {\n var input = document.createElement('input');\n input.setAttribute('type', type);\n return input.type == type;\n }\n\n // create element\n var input = document.createElement('input');\n input.id = `bambora-${self.type}`;\n input.type = (checkInput('tel') ? 'tel' : 'text');\n input.autocorrect = 'off';\n input.autocapitalize = 'none';\n input.spellcheck = 'false';\n\n // autocomplete hints (these values shouldn't be changed)\n if (this.type === Fields.CARD_NUMBER) {\t\t\n input.autocomplete = 'cc-number';\n input.name = 'ccnumber';\n } else if (this.type === Fields.CVV) {\t\t\n input.autocomplete = 'cc-csc';\t\t\n input.name = 'cvv2';\n } else if (this.type === Fields.EXPIRY) {\t\t\n input.autocomplete = 'cc-exp';\t\t\n input.name = 'cc-exp';\n }\n \n // styling\n input.style.boxSizing = 'border-box';\n input.style.width = '100%';\n input.style.height = '100%';\n input.style.border = 'none';\n input.style.overflow = 'visible';\n input.style.backgroundColor = 'transparent';\n\n // saved color when autofilling\n input.savedColor = {};\n \n // add to page\n this.$input = input;\n this.height = document.documentElement.scrollHeight;\n document.body.appendChild(input);\n};\n\nView.prototype.createHiddenInput = function(field) {\n const self = this; \n\n let input = document.createElement('input');\n \n input.style.position = 'absolute';\n input.style.top = '-9999px';\n input.style.left = '-9999px';\n input.tabIndex = '-1';\n input.setAttribute('aria-hidden', true);\n\n if (field === Fields.CARD_NUMBER) {\n input.autocomplete = 'cc-number';\n input.name = 'ccnumber';\n input.id = 'ccnumber';\n } else if (field === Fields.CVV) {\n input.autocomplete = 'cc-csc';\n input.name = 'cvv2';\n input.id = 'cvv2';\n } else if (field === Fields.EXPIRY) {\n input.autocomplete = 'cc-exp';\n input.name = 'cc-exp';\n input.id = 'cc-exp';\n }\n\n input.addEventListener('change', e => {\n self.postMessage(Message.changeValue(e.target.value, true), field);\n });\n\n document.body.appendChild(input);\n return input;\n};\n\nView.prototype._initAutofillInputs = function() {\n const self = this;\n\n if (self.type === Fields.CARD_NUMBER) {\n self.$hiddenInput1 = self.createHiddenInput(Fields.CVV);\n self.$hiddenInput2 = self.createHiddenInput(Fields.EXPIRY);\n } else if (self.type === Fields.CVV) {\n self.$hiddenInput1 = self.createHiddenInput(Fields.CARD_NUMBER);\n self.$hiddenInput2 = self.createHiddenInput(Fields.EXPIRY);\n } else if (self.type === Fields.EXPIRY) {\n self.$hiddenInput1 = self.createHiddenInput(Fields.CARD_NUMBER);\n self.$hiddenInput2 = self.createHiddenInput(Fields.CVV);\n }\n};\n\nView.prototype._resetAutofillInputs = function() {\n const self = this;\n self.$hiddenInput1.parentNode.removeChild(self.$hiddenInput1);\n self.$hiddenInput2.parentNode.removeChild(self.$hiddenInput2);\n self._initAutofillInputs();\n};\n\n// returns the value of the url parameter with given name. Need to pass in\n// window.location.search as first argument (keeps function testable).\n// TODO: Move this outside of the view so it can be tested. \nView.prototype._getUrlParameter = function(windowLocationSearch, sParam) {\n var sPageURL = decodeURIComponent(windowLocationSearch.substring(1)),\n sURLVariables = sPageURL.split('&'),\n sParameterName,\n i;\n\n for (i = 0; i < sURLVariables.length; i++) {\n sParameterName = sURLVariables[i].split('=');\n\n if (sParameterName[0] === sParam) {\n return sParameterName[1] === undefined ? true : sParameterName[1];\n }\n }\n};\n\nView.prototype.addStylesForCssClass = function(styles, cssClass) {\n const styleSheet = document.querySelector('#styles').sheet;\n const rules = Style.buildRuleStringFromStyle(styles);\n\n styleSheet.insertRule(`.${cssClass} { ${rules} }`, 0);\n\n if (styles[':hover']) {\n const hoverRules = Style.buildRuleStringFromStyle(styles[':hover']);\n styleSheet.insertRule(`.${cssClass}:hover { ${hoverRules} }`, 0);\n }\n\n if (styles[':focus']) {\n const focusRules = Style.buildRuleStringFromStyle(styles[':focus']);\n styleSheet.insertRule(`.${cssClass}:focus { ${focusRules} }`, 0);\n }\n};\n\nView.prototype._addStyles = function(styles) {\n if (styles.base) {\n self.view.addStylesForCssClass(styles.base, 'base');\n }\n\n if (styles.complete) {\n self.view.addStylesForCssClass(styles.complete, 'complete');\n } \n\n if (styles.empty) {\n self.view.addStylesForCssClass(styles.empty, 'empty');\n }\n\n if (styles.error) {\n self.view.addStylesForCssClass(styles.error, 'error');\n }\n};\n\nView.prototype._removeStyles = function() {\n // Reset styles by removing all except for the last pre-existing \n // rule that is {margin: 0px; padding: 0px;}\n const styleSheet = document.querySelector('#styles').sheet;\n var rules = styleSheet.cssRules;\n\n var i = rules.length - 1;\n while (i-- && i >= 0) {\n styleSheet.deleteRule(i);\n }\n};\n\nView.prototype._addCssClass = function(cssClass) {\n this.$input.classList.add(cssClass);\n this.height = document.documentElement.scrollHeight;\n};\n\nView.prototype._removeCssClass = function(cssClass) {\n this.$input.classList.remove(cssClass);\n this.height = document.documentElement.scrollHeight;\n};\n\nView.prototype._updatePlaceholder = function(placeholder) {\n this.$input.placeholder = placeholder;\n};\n\nView.prototype._error = function(str) {\n console.error(`Custom Checkout: ${str}`);\n};\n\nView.prototype._noOutline = function() {\n this.$input.style.outline = 'none';\n};\n\nView.prototype._autofillStyle = function() {\n this.$input.focus();\n this.$input.savedColor.backgroundColor = this.$input.style.backgroundColor;\n this.$input.savedColor.color = this.$input.style.color;\n this.$input.style.backgroundColor = 'rgb(250, 255, 189)';\n this.$input.style.setProperty('color', 'rgba(30, 30, 30, 1)', 'important');\n};\n\nView.prototype._removeAutofillStyle = function() {\n if(typeof(this.$input.savedColor.backgroundColor) !== 'undefined') {\n this.$input.style.backgroundColor = this.$input.savedColor.backgroundColor;\n this.$input.style.color = this.$input.savedColor.color;\n this.$input.savedColor = {};\n }\n};\n\n/* Render handler */\n\nView.prototype.render = function(viewCmd, parameter) {\n const self = this;\n var viewCommands = {\n init: function() {\n self._init(parameter);\n },\n initAutofillInputs: function() {\n self._initAutofillInputs(parameter);\n },\n resetAutofillInputs: function() {\n self._resetAutofillInputs(parameter);\n },\n updatePlaceholder: function() {\n self._updatePlaceholder(parameter);\n },\n error: function() {\n self._error(parameter);\n },\n addStyles: function() {\n self._addStyles(parameter);\n },\n removeStyles: function() {\n self._removeStyles();\n },\n addCssClass: function() {\n self._addCssClass(parameter);\n },\n removeCssClass: function() {\n self._removeCssClass(parameter);\n },\n autofillStyle: function() {\n self._autofillStyle(parameter);\n },\n removeAutofillStyle: function() {\n self._removeAutofillStyle(parameter);\n },\n noOutline: function() {\n self._noOutline(parameter);\n },\n };\n\n viewCommands[viewCmd]();\n};\n\nView.prototype.postMessage = function(msg, target) {\n const self = this; \n\n let encodedMessage;\n try {\n encodedMessage = JSON.stringify(msg);\n }\n catch (err) {\n self.view.render('error', err.message);\n encodedMessage = msg;\n }\n\n if (target === 'source') {\n self.sourceWindow.postMessage(encodedMessage, self.sourcePageUrl);\n } \n else {\n const frames = this.sourceWindow.frames;\n var targetFrame;\n for (var i = 0; i < frames.length; i++) {\n var queryString = '';\n try {\n queryString = frames[i].location.search;\n }\n catch (err) {\n // Ignoring potential CORS issues with an iframe.\n }\n\n if (queryString) {\n let type = self._getUrlParameter(queryString, 'type');\n if (type === target) {\n targetFrame = frames[i];\n break;\n }\n }\n }\n\n if (targetFrame) {\n targetFrame.postMessage(encodedMessage, REMOTE_PAGE_URL); \n } \n else {\n self.render('error', `The ${target} field has not been mounted to the page`);\n }\n }\n};\n\nView.prototype.checkForCvv = function() {\n const self = this;\n const frames = this.sourceWindow.frames;\n\n var cvvFound = false;\n\n for (var i = 0; i < frames.length; i++) {\n var queryString = '';\n try {\n queryString = frames[i].location.search;\n }\n catch (err) {\n // Ignoring potential CORS issues with an iframe.\n }\n\n if (queryString) {\n let type = self._getUrlParameter(queryString, 'type');\n\n if (type === Fields.CVV) {\n cvvFound = true;\n break;\n }\n }\n }\n\n return cvvFound;\n};\n\nView.prototype.focus = function() {\n this.$input.focus();\n};\n\nView.prototype.blur = function() {\n this.$input.blur();\n};\n\nView.prototype.clear = function() {\n this.$input.value = '';\n};\n\n/* Bind callbacks */\n\nView.prototype.bind = function(event, handler) {\n const self = this;\n if (event === 'message') {\n window.addEventListener(event, handler, false);\n } else { // e.g. focus, blur, empty, brand...\n self.$input.addEventListener(event, handler, false);\n }\n};\n\nView.prototype.trigger = function(event, data) {\n const self = this;\n \n const domEvent = document.createEvent('Event');\n domEvent.initEvent(event, false, true);\n \n if (event === Events.value) {\n self.$input.value = data;\n } else if (event === Events.brand) {\n self.$input.dispatchEvent(domEvent);\n } else if (event === Events.empty) {\n self.$input.dispatchEvent(domEvent);\n } else if (event === Events.error) {\n self.$input.dispatchEvent(domEvent);\n } else if (event === Events.complete) {\n self.$input.dispatchEvent(domEvent);\n }\n};\n\nView.prototype.getCursorPosition = function() {\n const self = this;\n let position;\n if ('selectionEnd' in self.$input) {\n position = self.$input.selectionEnd;\n } else if (document.selection) {\n // IE\n self.$input.focus();\n let sel = document.selection.createRange();\n let selLen = document.selection.createRange().text.length;\n sel.moveStart('character', -self.$input.value.length);\n position = sel.text.length - selLen;\n }\n return position;\n};\n\nView.prototype.setCursorPosition = function(position) {\n const self = this;\n\n // use setTimeout to handle cursor not being moved properly on Samsung's Android keyboards\n setTimeout(function() {\n if (self.$input.setSelectionRange) {\n self.$input.focus();\n self.$input.setSelectionRange(position, position);\n }\n else if (self.$input.createTextRange) {\n let range = self.$input.createTextRange();\n range.collapse(true);\n range.moveEnd('character', position);\n range.moveStart('character', position);\n range.select();\n }\n }, 0);\n};\n\nmodule.exports = View;\n\n\n\n// WEBPACK FOOTER //\n// ./app/remote/view.js","var Format = {\n cardNumber: function (cardNumber, cardBrand) {\n let formatted = '';\n if (cardNumber && (cardNumber.toString().trim())) {\n cardNumber = cardNumber.toString().replace(/[^0-9]/g, '');\n\n let maxLength = Math.max.apply(null, cardBrand.lengths);\n cardNumber = cardNumber.substring(0, maxLength);\n\n let start = 0;\n for (let i = 0, spaces = cardBrand.spaces.length; i < spaces; i++) {\n let end = cardBrand.spaces[i];\n formatted = formatted + ' ' + cardNumber.substring(start, end);\n start = end;\n }\n formatted = formatted + ' ' + cardNumber.substring(start, cardNumber.length);\n }\n \n return formatted.trim();\n },\n\n cursorPosition: function(oldPosition, oldValue, formattedValue) {\n oldPosition = (oldPosition && oldPosition.toString().trim()) ? oldPosition : 0;\n if (isNaN(oldPosition) || (oldPosition === 0) || !formattedValue || formattedValue.length === 0) {\n return 0;\n } else {\n let newPosition = 0;\n oldValue = oldValue ? oldValue : '';\n\n // get numeric characters before cursor\n let numValuesBeforeCursor = oldValue.substring(0, oldPosition).replace(/\\D/g, '');\n let lengthOfFormatted = formattedValue.length;\n\n // for each value in old value\n for (let i = 0, charsCount = numValuesBeforeCursor.length; i < charsCount; i++) {\n while (newPosition < lengthOfFormatted && (numValuesBeforeCursor[i] !== formattedValue[newPosition])) {\n newPosition++;\n }\n newPosition++;\n }\n\n // handle non-numbers at end\n if (isNaN(parseInt(formattedValue.slice(-1)))) {\n newPosition = lengthOfFormatted;\n }\n\n // restrict length\n if (lengthOfFormatted < newPosition) {\n newPosition = lengthOfFormatted;\n }\n\n return newPosition;\n }\n },\n\n expiry: function(expiry) {\n if (expiry === null) {\n return '';\n }\n \n const EXPIRY_SEPARATOR = '/';\n\n let formatted = expiry;\n\n // if month is set and year is not, do not append if moving back to month\n let appendSeparator = !(/^(\\d{1,2}) \\/$/.test(expiry));\n\n if (expiry && (expiry.toString().trim())) {\n expiry = expiry.toString().replace(/[^0-9\\/]/g, '');\n\n let expiryParts = expiry.split(EXPIRY_SEPARATOR);\n let month = expiryParts[0] || '';\n let year = expiryParts[1] || '';\n\n // if month too short take from year if it has value\n if (year && (!month || parseInt(month) === 0)) {\n month = '0' + year.substring(0, 1);\n year = year.substring(1);\n }\n\n if (month) {\n let oldMonth = month;\n const MAX_MONTH = 12;\n\n // pad month with zeroes\n if ((year && month.length < 2) || parseInt(month.substring(0, 1)) > 1 || parseInt(month.substring(0, 2)) > MAX_MONTH) {\n month = '0' + month;\n } else if (parseInt(month) === 0) {\n month = '0';\n }\n\n // if month was not formatted prepend extra digits to year\n if (oldMonth === month || (!year)) {\n year = month.substring(2) + year;\n }\n // restrict month to two digits\n month = month.substring(0,2);\n }\n\n // restrict year to two digits\n year = year.slice(-2);\n\n formatted = month;\n\n // join with separator\n if (year || ((month.length == 2) && (appendSeparator)) ) {\n formatted = month + ' ' + EXPIRY_SEPARATOR + ' ' + year;\n }\n }\n\n return formatted;\n },\n\n cvv: function(cvv, cardBrand) {\n if (cvv === null) {\n return '';\n }\n\n let length = 4;\n length = cardBrand.cvvLength ? cardBrand.cvvLength : length;\n\n cvv = cvv.replace(/\\D/g, '');\n return cvv.substring(0, length);\n },\n};\n\nmodule.exports = Format;\n\n\n// WEBPACK FOOTER //\n// ./app/format.js","const View = require('./view.js');\nconst Controller = require('./controller.js');\n\nmodule.exports = function() {\n this.view = new View();\n this.controller = new Controller(this.view);\n};\n\n\n// WEBPACK FOOTER //\n// ./app/remote/index.js","const Errors = require('./errors.js');\nconst Fields = require('./fields.js');\nconst tokenizationURL = 'https://www.beanstream.com/scripts/tokenization/tokens';\n\nvar Tokenization = {\n // Requests a token with the passed in data and executes the callback with a \n // successful token or an error. \n // data arg expects properties: `card`, `cvv`, `month`, `year`.\n getToken: function(data, callback) {\n var self = this;\n const formattedData = self._formatData(data);\n\n // create AJAX request:\n const isIE9 = window.XDomainRequest ? true : false; \n let xhr;\n if (isIE9) {\n xhr = new window.XDomainRequest();\n } else {\n xhr = new XMLHttpRequest();\n }\n \n xhr.open('POST', tokenizationURL, true);\n if (!isIE9) {\n xhr.setRequestHeader('Content-Type', 'text/plain; charset=UTF-8');\n }\n xhr.timeout = 5000; // milliseconds\n\n xhr.onload = function(e) {\n var request = e.currentTarget || e.target;\n var result; \n\n // successful response\n if (!isIE9 && request.status >= 200 && request.status < 400) {\n result = {\n code: request.status || 200,\n success: true, \n token: JSON.parse(request.responseText).token,\n last4: formattedData.number.substr(-4),\n expiryMonth: formattedData.expiry_month,\n expiryYear: formattedData.expiry_year,\n };\n } else if (isIE9 && xhr.responseText && JSON.parse(xhr.responseText).token) {\n result = {\n code: 200,\n success: true, \n token: JSON.parse(xhr.responseText).token,\n last4: formattedData.number.substr(-4),\n expiryMonth: formattedData.expiry_month,\n expiryYear: formattedData.expiry_year,\n };\n // unsuccessful response\n } else {\n result = {\n code: request.status,\n success: false,\n error: Errors.errorDetails('token', Errors.TokenizationFailed),\n };\n }\n callback(result);\n };\n\n\n xhr.onerror = function() {\n var result = {\n code: 500,\n success: false,\n error: Errors.errorDetails('token', Errors.TokenizationNoResponse),\n };\n callback(result);\n };\n\n xhr.ontimeout = function() {\n var result = {\n success: false, \n code: 504,\n error: Errors.errorDetails('token', Errors.TokenizationNoResponse),\n };\n callback(result);\n };\n\n\n xhr.send(JSON.stringify(formattedData));\n },\n\n\n // Format the passed in data into the format expected by the \n // tokenization endpoint. \n _formatData: function(data) {\n if (data[Fields.CARD_NUMBER] === null) {\n data[Fields.CARD_NUMBER] = '';\n }\n\n if (data[Fields.EXPIRY] === null) {\n data[Fields.EXPIRY] = ' / ';\n }\n\n const monthYear = data[Fields.EXPIRY].split(' / ');\n const month = monthYear[0];\n const year = monthYear[1];\n\n const number = data[Fields.CARD_NUMBER].replace(/\\s/g, '');\n\n // These property names are required by the tokenization endpoint. \n let dataObject = {\n number: number, \n expiry_month: month,\n expiry_year: year,\n };\n\n if (data.cvv) {\n dataObject.cvd = data.cvv; // endpoint requires 'cvd' field (not 'cvv')\n }\n\n return dataObject; \n },\n};\n\nmodule.exports = Tokenization;\n\n\n// WEBPACK FOOTER //\n// ./app/tokenization.js","const Errors = require('./errors.js');\nconst Fields = require('./fields.js');\nconst Brands = require('./brands.js');\n\nfunction Validator() {}\n\n// Card Validation \n\nfunction isValidCardNumber(cardNumber) {\n if (cardNumber && (cardNumber.toString().trim())) {\n cardNumber = cardNumber.toString().replace(/\\s/g, '');\n\n let cardBrand = Brands.cardBrand(cardNumber);\n if (cardBrand.cardPattern) {\n return cardBrand.cardPattern.test(cardNumber);\n }\n }\n\n return false;\n}\n\nfunction isValidLength(cardNumber, cardBrand) {\n if (cardNumber && (cardNumber.toString().trim()) && cardBrand && cardBrand.lengths) {\n cardNumber = cardNumber.toString().replace(/\\s/g, '');\n\n for (let i = 0, lengths = cardBrand.lengths.length; i < lengths; i++) {\n if (cardNumber.length == cardBrand.lengths[i]) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction isValidLuhn(cardNumber) {\n if (cardNumber && (cardNumber.toString().trim())) {\n cardNumber = cardNumber.toString().replace(/\\s/g, '');\n let sum = 0;\n let alternate = false;\n for (let i = cardNumber.length - 1; i >= 0; i--) {\n let n = parseInt(cardNumber.substring(i, i + 1));\n if (alternate) {\n n *= 2;\n if (n > 9) {\n n = (n % 10) + 1;\n }\n }\n sum += n;\n alternate = !alternate;\n }\n return ((sum % 10) === 0);\n }\n return false;\n}\n\nValidator.prototype.validateCardNumber = function(cardNumber, acceptedBrands) {\n if (cardNumber && (cardNumber.toString().trim())) {\n cardNumber = cardNumber.toString().replace(/\\s/g, '');\n\n let cardBrand = Brands.cardBrand(cardNumber);\n if (cardBrand.brand === Brands.Names.Unknown) {\n return {\n isValid: false,\n error: Errors.errorDetails(Fields.CARD_NUMBER, Errors.CardNumberInvalid),\n };\n } else if (!isValidLength(cardNumber, cardBrand)) {\n return {\n isValid: false,\n error: Errors.errorDetails(Fields.CARD_NUMBER, Errors.CardNumberInvalid),\n };\n } else if (!isValidCardNumber(cardNumber)) {\n return {\n isValid: false,\n error: Errors.errorDetails(Fields.CARD_NUMBER, Errors.CardNumberInvalid),\n };\n } else if (!isValidLuhn(cardNumber)) {\n return {\n isValid: false,\n error: Errors.errorDetails(Fields.CARD_NUMBER, Errors.CardNumberInvalid),\n };\n } else if (acceptedBrands && acceptedBrands.indexOf(cardBrand.brand) < 0) {\n return {\n isValid: false, \n error: Errors.errorDetails(Fields.CARD_NUMBER, Errors.CardNumberInvalid),\n }; \n } else {\n return {\n isValid: true,\n };\n }\n }\n\n return {\n isValid: false,\n error: Errors.errorDetails(Fields.CARD_NUMBER, Errors.CardNumberInvalid),\n };\n};\n\n\n// cvv validation \n\nValidator.prototype.validateCvv = function(cvv, cardBrand) {\n if (cvv && (cvv.toString().trim())) {\n cvv = cvv.toString().replace(/\\s/g, '');\n\n let length = 4;\n length = (cardBrand && cardBrand.cvvLength) ? cardBrand.cvvLength : length;\n\n if ((cvv.length !== length)) {\n return {\n isValid: false,\n error: Errors.errorDetails(Fields.CVV, Errors.CvvNotSet),\n };\n } else if (isNaN(cvv)) {\n return {\n isValid: false,\n error: Errors.errorDetails(Fields.CVV, Errors.CvvNotSet),\n };\n } else {\n return {\n isValid: true,\n };\n }\n }\n return {\n isValid: false,\n error: Errors.errorDetails(Fields.CVV, Errors.CvvNotSet),\n };\n};\n\n// expiry validation \n\nfunction isValidExpiryField(expiryField) {\n let expiryLength = 2;\n\n if (expiryField && (expiryField.toString().trim())) {\n expiryField = expiryField.toString().replace(/\\s/g, '');\n return (expiryField.length === expiryLength) && !isNaN(expiryField);\n }\n}\n\nfunction isValidMonth(month) {\n if (isValidExpiryField(month)) {\n let january = 1;\n let december = 12;\n month = parseInt(month);\n return (month >= january && month <= december);\n }\n}\n\nfunction isValidExpiry(month, year) {\n if (isValidExpiryField(month) && isValidExpiryField(year) && isValidMonth(month)) {\n\n let today = new Date();\n let expiry = new Date();\n\n year = 2000 + parseInt(year);\n month = parseInt(month);\n expiry.setFullYear(year, month - 1, today.getDate());\n\n if (expiry >= today) {\n return true;\n }\n }\n return false;\n}\n\nValidator.prototype.validateExpiry = function(expiry) {\n \n let month;\n let year;\n if (!expiry) {\n month = '';\n year = '';\n } else {\n const monthYear = expiry.split(' / ');\n if (!monthYear || monthYear.length !== 2) {\n month = '';\n year = '';\n } else {\n month = monthYear[0];\n year = monthYear[1];\n }\n }\n\n if (isValidExpiryField(month) && isValidExpiryField(year) ) {\n month = month.toString().replace(/\\s/g, '');\n year = year.toString().replace(/\\s/g, '');\n if (!isValidMonth(month)) {\n return {\n isValid: false,\n error: Errors.errorDetails(Fields.EXPIRY, Errors.ExpiryIsNotSet),\n };\n } else if (isValidExpiry(month, year)) {\n return {\n isValid: true,\n };\n } else {\n return {\n isValid: false,\n error: Errors.errorDetails(Fields.EXPIRY, Errors.ExpiryIsInThePast),\n };\n }\n } else {\n return {\n isValid: false,\n error: Errors.errorDetails(Fields.EXPIRY, Errors.ExpiryIsNotSet),\n };\n }\n};\n\nmodule.exports = Validator;\n\n\n// WEBPACK FOOTER //\n// ./app/validator.js"],"sourceRoot":""}