diff --git a/i18n/parse.js b/i18n/parse.js index 7393f1bc0..3cd200c22 100644 --- a/i18n/parse.js +++ b/i18n/parse.js @@ -74,7 +74,7 @@ const app = fs.readFileSync(appPath, {encoding: 'utf8'}) const outPath = path.resolve(__dirname, '../i18n/ui/lbm-ui_en-US.po') const coins = [ - 'Bitcoin', 'Ethereum', 'Zcash', 'Litecoin', 'Dash', 'Bitcoin Cash' + 'Bitcoin', 'Ethereum', 'Zcash', 'Litecoin', 'Dash', 'Bitcoin Cash', 'Monero', 'USDT' ] function run (){ diff --git a/i18n/ui/lbm-ui_en-US.po b/i18n/ui/lbm-ui_en-US.po index 3f8f5cf0e..09abe6c15 100644 --- a/i18n/ui/lbm-ui_en-US.po +++ b/i18n/ui/lbm-ui_en-US.po @@ -102,6 +102,10 @@ msgstr "Please contact the operator if you wish to learn more." msgid "Languages" msgstr "Languages" +#: On screen: choose_coin +msgid "Rates" +msgstr "Rates" + #: On screen: choose_coin msgid "Redeem" msgstr "Redeem" @@ -594,6 +598,22 @@ msgstr "If you are sure of the code, please contact the operator for clarificati msgid "Enter a different code" msgstr "Enter a different code" +#: On screen: rates +msgid "Exchange Rates" +msgstr "Exchange Rates" + +#: On screen: rates +msgid "Buy" +msgstr "Buy" + +#: On screen: rates +msgid "Crypto" +msgstr "Crypto" + +#: On screen: rates +msgid "Sell" +msgstr "Sell" + #: On screen: recycler-continue msgid "Depositing bills..." msgstr "Depositing bills..." @@ -1078,3 +1098,11 @@ msgstr "Dash" msgid "Bitcoin Cash" msgstr "Bitcoin Cash" +#: On screen: coins +msgid "Monero" +msgstr "Monero" + +#: On screen: coins +msgid "USDT" +msgstr "USDT" + diff --git a/lib/brain.js b/lib/brain.js index 4c933103f..6a822e1f1 100644 --- a/lib/brain.js +++ b/lib/brain.js @@ -1098,6 +1098,7 @@ Brain.prototype._connectedBrowser = function _connectedBrowser () { cryptomatModel, version, operatorInfo: this.trader?.operatorInfo ?? { active: false }, + screenOpts: this.trader?.machineScreenOpts } return this.browser().send(rec) @@ -1130,7 +1131,8 @@ Brain.prototype._connectedBrowser = function _connectedBrowser () { operatorInfo: this.trader.operatorInfo, cryptomatModel, areThereAvailablePromoCodes: this.trader.areThereAvailablePromoCodes, - supportedCoins: this.mapCryptoUnitsDisplay(this.trader.coins) + supportedCoins: this.mapCryptoUnitsDisplay(this.trader.coins), + screenOpts: this.trader.machineScreenOpts } this.browser().send(fullRec) @@ -1375,6 +1377,9 @@ Brain.prototype._processReal = function _processReal (req) { case 'leftoverBillsRemoved': this._leftoverBillsRemoved() break + case 'ratesScreen': + this.ratesScreen() + break default: break } @@ -2334,6 +2339,7 @@ Brain.prototype._chooseCoinScreen = function _chooseCoinsScreen (localeInfo, cas localeInfo: localeInfo, cassettes: cassettes, coins: this.trader.coins, + screenOpts: this.trader.machineScreenOpts, twoWayMode: this.twoWayMode(), supportedCoins: this.mapCryptoUnitsDisplay(this.trader.coins) }) @@ -2670,7 +2676,8 @@ Brain.prototype.sendRates = function sendRates () { terms: _.assign(this.trader.terms, this._getTermsDelayConfig()), operatorInfo: this.trader.operatorInfo, areThereAvailablePromoCodes: this.trader.areThereAvailablePromoCodes, - supportedCoins: this.mapCryptoUnitsDisplay(this.trader.coins) + supportedCoins: this.mapCryptoUnitsDisplay(this.trader.coins), + screenOpts: this.trader.machineScreenOpts } this.browser().send(rec) @@ -4163,6 +4170,13 @@ Brain.prototype.cancelTransaction = function cancelTransaction (previousState) { } } +Brain.prototype.ratesScreen = function () { + const coins = _.map(it => it.cryptoCode, this.trader.coins) + const rates = _.reduce((acc, value) => Object.assign({ [value]: _.mapValues(it => it.toString(), this.trader.rates(value)) }, acc), {}, coins) + + this._transitionState('rates', { allRates: rates, ratesFiat: this.trader.locale.fiatCode }) +} + Brain.prototype.browser = function browser () { return this.browserObj } diff --git a/lib/trader.js b/lib/trader.js index 591899523..758397cfa 100644 --- a/lib/trader.js +++ b/lib/trader.js @@ -90,6 +90,12 @@ query($configVersion: Int, $currentHash: String) { addressQRCode } + screenOptions { + rates { + active + } + } + triggersAutomation { sanctions idCardPhoto @@ -716,6 +722,7 @@ Trader.prototype.pollHandler = function pollHandler (data) { ) ) this.triggers = addCustomInfoRequestIdToTriggers(data.triggers) + this.machineScreenOpts = data.screenOptions this.receiptPrintingActive = data.receiptInfo && data.receiptInfo.paper this.smsReceiptActive = data.receiptInfo && data.receiptInfo.sms @@ -907,7 +914,7 @@ Trader.prototype.networkHeartbeat = function networkHeartbeat (obj) { body: obj, method: 'POST' }) - .catch(err => console.error('Failed to send network heartbeat', err)) + .catch(err => console.error('Failed to send network heartbeat', err)) } Trader.prototype.networkPerformance = function networkPerformance (obj) { @@ -916,7 +923,7 @@ Trader.prototype.networkPerformance = function networkPerformance (obj) { body: obj, method: 'POST' }) - .catch(err => console.error('Failed to send network performance', err)) + .catch(err => console.error('Failed to send network performance', err)) } Trader.prototype.emptyUnit = function emptyUnit (body) { @@ -1030,7 +1037,8 @@ function isNewState (res) { const pare = r => ({ twoWayMode: r.twoWayMode, locale: r.locale, - coins: _.map('cryptoCode', r.coins) + coins: _.map('cryptoCode', r.coins), + screenOps: r.machineScreenOpts }) if (_.isEqual(pare(res), oldState)) return false diff --git a/ui/css/main.scss b/ui/css/main.scss index 2c0d31dc6..0c3daa346 100644 --- a/ui/css/main.scss +++ b/ui/css/main.scss @@ -733,6 +733,10 @@ footer { width: 30vh; } +.rates-section { + margin-left: 2em; +} + #change-language-section #language-dropdown-toggle { align-items: center; } @@ -1444,6 +1448,10 @@ footer { display: flex; justify-content: flex-end; } + .rates-section { + margin-left: 0; + margin-right: 2em; + } } .send-only-total { diff --git a/ui/html/choose-coin.html b/ui/html/choose-coin.html index 5f1f3ddf8..13c0de851 100644 --- a/ui/html/choose-coin.html +++ b/ui/html/choose-coin.html @@ -15,6 +15,11 @@
+
+
+
Rates
+
+
diff --git a/ui/html/insert_promo_code.html b/ui/html/insert_promo_code.html index 3685dfcbc..b4dc222d8 100644 --- a/ui/html/insert_promo_code.html +++ b/ui/html/insert_promo_code.html @@ -72,7 +72,7 @@
diff --git a/ui/html/rates.html b/ui/html/rates.html new file mode 100644 index 000000000..4e584ed44 --- /dev/null +++ b/ui/html/rates.html @@ -0,0 +1,26 @@ +
+
+
+ +
+
+ +
+
+

Exchange Rates

+

EUR

+
+
+
+

Buy

+

Crypto

+

Sell

+
+
+
+
diff --git a/ui/html/withdraw-failure.html b/ui/html/withdraw-failure.html index dd1534053..fcf6de1fb 100644 --- a/ui/html/withdraw-failure.html +++ b/ui/html/withdraw-failure.html @@ -8,7 +8,7 @@

We got this

-

+

Our Internet was down for a bit but you'll receive your funds as soon as our connection is back.

You Purchased

diff --git a/ui/js/app.js b/ui/js/app.js index a6f19a170..c69bf2c6d 100644 --- a/ui/js/app.js +++ b/ui/js/app.js @@ -93,6 +93,7 @@ var LN = 'LN'; var BTC = 'BTC'; function processData(data) { + if (data.screenOpts) setScreenOptions(data.screenOpts); if (data.localeInfo) setLocaleInfo(data.localeInfo); if (data.locale) setLocale(data.locale); if (data.supportedCoins) setCoins(data.supportedCoins); @@ -112,7 +113,9 @@ function processData(data) { if (data.cassettes) buildCassetteButtons(data.cassettes, NUMBER_OF_BUTTONS); if (data.readingBills) readingBills(data.readingBills); if (data.cryptoCode) translateCoin(data.cryptoCode); - if (data.tx && data.tx.cashInFee) setFixedFee(data.tx.cashInFee); + if (data.tx) { + if (data.tx.cashInFee) setFixedFee(data.tx.cashInFee);else if (data.tx.cashOutFee) setFixedFee(data.tx.cashOutFee); + } if (data.terms) setTermsScreen(data.terms); if (data.dispenseBatch) dispenseBatch(data.dispenseBatch); if (data.direction) setDirection(data.direction); @@ -120,6 +123,7 @@ function processData(data) { if (data.hardLimit) setHardLimit(data.hardLimit); if (data.cryptomatModel) setCryptomatModel(data.cryptomatModel); if (data.areThereAvailablePromoCodes !== undefined) setAvailablePromoCodes(data.areThereAvailablePromoCodes); + if (data.allRates && data.ratesFiat) setRates(data.allRates, data.ratesFiat); if (data.tx && data.tx.discount) setCurrentDiscount(data.tx.discount); if (data.receiptStatus) setReceiptPrint(data.receiptStatus, null); @@ -298,6 +302,9 @@ function processData(data) { clearTimeout(complianceTimeout); externalCompliance(data.externalComplianceUrl); break; + case 'rates': + setState('rates'); + break; default: if (data.action) setState(window.snakecase(data.action)); } @@ -843,6 +850,9 @@ $(document).ready(function () { setupButton('terms-ok', 'termsAccepted'); setupButton('terms-ko', 'idle'); + setupImmediateButton('rates-close', 'idle'); + setupButton('rates-section-button', 'ratesScreen'); + setupButton('maintenance_restart', 'maintenanceRestart'); calculateAspectRatio(); @@ -2036,4 +2046,30 @@ function externalCompliance(url) { qrize(url, $('#qr-code-external-validation'), cashDirection === 'cashIn' ? CASH_IN_QR_COLOR : CASH_OUT_QR_COLOR); return setScreen('external_compliance'); } + +function setScreenOptions(opts) { + opts.rates && opts.rates.active ? $('#rates-section').show() : $('#rates-section').hide(); +} + +function thousandSeparator(number, country, minimumFractionDigits) { + var numberFormatter = Intl.NumberFormat(country, { minimumFractionDigits: minimumFractionDigits }); + return numberFormatter.format(number); +} + +function setRates(allRates, fiat) { + var ratesTable = $('.rates-content'); + var tableHeader = $('
\n

' + translate('Buy') + '

\n

' + translate('Crypto') + '

\n

' + translate('Sell') + '

\n
'); + var coinEntries = []; + + Object.keys(allRates).forEach(function (it) { + var cashIn = BN(allRates[it].cashIn); + var cashOut = BN(allRates[it].cashOut); + var biggestDecimalPlaces = Math.max(cashIn.dp(), cashOut.dp()); + + coinEntries.push($('
\n

' + thousandSeparator(BN(allRates[it].cashIn).toFixed(2), localeCode) + '

\n

' + it + '

\n

' + thousandSeparator(BN(allRates[it].cashOut).toFixed(2), localeCode) + '

\n
')); + }); + + $('#rates-fiat-currency').text(fiat); + ratesTable.empty().append(tableHeader).append(coinEntries); +} //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/ui/js/app.js.map b/ui/js/app.js.map index 735ebd7b7..fb1668559 100644 --- a/ui/js/app.js.map +++ b/ui/js/app.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/app.js"],"names":["queryString","window","location","search","params","URLSearchParams","substring","DEBUG_MODE","get","CASH_OUT_QR_COLOR","CASH_IN_QR_COLOR","NUMBER_OF_BUTTONS","scrollSize","textHeightQuantity","currentPage","totalPages","aspectRatio","isTwoWay","isRTL","cryptomatModel","termsConditionsTimeout","termsConditionsAcceptanceInterval","T_C_TIMEOUT","complianceTimeout","cashDirection","fiatCode","locale","defaultLocale","loadI18n","localeCode","jsLocaleCode","_primaryLocales","lastRates","coins","currentState","websocket","promoKeyboard","usSsnKeypad","phoneKeypad","securityKeypad","previousState","buttonActive","currentCryptoCode","currentCoin","currentCoins","emailKeyboard","customRequirementNumericalKeypad","customRequirementTextKeyboard","customRequirementChoiceList","MUSEO","connect","console","log","HOST","PORT","WebSocket","onmessage","event","data","$","parseJSON","processData","onerror","err","verifyConnection","readyState","CLOSED","buttonPressed","button","deactivate","setTimeout","activate","res","send","JSON","stringify","displayLN","displayBTC","LN","BTC","localeInfo","setLocaleInfo","setLocale","supportedCoins","setCoins","setFiatCode","rates","setExchangeRate","buyerAddress","setBuyerAddress","credit","lastBill","action","setCredit","tx","setTx","sendOnly","reason","fiatCredit","depositInfo","setDepositAddress","version","setVersion","cassettes","buildCassetteButtons","readingBills","cryptoCode","translateCoin","cashInFee","setFixedFee","terms","setTermsScreen","dispenseBatch","direction","setDirection","operatorInfo","setOperatorInfo","hardLimit","setHardLimit","setCryptomatModel","areThereAvailablePromoCodes","undefined","setAvailablePromoCodes","discount","setCurrentDiscount","receiptStatus","setReceiptPrint","smsReceiptStatus","context","hide","show","isRecycler","billValidator","setState","text","setComplianceTimeout","setConstraint","disableRecyclerBillButtons","enableRecyclerBillButtons","highBill","highestBill","minimumTx","lowestBill","isCashInOnlyCoin","chooseFiat","deposit","fiatReceipt","fiatComplete","chooseCoin","twoWayMode","smsVerification","emailVerification","idVerification","facephotoPermission","usSsnPermission","externalPermission","blockedCustomer","customInfoRequestPermission","customInfoRequest","invalidAddress","lnInvoiceTypeError","clearTimeout","externalCompliance","externalComplianceUrl","snakecase","translate","fetchArgs","fetch","error","e","setScreen","screen1","title","interval","complianceButton","input","type","screen2","setOpts","constraint","constraintType","maxLength","numDigits","label1","label2","removeClass","addClass","replaceChoices","choiceList","setChooseCoinColors","defaultCoin","slice","setCryptoBuy","setCryptoSell","setupCoinsButtons","openLanguageDropdown","closeLanguageDropdown","openCoinDropdown","closeCoinDropdown","empty","dropdownCoins","length","showMoreButton","forEach","coin","activeClass","el","toLowerCase","display","append","each","html","trim","cashIn","translatedCoin","buyStr","cashOut","sellStr","getCryptoCurrency","cryptoCurrency","find","c","Error","switchCoin","selectedIndex","indexOf","it","splice","document","ready","attachFastClick","Origami","fastclick","body","addEventListener","calculateAspectRatio","onclick","oncontextmenu","onmousedown","onmousemove","onmouseup","BigNumber","config","ROUNDING_MODE","ROUND_HALF_EVEN","Keyboard","id","inputBox","init","Keypad","result","country","submitButtonWrapper","ChoiceList","setInterval","initTranslatePage","sendCoinsButton","getElementById","sendCoinsButton2","touchEvent","setupButton","blockedCustomerOk","insertBillCancelButton","touchImmediateEvent","insertBillCancelRecyclerButton","setupImmediateButton","promoCodeCancelButton","bind","submitCodeButton","code","submitEmailButton","submitTextRequirementButton","nextFieldTextRequirementButton","previousFieldTextRequirementButton","val","setInputBox","cryptoButtons","target","is","closest","wantedCoin","areYouSureCancel","areYouSureContinue","coinRedeem","otherLocale","cashInBox","cashOutBox","languageOverlay","cryptoOverlay","languageButtons","languageButtonJ","newLocale","attr","buildCassetteButtonEvents","initDebug","targetButton","element","classList","special","contains","parentNode","callback","handler","add","remove","stopPropagation","preventDefault","shouldEnableTouch","buttonClass","buttonAction","actionData","newScreen","oldScreen","css","top","left","newView","state","delay","clearTermsConditionsTimeout","clearTermsConditionsAcceptanceDelay","reset","revertScreen","setUpDirectionElement","operator","active","name","email","phone","limits","component","hardLimitWeeks","hardLimitDays","hardLimitHours","model","versions","startsWith","continueButton","finishButton","disabled","states","$screen","startPage","acceptDisabled","cancel","accept","setTermsConditionsTimeout","setAcceptButtonDisabled","setTermsConditionsAcceptanceDelay","screen","acceptButton","prop","Boolean","delayTimer","isNaN","seconds","tmpbtn","clone","appendTo","width","outerWidth","clearInterval","resetTermsConditionsTimeout","scrollUp","div","updateButtonStyles","updatePageCounter","scrollTo","acceptedTerms","offsetHeight","style","Math","ceil","textContent","scrollDown","buttonDown","buttonUp","setCountry","setPrimaryLocales","primaryLocales","primaryLocale","otherLanguageName","lang","lookupLocaleNames","nativeName","split","isArabic","isHebrew","translatePage","ex","elem","img","areArraysEqual","arr1","arr2","i","langMap","languageMappingList","language","localeNames","languages","sortedPrimaryLocales","filter","sort","a","b","langA","langB","englishName","localeCompare","l","toggleClass","_fee","fee","parseFloat","fixedFee","formatFiat","fiat","cryptoAtoms","scale","pow","displayScale","cryptoAmount","toNumber","cryptoDisplayCode","displayCode","updateCrypto","inserted","formatDenomination","denom","toLocaleString","useGrouping","maximumFractionDigits","minimumFractionDigits","_cassettes","numberOfButtons","activeCassettes","count","inactiveCassettes","allCassettes","concat","selectedCassettes","sortedCassettes","denomination","updateCassetteButtons","activeDenoms","children","fiatButtons","lastTouch","now","Date","cashButtonJ","hasClass","selector","formatCrypto","lookupDecimalChar","num","localized","splitNumber","localize","decimalChar","join","formatNumber","amount","fractionDigits","_rates","cryptoToFiat","rateStr","round","cashOutCryptoToFiat","qrize","color","lightning","size","image","_size","clientHeight","opts","crisp","fill","render","rounded","quiet","mPosX","mPosY","mSize","mode","kjua","txId","isPaperWallet","hasBills","bills","promoCodeApplied","formatAddressNoBreakLines","address","firstPart","replace","secondPart","formatAddress","toBr","reasonText","t","bill","errorMessages","transactionLimit","validatorError","lowBalance","str","_cryptoCode","cryptoCodeDisplay","base","messages","locales","Jed","reachFiatLimit","rec","msg","isEmpty","txLimitReached","displayCrypto","decimalPlaces","unitScale","BN","s","activeDenominations","fiatDisplay","cryptoDisplay","eq","activeMap","toAddress","depositUrl","of","current","createElement","innerHTML","getElementsByTagName","appendChild","height","gcd","w","h","r","aspectRatioPt1","aspectRatioPt2","background","ua","navigator","userAgent","match","chromiumVersion","chromeVersion","chromiumPlus73","chromePlus73","currentDiscount","successMessage","status","className","printing","success","message","failMessage","url"],"mappings":"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","file":"app.js","sourcesContent":["/* globals $, URLSearchParams, WebSocket, locales, Keyboard, Keypad, Jed, BigNumber, HOST, PORT, Origami, kjua, TimelineMax, Two */\n'use strict'\n\nconst queryString = window.location.search\nconst params = new URLSearchParams(queryString.substring(1))\nconst DEBUG_MODE = params.get('debug')\nconst CASH_OUT_QR_COLOR = '#403c51'\nconst CASH_IN_QR_COLOR = '#0e4160'\nconst NUMBER_OF_BUTTONS = 3\n\nvar scrollSize = 0\nvar textHeightQuantity = 0\nvar currentPage = 0\nvar totalPages = 0\nvar aspectRatio = '16:10'\nvar isTwoWay = null\nvar isRTL = false\nvar cryptomatModel = null\nvar termsConditionsTimeout = null\nvar termsConditionsAcceptanceInterval = null\nvar T_C_TIMEOUT = 30000\nvar complianceTimeout = null;\nvar cashDirection = null;\n\nvar fiatCode = null\nvar locale = null\nvar defaultLocale = loadI18n('en-US') || null\nvar localeCode = null\nvar jsLocaleCode = null // Sometimes slightly different than localeCode\nvar _primaryLocales = []\nvar lastRates = null\nvar coins\n\nvar currentState\n\nvar websocket = null\nvar promoKeyboard = null\nvar usSsnKeypad = null\nvar phoneKeypad = null\nvar securityKeypad = null\nvar previousState = null\nvar buttonActive = true\nlet currentCryptoCode = null\nlet currentCoin = null\nlet currentCoins = []\nlet emailKeyboard = null\nlet customRequirementNumericalKeypad = null\nlet customRequirementTextKeyboard = null\nlet customRequirementChoiceList = null\n\nvar MUSEO = ['ca', 'cs', 'da', 'de', 'en', 'es', 'et', 'fi', 'fr', 'hr',\n 'hu', 'it', 'lt', 'nb', 'nl', 'pl', 'pt', 'ro', 'sl', 'sv', 'tr']\n\nfunction connect () {\n console.log(`ws://${HOST}:${PORT}/`)\n websocket = new WebSocket(`ws://${HOST}:${PORT}/`)\n websocket.onmessage = function (event) {\n var data = $.parseJSON(event.data)\n processData(data)\n }\n websocket.onerror = err => console.log(err)\n}\n\nfunction verifyConnection () {\n if (websocket.readyState === websocket.CLOSED) {\n connect()\n }\n}\n\nfunction buttonPressed (button, data) {\n if (!buttonActive) return\n promoKeyboard.deactivate()\n emailKeyboard.deactivate()\n customRequirementTextKeyboard.deactivate()\n buttonActive = false\n setTimeout(function () {\n buttonActive = true\n promoKeyboard.activate()\n emailKeyboard.activate()\n customRequirementTextKeyboard.activate()\n }, 300)\n var res = { button: button }\n if (data || data === null) res.data = data\n if (websocket) websocket.send(JSON.stringify(res))\n}\n\nconst displayLN = 'Lightning Network'\nconst displayBTC = 'Bitcoin
(LN)'\nconst LN = 'LN'\nconst BTC = 'BTC'\n\nfunction processData (data) {\n if (data.localeInfo) setLocaleInfo(data.localeInfo)\n if (data.locale) setLocale(data.locale)\n if (data.supportedCoins) setCoins(data.supportedCoins)\n if (!locale) return\n if (data.fiatCode) setFiatCode(data.fiatCode)\n if (data.rates) setExchangeRate(data.rates)\n if (data.buyerAddress) setBuyerAddress(data.buyerAddress)\n if (data.credit) {\n var lastBill = data.action === 'rejectedBill' ? null : data.credit.lastBill\n setCredit(data.credit, lastBill)\n }\n if (data.tx) setTx(data.tx)\n if (data.sendOnly) sendOnly(data.reason)\n if (data.fiatCredit) fiatCredit(data.fiatCredit)\n if (data.depositInfo) setDepositAddress(data.depositInfo)\n if (data.version) setVersion(data.version)\n if (data.cassettes) buildCassetteButtons(data.cassettes, NUMBER_OF_BUTTONS)\n if (data.readingBills) readingBills(data.readingBills)\n if (data.cryptoCode) translateCoin(data.cryptoCode)\n if (data.tx && data.tx.cashInFee) setFixedFee(data.tx.cashInFee)\n if (data.terms) setTermsScreen(data.terms)\n if (data.dispenseBatch) dispenseBatch(data.dispenseBatch)\n if (data.direction) setDirection(data.direction)\n if (data.operatorInfo) setOperatorInfo(data.operatorInfo)\n if (data.hardLimit) setHardLimit(data.hardLimit)\n if (data.cryptomatModel) setCryptomatModel(data.cryptomatModel)\n if (data.areThereAvailablePromoCodes !== undefined) setAvailablePromoCodes(data.areThereAvailablePromoCodes)\n\n if (data.tx && data.tx.discount) setCurrentDiscount(data.tx.discount)\n if (data.receiptStatus) setReceiptPrint(data.receiptStatus, null)\n if (data.smsReceiptStatus) setReceiptPrint(null, data.smsReceiptStatus)\n\n if (data.context) {\n $('.js-context').hide()\n $('.js-context-' + data.context).show()\n }\n\n const isRecycler = billValidator => {\n return billValidator === 'HCM2'\n }\n\n switch (data.action) {\n case 'pairing':\n setState('pairing')\n break\n case 'pairingError':\n $('.js-pairing-error').text(data.err)\n // Give it some time to update text in background\n setTimeout(function () { setState('pairing_error') }, 500)\n break\n case 'booting':\n if (currentState !== 'maintenance') setState('booting')\n break\n case 'idle':\n case 'fakeIdle':\n setState('idle')\n break\n case 'dualIdle':\n case 'fakeDualIdle':\n setState('dual_idle')\n break\n case 'registerUsSsn':\n usSsnKeypad.activate()\n setState('register_us_ssn')\n setComplianceTimeout(null, 'finishBeforeSms')\n break\n case 'registerPhone':\n phoneKeypad.activate()\n setState('register_phone')\n break\n case 'registerEmail':\n emailKeyboard.setConstraint('email', ['#submit-email'])\n setState('register_email')\n break\n case 'securityCode':\n securityKeypad.activate()\n setState('security_code')\n break\n case 'scanned':\n isRecycler(data.billValidator)\n ? setState('insert_first_bills_recycler')\n : setState('insert_bills')\n break\n case 'acceptingFirstBill':\n $('.js-send-crypto-enable').show()\n setState('insert_bills')\n break\n case 'acceptingBills':\n $('.blocked-customer-top').hide()\n setState('insert_more_bills')\n break\n case 'acceptingFirstRecyclerBills':\n $('.js-continue-crypto-enable').show()\n $('.js-send-crypto-enable').show()\n setState('insert_first_bills_recycler')\n break\n case 'recyclerContinue':\n disableRecyclerBillButtons()\n break;\n case 'acceptingRecyclerBills':\n enableRecyclerBillButtons()\n $('.blocked-customer-top').hide()\n setState('insert_bills_recycler')\n break\n case 'acceptingBill':\n case 'rejectedBill':\n // still need to prevent screen change\n break\n case 'cryptoTransferPending':\n setState('sending_coins')\n break\n case 'cryptoTransferComplete':\n setState('completed')\n break\n case 'networkDown':\n setState('trouble')\n break\n case 'balanceLow':\n setState('limit_reached')\n break\n case 'insufficientFunds':\n setState('out_of_coins')\n break\n case 'highBill':\n highBill(data.highestBill, data.reason)\n break\n case 'minimumTx':\n minimumTx(data.lowestBill)\n break\n case 'chooseFiat':\n if (data.isCashInOnlyCoin) {\n setState('cash_in_only_coin')\n break\n }\n chooseFiat(data.chooseFiat)\n break\n case 'deposit':\n setState('deposit')\n deposit(data.tx)\n break\n case 'rejectedDeposit':\n setState('deposit_timeout')\n break\n case 'fiatReceipt':\n fiatReceipt(data.tx)\n break\n case 'fiatComplete':\n fiatComplete(data.tx)\n break\n case 'restart':\n setState('restart')\n break\n case 'chooseCoin':\n chooseCoin(data.coins, data.twoWayMode)\n break\n case 'smsVerification':\n smsVerification()\n break\n case 'emailVerification':\n emailVerification();\n break;\n case 'permission_id':\n idVerification()\n break\n case 'permission_face_photo':\n facephotoPermission()\n break\n case 'usSsnPermission':\n usSsnPermission()\n break\n case 'externalPermission':\n externalPermission()\n break\n case 'blockedCustomer':\n blockedCustomer()\n break\n case 'insertPromoCode':\n promoKeyboard.activate()\n setState('insert_promo_code')\n break\n case 'invalidPromoCode':\n setState('promo_code_not_found')\n break\n case 'customInfoRequestPermission':\n customInfoRequestPermission(data.customInfoRequest)\n break\n case 'inputCustomInfoRequest':\n customInfoRequest(data.customInfoRequest)\n break\n case 'actionRequiredMaintenance':\n setState('action_required_maintenance')\n break\n case 'cashSlotRemoveBills':\n setState('cash_slot_remove_bills')\n break\n case 'leftoverBillsInCashSlot':\n setState('leftover_bills_in_cash_slot')\n break\n case 'invalidAddress':\n invalidAddress(data.lnInvoiceTypeError)\n break\n case 'externalCompliance':\n clearTimeout(complianceTimeout)\n externalCompliance(data.externalComplianceUrl)\n break\n default:\n if (data.action) setState(window.snakecase(data.action))\n }\n}\n\nfunction translate (data, fetchArgs) {\n if (data === \"\")\n return data\n\n try {\n return fetchArgs\n ? locale.translate(data).fetch(...fetchArgs)\n : locale.translate(data).fetch()\n } catch (error) {\n if (!defaultLocale) console.error('Error while translating: ', error)\n else {\n try {\n return fetchArgs\n ? defaultLocale.translate(data).fetch(...fetchArgs)\n : defaultLocale.translate(data).fetch()\n } catch (e) {\n console.error('Error while translating: ', e)\n return data\n }\n }\n }\n}\n\nfunction facephotoPermission () {\n setComplianceTimeout(null, 'finishBeforeSms')\n setScreen('permission_face_photo')\n}\n\nfunction usSsnPermission () {\n setComplianceTimeout(null, 'finishBeforeSms')\n setScreen('us_ssn_permission')\n}\n\nfunction externalPermission () {\n setComplianceTimeout(null, 'finishBeforeSms')\n setScreen('external_permission')\n}\n\nfunction customInfoRequestPermission (customInfoRequest) {\n $('#custom-screen1-title').text(customInfoRequest.screen1.title)\n $('#custom-screen1-text').text(customInfoRequest.screen1.text)\n setComplianceTimeout(null, 'finishBeforeSms')\n setScreen('custom_permission')\n}\n\nfunction setComplianceTimeout (interval, complianceButton) {\n clearTimeout(complianceTimeout)\n\n if (interval === 0) {\n return\n }\n\n complianceTimeout = setTimeout(function () {\n buttonPressed(complianceButton)\n }, interval == null ? 60000 : interval)\n}\n\nfunction invalidAddress (lnInvoiceTypeError) {\n if (lnInvoiceTypeError) {\n $('#invalid-address').hide()\n $('#invalid-invoice').show()\n } else {\n $('#invalid-invoice').hide()\n $('#invalid-address').show()\n }\n setState('invalid_address')\n}\n\nfunction customInfoRequest (customInfoRequest) {\n switch (customInfoRequest.input.type) {\n case 'numerical':\n $('#custom-screen2-numerical-title').text(customInfoRequest.screen2.title)\n $('#custom-screen2-numerical-text').text(customInfoRequest.screen2.text)\n customRequirementNumericalKeypad.setOpts({\n type: 'custom',\n constraint: customInfoRequest.input.constraintType,\n maxLength: customInfoRequest.input.numDigits\n })\n customRequirementNumericalKeypad.activate()\n setState('custom_permission_screen2_numerical')\n setScreen('custom_permission_screen2_numerical')\n setComplianceTimeout(null, 'cancelCustomInfoRequest')\n break\n case 'text':\n $('#custom-requirement-text-label1').text(customInfoRequest.input.label1)\n $('#custom-requirement-text-label2').text(customInfoRequest.input.label2)\n $('#previous-text-requirement').hide()\n $('#submit-text-requirement').hide()\n $('#next-text-requirement').hide()\n $('#optional-text-field-2').hide()\n $('.key.backspace.standard-backspace-key').removeClass('backspace-margin-left-override')\n $('.custom-info-request-space-key').show()\n // set type of constraint and buttons where that constraint should apply to disable/ enable\n customRequirementTextKeyboard.setConstraint(customInfoRequest.input.constraintType, ['#submit-text-requirement'])\n if (customInfoRequest.input.constraintType === 'spaceSeparation') {\n $('#optional-text-field-2').show()\n $('.key.backspace.standard-backspace-key').addClass('backspace-margin-left-override')\n $('.custom-info-request-space-key').hide()\n customRequirementTextKeyboard.setConstraint(customInfoRequest.input.constraintType, ['#next-text-requirement'])\n }\n setState('custom_permission_screen2_text')\n setScreen('custom_permission_screen2_text')\n setComplianceTimeout(null, 'cancelCustomInfoRequest')\n break\n case 'choiceList':\n $('#custom-screen2-choiceList-title').text(customInfoRequest.screen2.title)\n $('#custom-screen2-choiceList-text').text(customInfoRequest.screen2.text)\n customRequirementChoiceList.replaceChoices(customInfoRequest.input.choiceList, customInfoRequest.input.constraintType)\n setState('custom_permission_screen2_choiceList')\n setScreen('custom_permission_screen2_choiceList')\n setComplianceTimeout(null, 'cancelCustomInfoRequest')\n break\n default:\n return blockedCustomer()\n }\n}\n\nfunction idVerification () {\n setComplianceTimeout(null, 'finishBeforeSms')\n setScreen('permission_id')\n}\n\nfunction smsVerification () {\n setComplianceTimeout(null, 'finishBeforeSms')\n setScreen('sms_verification')\n}\n\nfunction emailVerification() {\n setComplianceTimeout(null, 'finishBeforeSms');\n setScreen('email_verification');\n}\n\nfunction blockedCustomer () {\n return setScreen('blocked_customer')\n}\n\nfunction chooseCoin (coins, twoWayMode) {\n if (twoWayMode) {\n $('.choose_coin_state').removeClass('choose-coin-cash-in').addClass('choose-coin-two-way')\n } else {\n $('.choose_coin_state').removeClass('choose-coin-two-way').addClass('choose-coin-cash-in')\n }\n\n isTwoWay = twoWayMode\n setChooseCoinColors()\n\n const defaultCoin = coins[0]\n\n currentCryptoCode = defaultCoin.cryptoCode\n currentCoin = defaultCoin\n currentCoins = coins.slice(0)\n\n setCryptoBuy(defaultCoin)\n setCryptoSell(defaultCoin)\n\n setupCoinsButtons(coins, currentCryptoCode)\n\n setState('choose_coin')\n}\n\nfunction openLanguageDropdown () {\n $('#language-dropdown-toggle').addClass('hide')\n $('#languages').removeClass('hide')\n $('#language-overlay').removeClass('hide')\n}\n\nfunction closeLanguageDropdown () {\n $('#language-dropdown-toggle').removeClass('hide')\n $('#languages').addClass('hide')\n $('#language-overlay').addClass('hide')\n}\n\nfunction openCoinDropdown () {\n $('#crypto-dropdown-toggle').addClass('hide')\n $('#crypto-overlay').removeClass('hide')\n $('#cryptos').removeClass('hide')\n}\n\nfunction closeCoinDropdown () {\n $('#crypto-dropdown-toggle').removeClass('hide')\n $('#crypto-overlay').addClass('hide')\n $('#cryptos').addClass('hide')\n}\n\nfunction setupCoinsButtons () {\n $('.crypto-buttons').empty()\n closeCoinDropdown()\n\n let coins = currentCoins.slice()\n let dropdownCoins = []\n\n if (coins.length === 1) return\n\n const showMoreButton = coins.length > 4\n if (showMoreButton) {\n $('crypto-dropdown-toggle').removeClass('hide')\n dropdownCoins = coins.slice(3)\n coins = coins.slice(0, 3)\n } else {\n $('crypto-dropdown-toggle').addClass('hide')\n }\n\n coins.forEach(function (coin) {\n const activeClass = coin.cryptoCode === currentCryptoCode ? 'choose-coin-button-active' : ''\n const el = `
\n ${coin.display}\n \n \n \n \n \n
`\n $('.crypto-buttons').append(el)\n })\n if (showMoreButton) {\n $('.crypto-buttons').append(`\n
\n
\n ${translate('More')}\n \n \n \n \n \n
\n
\n
\n `)\n dropdownCoins.forEach(coin => {\n const el = ``\n $('#cryptos').append(el)\n })\n const el = ``\n $('#cryptos').append(el)\n // As we add buttons 'more' and 'less' after initTranslate\n // they don't have baseTranslation translation data attached to them.\n $('.crypto-buttons .js-i18n').each(function () {\n var el = $(this)\n el.data('baseTranslation', el.html().trim())\n })\n }\n}\n\nfunction setCryptoBuy (coin) {\n const cashIn = $('.cash-in')\n const translatedCoin = translate(coin.display === displayLN ? displayBTC : coin.display)\n const buyStr = translate('Buy
%s', [translatedCoin])\n\n cashIn.html(buyStr)\n}\n\nfunction setCryptoSell (coin) {\n const cashOut = $('.cash-out')\n const translatedCoin = translate(coin.display === displayLN ? displayBTC : coin.display)\n const sellStr = translate('Sell
%s', [translatedCoin])\n\n cashOut.html(sellStr)\n}\n\nfunction setCoins (supportedCoins) {\n coins = supportedCoins\n}\n\nfunction getCryptoCurrency (cryptoCode) {\n const cryptoCurrency = coins.find(c => c.cryptoCode === cryptoCode)\n if (!cryptoCurrency) throw new Error(`Unsupported crypto: ${cryptoCode}`)\n return cryptoCurrency\n}\n\nfunction switchCoin (coin) {\n const cashIn = $('.cash-in')\n const cashOut = $('.cash-out')\n const cryptoCode = coin.cryptoCode\n\n if (currentCryptoCode === cryptoCode) return\n\n $(`.coin-${currentCryptoCode.toLowerCase()}`).removeClass('choose-coin-button-active')\n $(`.coin-${cryptoCode.toLowerCase()}`).addClass('choose-coin-button-active')\n currentCryptoCode = cryptoCode\n currentCoin = coin\n\n cashIn.addClass('crypto-switch')\n setTimeout(() => setCryptoBuy(coin), 100)\n setTimeout(() => cashIn.removeClass('crypto-switch'), 1000)\n\n setTimeout(() => {\n cashOut.addClass('crypto-switch')\n setTimeout(() => setCryptoSell(coin), 100)\n setTimeout(() => cashOut.removeClass('crypto-switch'), 1000)\n }, 80)\n\n const selectedIndex = currentCoins.indexOf(currentCoins.find(it => it.cryptoCode === cryptoCode))\n if (currentCoins.length > 4 && selectedIndex > 2) {\n currentCoins.splice(2, 0, currentCoins.splice(selectedIndex, 1)[0])\n }\n\n setupCoinsButtons()\n}\n\n$(document).ready(function () {\n const attachFastClick = Origami.fastclick\n attachFastClick(document.body)\n\n window.addEventListener('resize', () => {\n calculateAspectRatio()\n setChooseCoinColors()\n })\n\n // Matt's anti-drag hack\n window.onclick =\n window.oncontextmenu =\n window.onmousedown =\n window.onmousemove =\n window.onmouseup =\n function () { return false }\n\n BigNumber.config({ ROUNDING_MODE: BigNumber.ROUND_HALF_EVEN })\n\n promoKeyboard = new Keyboard({\n id: 'promo-keyboard',\n inputBox: '.promo-code-input'\n }).init(function () {\n if (currentState !== 'insert_promo_code') return\n buttonPressed('cancelPromoCode')\n })\n\n usSsnKeypad = new Keypad('us-ssn-keypad', { type: 'usSsn' }, function (result) {\n if (currentState !== 'register_us_ssn') return\n buttonPressed('usSsn', result)\n })\n\n phoneKeypad = new Keypad('phone-keypad', { type: 'phoneNumber', country: 'US' }, function (result) {\n if (currentState !== 'register_phone') return\n buttonPressed('phoneNumber', result)\n })\n\n securityKeypad = new Keypad('security-keypad', { type: 'code' }, function (result) {\n if (currentState !== 'security_code') return\n buttonPressed('securityCode', result)\n })\n\n customRequirementNumericalKeypad = new Keypad('custom-requirement-numeric-keypad', {\n type: 'custom'\n }, function (result) {\n if (currentState !== 'custom_permission_screen2_numerical') return\n buttonPressed('customInfoRequestSubmit', result)\n })\n\n emailKeyboard = new Keyboard({\n id: 'email-keyboard',\n inputBox: '#email-input',\n submitButtonWrapper: '#submit-email-wrapper',\n setComplianceTimeout: setComplianceTimeout\n }).init(function (result) {\n if (currentState !== 'register_email') return\n buttonPressed('email', result)\n })\n\n customRequirementTextKeyboard = new Keyboard({\n id: 'custom-requirement-text-keyboard',\n inputBox: '.text-input-field-1',\n submitButtonWrapper: '.submit-text-requirement-button-wrapper',\n setComplianceTimeout: setComplianceTimeout\n }).init(function () {\n if (currentState !== 'custom_permission_screen2_text') return\n buttonPressed('customInfoRequestSubmit')\n })\n\n customRequirementChoiceList = new ChoiceList({\n id: 'custom-requirement-choicelist-wrapper',\n setComplianceTimeout: setComplianceTimeout\n }).init(function (result) {\n if (currentState !== 'custom_permission_screen2_choiceList') return\n buttonPressed('customInfoRequestSubmit', result)\n })\n\n if (DEBUG_MODE !== 'demo') {\n connect()\n setInterval(verifyConnection, 1000)\n }\n\n initTranslatePage()\n\n var sendCoinsButton = document.getElementById('send-coins')\n var sendCoinsButton2 = document.getElementById('send-only-send-coins')\n touchEvent(sendCoinsButton, function () {\n setState('sending_coins')\n buttonPressed('sendCoins')\n })\n\n touchEvent(sendCoinsButton2, function () {\n setState('sending_coins')\n buttonPressed('sendCoins')\n })\n\n setupButton('recycler-continue-start', 'recyclerContinue')\n setupButton('recycler-continue', 'recyclerContinue')\n setupButton('recycler-finish', 'sendCoins')\n setupButton('cash-slot-bills-removed', 'cashSlotBillsRemoved')\n setupButton('leftover-bills-removed', 'leftoverBillsRemoved')\n\n const blockedCustomerOk = document.getElementById('blocked-customer-ok')\n touchEvent(blockedCustomerOk, function () {\n buttonPressed('blockedCustomerOk')\n })\n var insertBillCancelButton = document.getElementById('insertBillCancel')\n touchImmediateEvent(insertBillCancelButton, function () {\n setBuyerAddress(null)\n buttonPressed('cancelInsertBill')\n })\n\n var insertBillCancelRecyclerButton = document.getElementById('insertBillCancelRecycler')\n touchImmediateEvent(insertBillCancelRecyclerButton, function () {\n setBuyerAddress(null)\n buttonPressed('cancelInsertBill')\n })\n\n setupImmediateButton('scanCancel', 'cancelScan')\n setupImmediateButton('completed_viewport', 'completed')\n setupImmediateButton('withdraw_failure_viewport', 'completed')\n setupImmediateButton('out_of_coins_viewport', 'completed')\n setupImmediateButton('fiat_receipt_viewport', 'completed')\n setupImmediateButton('fiat_complete_viewport', 'completed')\n setupImmediateButton('chooseFiatCancel', 'chooseFiatCancel')\n setupImmediateButton('depositCancel', 'depositCancel')\n setupImmediateButton('printer-scan-cancel', 'cancelScan')\n\n setupButton('printer-back-to-home', 'idle')\n setupButton('printer-print-again', 'printAgain')\n setupButton('printer-print-again2', 'printAgain')\n setupButton('printer-scan-again', 'printerScanAgain')\n\n setupButton('insert-first-bill-promo-button', 'insertPromoCode')\n setupButton('insert-first-recycler-bills-promo-button', 'insertPromoCode')\n setupButton('choose-fiat-promo-button', 'insertPromoCode')\n\n var promoCodeCancelButton = document.getElementById('promo-code-cancel')\n touchImmediateEvent(promoCodeCancelButton, function () {\n promoKeyboard.deactivate.bind(promoKeyboard)\n buttonPressed('cancelPromoCode')\n })\n\n var submitCodeButton = document.getElementById('submit-promo-code')\n touchEvent(submitCodeButton, function () {\n promoKeyboard.deactivate.bind(promoKeyboard)\n var code = $('.promo-code-input').data('content')\n buttonPressed('submitPromoCode', { input: code })\n })\n\n const submitEmailButton = document.getElementById('submit-email')\n const submitTextRequirementButton = document.getElementById('submit-text-requirement')\n const nextFieldTextRequirementButton = document.getElementById('next-text-requirement')\n const previousFieldTextRequirementButton = document.getElementById('previous-text-requirement')\n touchEvent(submitEmailButton, function () {\n emailKeyboard.deactivate.bind(emailKeyboard)\n var text = $('#email-input').data('content')\n buttonPressed('email', text)\n $('#email-input').data('content', '').val('')\n emailKeyboard.setInputBox('#email-input')\n })\n touchEvent(submitTextRequirementButton, function () {\n customRequirementTextKeyboard.deactivate.bind(customRequirementTextKeyboard)\n var text = `${$('.text-input-field-1').data('content')} ${$('.text-input-field-2').data('content') || ''}`\n buttonPressed('customInfoRequestSubmit', text)\n $('.text-input-field-1').removeClass('faded').data('content', '').val('')\n $('.text-input-field-2').addClass('faded').data('content', '').val('')\n customRequirementTextKeyboard.setInputBox('.text-input-field-1')\n })\n touchEvent(nextFieldTextRequirementButton, function() {\n $('.text-input-field-1').addClass('faded')\n $('.text-input-field-2').removeClass('faded')\n $('#next-text-requirement').hide()\n $('#previous-text-requirement').show()\n $('#submit-text-requirement').show()\n // changing input box changes buttons where validation works on\n customRequirementTextKeyboard.setInputBox('.text-input-field-2', ['#submit-text-requirement'])\n })\n touchEvent(previousFieldTextRequirementButton, function() {\n $('.text-input-field-1').removeClass('faded')\n $('.text-input-field-2').addClass('faded')\n $('#next-text-requirement').show()\n $('#previous-text-requirement').hide()\n $('#submit-text-requirement').hide()\n customRequirementTextKeyboard.setInputBox('.text-input-field-1', ['#next-text-requirement'])\n })\n\n setupButton('submit-promo-code', 'submitPromoCode', {\n input: $('.promo-code-input').data('content')\n })\n setupButton('promo-code-try-again', 'insertPromoCode')\n setupButton('promo-code-continue', 'cancelPromoCode')\n\n setupButton('initialize', 'initialize')\n setupButton('pairing-scan', 'pairingScan')\n setupImmediateButton('pairing-scan-cancel', 'pairingScanCancel')\n setupButton('pairing-error-ok', 'pairingErrorOk')\n setupButton('cash-out-button', 'cashOut')\n\n setupImmediateButton('scan-id-cancel', 'idDataActionCancel')\n setupImmediateButton('scan-photo-cancel', 'idPhotoActionCancel')\n setupImmediateButton('scan-photo-manual-cancel', 'idPhotoActionCancel')\n setupImmediateButton('us-ssn-cancel', 'cancelUsSsn',\n usSsnKeypad.deactivate.bind(usSsnKeypad))\n setupImmediateButton('phone-number-cancel', 'cancelPhoneNumber',\n phoneKeypad.deactivate.bind(phoneKeypad))\n setupImmediateButton('security-code-cancel', 'cancelSecurityCode',\n securityKeypad.deactivate.bind(securityKeypad))\n setupButton('id-verification-failed-ok', 'idVerificationFailedOk')\n setupButton('id-scan-failed-try-again', 'idCodeFailedRetry')\n setupButton('id-scan-failed-cancel', 'idVerificationFailedOk')\n setupButton('id-code-failed-retry', 'idCodeFailedRetry')\n setupButton('id-code-failed-cancel', 'bye')\n setupButton('id-verification-error-ok', 'idVerificationErrorOk')\n setupButton('photo-scan-failed-retry', 'retryPhotoScan')\n setupButton('photo-scan-failed-cancel', 'photoScanVerificationCancel')\n setupButton('photo-verification-failed-ok', 'cancelIdScan')\n setupButton('invalid-address-try-again', 'invalidAddressTryAgain')\n setupButton('address-reuse-start-over', 'idle')\n setupButton('suspicious-address-start-over', 'idle')\n\n setupButton('sanctions-failure-ok', 'idle')\n setupButton('limit-reached-ok', 'idle')\n setupButton('hard-limit-reached-ok', 'idle')\n setupButton('deposit-timeout-sent-yes', 'depositTimeout')\n setupButton('deposit-timeout-sent-no', 'depositTimeoutNotSent')\n setupButton('out-of-cash-ok', 'idle')\n setupButton('cash-in-disabled-ok', 'idle')\n setupButton('cash-in-only-ok', 'idle')\n\n setupButton('bad-phone-number-ok', 'badPhoneNumberOk')\n setupButton('bad-security-code-ok', 'badSecurityCodeOk')\n setupButton('max-phone-retries-ok', 'maxPhoneRetriesOk')\n //setupButton('max-email-retries-ok', 'maxEmailRetriesOk')\n setupButton('redeem-later-ok', 'idle')\n setupButton('fiat-error-ok', 'idle')\n setupButton('network-down-ok', 'idle')\n setupButton('fiat-transaction-error-ok', 'fiatReceipt')\n\n setupButton('unknown-phone-number-ok', 'idle')\n setupButton('unknown-email-ok', 'idle')\n setupButton('unconfirmed-deposit-ok', 'idle')\n setupButton('tx-not-seen-ok', 'idle')\n setupButton('wrong-dispenser-currency-ok', 'idle')\n\n setupButton('print-receipt-cash-in-button', 'printReceipt')\n setupButton('print-receipt-cash-out-button', 'printReceipt')\n setupButton('print-receipt-cash-in-fail-button', 'printReceipt')\n\n setupButton('send-sms-receipt-cash-in-button', 'sendSmsReceipt')\n setupButton('send-sms-receipt-cash-out-button', 'sendSmsReceipt')\n setupButton('send-sms-receipt-cash-in-fail-button', 'sendSmsReceipt')\n\n setupButton('terms-ok', 'termsAccepted')\n setupButton('terms-ko', 'idle')\n\n setupButton('maintenance_restart', 'maintenanceRestart')\n\n calculateAspectRatio()\n\n const cryptoButtons = document.getElementById('crypto-buttons')\n touchEvent(cryptoButtons, event => {\n let el = $(event.target)\n if (el.is('path') || el.is('svg') || el.is('span')) {\n el = el.closest('div')\n }\n\n if (el.data('more')) {\n openCoinDropdown()\n return\n }\n\n if (el.data('less')) {\n closeCoinDropdown()\n return\n }\n\n const cryptoCode = el.data('cryptoCode')\n if (!cryptoCode) return\n\n const wantedCoin = currentCoins.find(it => it.cryptoCode === cryptoCode)\n if (!wantedCoin) return\n\n const coin = { cryptoCode, display: wantedCoin.display === displayLN ? displayBTC : wantedCoin.display }\n switchCoin(coin)\n })\n\n var areYouSureCancel = document.getElementById('are-you-sure-cancel-transaction')\n touchEvent(areYouSureCancel, () => buttonPressed('cancelTransaction', previousState))\n\n var areYouSureContinue = document.getElementById('are-you-sure-continue-transaction')\n touchEvent(areYouSureContinue, () => buttonPressed('continueTransaction', previousState))\n\n var coinRedeem = document.getElementById('coin-redeem-button')\n touchEvent(coinRedeem, () => {\n setDirection('cashOut')\n buttonPressed('redeem')\n })\n\n setupButton('facephoto-scan-failed-retry', 'retryFacephoto')\n setupButton('id-start-verification', 'permissionIdCompliance')\n setupButton('sms-start-verification', 'permissionSmsCompliance')\n setupButton('email-start-verification', 'permissionEmailCompliance');\n setupButton('ready-to-scan-id-card-photo', 'scanIdCardPhoto')\n setupButton('facephoto-permission-yes', 'permissionPhotoCompliance')\n setupButton('us-ssn-permission-yes', 'permissionUsSsnCompliance')\n setupButton('external-permission-yes', 'permissionExternalCompliance')\n\n setupButton('send-coins-id', 'finishBeforeSms')\n setupButton('send-coins-id-2', 'finishBeforeSms')\n setupButton('send-coins-sms', 'finishBeforeSms')\n setupButton('send-coins-sms-2', 'finishBeforeSms')\n setupButton('send-coins-email', 'finishBeforeSms');\n setupButton('send-coins-email-2', 'finishBeforeSms');\n\n setupButton('facephoto-permission-no', 'finishBeforeSms')\n setupButton('us-ssn-permission-send-coins', 'finishBeforeSms')\n setupButton('us-ssn-permission-cancel', 'finishBeforeSms')\n setupButton('us-ssn-cancel', 'finishBeforeSms')\n setupButton('external-permission-send-coins', 'finishBeforeSms')\n setupButton('facephoto-scan-failed-cancel', 'finishBeforeSms')\n setupButton('facephoto-scan-failed-cancel2', 'finishBeforeSms')\n\n setupButton('custom-permission-yes', 'permissionCustomInfoRequest')\n setupButton('custom-permission-no', 'finishBeforeSms')\n setupImmediateButton('custom-permission-cancel-numerical', 'cancelCustomInfoRequest', () => {\n customRequirementNumericalKeypad.deactivate.bind(customRequirementNumericalKeypad)\n })\n setupImmediateButton('email-cancel', 'cancelEmail', () => {\n emailKeyboard.deactivate.bind(emailKeyboard)\n $('#email-input').data('content', '').val('')\n emailKeyboard.setInputBox('#email-input')\n })\n setupImmediateButton('custom-permission-cancel-text', 'cancelCustomInfoRequest', () => {\n customRequirementTextKeyboard.deactivate.bind(customRequirementTextKeyboard)\n $('.text-input-field-1').removeClass('faded').data('content', '').val('')\n $('.text-input-field-2').addClass('faded').data('content', '').val('')\n customRequirementTextKeyboard.setInputBox('.text-input-field-1')\n })\n setupImmediateButton('custom-permission-cancel-choiceList', 'cancelCustomInfoRequest', () => {\n })\n\n setupButton('custom-permission-yes', 'permissionCustomInfoRequest')\n setupButton('custom-permission-no', 'finishBeforeSms')\n setupImmediateButton('custom-permission-cancel-numerical', 'cancelCustomInfoRequest', () => {\n customRequirementNumericalKeypad.deactivate.bind(customRequirementNumericalKeypad)\n })\n\n setupButton('external-validation-ok', 'finishBeforeSms')\n\n touchEvent(document.getElementById('change-language-section'), () => {\n if (_primaryLocales.length === 2) {\n setLocale(otherLocale())\n setCryptoBuy(currentCoin)\n setCryptoSell(currentCoin)\n return\n }\n openLanguageDropdown()\n })\n\n const cashInBox = document.getElementById('cash-in-box')\n touchEvent(cashInBox, () => {\n buttonPressed('start', { cryptoCode: currentCryptoCode, direction: 'cashIn' })\n })\n\n const cashOutBox = document.getElementById('cash-out-box')\n touchEvent(cashOutBox, () => {\n buttonPressed('start', { cryptoCode: currentCryptoCode, direction: 'cashOut' })\n })\n\n var languageOverlay = document.getElementById('language-overlay')\n touchEvent(languageOverlay, function (e) {\n closeLanguageDropdown()\n })\n\n var cryptoOverlay = document.getElementById('crypto-overlay')\n touchEvent(cryptoOverlay, function (e) {\n closeCoinDropdown()\n })\n\n var languageButtons = document.getElementById('languages')\n touchEvent(languageButtons, function (e) {\n var languageButtonJ = $(e.target).closest('button')\n if (languageButtonJ.length === 0) return\n var newLocale = languageButtonJ.attr('data-locale')\n\n if (!newLocale) {\n closeLanguageDropdown()\n return\n }\n\n setLocale(newLocale)\n setCryptoBuy(currentCoin)\n setCryptoSell(currentCoin)\n closeLanguageDropdown()\n })\n\n buildCassetteButtonEvents()\n if (DEBUG_MODE === 'dev') initDebug()\n})\n\nfunction targetButton (element) {\n var classList = element.classList || []\n var special = classList.contains('button') ||\n classList.contains('circle-button') ||\n classList.contains('square-button')\n if (special) { return element }\n return targetButton(element.parentNode)\n}\n\nfunction touchEvent (element, callback) {\n function handler (e) {\n var target = targetButton(e.target)\n\n target.classList.add('active')\n\n // Wait for transition to finish\n setTimeout(function () {\n target.classList.remove('active')\n }, 300)\n\n setTimeout(function () {\n callback(e)\n }, 200)\n\n e.stopPropagation()\n e.preventDefault()\n }\n\n if (shouldEnableTouch()) {\n element.addEventListener('touchstart', handler)\n }\n element.addEventListener('mousedown', handler)\n}\n\nfunction touchImmediateEvent (element, callback) {\n function handler (e) {\n callback(e)\n e.stopPropagation()\n e.preventDefault()\n }\n if (shouldEnableTouch()) {\n element.addEventListener('touchstart', handler)\n }\n element.addEventListener('mousedown', handler)\n}\n\nfunction setupImmediateButton (buttonClass, buttonAction, callback) {\n var button = document.getElementById(buttonClass)\n touchImmediateEvent(button, function () {\n if (callback) callback()\n buttonPressed(buttonAction)\n })\n}\n\nfunction setupButton (buttonClass, buttonAction, actionData) {\n var button = document.getElementById(buttonClass)\n touchEvent(button, function () {\n buttonPressed(buttonAction, actionData)\n })\n}\n\nfunction setScreen (newScreen, oldScreen) {\n if (newScreen === oldScreen) return\n\n if (newScreen === 'insert_bills') {\n $('.js-processing-bill').html(translate('Lamassu Cryptomat'))\n $('.bill img').css({'-webkit-transform': 'none', top: 0, left: 0})\n }\n\n var newView = $('.' + newScreen + '_state')\n if (newView.length !== 1) console.log('FATAL: ' + newView.length + ' screens found of class ' + newScreen + '_state')\n\n $('.viewport').removeClass('viewport-active')\n newView.addClass('viewport-active')\n}\n\nfunction setState (state, delay) {\n if (state === currentState) return\n\n if (currentState === 'terms_screen') {\n clearTermsConditionsTimeout()\n clearTermsConditionsAcceptanceDelay()\n }\n\n setComplianceTimeout(0)\n\n previousState = currentState\n currentState = state\n\n promoKeyboard.reset()\n emailKeyboard.reset()\n customRequirementTextKeyboard.reset()\n\n if (state === 'idle') {\n $('.qr-code').empty()\n $('.qr-code-deposit').empty()\n }\n\n if (delay) {\n window.setTimeout(function () {\n setScreen(currentState, previousState)\n }, delay)\n } else setScreen(currentState, previousState)\n}\n\nfunction revertScreen () { setScreen(currentState) }\n\nfunction setUpDirectionElement (element, direction) {\n if (direction === 'cashOut') {\n element.removeClass('cash-in-color')\n element.addClass('cash-out-color')\n } else {\n element.addClass('cash-in-color')\n element.removeClass('cash-out-color')\n }\n}\n\nfunction setOperatorInfo (operator) {\n if (!operator || !operator.active) {\n $('.contacts, .contacts-compact').addClass('hide')\n } else {\n $('.contacts, .contacts-compact').removeClass('hide')\n $('.operator-name').text(operator.name)\n $('.operator-email').text(operator.email)\n $('.operator-phone').text(operator.phone)\n }\n}\n\nfunction setHardLimit (limits) {\n const component = $('#hard-limit-hours')\n if (limits.hardLimitWeeks >= 1) {\n return component.text(translate('Please come back in %s weeks', [limits.hardLimitWeeks]))\n }\n\n if (limits.hardLimitDays >= 1) {\n return component.text(translate('Please come back in %s days and %s hours', [limits.hardLimitDays, limits.hardLimitHours]))\n }\n\n component.text(translate('Please come back in %s hours', [limits.hardLimitHours]))\n}\n\nfunction setCryptomatModel (model) {\n cryptomatModel = model\n const versions = ['sintra', 'douro', 'gaia', 'tejo', 'grandola', 'aveiro', 'coincloud', 'gmuk1', 'batm7in']\n const body = $('body')\n\n versions.forEach(it => body.removeClass(it))\n $('body').addClass(model.startsWith('douro') ? 'douro' : model)\n}\n\nfunction enableRecyclerBillButtons() {\n var continueButton = document.getElementById('recycler-continue');\n var finishButton = document.getElementById('recycler-finish');\n continueButton.disabled = false;\n finishButton.disabled = false;\n}\n\nfunction disableRecyclerBillButtons() {\n var continueButton = document.getElementById('recycler-continue');\n var finishButton = document.getElementById('recycler-finish');\n continueButton.disabled = true;\n finishButton.disabled = true;\n}\n\nfunction setDirection (direction) {\n let states = [\n $('.scan_id_photo_state'),\n $('.scan_manual_id_photo_state'),\n $('.scan_id_data_state'),\n $('.security_code_state'),\n $('.register_us_ssn_state'),\n $('.us_ssn_permission_state'),\n $('.register_phone_state'),\n $('.register_email_state'),\n $('.terms_screen_state'),\n $('.verifying_id_photo_state'),\n $('.verifying_face_photo_state'),\n $('.verifying_id_data_state'),\n $('.permission_id_state'),\n $('.sms_verification_state'),\n $('.email_verification_state'),\n $('.bad_phone_number_state'),\n $('.bad_security_code_state'),\n $('.max_phone_retries_state'),\n $('.max_email_retries_state'),\n $('.failed_permission_id_state'),\n $('.failed_verifying_id_photo_state'),\n $('.blocked_customer_state'),\n $('.fiat_error_state'),\n $('.fiat_transaction_error_state'),\n $('.failed_scan_id_data_state'),\n $('.sanctions_failure_state'),\n $('.error_permission_id_state'),\n $('.scan_face_photo_state'),\n $('.retry_scan_face_photo_state'),\n $('.permission_face_photo_state'),\n $('.failed_scan_face_photo_state'),\n $('.hard_limit_reached_state'),\n $('.failed_scan_id_photo_state'),\n $('.retry_permission_id_state'),\n $('.waiting_state'),\n $('.insert_promo_code_state'),\n $('.promo_code_not_found_state'),\n $('.custom_permission_state'),\n $('.external_permission_state'),\n $('.custom_permission_screen2_numerical_state'),\n $('.custom_permission_screen2_text_state'),\n $('.custom_permission_screen2_choiceList_state'),\n $('.external_compliance_state')\n ]\n cashDirection = direction\n states.forEach(it => {\n setUpDirectionElement(it, direction)\n })\n}\n\n/**\n *\n * @param {Object} data\n * @param {boolean} data.active\n * @param {String} data.title\n * @param {String} data.text\n * @param {String} data.accept\n * @param {String} data.cancel\n */\nfunction setTermsScreen (data) {\n const $screen = $('.terms_screen_state')\n $screen.find('.js-terms-title').html(data.title)\n startPage(data.text, data.acceptDisabled)\n $screen.find('.js-terms-cancel-button').html(data.cancel)\n $screen.find('.js-terms-accept-button').html(data.accept)\n setTermsConditionsTimeout()\n setAcceptButtonDisabled($screen, data)\n setTermsConditionsAcceptanceDelay($screen, data)\n}\n\nfunction setAcceptButtonDisabled (screen, data) {\n var acceptButton = screen.find('.js-terms-accept-button');\n acceptButton.prop('disabled', Boolean(data.acceptDisabled));\n}\n\nfunction clearTermsConditionsTimeout () {\n clearTimeout(termsConditionsTimeout)\n}\n\nfunction setTermsConditionsTimeout () {\n termsConditionsTimeout = setTimeout(function () {\n if (currentState === 'terms_screen') {\n buttonPressed('idle')\n }\n }, T_C_TIMEOUT)\n}\n\nfunction setTermsConditionsAcceptanceDelay (screen, data) {\n let acceptButton = screen.find('.js-terms-accept-button')\n acceptButton.css({ 'min-width': 0 })\n\n if (!data.delay) return\n\n const delayTimer = isNaN(data.delayTimer) ? 0 : data.delayTimer\n let seconds = delayTimer / 1000\n acceptButton.prop('disabled', true)\n acceptButton.html(seconds > 0 ? `${data.accept} (${seconds})` : `${data.accept}`)\n\n var tmpbtn = acceptButton.clone().appendTo('body').css({ 'display': 'block', 'visibility': 'hidden' })\n var width = tmpbtn.outerWidth()\n tmpbtn.remove()\n acceptButton.css({ 'min-width': `${width}px` })\n termsConditionsAcceptanceInterval = setInterval(function () {\n seconds--\n if (currentState === 'terms_screen' && seconds > 0) {\n acceptButton.html(`${data.accept} (${seconds})`)\n }\n if (currentState === 'terms_screen' && seconds <= 0) {\n acceptButton.prop('disabled', false)\n acceptButton.html(`${data.accept}`)\n }\n if (seconds <= 0) {\n clearInterval(termsConditionsAcceptanceInterval)\n }\n }, 1000)\n}\n\nfunction clearTermsConditionsAcceptanceDelay () {\n clearInterval(termsConditionsAcceptanceInterval)\n}\n\nfunction resetTermsConditionsTimeout () {\n clearTermsConditionsTimeout()\n setTermsConditionsTimeout()\n}\n\n// click page up button\nfunction scrollUp () {\n resetTermsConditionsTimeout()\n const div = document.getElementById('js-terms-text-div')\n if (currentPage !== 0) {\n currentPage -= 1\n updateButtonStyles()\n updatePageCounter()\n div.scrollTo(0, currentPage * scrollSize)\n }\n}\n\n// start page\nfunction startPage (text, acceptedTerms) {\n const $screen = $('.terms_screen_state')\n $screen.find('.js-terms-text').html(text)\n if (!acceptedTerms) currentPage = 0\n totalPages = 0\n setTimeout(function () {\n const div = document.getElementById('js-terms-text-div')\n textHeightQuantity = document.getElementById('js-terms-text').offsetHeight\n scrollSize = div.offsetHeight - 40\n updateButtonStyles()\n if (text.length <= 1000 && textHeightQuantity <= div.offsetHeight) {\n document.getElementById('actions-scroll').style.display = 'none'\n } else {\n document.getElementById('actions-scroll').style.display = ''\n if (!acceptedTerms) div.scrollTo(0, 0)\n totalPages = Math.ceil(textHeightQuantity / scrollSize)\n updatePageCounter()\n }\n }, 100)\n}\n\nfunction updatePageCounter () {\n document.getElementById('terms-page-counter').textContent = `${currentPage + 1}/${totalPages}`\n}\n\n// click page up button\nfunction scrollDown () {\n resetTermsConditionsTimeout()\n const div = document.getElementById('js-terms-text-div')\n if (!(currentPage * scrollSize + scrollSize > textHeightQuantity && currentPage !== 0)) {\n currentPage += 1\n updateButtonStyles()\n updatePageCounter()\n div.scrollTo(0, currentPage * scrollSize)\n }\n}\n\nfunction updateButtonStyles () {\n textHeightQuantity = document.getElementById('js-terms-text').offsetHeight\n const buttonDown = document.getElementById('scroll-down')\n const buttonUp = document.getElementById('scroll-up')\n buttonUp.disabled = currentPage === 0;\n buttonDown.disabled = currentPage * scrollSize + scrollSize > textHeightQuantity && currentPage !== 0;\n}\n\nfunction setLocaleInfo (data) {\n phoneKeypad.setCountry(data.country)\n setPrimaryLocales(data.primaryLocales)\n setLocale(data.primaryLocale)\n}\n\nfunction otherLanguageName () {\n const lang = lookupLocaleNames(otherLocale())\n return lang && lang.nativeName\n}\n\nfunction otherLocale () {\n return _primaryLocales.find(c => c !== localeCode)\n}\n\nfunction setLocale (data) {\n if (!data || data === localeCode) return\n localeCode = data\n jsLocaleCode = data\n var lang = localeCode.split('-')[0]\n\n if (jsLocaleCode === 'fr-QC') jsLocaleCode = 'fr-CA'\n\n var isArabic = jsLocaleCode.indexOf('ar-') === 0\n var isHebrew = jsLocaleCode.indexOf('he-') === 0\n isRTL = isArabic || isHebrew\n\n setChooseCoinColors()\n\n if (isRTL) {\n $('body').addClass('i18n-rtl')\n } else {\n $('body').removeClass('i18n-rtl')\n }\n\n if (isArabic) {\n $('body').addClass('i18n-ar')\n } else {\n $('body').removeClass('i18n-ar')\n }\n\n if (isHebrew) {\n $('body').addClass('i18n-he')\n } else {\n $('body').removeClass('i18n-he')\n }\n\n if (MUSEO.indexOf(lang) !== -1) $('body').addClass('museo')\n else $('body').removeClass('museo')\n\n locale = loadI18n(localeCode)\n try { translatePage() } catch (ex) {}\n\n $('.js-two-language').html(otherLanguageName())\n\n if (lastRates) setExchangeRate(lastRates)\n}\n\nfunction setChooseCoinColors () {\n var elem = $('#bg-to-show > img')\n let img = `images/background/${isTwoWay ? '2way' : '1way'}-${aspectRatio}${isRTL ? '-rtl' : ''}.svg`\n if (img !== elem.attr('src')) {\n elem.attr('src', img)\n }\n\n if (isTwoWay) {\n $('.choose_coin_state .change-language').removeClass('cash-in-color').addClass('cash-out-color')\n } else {\n $('.choose_coin_state .change-language').removeClass('cash-out-color').addClass('cash-in-color')\n }\n}\n\nfunction areArraysEqual (arr1, arr2) {\n if (arr1.length !== arr2.length) return false\n for (var i = 0; i < arr1.length; i++) {\n if (arr1[i] !== arr2[i]) return false\n }\n return true\n}\n\nfunction lookupLocaleNames (locale) {\n if (!locale) return\n var langMap = window.languageMappingList\n var language = locale.split('-')[0]\n var localeNames = langMap[language]\n return localeNames || langMap[locale]\n}\n\nfunction setPrimaryLocales (primaryLocales) {\n if (areArraysEqual(primaryLocales, _primaryLocales)) return\n _primaryLocales = primaryLocales\n\n var languages = $('#languages')\n closeLanguageDropdown()\n languages.empty()\n var sortedPrimaryLocales = primaryLocales.filter(lookupLocaleNames).sort(function (a, b) {\n var langA = lookupLocaleNames(a)\n var langB = lookupLocaleNames(b)\n return langA.englishName.localeCompare(langB.englishName)\n })\n\n languages.append(``)\n for (var i = 0; i < sortedPrimaryLocales.length; i++) {\n var l = sortedPrimaryLocales[i]\n var lang = lookupLocaleNames(l)\n var name = lang.nativeName || lang.englishName\n var div = ``\n languages.append(div)\n }\n\n $('.js-two-language').html(otherLanguageName())\n\n $('.js-menu-language').toggleClass('hide', sortedPrimaryLocales.length <= 1)\n $('.js-multi-language').toggleClass('hide', sortedPrimaryLocales.length === 2)\n $('.js-two-language').toggleClass('hide', sortedPrimaryLocales.length > 2)\n}\n\nfunction setFiatCode (data) {\n fiatCode = data\n $('.js-currency').text(fiatCode)\n}\n\nfunction setFixedFee (_fee) {\n const fee = parseFloat(_fee)\n if (fee > 0) {\n const fixedFee = translate('Transaction Fee: %s', [formatFiat(fee, 2)])\n $('.js-i18n-fixed-fee').html(fixedFee)\n } else {\n $('.js-i18n-fixed-fee').html('')\n }\n}\n\nfunction setCredit (credit, lastBill) {\n const { fiat, cryptoAtoms, cryptoCode } = credit\n var coin = getCryptoCurrency(cryptoCode)\n\n var scale = new BigNumber(10).pow(coin.displayScale)\n var cryptoAmount = new BigNumber(cryptoAtoms).div(scale).toNumber()\n var cryptoDisplayCode = coin.displayCode\n updateCrypto('.total-crypto-rec', cryptoAmount, cryptoDisplayCode)\n $('.amount-deposited').html(translate('You deposited %s', [`${fiat} ${fiatCode}`]))\n $('.fiat .js-amount').html(fiat)\n\n var inserted = lastBill\n ? translate('You inserted a %s bill', [formatFiat(lastBill)])\n : translate('Lamassu Cryptomat')\n\n $('.js-processing-bill').html(inserted)\n\n $('.js-continue-crypto-enable').show()\n $('.js-send-crypto-enable').show()\n}\n\nfunction formatDenomination (denom) {\n return denom.toLocaleString(jsLocaleCode, {\n useGrouping: true,\n maximumFractionDigits: 0,\n minimumFractionDigits: 0\n })\n}\n\nfunction buildCassetteButtons (_cassettes, numberOfButtons) {\n var activeCassettes = _cassettes.filter(it => it.count === null || it.count > 0)\n var inactiveCassettes = _cassettes.filter(it => it.count === 0)\n\n var allCassettes = activeCassettes.concat(inactiveCassettes)\n var selectedCassettes = allCassettes.slice(0, numberOfButtons)\n var sortedCassettes = selectedCassettes.sort((a, b) => a.denomination - b.denomination)\n\n for (var i = 0; i < sortedCassettes.length; i++) {\n var denomination = formatDenomination(sortedCassettes[i].denomination || 0)\n $('.cash-button[data-denomination-index=' + i + '] .js-denomination').text(denomination)\n }\n}\n\nfunction updateCassetteButtons (activeDenoms, numberOfButtons) {\n for(var i = 0; i < numberOfButtons; i++) {\n var button = $('.choose_fiat_state .cash-button[data-denomination-index=' + i + ']')\n var denomination = button.children('.js-denomination').text()\n button.prop('disabled', !Boolean(activeDenoms[denomination]))\n }\n}\n\nfunction buildCassetteButtonEvents () {\n var fiatButtons = document.getElementById('js-fiat-buttons')\n var lastTouch = null\n\n touchImmediateEvent(fiatButtons, function (e) {\n var now = Date.now()\n if (lastTouch && now - lastTouch < 100) return\n lastTouch = now\n var cashButtonJ = $(e.target).closest('.cash-button')\n if (cashButtonJ.length === 0) return\n if (cashButtonJ.hasClass('disabled')) return\n if (cashButtonJ.hasClass('clear')) return buttonPressed('clearFiat')\n buttonPressed('fiatButton', { denomination: cashButtonJ.children('.js-denomination').text() })\n })\n}\n\nfunction updateCrypto (selector, cryptoAmount, cryptoDisplayCode) {\n $(selector).find('.crypto-amount').html(formatCrypto(cryptoAmount))\n $(selector).find('.crypto-units').html(cryptoDisplayCode)\n}\n\nfunction lookupDecimalChar (localeCode) {\n var num = 1.1\n var localized = num.toLocaleString(localeCode, {\n useGrouping: true,\n maximumFractionDigits: 1,\n minimumFractionDigits: 1\n })\n\n return localized[1]\n}\n\nfunction splitNumber (localize, localeCode) {\n var decimalChar = lookupDecimalChar(localeCode)\n var split = localize.split(decimalChar)\n\n if (split.length === 1) {\n return ['', split[0], ''].join('')\n }\n\n return [\n '', split[0], '',\n decimalChar, '', split[1], ''\n ].join('')\n}\n\nfunction formatNumber (num) {\n var localized = num.toLocaleString(jsLocaleCode, {\n useGrouping: true,\n maximumFractionDigits: 6,\n minimumFractionDigits: 3\n })\n\n return splitNumber(localized, jsLocaleCode)\n}\n\nfunction formatCrypto (amount) {\n return formatNumber(amount)\n}\n\nfunction formatFiat (amount, fractionDigits) {\n if (!fractionDigits) fractionDigits = 0\n\n const localized = amount.toLocaleString(jsLocaleCode, {\n useGrouping: true,\n maximumFractionDigits: fractionDigits,\n minimumFractionDigits: fractionDigits\n })\n return splitNumber(localized, jsLocaleCode) + ' ' + fiatCode\n}\n\nfunction setExchangeRate (_rates) {\n lastRates = _rates\n var cryptoCode = _rates.cryptoCode\n var rates = _rates.rates\n\n var coin = getCryptoCurrency(cryptoCode)\n var displayCode = coin.displayCode\n\n if (rates.cashIn) {\n var cryptoToFiat = new BigNumber(rates.cashIn)\n var rateStr = formatFiat(cryptoToFiat.round(2).toNumber(), 2)\n\n $('.crypto-rate-cash-in').html(`1 ${cryptoCode === LN ? BTC : cryptoCode} = ${rateStr}`)\n }\n\n if (rates.cashOut) {\n var cashOut = new BigNumber(rates.cashOut)\n var cashOutCryptoToFiat = cashOut && formatFiat(cashOut.round(2).toNumber(), 2)\n\n $('.crypto-rate-cash-out').html(`1 ${cryptoCode === LN ? BTC : cryptoCode} = ${cashOutCryptoToFiat}`)\n }\n\n $('.js-crypto-display-units').text(displayCode)\n}\n\nfunction qrize (text, target, color, lightning, size = 'normal') {\n const image = document.getElementById('bolt-img')\n // Hack for surf browser\n const _size = size === 'normal'\n ? document.body.clientHeight * 0.36\n : document.body.clientHeight * 0.25\n\n const opts = {\n crisp: true,\n fill: color || 'black',\n text,\n size: _size,\n render: 'canvas',\n rounded: 50,\n quiet: 2,\n mPosX: 50,\n mPosY: 50,\n mSize: 30,\n image\n }\n\n if (lightning) {\n opts.mode = 'image'\n }\n\n const el = kjua(opts)\n\n target.empty().append(el)\n}\n\nfunction setTx (tx) {\n const txId = tx.id\n const isPaperWallet = tx.isPaperWallet\n const hasBills = tx.bills && tx.bills.length > 0\n\n if (hasBills) {\n $('.js-inserted-notes').show()\n $('.js-no-inserted-notes').hide()\n } else {\n $('.js-inserted-notes').hide()\n $('.js-no-inserted-notes').show()\n }\n\n $('.js-paper-wallet').toggleClass('hide', !isPaperWallet)\n\n setCurrentDiscount(tx.discount, tx.promoCodeApplied)\n\n setTimeout(() => {\n qrize(txId, $('#cash-in-qr-code'), CASH_IN_QR_COLOR)\n qrize(txId, $('#cash-in-fail-qr-code'), CASH_IN_QR_COLOR)\n qrize(txId, $('#cash-in-no-funds-qr-code'), CASH_IN_QR_COLOR, null, 'small')\n qrize(txId, $('#qr-code-fiat-receipt'), CASH_OUT_QR_COLOR)\n qrize(txId, $('#qr-code-fiat-complete'), CASH_OUT_QR_COLOR)\n }, 1000)\n}\n\nfunction formatAddressNoBreakLines (address) {\n if (!address) return\n if (address.length > 60) {\n const firstPart = address.substring(0, 40).replace(/(.{4})/g, '$1 ')\n const secondPart = address.substring(address.length-16, address.length).replace(/(.{4})/g, '$1 ')\n return firstPart.concat('... ').concat(secondPart)\n }\n return address.replace(/(.{4})/g, '$1 ')\n}\n\nfunction formatAddress (address) {\n let toBr = formatAddressNoBreakLines(address)\n if (!toBr) return\n\n return toBr.replace(/((.{4} ){5})/g, '$1
')\n}\n\nfunction setBuyerAddress (address) {\n $('.crypto-address-no-br').html(formatAddressNoBreakLines(address))\n $('.crypto-address').html(formatAddress(address))\n}\n\nfunction highBill (highestBill, reason) {\n var reasonText = reason === 'transactionLimit'\n ? translate('Transaction limit reached.')\n : translate(\"We're a little low on crypto.\")\n\n t('high-bill-header', reasonText)\n t('highest-bill', translate('Please insert %s or less.', [formatFiat(highestBill)]))\n\n setScreen('high_bill')\n window.setTimeout(revertScreen, 3000)\n}\n\nfunction minimumTx (lowestBill) {\n t('lowest-bill', translate('Minimum first bill is %s.', [formatFiat(lowestBill)]))\n\n setScreen('minimum_tx')\n window.setTimeout(revertScreen, 3000)\n}\n\nfunction readingBills (bill) {\n $('.js-processing-bill').html(translate('Processing %s ...', [formatFiat(bill)]))\n $('.js-continue-crypto-enable').hide()\n $('.js-send-crypto-enable').hide()\n}\n\nfunction sendOnly (reason) {\n // TODO: sendOnly should be made into its own state on brain.js\n if (currentState === 'send_only') return\n\n const errorMessages = {\n transactionLimit: translate('Transaction limit reached'),\n validatorError: translate('Error in validation'),\n lowBalance: translate(\"We're out of coins!\"),\n blockedCustomer: translate('Transaction limit reached')\n }\n\n // If no reason provided defaults to lowBalance\n const reasonText = errorMessages[reason] || errorMessages.lowBalance\n $('#send-only-title').text(reasonText)\n\n if (reason === 'blockedCustomer') {\n $('.js-send-only-text').text(translate(\"Due to local regulations, you've reached your transaction limit. Please contact us if you'd like to raise your limit.\"))\n } else {\n $('.js-send-only-text').text('')\n }\n\n setState('send_only')\n}\n\nfunction t (id, str) {\n $('#js-i18n-' + id).html(str)\n}\n\nfunction translateCoin (_cryptoCode) {\n const coin = getCryptoCurrency(_cryptoCode)\n const cryptoCode = coin.cryptoCodeDisplay || _cryptoCode\n $('.js-i18n-scan-your-address').html(translate('Scan your
%s address', [cryptoCode]))\n $('.js-i18n-please-scan').html(translate('Please scan the QR code
to send us your %s.', [cryptoCode]))\n $('.js-i18n-did-send-coins').html(translate('Have you sent the %s yet?', [cryptoCode]))\n $('.js-i18n-scan-address').html(translate('Scan your %s address', [cryptoCode]))\n $('.js-i18n-invalid-address').html(translate('Invalid %s address', [cryptoCode]))\n}\n\nfunction initTranslatePage () {\n $('.js-i18n').each(function () {\n var el = $(this)\n el.data('baseTranslation', el.html().trim())\n })\n $('input[placeholder]').each(function () {\n var el = $(this)\n el.data('baseTranslation', el.attr('placeholder'))\n })\n}\n\nfunction translatePage () {\n $('.js-i18n').each(function () {\n var el = $(this)\n var base = el.data('baseTranslation')\n el.html(translate(base))\n })\n $('input[placeholder]').each(function () {\n var el = $(this)\n var base = el.data('baseTranslation')\n el.attr('placeholder', translate(base))\n })\n\n // Adjust send coins button\n var length = $('#send-coins span').text().length\n if (length > 17) $('body').addClass('i18n-long-send-coins')\n else $('body').removeClass('i18n-long-send-coins')\n}\n\nfunction loadI18n (localeCode) {\n var messages = locales[localeCode] || locales['en-US']\n\n return new Jed({\n 'missing_key_callback': function () {},\n 'locale_data': {\n 'messages': messages\n }\n })\n}\n\nfunction reachFiatLimit (rec) {\n var msg = null\n if (rec.isEmpty) msg = translate(`We're a little low, please cash out`)\n else if (rec.txLimitReached) msg = translate('Transaction limit reached, please cash out')\n\n var el = $('.choose_fiat_state .limit')\n if (msg) el.html(msg).show()\n else el.hide()\n}\n\nfunction chooseFiat (data) {\n fiatCredit(data)\n setState('choose_fiat')\n}\n\nfunction displayCrypto (cryptoAtoms, cryptoCode) {\n var coin = getCryptoCurrency(cryptoCode)\n var scale = new BigNumber(10).pow(coin.displayScale)\n // number of decimal places vary based on displayScale value\n var decimalPlaces = (coin.displayScale - coin.unitScale) + 6\n var cryptoAmount = new BigNumber(cryptoAtoms).div(scale).round(decimalPlaces).toNumber()\n return formatCrypto(cryptoAmount)\n}\n\nfunction BN (s) { return new BigNumber(s) }\n\nfunction fiatCredit (data) {\n var tx = data.tx\n var cryptoCode = tx.cryptoCode\n var activeDenominations = data.activeDenominations\n var coin = getCryptoCurrency(cryptoCode)\n const fiat = BN(tx.fiat)\n\n var fiatDisplay = BN(tx.fiat).toNumber().toLocaleString(jsLocaleCode, {\n useGrouping: true,\n maximumFractionDigits: 0,\n minimumFractionDigits: 0\n })\n\n var cryptoAtoms = BN(tx.cryptoAtoms)\n var cryptoDisplay = displayCrypto(cryptoAtoms, cryptoCode)\n\n var cryptoDisplayCode = coin.displayCode\n\n setCurrentDiscount(tx.discount, tx.promoCodeApplied)\n\n if (cryptoAtoms.eq(0) || cryptoAtoms.isNaN()) $('#js-i18n-choose-digital-amount').hide()\n else $('#js-i18n-choose-digital-amount').show()\n\n if (fiat.eq(0)) $('#cash-out-button').prop('disabled', true)\n else $('#cash-out-button').prop('disabled', false)\n\n updateCassetteButtons(activeDenominations.activeMap, NUMBER_OF_BUTTONS)\n $('.choose_fiat_state .fiat-amount').text(fiatDisplay)\n t('choose-digital-amount',\n translate(\"You'll be sending %s %s\", [cryptoDisplay, cryptoDisplayCode]))\n\n reachFiatLimit(activeDenominations)\n}\n\nfunction setDepositAddress (depositInfo) {\n $('.deposit_state .loading').hide()\n $('.deposit_state .send-notice .crypto-address').html(formatAddress(depositInfo.toAddress))\n $('.deposit_state .send-notice').show()\n\n qrize(depositInfo.depositUrl, $('#qr-code-deposit'), CASH_OUT_QR_COLOR)\n}\n\nfunction setVersion (version) {\n $('.version-number').html(`Version: ${version}`)\n}\n\nfunction deposit (tx) {\n var cryptoCode = tx.cryptoCode\n var display = displayCrypto(tx.cryptoAtoms, cryptoCode)\n\n $('.js-wallet-address').show()\n\n $('.deposit_state .digital .js-amount').html(display)\n $('.deposit_state .fiat .js-amount').text(tx.fiat)\n $('.deposit_state .send-notice').hide()\n $('#qr-code-deposit').empty()\n $('.deposit_state .loading').show()\n $('#qr-code-deposit').show()\n $('#lightning-enabled').hide()\n if (tx.cryptoCode === 'LN') $('#lightning-enabled').show()\n\n setState('deposit')\n}\n\nfunction fiatReceipt (tx) {\n var cryptoCode = tx.cryptoCode\n var display = displayCrypto(tx.cryptoAtoms, cryptoCode)\n\n $('.fiat_receipt_state .digital .js-amount').html(display)\n $('.fiat_receipt_state .fiat .js-amount').text(tx.fiat)\n $('.fiat_receipt_state .sent-coins .crypto-address').html(formatAddress(tx.toAddress))\n\n setState('fiat_receipt')\n}\n\nfunction fiatComplete (tx) {\n var cryptoCode = tx.cryptoCode\n var display = displayCrypto(tx.cryptoAtoms, cryptoCode)\n\n $('.fiat_complete_state .digital .js-amount').html(display)\n $('.fiat_complete_state .fiat .js-amount').text(tx.fiat)\n $('.fiat_complete_state .sent-coins .crypto-address').html(formatAddress(tx.toAddress))\n\n setState('fiat_complete')\n}\n\nfunction dispenseBatch (data) {\n $('.batch').css('visibility', data.of === 1 ? 'hidden' : 'visible')\n $('.batch').text(`${data.current}/${data.of}`)\n}\n\nfunction initDebug () {\n $('body').css('cursor', 'default')\n var style = document.createElement('style')\n style.type = 'text/css'\n style.innerHTML = 'button { cursor: default !important; }'\n document.getElementsByTagName('head')[0].appendChild(style)\n}\n\nfunction calculateAspectRatio () {\n const width = $('body').width()\n const height = $('body').height()\n\n function gcd (a, b) {\n return (b === 0) ? a : gcd(b, a % b)\n }\n\n const w = width\n const h = height\n const r = gcd(w, h)\n const aspectRatioPt1 = w / r\n const aspectRatioPt2 = h / r\n\n if (aspectRatioPt1 < aspectRatioPt2) {\n aspectRatio = '9:16'\n } else if (aspectRatioPt1 === 8 && aspectRatioPt2 === 5) {\n aspectRatio = '16:10'\n } else if (aspectRatioPt1 === 16 && aspectRatioPt2 === 9) {\n aspectRatio = '16:9'\n } else {\n aspectRatio = w < 1420 ? '16:10' : '16:9'\n }\n}\n\nlet background = null\n\nfunction shouldEnableTouch () {\n const ua = navigator.userAgent\n if (ua.match(/surf/ig)) return false\n\n // ACP has chromium 34 and upboard 73\n const chromiumVersion = ua.match(/chromium\\/(\\d+)/i)\n const chromeVersion = ua.match(/chrome\\/(\\d+)/i)\n const chromiumPlus73 = chromiumVersion && chromiumVersion[1] >= 73\n const chromePlus73 = chromeVersion && chromeVersion[1] >= 73\n\n return chromiumPlus73 || chromePlus73\n}\n\nfunction setAvailablePromoCodes (areThereAvailablePromoCodes) {\n if (areThereAvailablePromoCodes) {\n $('#insert-first-bill-promo-button').show()\n $('#insert-first-recycler-bills-promo-button').show()\n $('#choose-fiat-promo-button').show()\n } else {\n $('#insert-first-bill-promo-button').hide()\n $('#insert-first-recycler-bills-promo-button').hide()\n $('#choose-fiat-promo-button').hide()\n }\n}\n\nfunction setCurrentDiscount (currentDiscount, promoCodeApplied) {\n if (promoCodeApplied) {\n $('#insert-first-bill-promo-button').hide()\n $('#insert-first-recycler-bills-promo-button').hide()\n $('#choose-fiat-promo-button').hide()\n }\n\n if (!currentDiscount) {\n $('#insert-first-bill-code-added').hide()\n $('#insert-first-recycler-bills-code-added').hide()\n $('#choose-fiat-code-added').hide()\n } else if (currentDiscount > 0) {\n const successMessage = '✔ ' + translate('Discount added (%s off commissions)', [`${currentDiscount}%`])\n $('#insert-first-bill-code-added').html(successMessage)\n $('#insert-first-recycler-bills-code-added').html(successMessage)\n $('#choose-fiat-code-added').html(successMessage)\n $('#insert-first-bill-code-added').show()\n $('#insert-first-recycler-bills-code-added').show()\n $('#choose-fiat-code-added').show()\n\n } else {\n $('#insert-first-bill-promo-button').show()\n $('#insert-first-recycler-bills-promo-button').show()\n $('#choose-fiat-promo-button').show()\n $('#insert-first-bill-code-added').hide()\n $('#insert-first-recycler-bills-code-added').hide()\n $('#choose-fiat-code-added').hide()\n }\n}\n\nfunction setReceiptPrint (receiptStatus, smsReceiptStatus) {\n const status = receiptStatus ? receiptStatus : smsReceiptStatus\n\n const className = receiptStatus ? 'print-receipt' : 'send-sms-receipt'\n const printing = receiptStatus ? 'Printing receipt...' : 'Sending receipt...'\n const success = receiptStatus ? 'Receipt printed successfully!' : 'Receipt sent successfully!'\n\n switch (status) {\n case 'disabled':\n $(`#${className}-cash-in-message`).addClass('hide')\n $(`#${className}-cash-in-button`).addClass('hide')\n $(`#${className}-cash-out-message`).addClass('hide')\n $(`#${className}-cash-out-button`).addClass('hide')\n $(`#${className}-cash-in-fail-message`).addClass('hide')\n $(`#${className}-cash-in-fail-button`).addClass('hide')\n break\n case 'available':\n $(`#${className}-cash-in-message`).addClass('hide')\n $(`#${className}-cash-in-button`).removeClass('hide')\n $(`#${className}-cash-out-message`).addClass('hide')\n $(`#${className}-cash-out-button`).removeClass('hide')\n $(`#${className}-cash-in-fail-message`).addClass('hide')\n $(`#${className}-cash-in-fail-button`).removeClass('hide')\n break\n case 'printing':\n const message = locale.translate(printing).fetch()\n $(`#${className}-cash-in-button`).addClass('hide')\n $(`#${className}-cash-in-message`).html(message)\n $(`#${className}-cash-in-message`).removeClass('hide')\n $(`#${className}-cash-out-button`).addClass('hide')\n $(`#${className}-cash-out-message`).html(message)\n $(`#${className}-cash-out-message`).removeClass('hide')\n $(`#${className}-cash-in-fail-button`).addClass('hide')\n $(`#${className}-cash-in-fail-message`).html(message)\n $(`#${className}-cash-in-fail-message`).removeClass('hide')\n break\n case 'success':\n const successMessage = '✔ ' + locale.translate(success).fetch()\n $(`#${className}-cash-in-button`).addClass('hide')\n $(`#${className}-cash-in-message`).html(successMessage)\n $(`#${className}-cash-in-message`).removeClass('hide')\n $(`#${className}-cash-out-button`).addClass('hide')\n $(`#${className}-cash-out-message`).html(successMessage)\n $(`#${className}-cash-out-message`).removeClass('hide')\n $(`#${className}-cash-in-fail-button`).addClass('hide')\n $(`#${className}-cash-in-fail-message`).html(successMessage)\n $(`#${className}-cash-in-fail-message`).removeClass('hide')\n break\n case 'failed':\n const failMessage = '✖ ' + locale.translate('An error occurred, try again.').fetch()\n $(`#${className}-cash-in-button`).addClass('hide')\n $(`#${className}-cash-in-message`).html(failMessage)\n $(`#${className}-cash-in-message`).removeClass('hide')\n $(`#${className}-cash-out-button`).addClass('hide')\n $(`#${className}-cash-out-message`).html(failMessage)\n $(`#${className}-cash-out-message`).removeClass('hide')\n $(`#${className}-cash-in-fail-button`).addClass('hide')\n $(`#${className}-cash-in-fail-message`).html(failMessage)\n $(`#${className}-cash-in-fail-message`).removeClass('hide')\n break\n }\n}\n\nfunction externalCompliance (url) {\n qrize(url, $('#qr-code-external-validation'), cashDirection === 'cashIn' ? CASH_IN_QR_COLOR : CASH_OUT_QR_COLOR)\n return setScreen('external_compliance')\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/app.js"],"names":["queryString","window","location","search","params","URLSearchParams","substring","DEBUG_MODE","get","CASH_OUT_QR_COLOR","CASH_IN_QR_COLOR","NUMBER_OF_BUTTONS","scrollSize","textHeightQuantity","currentPage","totalPages","aspectRatio","isTwoWay","isRTL","cryptomatModel","termsConditionsTimeout","termsConditionsAcceptanceInterval","T_C_TIMEOUT","complianceTimeout","cashDirection","fiatCode","locale","defaultLocale","loadI18n","localeCode","jsLocaleCode","_primaryLocales","lastRates","coins","currentState","websocket","promoKeyboard","usSsnKeypad","phoneKeypad","securityKeypad","previousState","buttonActive","currentCryptoCode","currentCoin","currentCoins","emailKeyboard","customRequirementNumericalKeypad","customRequirementTextKeyboard","customRequirementChoiceList","MUSEO","connect","console","log","HOST","PORT","WebSocket","onmessage","event","data","$","parseJSON","processData","onerror","err","verifyConnection","readyState","CLOSED","buttonPressed","button","deactivate","setTimeout","activate","res","send","JSON","stringify","displayLN","displayBTC","LN","BTC","screenOpts","setScreenOptions","localeInfo","setLocaleInfo","setLocale","supportedCoins","setCoins","setFiatCode","rates","setExchangeRate","buyerAddress","setBuyerAddress","credit","lastBill","action","setCredit","tx","setTx","sendOnly","reason","fiatCredit","depositInfo","setDepositAddress","version","setVersion","cassettes","buildCassetteButtons","readingBills","cryptoCode","translateCoin","cashInFee","setFixedFee","cashOutFee","terms","setTermsScreen","dispenseBatch","direction","setDirection","operatorInfo","setOperatorInfo","hardLimit","setHardLimit","setCryptomatModel","areThereAvailablePromoCodes","undefined","setAvailablePromoCodes","allRates","ratesFiat","setRates","discount","setCurrentDiscount","receiptStatus","setReceiptPrint","smsReceiptStatus","context","hide","show","isRecycler","billValidator","setState","text","setComplianceTimeout","setConstraint","disableRecyclerBillButtons","enableRecyclerBillButtons","highBill","highestBill","minimumTx","lowestBill","isCashInOnlyCoin","chooseFiat","deposit","fiatReceipt","fiatComplete","chooseCoin","twoWayMode","smsVerification","emailVerification","idVerification","facephotoPermission","usSsnPermission","externalPermission","blockedCustomer","customInfoRequestPermission","customInfoRequest","invalidAddress","lnInvoiceTypeError","clearTimeout","externalCompliance","externalComplianceUrl","snakecase","translate","fetchArgs","fetch","error","e","setScreen","screen1","title","interval","complianceButton","input","type","screen2","setOpts","constraint","constraintType","maxLength","numDigits","label1","label2","removeClass","addClass","replaceChoices","choiceList","setChooseCoinColors","defaultCoin","slice","setCryptoBuy","setCryptoSell","setupCoinsButtons","openLanguageDropdown","closeLanguageDropdown","openCoinDropdown","closeCoinDropdown","empty","dropdownCoins","length","showMoreButton","forEach","coin","activeClass","el","toLowerCase","display","append","each","html","trim","cashIn","translatedCoin","buyStr","cashOut","sellStr","getCryptoCurrency","cryptoCurrency","find","c","Error","switchCoin","selectedIndex","indexOf","it","splice","document","ready","attachFastClick","Origami","fastclick","body","addEventListener","calculateAspectRatio","onclick","oncontextmenu","onmousedown","onmousemove","onmouseup","BigNumber","config","ROUNDING_MODE","ROUND_HALF_EVEN","Keyboard","id","inputBox","init","Keypad","result","country","submitButtonWrapper","ChoiceList","setInterval","initTranslatePage","sendCoinsButton","getElementById","sendCoinsButton2","touchEvent","setupButton","blockedCustomerOk","insertBillCancelButton","touchImmediateEvent","insertBillCancelRecyclerButton","setupImmediateButton","promoCodeCancelButton","bind","submitCodeButton","code","submitEmailButton","submitTextRequirementButton","nextFieldTextRequirementButton","previousFieldTextRequirementButton","val","setInputBox","cryptoButtons","target","is","closest","wantedCoin","areYouSureCancel","areYouSureContinue","coinRedeem","otherLocale","cashInBox","cashOutBox","languageOverlay","cryptoOverlay","languageButtons","languageButtonJ","newLocale","attr","buildCassetteButtonEvents","initDebug","targetButton","element","classList","special","contains","parentNode","callback","handler","add","remove","stopPropagation","preventDefault","shouldEnableTouch","buttonClass","buttonAction","actionData","newScreen","oldScreen","css","top","left","newView","state","delay","clearTermsConditionsTimeout","clearTermsConditionsAcceptanceDelay","reset","revertScreen","setUpDirectionElement","operator","active","name","email","phone","limits","component","hardLimitWeeks","hardLimitDays","hardLimitHours","model","versions","startsWith","continueButton","finishButton","disabled","states","$screen","startPage","acceptDisabled","cancel","accept","setTermsConditionsTimeout","setAcceptButtonDisabled","setTermsConditionsAcceptanceDelay","screen","acceptButton","prop","Boolean","delayTimer","isNaN","seconds","tmpbtn","clone","appendTo","width","outerWidth","clearInterval","resetTermsConditionsTimeout","scrollUp","div","updateButtonStyles","updatePageCounter","scrollTo","acceptedTerms","offsetHeight","style","Math","ceil","textContent","scrollDown","buttonDown","buttonUp","setCountry","setPrimaryLocales","primaryLocales","primaryLocale","otherLanguageName","lang","lookupLocaleNames","nativeName","split","isArabic","isHebrew","translatePage","ex","elem","img","areArraysEqual","arr1","arr2","i","langMap","languageMappingList","language","localeNames","languages","sortedPrimaryLocales","filter","sort","a","b","langA","langB","englishName","localeCompare","l","toggleClass","_fee","fee","parseFloat","fixedFee","formatFiat","fiat","cryptoAtoms","scale","pow","displayScale","cryptoAmount","toNumber","cryptoDisplayCode","displayCode","updateCrypto","inserted","formatDenomination","denom","toLocaleString","useGrouping","maximumFractionDigits","minimumFractionDigits","_cassettes","numberOfButtons","activeCassettes","count","inactiveCassettes","allCassettes","concat","selectedCassettes","sortedCassettes","denomination","updateCassetteButtons","activeDenoms","children","fiatButtons","lastTouch","now","Date","cashButtonJ","hasClass","selector","formatCrypto","lookupDecimalChar","num","localized","splitNumber","localize","decimalChar","join","formatNumber","amount","fractionDigits","_rates","cryptoToFiat","rateStr","round","cashOutCryptoToFiat","qrize","color","lightning","size","image","_size","clientHeight","opts","crisp","fill","render","rounded","quiet","mPosX","mPosY","mSize","mode","kjua","txId","isPaperWallet","hasBills","bills","promoCodeApplied","formatAddressNoBreakLines","address","firstPart","replace","secondPart","formatAddress","toBr","reasonText","t","bill","errorMessages","transactionLimit","validatorError","lowBalance","str","_cryptoCode","cryptoCodeDisplay","base","messages","locales","Jed","reachFiatLimit","rec","msg","isEmpty","txLimitReached","displayCrypto","decimalPlaces","unitScale","BN","s","activeDenominations","fiatDisplay","cryptoDisplay","eq","activeMap","toAddress","depositUrl","of","current","createElement","innerHTML","getElementsByTagName","appendChild","height","gcd","w","h","r","aspectRatioPt1","aspectRatioPt2","background","ua","navigator","userAgent","match","chromiumVersion","chromeVersion","chromiumPlus73","chromePlus73","currentDiscount","successMessage","status","className","printing","success","message","failMessage","url","thousandSeparator","number","numberFormatter","Intl","NumberFormat","format","ratesTable","tableHeader","coinEntries","Object","keys","biggestDecimalPlaces","max","dp","push","toFixed"],"mappings":"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","file":"app.js","sourcesContent":["/* globals $, URLSearchParams, WebSocket, locales, Keyboard, Keypad, Jed, BigNumber, HOST, PORT, Origami, kjua, TimelineMax, Two */\n'use strict'\n\nconst queryString = window.location.search\nconst params = new URLSearchParams(queryString.substring(1))\nconst DEBUG_MODE = params.get('debug')\nconst CASH_OUT_QR_COLOR = '#403c51'\nconst CASH_IN_QR_COLOR = '#0e4160'\nconst NUMBER_OF_BUTTONS = 3\n\nvar scrollSize = 0\nvar textHeightQuantity = 0\nvar currentPage = 0\nvar totalPages = 0\nvar aspectRatio = '16:10'\nvar isTwoWay = null\nvar isRTL = false\nvar cryptomatModel = null\nvar termsConditionsTimeout = null\nvar termsConditionsAcceptanceInterval = null\nvar T_C_TIMEOUT = 30000\nvar complianceTimeout = null;\nvar cashDirection = null;\n\nvar fiatCode = null\nvar locale = null\nvar defaultLocale = loadI18n('en-US') || null\nvar localeCode = null\nvar jsLocaleCode = null // Sometimes slightly different than localeCode\nvar _primaryLocales = []\nvar lastRates = null\nvar coins\n\nvar currentState\n\nvar websocket = null\nvar promoKeyboard = null\nvar usSsnKeypad = null\nvar phoneKeypad = null\nvar securityKeypad = null\nvar previousState = null\nvar buttonActive = true\nlet currentCryptoCode = null\nlet currentCoin = null\nlet currentCoins = []\nlet emailKeyboard = null\nlet customRequirementNumericalKeypad = null\nlet customRequirementTextKeyboard = null\nlet customRequirementChoiceList = null\n\nvar MUSEO = ['ca', 'cs', 'da', 'de', 'en', 'es', 'et', 'fi', 'fr', 'hr',\n 'hu', 'it', 'lt', 'nb', 'nl', 'pl', 'pt', 'ro', 'sl', 'sv', 'tr']\n\nfunction connect () {\n console.log(`ws://${HOST}:${PORT}/`)\n websocket = new WebSocket(`ws://${HOST}:${PORT}/`)\n websocket.onmessage = function (event) {\n var data = $.parseJSON(event.data)\n processData(data)\n }\n websocket.onerror = err => console.log(err)\n}\n\nfunction verifyConnection () {\n if (websocket.readyState === websocket.CLOSED) {\n connect()\n }\n}\n\nfunction buttonPressed (button, data) {\n if (!buttonActive) return\n promoKeyboard.deactivate()\n emailKeyboard.deactivate()\n customRequirementTextKeyboard.deactivate()\n buttonActive = false\n setTimeout(function () {\n buttonActive = true\n promoKeyboard.activate()\n emailKeyboard.activate()\n customRequirementTextKeyboard.activate()\n }, 300)\n var res = { button: button }\n if (data || data === null) res.data = data\n if (websocket) websocket.send(JSON.stringify(res))\n}\n\nconst displayLN = 'Lightning Network'\nconst displayBTC = 'Bitcoin
(LN)'\nconst LN = 'LN'\nconst BTC = 'BTC'\n\nfunction processData (data) {\n if (data.screenOpts) setScreenOptions(data.screenOpts)\n if (data.localeInfo) setLocaleInfo(data.localeInfo)\n if (data.locale) setLocale(data.locale)\n if (data.supportedCoins) setCoins(data.supportedCoins)\n if (!locale) return\n if (data.fiatCode) setFiatCode(data.fiatCode)\n if (data.rates) setExchangeRate(data.rates)\n if (data.buyerAddress) setBuyerAddress(data.buyerAddress)\n if (data.credit) {\n var lastBill = data.action === 'rejectedBill' ? null : data.credit.lastBill\n setCredit(data.credit, lastBill)\n }\n if (data.tx) setTx(data.tx)\n if (data.sendOnly) sendOnly(data.reason)\n if (data.fiatCredit) fiatCredit(data.fiatCredit)\n if (data.depositInfo) setDepositAddress(data.depositInfo)\n if (data.version) setVersion(data.version)\n if (data.cassettes) buildCassetteButtons(data.cassettes, NUMBER_OF_BUTTONS)\n if (data.readingBills) readingBills(data.readingBills)\n if (data.cryptoCode) translateCoin(data.cryptoCode)\n if (data.tx) {\n if (data.tx.cashInFee) setFixedFee(data.tx.cashInFee)\n else if (data.tx.cashOutFee) setFixedFee(data.tx.cashOutFee)\n }\n if (data.terms) setTermsScreen(data.terms)\n if (data.dispenseBatch) dispenseBatch(data.dispenseBatch)\n if (data.direction) setDirection(data.direction)\n if (data.operatorInfo) setOperatorInfo(data.operatorInfo)\n if (data.hardLimit) setHardLimit(data.hardLimit)\n if (data.cryptomatModel) setCryptomatModel(data.cryptomatModel)\n if (data.areThereAvailablePromoCodes !== undefined) setAvailablePromoCodes(data.areThereAvailablePromoCodes)\n if (data.allRates && data.ratesFiat) setRates(data.allRates, data.ratesFiat)\n\n if (data.tx && data.tx.discount) setCurrentDiscount(data.tx.discount)\n if (data.receiptStatus) setReceiptPrint(data.receiptStatus, null)\n if (data.smsReceiptStatus) setReceiptPrint(null, data.smsReceiptStatus)\n\n if (data.context) {\n $('.js-context').hide()\n $('.js-context-' + data.context).show()\n }\n\n const isRecycler = billValidator => {\n return billValidator === 'HCM2'\n }\n\n switch (data.action) {\n case 'pairing':\n setState('pairing')\n break\n case 'pairingError':\n $('.js-pairing-error').text(data.err)\n // Give it some time to update text in background\n setTimeout(function () { setState('pairing_error') }, 500)\n break\n case 'booting':\n if (currentState !== 'maintenance') setState('booting')\n break\n case 'idle':\n case 'fakeIdle':\n setState('idle')\n break\n case 'dualIdle':\n case 'fakeDualIdle':\n setState('dual_idle')\n break\n case 'registerUsSsn':\n usSsnKeypad.activate()\n setState('register_us_ssn')\n setComplianceTimeout(null, 'finishBeforeSms')\n break\n case 'registerPhone':\n phoneKeypad.activate()\n setState('register_phone')\n break\n case 'registerEmail':\n emailKeyboard.setConstraint('email', ['#submit-email'])\n setState('register_email')\n break\n case 'securityCode':\n securityKeypad.activate()\n setState('security_code')\n break\n case 'scanned':\n isRecycler(data.billValidator)\n ? setState('insert_first_bills_recycler')\n : setState('insert_bills')\n break\n case 'acceptingFirstBill':\n $('.js-send-crypto-enable').show()\n setState('insert_bills')\n break\n case 'acceptingBills':\n $('.blocked-customer-top').hide()\n setState('insert_more_bills')\n break\n case 'acceptingFirstRecyclerBills':\n $('.js-continue-crypto-enable').show()\n $('.js-send-crypto-enable').show()\n setState('insert_first_bills_recycler')\n break\n case 'recyclerContinue':\n disableRecyclerBillButtons()\n break;\n case 'acceptingRecyclerBills':\n enableRecyclerBillButtons()\n $('.blocked-customer-top').hide()\n setState('insert_bills_recycler')\n break\n case 'acceptingBill':\n case 'rejectedBill':\n // still need to prevent screen change\n break\n case 'cryptoTransferPending':\n setState('sending_coins')\n break\n case 'cryptoTransferComplete':\n setState('completed')\n break\n case 'networkDown':\n setState('trouble')\n break\n case 'balanceLow':\n setState('limit_reached')\n break\n case 'insufficientFunds':\n setState('out_of_coins')\n break\n case 'highBill':\n highBill(data.highestBill, data.reason)\n break\n case 'minimumTx':\n minimumTx(data.lowestBill)\n break\n case 'chooseFiat':\n if (data.isCashInOnlyCoin) {\n setState('cash_in_only_coin')\n break\n }\n chooseFiat(data.chooseFiat)\n break\n case 'deposit':\n setState('deposit')\n deposit(data.tx)\n break\n case 'rejectedDeposit':\n setState('deposit_timeout')\n break\n case 'fiatReceipt':\n fiatReceipt(data.tx)\n break\n case 'fiatComplete':\n fiatComplete(data.tx)\n break\n case 'restart':\n setState('restart')\n break\n case 'chooseCoin':\n chooseCoin(data.coins, data.twoWayMode)\n break\n case 'smsVerification':\n smsVerification()\n break\n case 'emailVerification':\n emailVerification();\n break;\n case 'permission_id':\n idVerification()\n break\n case 'permission_face_photo':\n facephotoPermission()\n break\n case 'usSsnPermission':\n usSsnPermission()\n break\n case 'externalPermission':\n externalPermission()\n break\n case 'blockedCustomer':\n blockedCustomer()\n break\n case 'insertPromoCode':\n promoKeyboard.activate()\n setState('insert_promo_code')\n break\n case 'invalidPromoCode':\n setState('promo_code_not_found')\n break\n case 'customInfoRequestPermission':\n customInfoRequestPermission(data.customInfoRequest)\n break\n case 'inputCustomInfoRequest':\n customInfoRequest(data.customInfoRequest)\n break\n case 'actionRequiredMaintenance':\n setState('action_required_maintenance')\n break\n case 'cashSlotRemoveBills':\n setState('cash_slot_remove_bills')\n break\n case 'leftoverBillsInCashSlot':\n setState('leftover_bills_in_cash_slot')\n break\n case 'invalidAddress':\n invalidAddress(data.lnInvoiceTypeError)\n break\n case 'externalCompliance':\n clearTimeout(complianceTimeout)\n externalCompliance(data.externalComplianceUrl)\n break\n case 'rates':\n setState('rates')\n break\n default:\n if (data.action) setState(window.snakecase(data.action))\n }\n}\n\nfunction translate (data, fetchArgs) {\n if (data === \"\")\n return data\n\n try {\n return fetchArgs\n ? locale.translate(data).fetch(...fetchArgs)\n : locale.translate(data).fetch()\n } catch (error) {\n if (!defaultLocale) console.error('Error while translating: ', error)\n else {\n try {\n return fetchArgs\n ? defaultLocale.translate(data).fetch(...fetchArgs)\n : defaultLocale.translate(data).fetch()\n } catch (e) {\n console.error('Error while translating: ', e)\n return data\n }\n }\n }\n}\n\nfunction facephotoPermission () {\n setComplianceTimeout(null, 'finishBeforeSms')\n setScreen('permission_face_photo')\n}\n\nfunction usSsnPermission () {\n setComplianceTimeout(null, 'finishBeforeSms')\n setScreen('us_ssn_permission')\n}\n\nfunction externalPermission () {\n setComplianceTimeout(null, 'finishBeforeSms')\n setScreen('external_permission')\n}\n\nfunction customInfoRequestPermission (customInfoRequest) {\n $('#custom-screen1-title').text(customInfoRequest.screen1.title)\n $('#custom-screen1-text').text(customInfoRequest.screen1.text)\n setComplianceTimeout(null, 'finishBeforeSms')\n setScreen('custom_permission')\n}\n\nfunction setComplianceTimeout (interval, complianceButton) {\n clearTimeout(complianceTimeout)\n\n if (interval === 0) {\n return\n }\n\n complianceTimeout = setTimeout(function () {\n buttonPressed(complianceButton)\n }, interval == null ? 60000 : interval)\n}\n\nfunction invalidAddress (lnInvoiceTypeError) {\n if (lnInvoiceTypeError) {\n $('#invalid-address').hide()\n $('#invalid-invoice').show()\n } else {\n $('#invalid-invoice').hide()\n $('#invalid-address').show()\n }\n setState('invalid_address')\n}\n\nfunction customInfoRequest (customInfoRequest) {\n switch (customInfoRequest.input.type) {\n case 'numerical':\n $('#custom-screen2-numerical-title').text(customInfoRequest.screen2.title)\n $('#custom-screen2-numerical-text').text(customInfoRequest.screen2.text)\n customRequirementNumericalKeypad.setOpts({\n type: 'custom',\n constraint: customInfoRequest.input.constraintType,\n maxLength: customInfoRequest.input.numDigits\n })\n customRequirementNumericalKeypad.activate()\n setState('custom_permission_screen2_numerical')\n setScreen('custom_permission_screen2_numerical')\n setComplianceTimeout(null, 'cancelCustomInfoRequest')\n break\n case 'text':\n $('#custom-requirement-text-label1').text(customInfoRequest.input.label1)\n $('#custom-requirement-text-label2').text(customInfoRequest.input.label2)\n $('#previous-text-requirement').hide()\n $('#submit-text-requirement').hide()\n $('#next-text-requirement').hide()\n $('#optional-text-field-2').hide()\n $('.key.backspace.standard-backspace-key').removeClass('backspace-margin-left-override')\n $('.custom-info-request-space-key').show()\n // set type of constraint and buttons where that constraint should apply to disable/ enable\n customRequirementTextKeyboard.setConstraint(customInfoRequest.input.constraintType, ['#submit-text-requirement'])\n if (customInfoRequest.input.constraintType === 'spaceSeparation') {\n $('#optional-text-field-2').show()\n $('.key.backspace.standard-backspace-key').addClass('backspace-margin-left-override')\n $('.custom-info-request-space-key').hide()\n customRequirementTextKeyboard.setConstraint(customInfoRequest.input.constraintType, ['#next-text-requirement'])\n }\n setState('custom_permission_screen2_text')\n setScreen('custom_permission_screen2_text')\n setComplianceTimeout(null, 'cancelCustomInfoRequest')\n break\n case 'choiceList':\n $('#custom-screen2-choiceList-title').text(customInfoRequest.screen2.title)\n $('#custom-screen2-choiceList-text').text(customInfoRequest.screen2.text)\n customRequirementChoiceList.replaceChoices(customInfoRequest.input.choiceList, customInfoRequest.input.constraintType)\n setState('custom_permission_screen2_choiceList')\n setScreen('custom_permission_screen2_choiceList')\n setComplianceTimeout(null, 'cancelCustomInfoRequest')\n break\n default:\n return blockedCustomer()\n }\n}\n\nfunction idVerification () {\n setComplianceTimeout(null, 'finishBeforeSms')\n setScreen('permission_id')\n}\n\nfunction smsVerification () {\n setComplianceTimeout(null, 'finishBeforeSms')\n setScreen('sms_verification')\n}\n\nfunction emailVerification() {\n setComplianceTimeout(null, 'finishBeforeSms');\n setScreen('email_verification');\n}\n\nfunction blockedCustomer () {\n return setScreen('blocked_customer')\n}\n\nfunction chooseCoin (coins, twoWayMode) {\n if (twoWayMode) {\n $('.choose_coin_state').removeClass('choose-coin-cash-in').addClass('choose-coin-two-way')\n } else {\n $('.choose_coin_state').removeClass('choose-coin-two-way').addClass('choose-coin-cash-in')\n }\n\n isTwoWay = twoWayMode\n setChooseCoinColors()\n\n const defaultCoin = coins[0]\n\n currentCryptoCode = defaultCoin.cryptoCode\n currentCoin = defaultCoin\n currentCoins = coins.slice(0)\n\n setCryptoBuy(defaultCoin)\n setCryptoSell(defaultCoin)\n\n setupCoinsButtons(coins, currentCryptoCode)\n\n setState('choose_coin')\n}\n\nfunction openLanguageDropdown () {\n $('#language-dropdown-toggle').addClass('hide')\n $('#languages').removeClass('hide')\n $('#language-overlay').removeClass('hide')\n}\n\nfunction closeLanguageDropdown () {\n $('#language-dropdown-toggle').removeClass('hide')\n $('#languages').addClass('hide')\n $('#language-overlay').addClass('hide')\n}\n\nfunction openCoinDropdown () {\n $('#crypto-dropdown-toggle').addClass('hide')\n $('#crypto-overlay').removeClass('hide')\n $('#cryptos').removeClass('hide')\n}\n\nfunction closeCoinDropdown () {\n $('#crypto-dropdown-toggle').removeClass('hide')\n $('#crypto-overlay').addClass('hide')\n $('#cryptos').addClass('hide')\n}\n\nfunction setupCoinsButtons () {\n $('.crypto-buttons').empty()\n closeCoinDropdown()\n\n let coins = currentCoins.slice()\n let dropdownCoins = []\n\n if (coins.length === 1) return\n\n const showMoreButton = coins.length > 4\n if (showMoreButton) {\n $('crypto-dropdown-toggle').removeClass('hide')\n dropdownCoins = coins.slice(3)\n coins = coins.slice(0, 3)\n } else {\n $('crypto-dropdown-toggle').addClass('hide')\n }\n\n coins.forEach(function (coin) {\n const activeClass = coin.cryptoCode === currentCryptoCode ? 'choose-coin-button-active' : ''\n const el = `
\n ${coin.display}\n \n \n \n \n \n
`\n $('.crypto-buttons').append(el)\n })\n if (showMoreButton) {\n $('.crypto-buttons').append(`\n
\n
\n ${translate('More')}\n \n \n \n \n \n
\n
\n
\n `)\n dropdownCoins.forEach(coin => {\n const el = ``\n $('#cryptos').append(el)\n })\n const el = ``\n $('#cryptos').append(el)\n // As we add buttons 'more' and 'less' after initTranslate\n // they don't have baseTranslation translation data attached to them.\n $('.crypto-buttons .js-i18n').each(function () {\n var el = $(this)\n el.data('baseTranslation', el.html().trim())\n })\n }\n}\n\nfunction setCryptoBuy (coin) {\n const cashIn = $('.cash-in')\n const translatedCoin = translate(coin.display === displayLN ? displayBTC : coin.display)\n const buyStr = translate('Buy
%s', [translatedCoin])\n\n cashIn.html(buyStr)\n}\n\nfunction setCryptoSell (coin) {\n const cashOut = $('.cash-out')\n const translatedCoin = translate(coin.display === displayLN ? displayBTC : coin.display)\n const sellStr = translate('Sell
%s', [translatedCoin])\n\n cashOut.html(sellStr)\n}\n\nfunction setCoins (supportedCoins) {\n coins = supportedCoins\n}\n\nfunction getCryptoCurrency (cryptoCode) {\n const cryptoCurrency = coins.find(c => c.cryptoCode === cryptoCode)\n if (!cryptoCurrency) throw new Error(`Unsupported crypto: ${cryptoCode}`)\n return cryptoCurrency\n}\n\nfunction switchCoin (coin) {\n const cashIn = $('.cash-in')\n const cashOut = $('.cash-out')\n const cryptoCode = coin.cryptoCode\n\n if (currentCryptoCode === cryptoCode) return\n\n $(`.coin-${currentCryptoCode.toLowerCase()}`).removeClass('choose-coin-button-active')\n $(`.coin-${cryptoCode.toLowerCase()}`).addClass('choose-coin-button-active')\n currentCryptoCode = cryptoCode\n currentCoin = coin\n\n cashIn.addClass('crypto-switch')\n setTimeout(() => setCryptoBuy(coin), 100)\n setTimeout(() => cashIn.removeClass('crypto-switch'), 1000)\n\n setTimeout(() => {\n cashOut.addClass('crypto-switch')\n setTimeout(() => setCryptoSell(coin), 100)\n setTimeout(() => cashOut.removeClass('crypto-switch'), 1000)\n }, 80)\n\n const selectedIndex = currentCoins.indexOf(currentCoins.find(it => it.cryptoCode === cryptoCode))\n if (currentCoins.length > 4 && selectedIndex > 2) {\n currentCoins.splice(2, 0, currentCoins.splice(selectedIndex, 1)[0])\n }\n\n setupCoinsButtons()\n}\n\n$(document).ready(function () {\n const attachFastClick = Origami.fastclick\n attachFastClick(document.body)\n\n window.addEventListener('resize', () => {\n calculateAspectRatio()\n setChooseCoinColors()\n })\n\n // Matt's anti-drag hack\n window.onclick =\n window.oncontextmenu =\n window.onmousedown =\n window.onmousemove =\n window.onmouseup =\n function () { return false }\n\n BigNumber.config({ ROUNDING_MODE: BigNumber.ROUND_HALF_EVEN })\n\n promoKeyboard = new Keyboard({\n id: 'promo-keyboard',\n inputBox: '.promo-code-input'\n }).init(function () {\n if (currentState !== 'insert_promo_code') return\n buttonPressed('cancelPromoCode')\n })\n\n usSsnKeypad = new Keypad('us-ssn-keypad', { type: 'usSsn' }, function (result) {\n if (currentState !== 'register_us_ssn') return\n buttonPressed('usSsn', result)\n })\n\n phoneKeypad = new Keypad('phone-keypad', { type: 'phoneNumber', country: 'US' }, function (result) {\n if (currentState !== 'register_phone') return\n buttonPressed('phoneNumber', result)\n })\n\n securityKeypad = new Keypad('security-keypad', { type: 'code' }, function (result) {\n if (currentState !== 'security_code') return\n buttonPressed('securityCode', result)\n })\n\n customRequirementNumericalKeypad = new Keypad('custom-requirement-numeric-keypad', {\n type: 'custom'\n }, function (result) {\n if (currentState !== 'custom_permission_screen2_numerical') return\n buttonPressed('customInfoRequestSubmit', result)\n })\n\n emailKeyboard = new Keyboard({\n id: 'email-keyboard',\n inputBox: '#email-input',\n submitButtonWrapper: '#submit-email-wrapper',\n setComplianceTimeout: setComplianceTimeout\n }).init(function (result) {\n if (currentState !== 'register_email') return\n buttonPressed('email', result)\n })\n\n customRequirementTextKeyboard = new Keyboard({\n id: 'custom-requirement-text-keyboard',\n inputBox: '.text-input-field-1',\n submitButtonWrapper: '.submit-text-requirement-button-wrapper',\n setComplianceTimeout: setComplianceTimeout\n }).init(function () {\n if (currentState !== 'custom_permission_screen2_text') return\n buttonPressed('customInfoRequestSubmit')\n })\n\n customRequirementChoiceList = new ChoiceList({\n id: 'custom-requirement-choicelist-wrapper',\n setComplianceTimeout: setComplianceTimeout\n }).init(function (result) {\n if (currentState !== 'custom_permission_screen2_choiceList') return\n buttonPressed('customInfoRequestSubmit', result)\n })\n\n if (DEBUG_MODE !== 'demo') {\n connect()\n setInterval(verifyConnection, 1000)\n }\n\n initTranslatePage()\n\n var sendCoinsButton = document.getElementById('send-coins')\n var sendCoinsButton2 = document.getElementById('send-only-send-coins')\n touchEvent(sendCoinsButton, function () {\n setState('sending_coins')\n buttonPressed('sendCoins')\n })\n\n touchEvent(sendCoinsButton2, function () {\n setState('sending_coins')\n buttonPressed('sendCoins')\n })\n\n setupButton('recycler-continue-start', 'recyclerContinue')\n setupButton('recycler-continue', 'recyclerContinue')\n setupButton('recycler-finish', 'sendCoins')\n setupButton('cash-slot-bills-removed', 'cashSlotBillsRemoved')\n setupButton('leftover-bills-removed', 'leftoverBillsRemoved')\n\n const blockedCustomerOk = document.getElementById('blocked-customer-ok')\n touchEvent(blockedCustomerOk, function () {\n buttonPressed('blockedCustomerOk')\n })\n var insertBillCancelButton = document.getElementById('insertBillCancel')\n touchImmediateEvent(insertBillCancelButton, function () {\n setBuyerAddress(null)\n buttonPressed('cancelInsertBill')\n })\n\n var insertBillCancelRecyclerButton = document.getElementById('insertBillCancelRecycler')\n touchImmediateEvent(insertBillCancelRecyclerButton, function () {\n setBuyerAddress(null)\n buttonPressed('cancelInsertBill')\n })\n\n setupImmediateButton('scanCancel', 'cancelScan')\n setupImmediateButton('completed_viewport', 'completed')\n setupImmediateButton('withdraw_failure_viewport', 'completed')\n setupImmediateButton('out_of_coins_viewport', 'completed')\n setupImmediateButton('fiat_receipt_viewport', 'completed')\n setupImmediateButton('fiat_complete_viewport', 'completed')\n setupImmediateButton('chooseFiatCancel', 'chooseFiatCancel')\n setupImmediateButton('depositCancel', 'depositCancel')\n setupImmediateButton('printer-scan-cancel', 'cancelScan')\n\n setupButton('printer-back-to-home', 'idle')\n setupButton('printer-print-again', 'printAgain')\n setupButton('printer-print-again2', 'printAgain')\n setupButton('printer-scan-again', 'printerScanAgain')\n\n setupButton('insert-first-bill-promo-button', 'insertPromoCode')\n setupButton('insert-first-recycler-bills-promo-button', 'insertPromoCode')\n setupButton('choose-fiat-promo-button', 'insertPromoCode')\n\n var promoCodeCancelButton = document.getElementById('promo-code-cancel')\n touchImmediateEvent(promoCodeCancelButton, function () {\n promoKeyboard.deactivate.bind(promoKeyboard)\n buttonPressed('cancelPromoCode')\n })\n\n var submitCodeButton = document.getElementById('submit-promo-code')\n touchEvent(submitCodeButton, function () {\n promoKeyboard.deactivate.bind(promoKeyboard)\n var code = $('.promo-code-input').data('content')\n buttonPressed('submitPromoCode', { input: code })\n })\n\n const submitEmailButton = document.getElementById('submit-email')\n const submitTextRequirementButton = document.getElementById('submit-text-requirement')\n const nextFieldTextRequirementButton = document.getElementById('next-text-requirement')\n const previousFieldTextRequirementButton = document.getElementById('previous-text-requirement')\n touchEvent(submitEmailButton, function () {\n emailKeyboard.deactivate.bind(emailKeyboard)\n var text = $('#email-input').data('content')\n buttonPressed('email', text)\n $('#email-input').data('content', '').val('')\n emailKeyboard.setInputBox('#email-input')\n })\n touchEvent(submitTextRequirementButton, function () {\n customRequirementTextKeyboard.deactivate.bind(customRequirementTextKeyboard)\n var text = `${$('.text-input-field-1').data('content')} ${$('.text-input-field-2').data('content') || ''}`\n buttonPressed('customInfoRequestSubmit', text)\n $('.text-input-field-1').removeClass('faded').data('content', '').val('')\n $('.text-input-field-2').addClass('faded').data('content', '').val('')\n customRequirementTextKeyboard.setInputBox('.text-input-field-1')\n })\n touchEvent(nextFieldTextRequirementButton, function() {\n $('.text-input-field-1').addClass('faded')\n $('.text-input-field-2').removeClass('faded')\n $('#next-text-requirement').hide()\n $('#previous-text-requirement').show()\n $('#submit-text-requirement').show()\n // changing input box changes buttons where validation works on\n customRequirementTextKeyboard.setInputBox('.text-input-field-2', ['#submit-text-requirement'])\n })\n touchEvent(previousFieldTextRequirementButton, function() {\n $('.text-input-field-1').removeClass('faded')\n $('.text-input-field-2').addClass('faded')\n $('#next-text-requirement').show()\n $('#previous-text-requirement').hide()\n $('#submit-text-requirement').hide()\n customRequirementTextKeyboard.setInputBox('.text-input-field-1', ['#next-text-requirement'])\n })\n\n setupButton('submit-promo-code', 'submitPromoCode', {\n input: $('.promo-code-input').data('content')\n })\n setupButton('promo-code-try-again', 'insertPromoCode')\n setupButton('promo-code-continue', 'cancelPromoCode')\n\n setupButton('initialize', 'initialize')\n setupButton('pairing-scan', 'pairingScan')\n setupImmediateButton('pairing-scan-cancel', 'pairingScanCancel')\n setupButton('pairing-error-ok', 'pairingErrorOk')\n setupButton('cash-out-button', 'cashOut')\n\n setupImmediateButton('scan-id-cancel', 'idDataActionCancel')\n setupImmediateButton('scan-photo-cancel', 'idPhotoActionCancel')\n setupImmediateButton('scan-photo-manual-cancel', 'idPhotoActionCancel')\n setupImmediateButton('us-ssn-cancel', 'cancelUsSsn',\n usSsnKeypad.deactivate.bind(usSsnKeypad))\n setupImmediateButton('phone-number-cancel', 'cancelPhoneNumber',\n phoneKeypad.deactivate.bind(phoneKeypad))\n setupImmediateButton('security-code-cancel', 'cancelSecurityCode',\n securityKeypad.deactivate.bind(securityKeypad))\n setupButton('id-verification-failed-ok', 'idVerificationFailedOk')\n setupButton('id-scan-failed-try-again', 'idCodeFailedRetry')\n setupButton('id-scan-failed-cancel', 'idVerificationFailedOk')\n setupButton('id-code-failed-retry', 'idCodeFailedRetry')\n setupButton('id-code-failed-cancel', 'bye')\n setupButton('id-verification-error-ok', 'idVerificationErrorOk')\n setupButton('photo-scan-failed-retry', 'retryPhotoScan')\n setupButton('photo-scan-failed-cancel', 'photoScanVerificationCancel')\n setupButton('photo-verification-failed-ok', 'cancelIdScan')\n setupButton('invalid-address-try-again', 'invalidAddressTryAgain')\n setupButton('address-reuse-start-over', 'idle')\n setupButton('suspicious-address-start-over', 'idle')\n\n setupButton('sanctions-failure-ok', 'idle')\n setupButton('limit-reached-ok', 'idle')\n setupButton('hard-limit-reached-ok', 'idle')\n setupButton('deposit-timeout-sent-yes', 'depositTimeout')\n setupButton('deposit-timeout-sent-no', 'depositTimeoutNotSent')\n setupButton('out-of-cash-ok', 'idle')\n setupButton('cash-in-disabled-ok', 'idle')\n setupButton('cash-in-only-ok', 'idle')\n\n setupButton('bad-phone-number-ok', 'badPhoneNumberOk')\n setupButton('bad-security-code-ok', 'badSecurityCodeOk')\n setupButton('max-phone-retries-ok', 'maxPhoneRetriesOk')\n //setupButton('max-email-retries-ok', 'maxEmailRetriesOk')\n setupButton('redeem-later-ok', 'idle')\n setupButton('fiat-error-ok', 'idle')\n setupButton('network-down-ok', 'idle')\n setupButton('fiat-transaction-error-ok', 'fiatReceipt')\n\n setupButton('unknown-phone-number-ok', 'idle')\n setupButton('unknown-email-ok', 'idle')\n setupButton('unconfirmed-deposit-ok', 'idle')\n setupButton('tx-not-seen-ok', 'idle')\n setupButton('wrong-dispenser-currency-ok', 'idle')\n\n setupButton('print-receipt-cash-in-button', 'printReceipt')\n setupButton('print-receipt-cash-out-button', 'printReceipt')\n setupButton('print-receipt-cash-in-fail-button', 'printReceipt')\n\n setupButton('send-sms-receipt-cash-in-button', 'sendSmsReceipt')\n setupButton('send-sms-receipt-cash-out-button', 'sendSmsReceipt')\n setupButton('send-sms-receipt-cash-in-fail-button', 'sendSmsReceipt')\n\n setupButton('terms-ok', 'termsAccepted')\n setupButton('terms-ko', 'idle')\n\n setupImmediateButton('rates-close', 'idle')\n setupButton('rates-section-button', 'ratesScreen')\n\n setupButton('maintenance_restart', 'maintenanceRestart')\n\n calculateAspectRatio()\n\n const cryptoButtons = document.getElementById('crypto-buttons')\n touchEvent(cryptoButtons, event => {\n let el = $(event.target)\n if (el.is('path') || el.is('svg') || el.is('span')) {\n el = el.closest('div')\n }\n\n if (el.data('more')) {\n openCoinDropdown()\n return\n }\n\n if (el.data('less')) {\n closeCoinDropdown()\n return\n }\n\n const cryptoCode = el.data('cryptoCode')\n if (!cryptoCode) return\n\n const wantedCoin = currentCoins.find(it => it.cryptoCode === cryptoCode)\n if (!wantedCoin) return\n\n const coin = { cryptoCode, display: wantedCoin.display === displayLN ? displayBTC : wantedCoin.display }\n switchCoin(coin)\n })\n\n var areYouSureCancel = document.getElementById('are-you-sure-cancel-transaction')\n touchEvent(areYouSureCancel, () => buttonPressed('cancelTransaction', previousState))\n\n var areYouSureContinue = document.getElementById('are-you-sure-continue-transaction')\n touchEvent(areYouSureContinue, () => buttonPressed('continueTransaction', previousState))\n\n var coinRedeem = document.getElementById('coin-redeem-button')\n touchEvent(coinRedeem, () => {\n setDirection('cashOut')\n buttonPressed('redeem')\n })\n\n setupButton('facephoto-scan-failed-retry', 'retryFacephoto')\n setupButton('id-start-verification', 'permissionIdCompliance')\n setupButton('sms-start-verification', 'permissionSmsCompliance')\n setupButton('email-start-verification', 'permissionEmailCompliance');\n setupButton('ready-to-scan-id-card-photo', 'scanIdCardPhoto')\n setupButton('facephoto-permission-yes', 'permissionPhotoCompliance')\n setupButton('us-ssn-permission-yes', 'permissionUsSsnCompliance')\n setupButton('external-permission-yes', 'permissionExternalCompliance')\n\n setupButton('send-coins-id', 'finishBeforeSms')\n setupButton('send-coins-id-2', 'finishBeforeSms')\n setupButton('send-coins-sms', 'finishBeforeSms')\n setupButton('send-coins-sms-2', 'finishBeforeSms')\n setupButton('send-coins-email', 'finishBeforeSms');\n setupButton('send-coins-email-2', 'finishBeforeSms');\n\n setupButton('facephoto-permission-no', 'finishBeforeSms')\n setupButton('us-ssn-permission-send-coins', 'finishBeforeSms')\n setupButton('us-ssn-permission-cancel', 'finishBeforeSms')\n setupButton('us-ssn-cancel', 'finishBeforeSms')\n setupButton('external-permission-send-coins', 'finishBeforeSms')\n setupButton('facephoto-scan-failed-cancel', 'finishBeforeSms')\n setupButton('facephoto-scan-failed-cancel2', 'finishBeforeSms')\n\n setupButton('custom-permission-yes', 'permissionCustomInfoRequest')\n setupButton('custom-permission-no', 'finishBeforeSms')\n setupImmediateButton('custom-permission-cancel-numerical', 'cancelCustomInfoRequest', () => {\n customRequirementNumericalKeypad.deactivate.bind(customRequirementNumericalKeypad)\n })\n setupImmediateButton('email-cancel', 'cancelEmail', () => {\n emailKeyboard.deactivate.bind(emailKeyboard)\n $('#email-input').data('content', '').val('')\n emailKeyboard.setInputBox('#email-input')\n })\n setupImmediateButton('custom-permission-cancel-text', 'cancelCustomInfoRequest', () => {\n customRequirementTextKeyboard.deactivate.bind(customRequirementTextKeyboard)\n $('.text-input-field-1').removeClass('faded').data('content', '').val('')\n $('.text-input-field-2').addClass('faded').data('content', '').val('')\n customRequirementTextKeyboard.setInputBox('.text-input-field-1')\n })\n setupImmediateButton('custom-permission-cancel-choiceList', 'cancelCustomInfoRequest', () => {\n })\n\n setupButton('custom-permission-yes', 'permissionCustomInfoRequest')\n setupButton('custom-permission-no', 'finishBeforeSms')\n setupImmediateButton('custom-permission-cancel-numerical', 'cancelCustomInfoRequest', () => {\n customRequirementNumericalKeypad.deactivate.bind(customRequirementNumericalKeypad)\n })\n\n setupButton('external-validation-ok', 'finishBeforeSms')\n\n touchEvent(document.getElementById('change-language-section'), () => {\n if (_primaryLocales.length === 2) {\n setLocale(otherLocale())\n setCryptoBuy(currentCoin)\n setCryptoSell(currentCoin)\n return\n }\n openLanguageDropdown()\n })\n\n const cashInBox = document.getElementById('cash-in-box')\n touchEvent(cashInBox, () => {\n buttonPressed('start', { cryptoCode: currentCryptoCode, direction: 'cashIn' })\n })\n\n const cashOutBox = document.getElementById('cash-out-box')\n touchEvent(cashOutBox, () => {\n buttonPressed('start', { cryptoCode: currentCryptoCode, direction: 'cashOut' })\n })\n\n var languageOverlay = document.getElementById('language-overlay')\n touchEvent(languageOverlay, function (e) {\n closeLanguageDropdown()\n })\n\n var cryptoOverlay = document.getElementById('crypto-overlay')\n touchEvent(cryptoOverlay, function (e) {\n closeCoinDropdown()\n })\n\n var languageButtons = document.getElementById('languages')\n touchEvent(languageButtons, function (e) {\n var languageButtonJ = $(e.target).closest('button')\n if (languageButtonJ.length === 0) return\n var newLocale = languageButtonJ.attr('data-locale')\n\n if (!newLocale) {\n closeLanguageDropdown()\n return\n }\n\n setLocale(newLocale)\n setCryptoBuy(currentCoin)\n setCryptoSell(currentCoin)\n closeLanguageDropdown()\n })\n\n buildCassetteButtonEvents()\n if (DEBUG_MODE === 'dev') initDebug()\n})\n\nfunction targetButton (element) {\n var classList = element.classList || []\n var special = classList.contains('button') ||\n classList.contains('circle-button') ||\n classList.contains('square-button')\n if (special) { return element }\n return targetButton(element.parentNode)\n}\n\nfunction touchEvent (element, callback) {\n function handler (e) {\n var target = targetButton(e.target)\n\n target.classList.add('active')\n\n // Wait for transition to finish\n setTimeout(function () {\n target.classList.remove('active')\n }, 300)\n\n setTimeout(function () {\n callback(e)\n }, 200)\n\n e.stopPropagation()\n e.preventDefault()\n }\n\n if (shouldEnableTouch()) {\n element.addEventListener('touchstart', handler)\n }\n element.addEventListener('mousedown', handler)\n}\n\nfunction touchImmediateEvent (element, callback) {\n function handler (e) {\n callback(e)\n e.stopPropagation()\n e.preventDefault()\n }\n if (shouldEnableTouch()) {\n element.addEventListener('touchstart', handler)\n }\n element.addEventListener('mousedown', handler)\n}\n\nfunction setupImmediateButton (buttonClass, buttonAction, callback) {\n var button = document.getElementById(buttonClass)\n touchImmediateEvent(button, function () {\n if (callback) callback()\n buttonPressed(buttonAction)\n })\n}\n\nfunction setupButton (buttonClass, buttonAction, actionData) {\n var button = document.getElementById(buttonClass)\n touchEvent(button, function () {\n buttonPressed(buttonAction, actionData)\n })\n}\n\nfunction setScreen (newScreen, oldScreen) {\n if (newScreen === oldScreen) return\n\n if (newScreen === 'insert_bills') {\n $('.js-processing-bill').html(translate('Lamassu Cryptomat'))\n $('.bill img').css({'-webkit-transform': 'none', top: 0, left: 0})\n }\n\n var newView = $('.' + newScreen + '_state')\n if (newView.length !== 1) console.log('FATAL: ' + newView.length + ' screens found of class ' + newScreen + '_state')\n\n $('.viewport').removeClass('viewport-active')\n newView.addClass('viewport-active')\n}\n\nfunction setState (state, delay) {\n if (state === currentState) return\n\n if (currentState === 'terms_screen') {\n clearTermsConditionsTimeout()\n clearTermsConditionsAcceptanceDelay()\n }\n\n setComplianceTimeout(0)\n\n previousState = currentState\n currentState = state\n\n promoKeyboard.reset()\n emailKeyboard.reset()\n customRequirementTextKeyboard.reset()\n\n if (state === 'idle') {\n $('.qr-code').empty()\n $('.qr-code-deposit').empty()\n }\n\n if (delay) {\n window.setTimeout(function () {\n setScreen(currentState, previousState)\n }, delay)\n } else setScreen(currentState, previousState)\n}\n\nfunction revertScreen () { setScreen(currentState) }\n\nfunction setUpDirectionElement (element, direction) {\n if (direction === 'cashOut') {\n element.removeClass('cash-in-color')\n element.addClass('cash-out-color')\n } else {\n element.addClass('cash-in-color')\n element.removeClass('cash-out-color')\n }\n}\n\nfunction setOperatorInfo (operator) {\n if (!operator || !operator.active) {\n $('.contacts, .contacts-compact').addClass('hide')\n } else {\n $('.contacts, .contacts-compact').removeClass('hide')\n $('.operator-name').text(operator.name)\n $('.operator-email').text(operator.email)\n $('.operator-phone').text(operator.phone)\n }\n}\n\nfunction setHardLimit (limits) {\n const component = $('#hard-limit-hours')\n if (limits.hardLimitWeeks >= 1) {\n return component.text(translate('Please come back in %s weeks', [limits.hardLimitWeeks]))\n }\n\n if (limits.hardLimitDays >= 1) {\n return component.text(translate('Please come back in %s days and %s hours', [limits.hardLimitDays, limits.hardLimitHours]))\n }\n\n component.text(translate('Please come back in %s hours', [limits.hardLimitHours]))\n}\n\nfunction setCryptomatModel (model) {\n cryptomatModel = model\n const versions = ['sintra', 'douro', 'gaia', 'tejo', 'grandola', 'aveiro', 'coincloud', 'gmuk1', 'batm7in']\n const body = $('body')\n\n versions.forEach(it => body.removeClass(it))\n $('body').addClass(model.startsWith('douro') ? 'douro' : model)\n}\n\nfunction enableRecyclerBillButtons() {\n var continueButton = document.getElementById('recycler-continue');\n var finishButton = document.getElementById('recycler-finish');\n continueButton.disabled = false;\n finishButton.disabled = false;\n}\n\nfunction disableRecyclerBillButtons() {\n var continueButton = document.getElementById('recycler-continue');\n var finishButton = document.getElementById('recycler-finish');\n continueButton.disabled = true;\n finishButton.disabled = true;\n}\n\nfunction setDirection (direction) {\n let states = [\n $('.scan_id_photo_state'),\n $('.scan_manual_id_photo_state'),\n $('.scan_id_data_state'),\n $('.security_code_state'),\n $('.register_us_ssn_state'),\n $('.us_ssn_permission_state'),\n $('.register_phone_state'),\n $('.register_email_state'),\n $('.terms_screen_state'),\n $('.verifying_id_photo_state'),\n $('.verifying_face_photo_state'),\n $('.verifying_id_data_state'),\n $('.permission_id_state'),\n $('.sms_verification_state'),\n $('.email_verification_state'),\n $('.bad_phone_number_state'),\n $('.bad_security_code_state'),\n $('.max_phone_retries_state'),\n $('.max_email_retries_state'),\n $('.failed_permission_id_state'),\n $('.failed_verifying_id_photo_state'),\n $('.blocked_customer_state'),\n $('.fiat_error_state'),\n $('.fiat_transaction_error_state'),\n $('.failed_scan_id_data_state'),\n $('.sanctions_failure_state'),\n $('.error_permission_id_state'),\n $('.scan_face_photo_state'),\n $('.retry_scan_face_photo_state'),\n $('.permission_face_photo_state'),\n $('.failed_scan_face_photo_state'),\n $('.hard_limit_reached_state'),\n $('.failed_scan_id_photo_state'),\n $('.retry_permission_id_state'),\n $('.waiting_state'),\n $('.insert_promo_code_state'),\n $('.promo_code_not_found_state'),\n $('.custom_permission_state'),\n $('.external_permission_state'),\n $('.custom_permission_screen2_numerical_state'),\n $('.custom_permission_screen2_text_state'),\n $('.custom_permission_screen2_choiceList_state'),\n $('.external_compliance_state')\n ]\n cashDirection = direction\n states.forEach(it => {\n setUpDirectionElement(it, direction)\n })\n}\n\n/**\n *\n * @param {Object} data\n * @param {boolean} data.active\n * @param {String} data.title\n * @param {String} data.text\n * @param {String} data.accept\n * @param {String} data.cancel\n */\nfunction setTermsScreen (data) {\n const $screen = $('.terms_screen_state')\n $screen.find('.js-terms-title').html(data.title)\n startPage(data.text, data.acceptDisabled)\n $screen.find('.js-terms-cancel-button').html(data.cancel)\n $screen.find('.js-terms-accept-button').html(data.accept)\n setTermsConditionsTimeout()\n setAcceptButtonDisabled($screen, data)\n setTermsConditionsAcceptanceDelay($screen, data)\n}\n\nfunction setAcceptButtonDisabled (screen, data) {\n var acceptButton = screen.find('.js-terms-accept-button');\n acceptButton.prop('disabled', Boolean(data.acceptDisabled));\n}\n\nfunction clearTermsConditionsTimeout () {\n clearTimeout(termsConditionsTimeout)\n}\n\nfunction setTermsConditionsTimeout () {\n termsConditionsTimeout = setTimeout(function () {\n if (currentState === 'terms_screen') {\n buttonPressed('idle')\n }\n }, T_C_TIMEOUT)\n}\n\nfunction setTermsConditionsAcceptanceDelay (screen, data) {\n let acceptButton = screen.find('.js-terms-accept-button')\n acceptButton.css({ 'min-width': 0 })\n\n if (!data.delay) return\n\n const delayTimer = isNaN(data.delayTimer) ? 0 : data.delayTimer\n let seconds = delayTimer / 1000\n acceptButton.prop('disabled', true)\n acceptButton.html(seconds > 0 ? `${data.accept} (${seconds})` : `${data.accept}`)\n\n var tmpbtn = acceptButton.clone().appendTo('body').css({ 'display': 'block', 'visibility': 'hidden' })\n var width = tmpbtn.outerWidth()\n tmpbtn.remove()\n acceptButton.css({ 'min-width': `${width}px` })\n termsConditionsAcceptanceInterval = setInterval(function () {\n seconds--\n if (currentState === 'terms_screen' && seconds > 0) {\n acceptButton.html(`${data.accept} (${seconds})`)\n }\n if (currentState === 'terms_screen' && seconds <= 0) {\n acceptButton.prop('disabled', false)\n acceptButton.html(`${data.accept}`)\n }\n if (seconds <= 0) {\n clearInterval(termsConditionsAcceptanceInterval)\n }\n }, 1000)\n}\n\nfunction clearTermsConditionsAcceptanceDelay () {\n clearInterval(termsConditionsAcceptanceInterval)\n}\n\nfunction resetTermsConditionsTimeout () {\n clearTermsConditionsTimeout()\n setTermsConditionsTimeout()\n}\n\n// click page up button\nfunction scrollUp () {\n resetTermsConditionsTimeout()\n const div = document.getElementById('js-terms-text-div')\n if (currentPage !== 0) {\n currentPage -= 1\n updateButtonStyles()\n updatePageCounter()\n div.scrollTo(0, currentPage * scrollSize)\n }\n}\n\n// start page\nfunction startPage (text, acceptedTerms) {\n const $screen = $('.terms_screen_state')\n $screen.find('.js-terms-text').html(text)\n if (!acceptedTerms) currentPage = 0\n totalPages = 0\n setTimeout(function () {\n const div = document.getElementById('js-terms-text-div')\n textHeightQuantity = document.getElementById('js-terms-text').offsetHeight\n scrollSize = div.offsetHeight - 40\n updateButtonStyles()\n if (text.length <= 1000 && textHeightQuantity <= div.offsetHeight) {\n document.getElementById('actions-scroll').style.display = 'none'\n } else {\n document.getElementById('actions-scroll').style.display = ''\n if (!acceptedTerms) div.scrollTo(0, 0)\n totalPages = Math.ceil(textHeightQuantity / scrollSize)\n updatePageCounter()\n }\n }, 100)\n}\n\nfunction updatePageCounter () {\n document.getElementById('terms-page-counter').textContent = `${currentPage + 1}/${totalPages}`\n}\n\n// click page up button\nfunction scrollDown () {\n resetTermsConditionsTimeout()\n const div = document.getElementById('js-terms-text-div')\n if (!(currentPage * scrollSize + scrollSize > textHeightQuantity && currentPage !== 0)) {\n currentPage += 1\n updateButtonStyles()\n updatePageCounter()\n div.scrollTo(0, currentPage * scrollSize)\n }\n}\n\nfunction updateButtonStyles () {\n textHeightQuantity = document.getElementById('js-terms-text').offsetHeight\n const buttonDown = document.getElementById('scroll-down')\n const buttonUp = document.getElementById('scroll-up')\n buttonUp.disabled = currentPage === 0;\n buttonDown.disabled = currentPage * scrollSize + scrollSize > textHeightQuantity && currentPage !== 0;\n}\n\nfunction setLocaleInfo (data) {\n phoneKeypad.setCountry(data.country)\n setPrimaryLocales(data.primaryLocales)\n setLocale(data.primaryLocale)\n}\n\nfunction otherLanguageName () {\n const lang = lookupLocaleNames(otherLocale())\n return lang && lang.nativeName\n}\n\nfunction otherLocale () {\n return _primaryLocales.find(c => c !== localeCode)\n}\n\nfunction setLocale (data) {\n if (!data || data === localeCode) return\n localeCode = data\n jsLocaleCode = data\n var lang = localeCode.split('-')[0]\n\n if (jsLocaleCode === 'fr-QC') jsLocaleCode = 'fr-CA'\n\n var isArabic = jsLocaleCode.indexOf('ar-') === 0\n var isHebrew = jsLocaleCode.indexOf('he-') === 0\n isRTL = isArabic || isHebrew\n\n setChooseCoinColors()\n\n if (isRTL) {\n $('body').addClass('i18n-rtl')\n } else {\n $('body').removeClass('i18n-rtl')\n }\n\n if (isArabic) {\n $('body').addClass('i18n-ar')\n } else {\n $('body').removeClass('i18n-ar')\n }\n\n if (isHebrew) {\n $('body').addClass('i18n-he')\n } else {\n $('body').removeClass('i18n-he')\n }\n\n if (MUSEO.indexOf(lang) !== -1) $('body').addClass('museo')\n else $('body').removeClass('museo')\n\n locale = loadI18n(localeCode)\n try { translatePage() } catch (ex) {}\n\n $('.js-two-language').html(otherLanguageName())\n\n if (lastRates) setExchangeRate(lastRates)\n}\n\nfunction setChooseCoinColors () {\n var elem = $('#bg-to-show > img')\n let img = `images/background/${isTwoWay ? '2way' : '1way'}-${aspectRatio}${isRTL ? '-rtl' : ''}.svg`\n if (img !== elem.attr('src')) {\n elem.attr('src', img)\n }\n\n if (isTwoWay) {\n $('.choose_coin_state .change-language').removeClass('cash-in-color').addClass('cash-out-color')\n } else {\n $('.choose_coin_state .change-language').removeClass('cash-out-color').addClass('cash-in-color')\n }\n}\n\nfunction areArraysEqual (arr1, arr2) {\n if (arr1.length !== arr2.length) return false\n for (var i = 0; i < arr1.length; i++) {\n if (arr1[i] !== arr2[i]) return false\n }\n return true\n}\n\nfunction lookupLocaleNames (locale) {\n if (!locale) return\n var langMap = window.languageMappingList\n var language = locale.split('-')[0]\n var localeNames = langMap[language]\n return localeNames || langMap[locale]\n}\n\nfunction setPrimaryLocales (primaryLocales) {\n if (areArraysEqual(primaryLocales, _primaryLocales)) return\n _primaryLocales = primaryLocales\n\n var languages = $('#languages')\n closeLanguageDropdown()\n languages.empty()\n var sortedPrimaryLocales = primaryLocales.filter(lookupLocaleNames).sort(function (a, b) {\n var langA = lookupLocaleNames(a)\n var langB = lookupLocaleNames(b)\n return langA.englishName.localeCompare(langB.englishName)\n })\n\n languages.append(``)\n for (var i = 0; i < sortedPrimaryLocales.length; i++) {\n var l = sortedPrimaryLocales[i]\n var lang = lookupLocaleNames(l)\n var name = lang.nativeName || lang.englishName\n var div = ``\n languages.append(div)\n }\n\n $('.js-two-language').html(otherLanguageName())\n\n $('.js-menu-language').toggleClass('hide', sortedPrimaryLocales.length <= 1)\n $('.js-multi-language').toggleClass('hide', sortedPrimaryLocales.length === 2)\n $('.js-two-language').toggleClass('hide', sortedPrimaryLocales.length > 2)\n}\n\nfunction setFiatCode (data) {\n fiatCode = data\n $('.js-currency').text(fiatCode)\n}\n\nfunction setFixedFee (_fee) {\n const fee = parseFloat(_fee)\n if (fee > 0) {\n const fixedFee = translate('Transaction Fee: %s', [formatFiat(fee, 2)])\n $('.js-i18n-fixed-fee').html(fixedFee)\n } else {\n $('.js-i18n-fixed-fee').html('')\n }\n}\n\nfunction setCredit (credit, lastBill) {\n const { fiat, cryptoAtoms, cryptoCode } = credit\n var coin = getCryptoCurrency(cryptoCode)\n\n var scale = new BigNumber(10).pow(coin.displayScale)\n var cryptoAmount = new BigNumber(cryptoAtoms).div(scale).toNumber()\n var cryptoDisplayCode = coin.displayCode\n updateCrypto('.total-crypto-rec', cryptoAmount, cryptoDisplayCode)\n $('.amount-deposited').html(translate('You deposited %s', [`${fiat} ${fiatCode}`]))\n $('.fiat .js-amount').html(fiat)\n\n var inserted = lastBill\n ? translate('You inserted a %s bill', [formatFiat(lastBill)])\n : translate('Lamassu Cryptomat')\n\n $('.js-processing-bill').html(inserted)\n\n $('.js-continue-crypto-enable').show()\n $('.js-send-crypto-enable').show()\n}\n\nfunction formatDenomination (denom) {\n return denom.toLocaleString(jsLocaleCode, {\n useGrouping: true,\n maximumFractionDigits: 0,\n minimumFractionDigits: 0\n })\n}\n\nfunction buildCassetteButtons (_cassettes, numberOfButtons) {\n var activeCassettes = _cassettes.filter(it => it.count === null || it.count > 0)\n var inactiveCassettes = _cassettes.filter(it => it.count === 0)\n\n var allCassettes = activeCassettes.concat(inactiveCassettes)\n var selectedCassettes = allCassettes.slice(0, numberOfButtons)\n var sortedCassettes = selectedCassettes.sort((a, b) => a.denomination - b.denomination)\n\n for (var i = 0; i < sortedCassettes.length; i++) {\n var denomination = formatDenomination(sortedCassettes[i].denomination || 0)\n $('.cash-button[data-denomination-index=' + i + '] .js-denomination').text(denomination)\n }\n}\n\nfunction updateCassetteButtons (activeDenoms, numberOfButtons) {\n for(var i = 0; i < numberOfButtons; i++) {\n var button = $('.choose_fiat_state .cash-button[data-denomination-index=' + i + ']')\n var denomination = button.children('.js-denomination').text()\n button.prop('disabled', !Boolean(activeDenoms[denomination]))\n }\n}\n\nfunction buildCassetteButtonEvents () {\n var fiatButtons = document.getElementById('js-fiat-buttons')\n var lastTouch = null\n\n touchImmediateEvent(fiatButtons, function (e) {\n var now = Date.now()\n if (lastTouch && now - lastTouch < 100) return\n lastTouch = now\n var cashButtonJ = $(e.target).closest('.cash-button')\n if (cashButtonJ.length === 0) return\n if (cashButtonJ.hasClass('disabled')) return\n if (cashButtonJ.hasClass('clear')) return buttonPressed('clearFiat')\n buttonPressed('fiatButton', { denomination: cashButtonJ.children('.js-denomination').text() })\n })\n}\n\nfunction updateCrypto (selector, cryptoAmount, cryptoDisplayCode) {\n $(selector).find('.crypto-amount').html(formatCrypto(cryptoAmount))\n $(selector).find('.crypto-units').html(cryptoDisplayCode)\n}\n\nfunction lookupDecimalChar (localeCode) {\n var num = 1.1\n var localized = num.toLocaleString(localeCode, {\n useGrouping: true,\n maximumFractionDigits: 1,\n minimumFractionDigits: 1\n })\n\n return localized[1]\n}\n\nfunction splitNumber (localize, localeCode) {\n var decimalChar = lookupDecimalChar(localeCode)\n var split = localize.split(decimalChar)\n\n if (split.length === 1) {\n return ['', split[0], ''].join('')\n }\n\n return [\n '', split[0], '',\n decimalChar, '', split[1], ''\n ].join('')\n}\n\nfunction formatNumber (num) {\n var localized = num.toLocaleString(jsLocaleCode, {\n useGrouping: true,\n maximumFractionDigits: 6,\n minimumFractionDigits: 3\n })\n\n return splitNumber(localized, jsLocaleCode)\n}\n\nfunction formatCrypto (amount) {\n return formatNumber(amount)\n}\n\nfunction formatFiat (amount, fractionDigits) {\n if (!fractionDigits) fractionDigits = 0\n\n const localized = amount.toLocaleString(jsLocaleCode, {\n useGrouping: true,\n maximumFractionDigits: fractionDigits,\n minimumFractionDigits: fractionDigits\n })\n return splitNumber(localized, jsLocaleCode) + ' ' + fiatCode\n}\n\nfunction setExchangeRate (_rates) {\n lastRates = _rates\n var cryptoCode = _rates.cryptoCode\n var rates = _rates.rates\n\n var coin = getCryptoCurrency(cryptoCode)\n var displayCode = coin.displayCode\n\n if (rates.cashIn) {\n var cryptoToFiat = new BigNumber(rates.cashIn)\n var rateStr = formatFiat(cryptoToFiat.round(2).toNumber(), 2)\n\n $('.crypto-rate-cash-in').html(`1 ${cryptoCode === LN ? BTC : cryptoCode} = ${rateStr}`)\n }\n\n if (rates.cashOut) {\n var cashOut = new BigNumber(rates.cashOut)\n var cashOutCryptoToFiat = cashOut && formatFiat(cashOut.round(2).toNumber(), 2)\n\n $('.crypto-rate-cash-out').html(`1 ${cryptoCode === LN ? BTC : cryptoCode} = ${cashOutCryptoToFiat}`)\n }\n\n $('.js-crypto-display-units').text(displayCode)\n}\n\nfunction qrize (text, target, color, lightning, size = 'normal') {\n const image = document.getElementById('bolt-img')\n // Hack for surf browser\n const _size = size === 'normal'\n ? document.body.clientHeight * 0.36\n : document.body.clientHeight * 0.25\n\n const opts = {\n crisp: true,\n fill: color || 'black',\n text,\n size: _size,\n render: 'canvas',\n rounded: 50,\n quiet: 2,\n mPosX: 50,\n mPosY: 50,\n mSize: 30,\n image\n }\n\n if (lightning) {\n opts.mode = 'image'\n }\n\n const el = kjua(opts)\n\n target.empty().append(el)\n}\n\nfunction setTx (tx) {\n const txId = tx.id\n const isPaperWallet = tx.isPaperWallet\n const hasBills = tx.bills && tx.bills.length > 0\n\n if (hasBills) {\n $('.js-inserted-notes').show()\n $('.js-no-inserted-notes').hide()\n } else {\n $('.js-inserted-notes').hide()\n $('.js-no-inserted-notes').show()\n }\n\n $('.js-paper-wallet').toggleClass('hide', !isPaperWallet)\n\n setCurrentDiscount(tx.discount, tx.promoCodeApplied)\n\n setTimeout(() => {\n qrize(txId, $('#cash-in-qr-code'), CASH_IN_QR_COLOR)\n qrize(txId, $('#cash-in-fail-qr-code'), CASH_IN_QR_COLOR)\n qrize(txId, $('#cash-in-no-funds-qr-code'), CASH_IN_QR_COLOR, null, 'small')\n qrize(txId, $('#qr-code-fiat-receipt'), CASH_OUT_QR_COLOR)\n qrize(txId, $('#qr-code-fiat-complete'), CASH_OUT_QR_COLOR)\n }, 1000)\n}\n\nfunction formatAddressNoBreakLines (address) {\n if (!address) return\n if (address.length > 60) {\n const firstPart = address.substring(0, 40).replace(/(.{4})/g, '$1 ')\n const secondPart = address.substring(address.length-16, address.length).replace(/(.{4})/g, '$1 ')\n return firstPart.concat('... ').concat(secondPart)\n }\n return address.replace(/(.{4})/g, '$1 ')\n}\n\nfunction formatAddress (address) {\n let toBr = formatAddressNoBreakLines(address)\n if (!toBr) return\n\n return toBr.replace(/((.{4} ){5})/g, '$1
')\n}\n\nfunction setBuyerAddress (address) {\n $('.crypto-address-no-br').html(formatAddressNoBreakLines(address))\n $('.crypto-address').html(formatAddress(address))\n}\n\nfunction highBill (highestBill, reason) {\n var reasonText = reason === 'transactionLimit'\n ? translate('Transaction limit reached.')\n : translate(\"We're a little low on crypto.\")\n\n t('high-bill-header', reasonText)\n t('highest-bill', translate('Please insert %s or less.', [formatFiat(highestBill)]))\n\n setScreen('high_bill')\n window.setTimeout(revertScreen, 3000)\n}\n\nfunction minimumTx (lowestBill) {\n t('lowest-bill', translate('Minimum first bill is %s.', [formatFiat(lowestBill)]))\n\n setScreen('minimum_tx')\n window.setTimeout(revertScreen, 3000)\n}\n\nfunction readingBills (bill) {\n $('.js-processing-bill').html(translate('Processing %s ...', [formatFiat(bill)]))\n $('.js-continue-crypto-enable').hide()\n $('.js-send-crypto-enable').hide()\n}\n\nfunction sendOnly (reason) {\n // TODO: sendOnly should be made into its own state on brain.js\n if (currentState === 'send_only') return\n\n const errorMessages = {\n transactionLimit: translate('Transaction limit reached'),\n validatorError: translate('Error in validation'),\n lowBalance: translate(\"We're out of coins!\"),\n blockedCustomer: translate('Transaction limit reached')\n }\n\n // If no reason provided defaults to lowBalance\n const reasonText = errorMessages[reason] || errorMessages.lowBalance\n $('#send-only-title').text(reasonText)\n\n if (reason === 'blockedCustomer') {\n $('.js-send-only-text').text(translate(\"Due to local regulations, you've reached your transaction limit. Please contact us if you'd like to raise your limit.\"))\n } else {\n $('.js-send-only-text').text('')\n }\n\n setState('send_only')\n}\n\nfunction t (id, str) {\n $('#js-i18n-' + id).html(str)\n}\n\nfunction translateCoin (_cryptoCode) {\n const coin = getCryptoCurrency(_cryptoCode)\n const cryptoCode = coin.cryptoCodeDisplay || _cryptoCode\n $('.js-i18n-scan-your-address').html(translate('Scan your
%s address', [cryptoCode]))\n $('.js-i18n-please-scan').html(translate('Please scan the QR code
to send us your %s.', [cryptoCode]))\n $('.js-i18n-did-send-coins').html(translate('Have you sent the %s yet?', [cryptoCode]))\n $('.js-i18n-scan-address').html(translate('Scan your %s address', [cryptoCode]))\n $('.js-i18n-invalid-address').html(translate('Invalid %s address', [cryptoCode]))\n}\n\nfunction initTranslatePage () {\n $('.js-i18n').each(function () {\n var el = $(this)\n el.data('baseTranslation', el.html().trim())\n })\n $('input[placeholder]').each(function () {\n var el = $(this)\n el.data('baseTranslation', el.attr('placeholder'))\n })\n}\n\nfunction translatePage () {\n $('.js-i18n').each(function () {\n var el = $(this)\n var base = el.data('baseTranslation')\n el.html(translate(base))\n })\n $('input[placeholder]').each(function () {\n var el = $(this)\n var base = el.data('baseTranslation')\n el.attr('placeholder', translate(base))\n })\n\n // Adjust send coins button\n var length = $('#send-coins span').text().length\n if (length > 17) $('body').addClass('i18n-long-send-coins')\n else $('body').removeClass('i18n-long-send-coins')\n}\n\nfunction loadI18n (localeCode) {\n var messages = locales[localeCode] || locales['en-US']\n\n return new Jed({\n 'missing_key_callback': function () {},\n 'locale_data': {\n 'messages': messages\n }\n })\n}\n\nfunction reachFiatLimit (rec) {\n var msg = null\n if (rec.isEmpty) msg = translate(`We're a little low, please cash out`)\n else if (rec.txLimitReached) msg = translate('Transaction limit reached, please cash out')\n\n var el = $('.choose_fiat_state .limit')\n if (msg) el.html(msg).show()\n else el.hide()\n}\n\nfunction chooseFiat (data) {\n fiatCredit(data)\n setState('choose_fiat')\n}\n\nfunction displayCrypto (cryptoAtoms, cryptoCode) {\n var coin = getCryptoCurrency(cryptoCode)\n var scale = new BigNumber(10).pow(coin.displayScale)\n // number of decimal places vary based on displayScale value\n var decimalPlaces = (coin.displayScale - coin.unitScale) + 6\n var cryptoAmount = new BigNumber(cryptoAtoms).div(scale).round(decimalPlaces).toNumber()\n return formatCrypto(cryptoAmount)\n}\n\nfunction BN (s) { return new BigNumber(s) }\n\nfunction fiatCredit (data) {\n var tx = data.tx\n var cryptoCode = tx.cryptoCode\n var activeDenominations = data.activeDenominations\n var coin = getCryptoCurrency(cryptoCode)\n const fiat = BN(tx.fiat)\n\n var fiatDisplay = BN(tx.fiat).toNumber().toLocaleString(jsLocaleCode, {\n useGrouping: true,\n maximumFractionDigits: 0,\n minimumFractionDigits: 0\n })\n\n var cryptoAtoms = BN(tx.cryptoAtoms)\n var cryptoDisplay = displayCrypto(cryptoAtoms, cryptoCode)\n\n var cryptoDisplayCode = coin.displayCode\n\n setCurrentDiscount(tx.discount, tx.promoCodeApplied)\n\n if (cryptoAtoms.eq(0) || cryptoAtoms.isNaN()) $('#js-i18n-choose-digital-amount').hide()\n else $('#js-i18n-choose-digital-amount').show()\n\n if (fiat.eq(0)) $('#cash-out-button').prop('disabled', true)\n else $('#cash-out-button').prop('disabled', false)\n\n updateCassetteButtons(activeDenominations.activeMap, NUMBER_OF_BUTTONS)\n $('.choose_fiat_state .fiat-amount').text(fiatDisplay)\n t('choose-digital-amount',\n translate(\"You'll be sending %s %s\", [cryptoDisplay, cryptoDisplayCode]))\n\n reachFiatLimit(activeDenominations)\n}\n\nfunction setDepositAddress (depositInfo) {\n $('.deposit_state .loading').hide()\n $('.deposit_state .send-notice .crypto-address').html(formatAddress(depositInfo.toAddress))\n $('.deposit_state .send-notice').show()\n\n qrize(depositInfo.depositUrl, $('#qr-code-deposit'), CASH_OUT_QR_COLOR)\n}\n\nfunction setVersion (version) {\n $('.version-number').html(`Version: ${version}`)\n}\n\nfunction deposit (tx) {\n var cryptoCode = tx.cryptoCode\n var display = displayCrypto(tx.cryptoAtoms, cryptoCode)\n\n $('.js-wallet-address').show()\n\n $('.deposit_state .digital .js-amount').html(display)\n $('.deposit_state .fiat .js-amount').text(tx.fiat)\n $('.deposit_state .send-notice').hide()\n $('#qr-code-deposit').empty()\n $('.deposit_state .loading').show()\n $('#qr-code-deposit').show()\n $('#lightning-enabled').hide()\n if (tx.cryptoCode === 'LN') $('#lightning-enabled').show()\n\n setState('deposit')\n}\n\nfunction fiatReceipt (tx) {\n var cryptoCode = tx.cryptoCode\n var display = displayCrypto(tx.cryptoAtoms, cryptoCode)\n\n $('.fiat_receipt_state .digital .js-amount').html(display)\n $('.fiat_receipt_state .fiat .js-amount').text(tx.fiat)\n $('.fiat_receipt_state .sent-coins .crypto-address').html(formatAddress(tx.toAddress))\n\n setState('fiat_receipt')\n}\n\nfunction fiatComplete (tx) {\n var cryptoCode = tx.cryptoCode\n var display = displayCrypto(tx.cryptoAtoms, cryptoCode)\n\n $('.fiat_complete_state .digital .js-amount').html(display)\n $('.fiat_complete_state .fiat .js-amount').text(tx.fiat)\n $('.fiat_complete_state .sent-coins .crypto-address').html(formatAddress(tx.toAddress))\n\n setState('fiat_complete')\n}\n\nfunction dispenseBatch (data) {\n $('.batch').css('visibility', data.of === 1 ? 'hidden' : 'visible')\n $('.batch').text(`${data.current}/${data.of}`)\n}\n\nfunction initDebug () {\n $('body').css('cursor', 'default')\n var style = document.createElement('style')\n style.type = 'text/css'\n style.innerHTML = 'button { cursor: default !important; }'\n document.getElementsByTagName('head')[0].appendChild(style)\n}\n\nfunction calculateAspectRatio () {\n const width = $('body').width()\n const height = $('body').height()\n\n function gcd (a, b) {\n return (b === 0) ? a : gcd(b, a % b)\n }\n\n const w = width\n const h = height\n const r = gcd(w, h)\n const aspectRatioPt1 = w / r\n const aspectRatioPt2 = h / r\n\n if (aspectRatioPt1 < aspectRatioPt2) {\n aspectRatio = '9:16'\n } else if (aspectRatioPt1 === 8 && aspectRatioPt2 === 5) {\n aspectRatio = '16:10'\n } else if (aspectRatioPt1 === 16 && aspectRatioPt2 === 9) {\n aspectRatio = '16:9'\n } else {\n aspectRatio = w < 1420 ? '16:10' : '16:9'\n }\n}\n\nlet background = null\n\nfunction shouldEnableTouch () {\n const ua = navigator.userAgent\n if (ua.match(/surf/ig)) return false\n\n // ACP has chromium 34 and upboard 73\n const chromiumVersion = ua.match(/chromium\\/(\\d+)/i)\n const chromeVersion = ua.match(/chrome\\/(\\d+)/i)\n const chromiumPlus73 = chromiumVersion && chromiumVersion[1] >= 73\n const chromePlus73 = chromeVersion && chromeVersion[1] >= 73\n\n return chromiumPlus73 || chromePlus73\n}\n\nfunction setAvailablePromoCodes (areThereAvailablePromoCodes) {\n if (areThereAvailablePromoCodes) {\n $('#insert-first-bill-promo-button').show()\n $('#insert-first-recycler-bills-promo-button').show()\n $('#choose-fiat-promo-button').show()\n } else {\n $('#insert-first-bill-promo-button').hide()\n $('#insert-first-recycler-bills-promo-button').hide()\n $('#choose-fiat-promo-button').hide()\n }\n}\n\nfunction setCurrentDiscount (currentDiscount, promoCodeApplied) {\n if (promoCodeApplied) {\n $('#insert-first-bill-promo-button').hide()\n $('#insert-first-recycler-bills-promo-button').hide()\n $('#choose-fiat-promo-button').hide()\n }\n\n if (!currentDiscount) {\n $('#insert-first-bill-code-added').hide()\n $('#insert-first-recycler-bills-code-added').hide()\n $('#choose-fiat-code-added').hide()\n } else if (currentDiscount > 0) {\n const successMessage = '✔ ' + translate('Discount added (%s off commissions)', [`${currentDiscount}%`])\n $('#insert-first-bill-code-added').html(successMessage)\n $('#insert-first-recycler-bills-code-added').html(successMessage)\n $('#choose-fiat-code-added').html(successMessage)\n $('#insert-first-bill-code-added').show()\n $('#insert-first-recycler-bills-code-added').show()\n $('#choose-fiat-code-added').show()\n\n } else {\n $('#insert-first-bill-promo-button').show()\n $('#insert-first-recycler-bills-promo-button').show()\n $('#choose-fiat-promo-button').show()\n $('#insert-first-bill-code-added').hide()\n $('#insert-first-recycler-bills-code-added').hide()\n $('#choose-fiat-code-added').hide()\n }\n}\n\nfunction setReceiptPrint (receiptStatus, smsReceiptStatus) {\n const status = receiptStatus ? receiptStatus : smsReceiptStatus\n\n const className = receiptStatus ? 'print-receipt' : 'send-sms-receipt'\n const printing = receiptStatus ? 'Printing receipt...' : 'Sending receipt...'\n const success = receiptStatus ? 'Receipt printed successfully!' : 'Receipt sent successfully!'\n\n switch (status) {\n case 'disabled':\n $(`#${className}-cash-in-message`).addClass('hide')\n $(`#${className}-cash-in-button`).addClass('hide')\n $(`#${className}-cash-out-message`).addClass('hide')\n $(`#${className}-cash-out-button`).addClass('hide')\n $(`#${className}-cash-in-fail-message`).addClass('hide')\n $(`#${className}-cash-in-fail-button`).addClass('hide')\n break\n case 'available':\n $(`#${className}-cash-in-message`).addClass('hide')\n $(`#${className}-cash-in-button`).removeClass('hide')\n $(`#${className}-cash-out-message`).addClass('hide')\n $(`#${className}-cash-out-button`).removeClass('hide')\n $(`#${className}-cash-in-fail-message`).addClass('hide')\n $(`#${className}-cash-in-fail-button`).removeClass('hide')\n break\n case 'printing':\n const message = locale.translate(printing).fetch()\n $(`#${className}-cash-in-button`).addClass('hide')\n $(`#${className}-cash-in-message`).html(message)\n $(`#${className}-cash-in-message`).removeClass('hide')\n $(`#${className}-cash-out-button`).addClass('hide')\n $(`#${className}-cash-out-message`).html(message)\n $(`#${className}-cash-out-message`).removeClass('hide')\n $(`#${className}-cash-in-fail-button`).addClass('hide')\n $(`#${className}-cash-in-fail-message`).html(message)\n $(`#${className}-cash-in-fail-message`).removeClass('hide')\n break\n case 'success':\n const successMessage = '✔ ' + locale.translate(success).fetch()\n $(`#${className}-cash-in-button`).addClass('hide')\n $(`#${className}-cash-in-message`).html(successMessage)\n $(`#${className}-cash-in-message`).removeClass('hide')\n $(`#${className}-cash-out-button`).addClass('hide')\n $(`#${className}-cash-out-message`).html(successMessage)\n $(`#${className}-cash-out-message`).removeClass('hide')\n $(`#${className}-cash-in-fail-button`).addClass('hide')\n $(`#${className}-cash-in-fail-message`).html(successMessage)\n $(`#${className}-cash-in-fail-message`).removeClass('hide')\n break\n case 'failed':\n const failMessage = '✖ ' + locale.translate('An error occurred, try again.').fetch()\n $(`#${className}-cash-in-button`).addClass('hide')\n $(`#${className}-cash-in-message`).html(failMessage)\n $(`#${className}-cash-in-message`).removeClass('hide')\n $(`#${className}-cash-out-button`).addClass('hide')\n $(`#${className}-cash-out-message`).html(failMessage)\n $(`#${className}-cash-out-message`).removeClass('hide')\n $(`#${className}-cash-in-fail-button`).addClass('hide')\n $(`#${className}-cash-in-fail-message`).html(failMessage)\n $(`#${className}-cash-in-fail-message`).removeClass('hide')\n break\n }\n}\n\nfunction externalCompliance (url) {\n qrize(url, $('#qr-code-external-validation'), cashDirection === 'cashIn' ? CASH_IN_QR_COLOR : CASH_OUT_QR_COLOR)\n return setScreen('external_compliance')\n}\n\nfunction setScreenOptions (opts) {\n (opts.rates && opts.rates.active) ? $('#rates-section').show() : $('#rates-section').hide()\n}\n\nfunction thousandSeparator (number, country, minimumFractionDigits) {\n const numberFormatter = Intl.NumberFormat(country, { minimumFractionDigits })\n return numberFormatter.format(number)\n}\n\nfunction setRates (allRates, fiat) {\n const ratesTable = $('.rates-content')\n const tableHeader = $(`
\n

${translate('Buy')}

\n

${translate('Crypto')}

\n

${translate('Sell')}

\n
`)\n const coinEntries = []\n\n Object.keys(allRates).forEach(it => {\n const cashIn = BN(allRates[it].cashIn)\n const cashOut = BN(allRates[it].cashOut)\n const biggestDecimalPlaces = Math.max(cashIn.dp(), cashOut.dp())\n\n coinEntries.push($(`
\n

${thousandSeparator(BN(allRates[it].cashIn).toFixed(2), localeCode)}

\n

${it}

\n

${thousandSeparator(BN(allRates[it].cashOut).toFixed(2), localeCode)}

\n
`))\n })\n\n $('#rates-fiat-currency').text(fiat)\n ratesTable.empty().append(tableHeader).append(coinEntries)\n}\n"]} \ No newline at end of file diff --git a/ui/js/docker-app.js b/ui/js/docker-app.js index ab5ea8474..9bcbee041 100644 --- a/ui/js/docker-app.js +++ b/ui/js/docker-app.js @@ -93,6 +93,7 @@ var LN = 'LN'; var BTC = 'BTC'; function processData(data) { + if (data.screenOpts) setScreenOptions(data.screenOpts); if (data.localeInfo) setLocaleInfo(data.localeInfo); if (data.locale) setLocale(data.locale); if (data.supportedCoins) setCoins(data.supportedCoins); @@ -112,7 +113,9 @@ function processData(data) { if (data.cassettes) buildCassetteButtons(data.cassettes, NUMBER_OF_BUTTONS); if (data.readingBills) readingBills(data.readingBills); if (data.cryptoCode) translateCoin(data.cryptoCode); - if (data.tx && data.tx.cashInFee) setFixedFee(data.tx.cashInFee); + if (data.tx) { + if (data.tx.cashInFee) setFixedFee(data.tx.cashInFee);else if (data.tx.cashOutFee) setFixedFee(data.tx.cashOutFee); + } if (data.terms) setTermsScreen(data.terms); if (data.dispenseBatch) dispenseBatch(data.dispenseBatch); if (data.direction) setDirection(data.direction); @@ -120,6 +123,7 @@ function processData(data) { if (data.hardLimit) setHardLimit(data.hardLimit); if (data.cryptomatModel) setCryptomatModel(data.cryptomatModel); if (data.areThereAvailablePromoCodes !== undefined) setAvailablePromoCodes(data.areThereAvailablePromoCodes); + if (data.allRates && data.ratesFiat) setRates(data.allRates, data.ratesFiat); if (data.tx && data.tx.discount) setCurrentDiscount(data.tx.discount); if (data.receiptStatus) setReceiptPrint(data.receiptStatus, null); @@ -298,6 +302,9 @@ function processData(data) { clearTimeout(complianceTimeout); externalCompliance(data.externalComplianceUrl); break; + case 'rates': + setState('rates'); + break; default: if (data.action) setState(window.snakecase(data.action)); } @@ -843,6 +850,9 @@ $(document).ready(function () { setupButton('terms-ok', 'termsAccepted'); setupButton('terms-ko', 'idle'); + setupImmediateButton('rates-close', 'idle'); + setupButton('rates-section-button', 'ratesScreen'); + setupButton('maintenance_restart', 'maintenanceRestart'); calculateAspectRatio(); @@ -2036,4 +2046,30 @@ function externalCompliance(url) { qrize(url, $('#qr-code-external-validation'), cashDirection === 'cashIn' ? CASH_IN_QR_COLOR : CASH_OUT_QR_COLOR); return setScreen('external_compliance'); } + +function setScreenOptions(opts) { + opts.rates && opts.rates.active ? $('#rates-section').show() : $('#rates-section').hide(); +} + +function thousandSeparator(number, country, minimumFractionDigits) { + var numberFormatter = Intl.NumberFormat(country, { minimumFractionDigits: minimumFractionDigits }); + return numberFormatter.format(number); +} + +function setRates(allRates, fiat) { + var ratesTable = $('.rates-content'); + var tableHeader = $('
\n

' + translate('Buy') + '

\n

' + translate('Crypto') + '

\n

' + translate('Sell') + '

\n
'); + var coinEntries = []; + + Object.keys(allRates).forEach(function (it) { + var cashIn = BN(allRates[it].cashIn); + var cashOut = BN(allRates[it].cashOut); + var biggestDecimalPlaces = Math.max(cashIn.dp(), cashOut.dp()); + + coinEntries.push($('
\n

' + thousandSeparator(BN(allRates[it].cashIn).toFixed(2), localeCode) + '

\n

' + it + '

\n

' + thousandSeparator(BN(allRates[it].cashOut).toFixed(2), localeCode) + '

\n
')); + }); + + $('#rates-fiat-currency').text(fiat); + ratesTable.empty().append(tableHeader).append(coinEntries); +} //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/ui/main.css b/ui/main.css index 45e592225..e625676d5 100644 --- a/ui/main.css +++ b/ui/main.css @@ -2219,6 +2219,10 @@ footer { width: 30vh; } +.rates-section { + margin-left: 2em; +} + #change-language-section #language-dropdown-toggle { -webkit-box-align: center; -webkit-align-items: center; @@ -2976,6 +2980,10 @@ footer { -webkit-justify-content: flex-end; justify-content: flex-end; } +.i18n-rtl .rates-section { + margin-left: 0; + margin-right: 2em; +} .send-only-total { margin-bottom: 6vh; diff --git a/ui/src/app.js b/ui/src/app.js index d519cd63c..1835906bc 100644 --- a/ui/src/app.js +++ b/ui/src/app.js @@ -90,6 +90,7 @@ const LN = 'LN' const BTC = 'BTC' function processData (data) { + if (data.screenOpts) setScreenOptions(data.screenOpts) if (data.localeInfo) setLocaleInfo(data.localeInfo) if (data.locale) setLocale(data.locale) if (data.supportedCoins) setCoins(data.supportedCoins) @@ -120,6 +121,7 @@ function processData (data) { if (data.hardLimit) setHardLimit(data.hardLimit) if (data.cryptomatModel) setCryptomatModel(data.cryptomatModel) if (data.areThereAvailablePromoCodes !== undefined) setAvailablePromoCodes(data.areThereAvailablePromoCodes) + if (data.allRates && data.ratesFiat) setRates(data.allRates, data.ratesFiat) if (data.tx && data.tx.discount) setCurrentDiscount(data.tx.discount) if (data.receiptStatus) setReceiptPrint(data.receiptStatus, null) @@ -298,6 +300,9 @@ function processData (data) { clearTimeout(complianceTimeout) externalCompliance(data.externalComplianceUrl) break + case 'rates': + setState('rates') + break default: if (data.action) setState(window.snakecase(data.action)) } @@ -859,6 +864,9 @@ $(document).ready(function () { setupButton('terms-ok', 'termsAccepted') setupButton('terms-ko', 'idle') + setupImmediateButton('rates-close', 'idle') + setupButton('rates-section-button', 'ratesScreen') + setupButton('maintenance_restart', 'maintenanceRestart') calculateAspectRatio() @@ -2088,3 +2096,37 @@ function externalCompliance (url) { qrize(url, $('#qr-code-external-validation'), cashDirection === 'cashIn' ? CASH_IN_QR_COLOR : CASH_OUT_QR_COLOR) return setScreen('external_compliance') } + +function setScreenOptions (opts) { + (opts.rates && opts.rates.active) ? $('#rates-section').show() : $('#rates-section').hide() +} + +function thousandSeparator (number, country, minimumFractionDigits) { + const numberFormatter = Intl.NumberFormat(country, { minimumFractionDigits }) + return numberFormatter.format(number) +} + +function setRates (allRates, fiat) { + const ratesTable = $('.rates-content') + const tableHeader = $(`
+

${translate('Buy')}

+

${translate('Crypto')}

+

${translate('Sell')}

+
`) + const coinEntries = [] + + Object.keys(allRates).forEach(it => { + const cashIn = BN(allRates[it].cashIn) + const cashOut = BN(allRates[it].cashOut) + const biggestDecimalPlaces = Math.max(cashIn.dp(), cashOut.dp()) + + coinEntries.push($(`
+

${thousandSeparator(BN(allRates[it].cashIn).toFixed(2), localeCode)}

+

${it}

+

${thousandSeparator(BN(allRates[it].cashOut).toFixed(2), localeCode)}

+
`)) + }) + + $('#rates-fiat-currency').text(fiat) + ratesTable.empty().append(tableHeader).append(coinEntries) +} diff --git a/ui/start-docker.html b/ui/start-docker.html index b419e8072..b3b225276 100644 --- a/ui/start-docker.html +++ b/ui/start-docker.html @@ -283,6 +283,11 @@

Selling unavailable for this coin

+
+
+
Rates
+
+
@@ -1887,6 +1892,32 @@

Promo code not found

+
+
+
+ +
+
+ +
+
+

Exchange Rates

+

EUR

+
+
+
+

Buy

+

Crypto

+

Sell

+
+
+
+
Selling unavailable for this coin
+
+
+
Rates
+
+
@@ -1887,6 +1892,32 @@

Promo code not found

+
+
+
+ +
+
+ +
+
+

Exchange Rates

+

EUR

+
+
+
+

Buy

+

Crypto

+

Sell

+
+
+
+
Selling unavailable for this coin
+
+
+
Rates
+
+
@@ -1887,6 +1892,32 @@

Promo code not found

+
+
+
+ +
+
+ +
+
+

Exchange Rates

+

EUR

+
+
+
+

Buy

+

Crypto

+

Sell

+
+
+
+