Advertisement
Guest User

Untitled

a guest
Nov 2nd, 2018
2,356
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 151.81 KB | None | 0 0
  1. if (
  2. && window.location.hostname !== 'landingpage-ico.savedroid.tzander'
  3. && window.location.hostname !== 'landingpage-ico.mryvlin'
  4. && window.location.hostname !== 'localhost'
  5. && window.location.hostname !== 'landingpage-ico.localhost'
  6. ) {
  7. }
  8.  
  9. var poolData = {
  10. UserPoolId: 'eu-central-1_jjhzopINU',
  11. ClientId: '1qlhp39on8d3cc4s25q8menucf'
  12. };
  13. var userPool = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(poolData);
  14. var cognitoUser = null;
  15. var rates = new FXRatesManager()
  16.  
  17. var storeAttribute = function (key, value, callback) {
  18. //console.log('Save ' + value + ' in ' + key);
  19. var attributeList = [];
  20. var attribute = {
  21. Name: key,
  22. Value: value
  23. };
  24. //console.log('setting attribute');
  25. var attribute = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserAttribute(attribute);
  26. attributeList.push(attribute);
  27.  
  28. //console.log('call updateAttributes');
  29. cognitoUser.updateAttributes(attributeList, function (err, result) {
  30. //console.log('result of updateAttributes');
  31. //console.log(result);
  32. if (err) {
  33. alert(err.message);
  34. return;
  35. }
  36. if (callback) {
  37. //console.log('stored attribute ' + key);
  38. callback();
  39. }
  40. });
  41. };
  42.  
  43. var changePassword = function(oldPwd, newPwd, buttonElement) {
  44.  
  45. var oldColor = buttonElement.css('background-color');
  46. var oldText = buttonElement.val();
  47. buttonElement.css('background-color', '#cccccc');
  48. buttonElement.val('Loading ...');
  49. buttonElement.prop('disabled', true);
  50.  
  51. var resetButton = function () {
  52. buttonElement.css('background-color', oldColor);
  53. buttonElement.val(oldText);
  54. buttonElement.prop('disabled', false);
  55. };
  56.  
  57. cognitoUser.changePassword(oldPwd, newPwd, function(err, message) {
  58. resetButton()
  59. if(err) {
  60. var alertElement = jQuery('#full-popup .alertcontainer');
  61. if (alertElement.length) {
  62. alertElement.html(getAlertHtml(err.message));
  63. } else {
  64. alert(message);
  65. }
  66. } else {
  67. var popup = jQuery("<div><img alt='Big Johnny likes it' src='/img/big_johnny_thumbsup.png' scale='0' style=' width: 150px; display: block; margin: auto; margin-top: 30px; margin-bottom: 30px; '><div style='margin:auto; text-align: center'><span>Password successfully changed</span></div></div>")
  68. showPopup("YEAH!", popup.html());
  69. }
  70.  
  71. })
  72. }
  73.  
  74. var showBanktransfer = function (amount, state, reservationId) {
  75. var popup = jQuery('.banktransfer-success');
  76. popup.find('.currencyamount').text(amount);
  77. if (state && state === 'processing') {
  78. popup.find('.banktransfer-proof').html('<p class="small-text">Thank you for providing the necessary information. We will check and confirm it when we receive your payment.</p>');
  79. }
  80. showPopup(popup.find('.title').html(), popup.find('.description').html(), true);
  81. jQuery('#full-popup').find('.paymentsubmit').click(function (e) {
  82.  
  83. var buttonElement = jQuery(this);
  84. buttonElement.css('background-color', '#cccccc');
  85. buttonElement.val('Loading...');
  86. buttonElement.prop('disabled', true);
  87.  
  88. showBanktransferProofPopup(reservationId);
  89. });
  90.  
  91. };
  92.  
  93. var showReferredAccountsPopup = function () {
  94. var popup = jQuery('#referred-accounts-popup');
  95. showPopup(popup.find('.title').html(), popup.find('.description').html());
  96. }
  97.  
  98. var showReferralInfoPopup = function () {
  99. var popup = jQuery('#referral-info-popup');
  100. showPopup(popup.find('.title').html(), popup.find('.description').html());
  101. }
  102.  
  103. var showBanktransferProofPopup = function (reservationId) {
  104. var popup = jQuery('.banktransfer-proof-popup');
  105. showPopup(popup.find('.title').html(), popup.find('.description').html());
  106.  
  107. var jPopup = jQuery('#full-popup');
  108.  
  109. jPopup.find('.paymentsubmit').click(function () {
  110.  
  111. var buttonElement = jQuery(this);
  112.  
  113. var oldColor = buttonElement.css('background-color');
  114. var oldText = buttonElement.val();
  115.  
  116.  
  117. buttonElement.css('background-color', '#cccccc');
  118. buttonElement.val('Loading...');
  119. buttonElement.prop('disabled', true);
  120.  
  121. var resetButton = function () {
  122. buttonElement.css('background-color', oldColor);
  123. buttonElement.val(oldText);
  124. buttonElement.prop('disabled', false);
  125. };
  126.  
  127. var uploadElement = jPopup.find('#banktransfer-proof-file').prop('files')[0];
  128.  
  129. var filename = uploadElement.name;
  130.  
  131. jQuery.ajax({
  132. type: "POST",
  133. url: 'https://start-payment-upload.ico.savedroid.com',
  134. data: JSON.stringify({accessToken: accessToken, filename: filename, reservationId: reservationId}),
  135. dataType: 'Text',
  136. headers: {
  137. 'X-Api-Key': 'wcqCNXFoYiap1YxJBnmau6S6WuB7rAHg9zjtYykE'
  138. },
  139. success: function (response) {
  140. var result = JSON.parse(response);
  141. var url = result.url;
  142. var filename = result.filename;
  143.  
  144. uploadFile(uploadElement, url, function(error) {
  145. if (error) {
  146. var message = 'Error on file upload. Please try again later.';
  147. var alertElement = jPopup.find('.alertcontainer');
  148. if (alertElement.length) {
  149. alertElement.html(getAlertHtml(message));
  150. } else {
  151. alert(message);
  152. }
  153. } else {
  154. var reservation = tokenReservations.filter(function(res) {
  155. return res.reservationId == reservationId
  156. })
  157. if(reservation.length > 0) {
  158. reservation.state = "processing"
  159. ga('send', 'event', 'PurchaseMainsale', 'paid', reservation[0].type, reservation[0].tokens);
  160. jQuery("#"+reservation[0].reservationId).data().update(reservation)
  161. }
  162.  
  163. var popup = jQuery('#banktransfer-proof-popup-success');
  164. showPopup(popup.find('.title').html(), popup.find('.description').html());
  165. jQuery('#full-popup').find('.share-button').data('amount', reservation[0].tokens);
  166.  
  167. }
  168. });
  169. }
  170. }).fail(function (error) {
  171. if (error) {
  172. var message = JSON.stringify(error);
  173. var alertElement = jPopup.find('.alertcontainer');
  174. if (alertElement.length) {
  175. alertElement.html(getAlertHtml(message));
  176. } else {
  177. alert(message);
  178. }
  179. ;
  180. resetButton();
  181. }
  182. });
  183. });
  184. };
  185.  
  186.  
  187. var showBtcSuccess = function (amount, reservationId, tokens) {
  188. var popup = jQuery('.bitcoin-success');
  189. popup.find('.currencyamount').text(amount);
  190. showPopup(popup.find('.title').html(), popup.find('.description').html(), true);
  191.  
  192. if (reservationId)
  193. {
  194. showCryptoPaymentInformation('bitcoin', reservationId, tokens);
  195.  
  196. jQuery('#full-popup').scrollTop(0);
  197.  
  198. if (tokens>=100000){
  199. var lastingMinutes = 60 - new Date().getMinutes();
  200. jQuery('#full-popup').find('.minutes').text(lastingMinutes);
  201. jQuery('#full-popup').find('.airdrop-info').removeClass('hidden');
  202. } else {
  203. jQuery('#full-popup').find(".edit-button").click( function(){ showPresalePopup(tokenReservations.filter(function(e){ return e.reservationId == reservationId; })[0]) });
  204. jQuery('#full-popup').find('.airdrop-info-not-enough').removeClass('hidden');
  205. }
  206. }
  207. };
  208.  
  209.  
  210. var startCcPayment = function (reservationId) {
  211. //console.log('in creditcard-success callback');
  212.  
  213. var url = 'https://vip-customers.ico.savedroid.com';
  214. var apiKey = 'dfGh3HZa3T71OUD6kiBSK82rTjCOSIWj6Zf9jRYw';
  215.  
  216. jQuery.ajax({
  217. type: "POST",
  218. data: JSON.stringify({"accessToken": accessToken}),
  219. url: url,
  220. success: function (data) {
  221. if(data.approved == false) {
  222. return showVIPPopup(reservationId)
  223. }
  224. doPayment(data.approved)
  225. },
  226. dataType: 'json',
  227. headers: {
  228. 'X-Api-Key': apiKey
  229. }
  230. }).fail(function(err) {
  231. doPayment(false)
  232. })
  233.  
  234. var doPayment = function(vipUser) {
  235. console.log(vipUser)
  236. var reservation = tokenReservations.filter(function(res) {
  237. return res.reservationId == reservationId
  238. })
  239.  
  240. if(reservation.length > 0 && reservation[0].tokens > 500000) {
  241. return showPopup("!!! CREDIT CARD MAXIMUM LIMIT !!!",'<p class="text-center;" style="width: 80%;margin: auto; margin-top:30px;">Please note that the maximum limit per credit card payment is 5,000.00 Euro and 5,750.00 US-Dollar respectively. So if you want to purchase SVD tokens for a total value of 10,000.00 Euro please make sure to split your credit cart payment into two separate payment transactions of 5,000.00 Euro each. Thanks a lot!</p>')
  242. }
  243.  
  244. var popup = jQuery('.creditcard-popup');
  245. showPopup(popup.find('.title').html(), popup.find('.description').html());
  246.  
  247. jQuery.ajax({
  248. type: "POST",
  249. data: JSON.stringify({"accessToken": accessToken, "reservationId": reservationId, vipUser : vipUser}),
  250. url: 'https://masterpayment-start.ico.savedroid.com',
  251. success: function (data) {
  252. var url = data.url;
  253. var popup = jQuery('#full-popup');
  254. if (window.navigator.userAgent.indexOf('Edge') > -1) {
  255. document.location = url;
  256. }
  257. popup.find('iframe').css('opacity', '0').css('width', '100%').attr('src', url).on('load', function() {
  258. jQuery("#full-popup .spinner").fadeOut(400, function() { popup.find('iframe').animate({opacity: 1}, 400) })
  259. });
  260.  
  261. },
  262. dataType: 'json',
  263. headers: {
  264. 'X-Api-Key': 'YCg42ejxj14G1OgbILFkC7sd6a3Jq2d45y9WuiU3'
  265. }
  266. }).fail(function (error) {
  267. var message = 'Transaction start failed, please try again in a couple of minutes';
  268. var alertElement = popup.find('.alertcontainer');
  269. if (alertElement.length) {
  270. alertElement.html(getAlertHtml(message));
  271. } else {
  272. alert(message);
  273. }
  274. });
  275. }
  276.  
  277.  
  278. };
  279.  
  280. var startSofortPayment = function (reservationId) {
  281. //console.log('in sofort-success callback');
  282.  
  283. var popup = jQuery('.sofort-popup');
  284.  
  285. showPopup(popup.find('.title').html(), popup.find('.description').html());
  286.  
  287. jQuery.ajax({
  288. type: "POST",
  289. data: JSON.stringify({"accessToken": accessToken, "reservationId": reservationId}),
  290. url: 'https://masterpayment-start.ico.savedroid.com',
  291. success: function (data) {
  292. var url = data.url;
  293. var popup = jQuery('#full-popup');
  294. if (window.navigator.userAgent.indexOf('Edge') > -1) {
  295. document.location = url;
  296. }
  297. popup.find('iframe').css('opacity', '0').css('height', '800px').css('width', '100%').attr('src', url).on('load', function() {
  298. jQuery("#full-popup .spinner").fadeOut(400, function() { popup.find('iframe').animate({opacity: 1}, 400) })
  299. });
  300. },
  301. dataType: 'json',
  302. headers: {
  303. 'X-Api-Key': 'YCg42ejxj14G1OgbILFkC7sd6a3Jq2d45y9WuiU3'
  304. }
  305. }).fail(function (error) {
  306. var message = 'Transaction start failed, please try again in a couple of minutes';
  307. var alertElement = popup.find('.alertcontainer');
  308. if (alertElement.length) {
  309. alertElement.html(getAlertHtml(message));
  310. } else {
  311. alert(message);
  312. }
  313. });
  314. };
  315.  
  316. var showEthSuccess2 = function (amount, reservationId, tokens) {
  317. var popup = jQuery('.ethereum-success2');
  318. popup.find('.currencyamount').text(amount);
  319. showPopup(popup.find('.title').html(), popup.find('.description').html(), true);
  320.  
  321. if (reservationId)
  322. {
  323. showCryptoPaymentInformation('ethereum', reservationId, tokens);
  324. jQuery('#full-popup').scrollTop(0);
  325.  
  326. if (tokens>=100000){
  327. var lastingMinutes = 60 - new Date().getMinutes();
  328. jQuery('#full-popup').find('.minutes').text(lastingMinutes);
  329. jQuery('#full-popup').find('.airdrop-info').removeClass('hidden');
  330. } else {
  331. jQuery('#full-popup').find(".edit-button").click( function(){ showPresalePopup(tokenReservations.filter(function(e){ return e.reservationId == reservationId; })[0]) });
  332. jQuery('#full-popup').find('.airdrop-info-not-enough').removeClass('hidden');
  333. }
  334. }
  335.  
  336. getMedianGasPrice(function(medianGasPrice) {
  337. var fullPopup = jQuery('#full-popup');
  338. fullPopup.find('.rec-gas-limit').text("100k"); // update gas limit here
  339. fullPopup.find('.rec-gwei').text(medianGasPrice);
  340. });
  341. };
  342.  
  343. var showTokenSuccess = function (amount, reservationId, tokens, type) {
  344. var popup = jQuery('.token-success');
  345. popup.find('.currencyamount').text(amount);
  346. popup.find('.currencytype').text(type);
  347. var targetaddress;
  348. if (type === 'DOGE') {
  349. targetaddress = 'DMXnqMDmBJW6Ux35e5ZVSoi2jeBYzufmjD';
  350. popup.find('.wallet-img').attr("src","/img/doge-qr.png");
  351. } else if(type === 'XLM') {
  352. targetaddress = 'GBL4JMOL3APAKIOIBACRNDWLTNCJ6YIDT2BKMQWA2GL7KSOP5O7AIBVT';
  353. popup.find('.wallet-img').attr("src","/img/stellar-qr.png");
  354. } else {
  355. targetaddress = '0x07CDDBb6244bC85c9CafD578Be1204aECB0B6D12'
  356. popup.find('.wallet-img').attr("src","/img/altcoins-qr.png");
  357. }
  358. popup.find('.targetaddress').text(targetaddress);
  359. showPopup(popup.find('.title').html(), popup.find('.description').html(), true);
  360.  
  361. if (reservationId)
  362. {
  363. showCryptoPaymentInformation(type, reservationId, tokens);
  364.  
  365. jQuery('#full-popup').scrollTop(0);
  366.  
  367. if (tokens>=100000){
  368. var lastingMinutes = 60 - new Date().getMinutes();
  369. jQuery('#full-popup').find('.minutes').text(lastingMinutes);
  370. jQuery('#full-popup').find('.airdrop-info').removeClass('hidden');
  371. } else {
  372. jQuery('#full-popup').find(".edit-button").click( function(){ showPresalePopup(tokenReservations.filter(function(e){ return e.reservationId == reservationId; })[0]) });
  373. jQuery('#full-popup').find('.airdrop-info-not-enough').removeClass('hidden');
  374. }
  375. }
  376.  
  377. };
  378.  
  379. var showCryptoPaymentInformation = function (type, reservationId, tokens) {
  380. var isBitcoin = (type === 'bitcoin');
  381. jQuery('#full-popup').find('.paymentsubmit').click(
  382. function (e) {
  383. var popup = jQuery('.transaction-hash-input');
  384. showPopup(popup.find('.title').html(), popup.find('.description').html());
  385.  
  386. var txHashText = isBitcoin ? "Txid" : "TxHash";
  387.  
  388. var buttonElement = jQuery('#full-popup').find('.paymentsubmit');
  389. var txHashListElement = jQuery('#full-popup').find('.tx-hash-list');
  390. var txHashNoneElement = jQuery('#full-popup').find('.tx-hash-none');
  391. var txHashElement = jQuery('#full-popup').find('.walletaddress');
  392. var txHash = txHashElement.val();
  393.  
  394. if (isBitcoin) {
  395. jQuery('#full-popup').find('.tx-hash-none-btc').show();
  396. txHashElement.attr('placeholder', "Transaction Identifier");
  397. } else if (type === 'ethereum') {
  398. jQuery('#full-popup').find('.tx-hash-none-eth').show();
  399. } else {
  400. jQuery('#full-popup').find('.tx-hash-none-token').show();
  401. }
  402.  
  403. jQuery('#full-popup').scrollTop(0);
  404.  
  405. if (tokens>=100000){
  406. var lastingMinutes = 60 - new Date().getMinutes();
  407. jQuery('#full-popup').find('.minutes').text(lastingMinutes);
  408. jQuery('#full-popup').find('.airdrop-info').removeClass('hidden');
  409. }
  410.  
  411. getTxHashes(reservationId, function(txHashes) {
  412. // add txHashes to the list
  413. for (var i = 0; i < txHashes.length; i++)
  414. {
  415. txHashListElement.append(createTxHashListItem(txHashes[i], reservationId));
  416. }
  417.  
  418. // if hashes were found, hide text about no hashes
  419. if (txHashes.length > 0)
  420. {
  421. txHashNoneElement.hide();
  422. }
  423.  
  424. // set txHash count and check if we should disable input
  425. numTxHashes = txHashes.length;
  426. if (numTxHashes >= MAX_TX_HASHES)
  427. {
  428. txHashElement.prop('disabled', true);
  429. buttonElement.val(txHashText + ' Saved');
  430. }
  431. });
  432.  
  433. buttonElement.click(
  434. function (e) {
  435. var addNewTxHash = function(resetButton) {
  436. // send to the backend
  437. storeTxHash(txHash, reservationId, tokens, rates.get(type), function() {
  438. var reservation = tokenReservations.filter(function(res) {
  439. return res.reservationId == reservationId
  440. })
  441. if(reservation.length > 0) {
  442. reservation.state = "processing"
  443. jQuery("#"+reservation[0].reservationId).data().update(reservation)
  444. }
  445. ga('send', 'event', 'PurchaseMainsale', 'paid', type, tokens );
  446.  
  447. var popup = jQuery('#banktransfer-proof-popup-success');
  448. showPopup(popup.find('.title').html(), popup.find('.description').html());
  449. jQuery('#full-popup').find('.share-button').data('amount', tokens);
  450.  
  451. /*
  452. // hide text about no hashes
  453. txHashNoneElement.hide();
  454.  
  455. // clear input
  456. txHashElement.val("");
  457. buttonElement.prop('disabled', true);
  458. buttonElement.css('background-color', '#cccccc');
  459. buttonElement.val(numTxHashes < MAX_TX_HASHES ? 'Please input a valid ' + txHashText : txHashText + ' Saved');
  460.  
  461. // add txHash to the list
  462. txHashListElement.append(createTxHashListItem(txHash, reservationId));
  463.  
  464. // increase txHash count and check if we should disable further input
  465. numTxHashes++;
  466. if (numTxHashes >= 5)
  467. {
  468. txHashElement.prop('disabled', true);
  469. }*/
  470. },
  471. function(err) {
  472. // fail
  473. var alertElement = jQuery('#full-popup .alertcontainer');
  474. alertElement.html(getAlertHtml(JSON.stringify(err)));
  475. resetButton();
  476. });
  477. };
  478.  
  479. var validateTxHash = function() {
  480. // check if txhash is valid
  481. var txHashRegex = '';
  482. if (isBitcoin || type === 'DOGE') {
  483. txHashRegex = /^[a-fA-F0-9]{64}$/;
  484. } else if (type !== 'XLM') {
  485. txHashRegex = /^0x[a-fA-F0-9]{64}$/
  486. }
  487. txHash = txHashElement.val().trim();
  488. var alertElement = jQuery('#full-popup .alertcontainer');
  489.  
  490. if (txHash.match(txHashRegex) && numTxHashes < MAX_TX_HASHES) {
  491. alertElement.empty();
  492. } else {
  493. // for some reason, the regex failed (unless it's again possible to input more than 1 tx hash - check MAX_TX_HASHES)
  494. // we need to try to diagnose the problem and input something useful for the user
  495. var message = "Unknown error. Please contact an admin on telegram with a screenshot or description of this error.";
  496.  
  497. if (isBitcoin || type === 'DOGE' || type === 'XLM') {
  498. if (txHash.length > 64) {
  499. // too big
  500. message = "Error: " + txHashText + " is too long. It should be 64 characters but it was " + txHash.length + ".";
  501. } else if (txHash.length < 64) {
  502. // too small
  503. message = "Error: " + txHashText + " is too short. It should be 64 characters but it was " + txHash.length + ".";
  504. } else {
  505. // some unknown problem - keep the default error message
  506. }
  507. } else if (type !== 'XLM') { // Ethereum
  508. if (txHash.length > 66) {
  509. // too big
  510. message = "Error: " + txHashText + " is too long. It should be 66 characters but it was " + txHash.length + ".";
  511. } else if (txHash.length < 66) {
  512. // too small
  513. message = "Error: " + txHashText + " is too short. It should be 66 characters but it was " + txHash.length + ".";
  514. } else if (!txHash.startsWith("0x")) {
  515. // doesn't start with 0x
  516. message = "Error: " + txHashText + " is must start with 0x. Please check the example above.";
  517. } else {
  518. // some unknown problem - keep the default error message
  519. }
  520. }
  521.  
  522. alertElement.html(getAlertHtml(message));
  523.  
  524. return false;
  525. }
  526.  
  527. return true;
  528. };
  529.  
  530. if (validateTxHash()) {
  531.  
  532. var oldColor = buttonElement.css('background-color');
  533. var oldText = buttonElement.val();
  534.  
  535. buttonElement.css('background-color', '#cccccc');
  536. buttonElement.val('Loading ...');
  537. buttonElement.prop('disabled', true);
  538.  
  539. var resetButton = function () {
  540. buttonElement.css('background-color', oldColor);
  541. buttonElement.val(oldText);
  542. buttonElement.prop('disabled', false);
  543. };
  544.  
  545. if (!isBitcoin && type !== 'ethereum') {
  546. return addNewTxHash(resetButton);
  547. }
  548.  
  549. var failed = false;
  550. var url = 'https://api.blockcypher.com/v1/' + (isBitcoin ? 'btc' : 'eth') +'/main/txs/'+txHash;
  551. $.get(url)
  552. .then(function(d) {
  553.  
  554. if (!isBitcoin && d.execution_error) {
  555. failed = true;
  556. var alertElement = jQuery('#full-popup .alertcontainer');
  557. var message = d.execution_error;
  558. if (d.execution_error == 'out of gas') {
  559. message = "Your transaction ran out of gas. To get more information about this problem check <a href='https://steemit.com/ethereum/@tomshwom/ethereum-gas-how-it-works'>https://steemit.com/ethereum/@tomshwom/ethereum-gas-how-it-works</a>"
  560. }
  561. alertElement.html(getAlertHtml(message));
  562. } else if (d.addresses.filter(function(address) {
  563. return (isBitcoin ? "37TSifbNfWVnrLWFtJjDRftVyTPcEH6wSt" : "0x2c30840965f8fb2dc42bf4d6d530661d9f0e73c3").indexOf(address) !== -1
  564. }).length <= 0) {
  565. failed = true;
  566. var alertElement = jQuery('#full-popup .alertcontainer');
  567. alertElement.html(getAlertHtml('Are you sure you have submitted the right txHash? This one didn\'t go to the savedroid wallet address.'));
  568. }
  569.  
  570. })
  571. .always(function() {
  572. if(!failed) {
  573. addNewTxHash(resetButton);
  574. } else {
  575. resetButton();
  576. }
  577. });
  578. }
  579. }
  580. );
  581.  
  582. jQuery('#full-popup').find('.panicbutton').click(function (e) {
  583. showPopup("Find your txHash", "<iframe src='../txhash-help' style='border: 0px; width: 100%; height: 100%;' onload='var frame = this; setInterval(function () {frame.style.height = (frame.contentWindow.document.body.scrollHeight + 50) + \"px\"}, 100);'/>");
  584. storeTxHash("<not set>", reservationId, tokens, rates.get(type), function() {
  585. var reservation = tokenReservations.filter(function(res) {
  586. return res.reservationId == reservationId
  587. })
  588. if(reservation.length > 0) {
  589. reservation.state = "waiting"
  590. jQuery("#"+reservation[0].reservationId).data().update(reservation)
  591. }
  592. },
  593. function() {
  594.  
  595. });
  596.  
  597. });
  598. }
  599. );
  600.  
  601. };
  602.  
  603.  
  604. var numTxHashes = 0;
  605. var MAX_TX_HASHES = 1;
  606. var getTxHashes = function (reservationId, callback) {
  607. /*var jsondatastring = JSON.stringify({
  608. "accessToken": accessToken,
  609. "reservationId": reservationId
  610. });
  611. jQuery.ajax({
  612. type: "POST",
  613. url: 'https://get-txhash.ico.savedroid.com',
  614. data: jsondatastring,
  615. success: function(result) { callback(result.hashes); },
  616. headers: {
  617. 'X-Api-Key': '' // todo: input API key if this is re-implemented
  618. }
  619. }).fail(function (err) {
  620. //console.log(err);
  621. //console.log('gettxhash fail');
  622. });*/
  623.  
  624. callback([]); // remove this if above is re-implemented
  625. };
  626.  
  627.  
  628.  
  629. var createTxHashListItem = function(txHash, reservationId) {
  630. // add the image into the li below, if we implement deleting of txhashes
  631. // '<img src="/wp-content/themes/savedroid/img/x.png" style="width: 10px; height: 10px; margin-left: 8px; margin-bottom: 3px; cursor: pointer;" alt="close" onclick="removeTxHash(txHash, reservationId);">
  632. return '<li>' + txHash + '</li>';
  633. };
  634.  
  635. var showGasGwei = function() {
  636. jQuery('#full-popup').find('.gas-gwei-link').hide();
  637. jQuery('#full-popup').find('.gas-gwei-info').show();
  638. };
  639.  
  640. var getMedianGasPrice = function(callback) {
  641. var url = "https://status.ico.savedroid.com/median-gas-price.json"
  642. var requestUri = encodeURI(url);
  643. jQuery.getJSON(requestUri, function(data) {
  644. if (data.medianGasPrice) {
  645. callback(data.medianGasPrice);
  646. } else {
  647. callback("Error");
  648. }
  649. });
  650. };
  651.  
  652. var accessToken;
  653. var idToken;
  654.  
  655. var storeTxHash = function (txHash, reservationId, tokens, rate, callbackSuccess, callbackFail) {
  656. var jsondatastring = JSON.stringify({
  657. "accessToken": accessToken,
  658. "txHash": txHash,
  659. "reservationId": reservationId,
  660. "tokens": tokens,
  661. "exchangeRate": rate
  662. });
  663. jQuery.ajax({
  664. type: "POST",
  665. url: 'https://txhash.ico.savedroid.com',
  666. data: jsondatastring,
  667. success: callbackSuccess,
  668. dataType: 'Text',
  669. headers: {
  670. 'X-Api-Key': 'dp4wyixCms7reBDwmlNE773Ha0rOWUU67IB8YZ9o'
  671. }
  672. }).fail(function (err) {
  673. //console.log(err);
  674. //console.log('txhash fail');
  675. callbackFail(err);
  676. });
  677. };
  678.  
  679. var getAlertHtml = function (message, type) {
  680. type = type || 'danger';
  681. return '<div class="alert alert-' + type + ' alert-dismissible animated bounceInUp" role="alert">\n' +
  682. ' <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>\n' +
  683. message +
  684. '</div>';
  685. };
  686.  
  687. var loginContext;
  688. var login = function (username, password, callback, buttonElement) {
  689. if (buttonElement) {
  690. var oldValue = buttonElement.val();
  691. buttonElement.val('Loading ...');
  692. var oldBackground = buttonElement.css('background-color');
  693. buttonElement.css('background-color', '#cccccc');
  694. buttonElement.prop('disabled', true);
  695.  
  696. var resetButton = function () {
  697. buttonElement.val(oldValue);
  698. buttonElement.css('background-color', oldBackground);
  699. buttonElement.prop('disabled', false);
  700. };
  701. }
  702.  
  703. var authenticationData = {
  704. Username: username,
  705. Password: password,
  706. };
  707. var authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);
  708. var userData = {
  709. Username: username,
  710. Pool: userPool
  711. };
  712. cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
  713.  
  714. var onSuccess = function (result) {
  715. if (resetButton) {
  716. resetButton();
  717. }
  718. accessToken = result.getAccessToken().getJwtToken();
  719. idToken = result.getIdToken().getJwtToken();
  720. initRefresh();
  721.  
  722. jQuery('.alertcontainer').html('');
  723.  
  724. updateUserDisplay();
  725.  
  726. document.location.href = '#top';
  727. if (callback) {
  728. callback();
  729. }
  730. };
  731.  
  732. var onFailure = function (err) {
  733. if (resetButton) {
  734. resetButton();
  735. }
  736. cognitoUser = null;
  737. var alertElement = jQuery('#login .alertcontainer');
  738. if (alertElement.length) {
  739. alertElement.html(getAlertHtml(err.message));
  740. } else {
  741. alert(err.message);
  742. }
  743. updateUserDisplay();
  744. };
  745.  
  746. var mfaRequired = function (codeDeliveryDetails) {
  747. //console.log(codeDeliveryDetails);
  748. //console.log(cognitoUser);
  749.  
  750. loginContext = this;
  751.  
  752. var popup = jQuery('#mfa-authentication-popup');
  753. showPopup(popup.find('.title').html(), popup.find('.description').html());
  754. };
  755.  
  756. var newPasswordRequired = function () {
  757. loginContext = this;
  758.  
  759. var popup = jQuery('#reset-password-popup');
  760. showPopup(popup.find('.title').html(), popup.find('.description').html());
  761. };
  762.  
  763. cognitoUser.authenticateUser(authenticationDetails, {
  764. onSuccess: onSuccess,
  765.  
  766. onFailure: function (err) {
  767. if (err.code === 'UserNotFoundException') {
  768. return loginRetry(username, password, callback, onSuccess, onFailure, mfaRequired);
  769. } else {
  770. return onFailure(err);
  771. }
  772. },
  773.  
  774. mfaRequired: mfaRequired,
  775.  
  776. newPasswordRequired: newPasswordRequired
  777. });
  778. };
  779.  
  780. var loginRetry = function (username, password, callback, onSuccess, onFailure, mfaRequired) {
  781. if (username.charAt(0).match(/^[a-z]$/)) {
  782. username = username.charAt(0).toUpperCase() + username.slice(1);
  783. } else {
  784. username = username.toLowerCase();
  785. }
  786.  
  787. //console.log(username);
  788.  
  789. var authenticationData = {
  790. Username: username,
  791. Password: password,
  792. };
  793. var authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);
  794. var userData = {
  795. Username: username,
  796. Pool: userPool
  797. };
  798. cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
  799.  
  800. cognitoUser.authenticateUser(authenticationDetails, {
  801. onSuccess: onSuccess,
  802.  
  803. onFailure: onFailure,
  804.  
  805. mfaRequired: mfaRequired
  806. });
  807. };
  808.  
  809. var authenticateMfa = function (code) {
  810. cognitoUser.sendMFACode(code, loginContext);
  811. closePopup()
  812. };
  813.  
  814. var resetPassword = function (password) {
  815. console.log(password);
  816. cognitoUser.completeNewPasswordChallenge(password, {}, loginContext);
  817. closePopup();
  818. };
  819.  
  820. var register = function (username, password, buttonElement) {
  821. var oldValue = buttonElement.val();
  822. buttonElement.val('Loading ...');
  823. var oldBackground = buttonElement.css('background-color');
  824. buttonElement.css('background-color', '#cccccc');
  825. buttonElement.prop('disabled', true);
  826.  
  827. var resetButton = function () {
  828. buttonElement.val(oldValue);
  829. buttonElement.css('background-color', oldBackground);
  830. buttonElement.prop('disabled', false);
  831. };
  832.  
  833. var attributeList = [];
  834.  
  835. var dataEmail = {
  836. Name: 'email',
  837. Value: username
  838. };
  839. var attributeEmail = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserAttribute(dataEmail);
  840.  
  841. attributeList.push(attributeEmail);
  842.  
  843. userPool.signUp(username, password, attributeList, null, function (err, result) {
  844. //console.log(result);
  845. resetButton();
  846. if (err) {
  847. var alertElement = jQuery('#register .alertcontainer');
  848. if (alertElement.length) {
  849. alertElement.html(getAlertHtml(err.message));
  850. } else {
  851. alert(err.message);
  852. }
  853. return;
  854. }
  855. cognitoUser = result.user;
  856. document.location.href = '/mail/success/';
  857. });
  858. };
  859.  
  860. var storeTelegram = function () {
  861. var buttonElement = jQuery('#full-popup input[type=submit]');
  862. if (buttonElement) {
  863. var oldValue = buttonElement.val();
  864. buttonElement.val('Loading ...');
  865. var oldBackground = buttonElement.css('background-color');
  866. buttonElement.css('background-color', '#cccccc');
  867. buttonElement.prop('disabled', true);
  868.  
  869. var resetButton = function () {
  870. buttonElement.val(oldValue);
  871. buttonElement.css('background-color', oldBackground);
  872. buttonElement.prop('disabled', false);
  873. };
  874. }
  875.  
  876. telegramUsername = jQuery('#full-popup input[type=text]').val();
  877. if (telegramUsername.trim() === '') {
  878. var alertElement = jQuery('#full-popup .alertcontainer');
  879. alertElement.html(getAlertHtml('Please enter your Telegram username to claim 100 SVD'));
  880. resetButton();
  881. } else {
  882. storeAttribute('custom:telegram', telegramUsername, function () {
  883. location.reload();
  884. });
  885. }
  886. };
  887.  
  888. var telegramUsername;
  889. var showTelegramPopup = function () {
  890. return;
  891. showPopup('Telegram', '<div class="col-sm-3"></div><div class="col-sm-6 text-center">Claim your first 100 SVD by joining the savedroid Telegram-group until the end of the Main Sale.<br />Only once per account and username.<br /><br />' +
  892. '<form onsubmit="storeTelegram(); return false;">' +
  893. '<input type="text" placeholder="Telegram username" />' +
  894. '<div class="alertcontainer"></div>' +
  895. '<input style="border: none; width:100%;height:40px;margin-top:20px;border-radius:20px;background-color:#ff794f;color:white;text-transform:uppercase;font-size: 1.2em;" type="submit" value="Claim 100 SVD"/>' +
  896. '</form></div>');
  897. jQuery('#full-popup input[type=text]').val(telegramUsername);
  898. };
  899.  
  900. var logout = function () {
  901. cognitoUser.signOut();
  902. cognitoUser = null;
  903.  
  904. jQuery('.alertcontainer').html('');
  905.  
  906. location.reload();
  907. };
  908.  
  909. var updateUserDisplay = function (first) {
  910. var isLoggedIn = (cognitoUser !== null);
  911. if (isLoggedIn) {
  912. jQuery('.loginVisible').toggleClass('hidden', false);
  913. jQuery('.loginHidden').toggleClass('hidden', true);
  914. loadLocalData();
  915. getReservations(first);
  916. //getPolls(function(res){showPoll(res)});
  917. } else {
  918. jQuery('.loginVisible').toggleClass('hidden', true);
  919. jQuery('.loginHidden').toggleClass('hidden', false);
  920. }
  921. };
  922.  
  923. function capitalizeFirstLetter(string) {
  924. return string.charAt(0).toUpperCase() + string.slice(1);
  925. }
  926. var username;
  927. var etherwallet;
  928. var btcwallet;
  929. var referal;
  930. var accountBalance = 0;
  931. var earnedTokens = 0;
  932. var balancesToLoad = 0;
  933. var email;
  934. var userCountry = null;
  935. var loadLocalData = function () {
  936.  
  937. accountBalance = 0;
  938. earnedTokens = 0;
  939.  
  940. jQuery.ajax({
  941. type: "POST",
  942. url: 'https://country.ico.savedroid.com',
  943. success: function (data) {
  944. if (data.country == "EU" ||
  945. data.country == "DE" ||
  946. data.country == "BE" ||
  947. data.country == "NL" ||
  948. data.country == "AT" ||
  949. data.country == "CH" ||
  950. data.country == "PL" ||
  951. data.country == "IT" ||
  952. data.country == "ES" ||
  953. data.country == "FR")
  954. {
  955. $('button.sofort').show(); // these are the countries that support SOFORT Ãœberweisung
  956. }
  957.  
  958. jQuery('.usinvestors').toggleClass('hidden', data.country !== 'US');
  959.  
  960. // share buttons
  961. switch (data.country) {
  962. case "RU":
  963. jQuery(".share-button.fb").addClass("hidden");
  964. jQuery(".br.fb").addClass("hidden");
  965. jQuery(".share-button.tw").addClass("hidden");
  966. jQuery(".br.tw").addClass("hidden");
  967. jQuery(".share-button.vk").removeClass("hidden");
  968. jQuery(".br.vk").removeClass("hidden");
  969. jQuery(".share-button.od").removeClass("hidden");
  970. jQuery(".br.od").removeClass("hidden");
  971. break;
  972. case "CN":
  973. jQuery(".share-button.fb").addClass("hidden");
  974. jQuery(".br.fb").addClass("hidden");
  975. jQuery(".share-button.tw").addClass("hidden");
  976. jQuery(".br.tw").addClass("hidden");
  977. jQuery(".share-button.qz").removeClass("hidden");
  978. jQuery(".br.qz").removeClass("hidden");
  979. jQuery(".share-button.wc").removeClass("hidden");
  980. jQuery(".br.wc").removeClass("hidden");
  981. break;
  982. case "KR":
  983. jQuery(".share-button.kt").removeClass("hidden");
  984. jQuery(".br.kt").removeClass("hidden");
  985. break;
  986. default:
  987. break;
  988. }
  989.  
  990. userCountry = data.country;
  991.  
  992. },
  993. dataType: 'json',
  994. headers: {
  995. 'X-Api-Key': 'WGDbNksGLl1U4sRoGxUEv3Cywm2T3cw72rR6xmAR'
  996. }
  997. }).fail(function (err) {
  998. //console.log(err);
  999. //console.log('get country failed');
  1000. $('button.sofort').show(); // err on the side of caution and let them see the SOFORT button
  1001. });
  1002.  
  1003. jQuery('#svd-balance').addClass('hidden');
  1004. jQuery('#svd-balance-loading').removeClass('hidden');
  1005. var isBalanceReady = window.setInterval(
  1006. function () {
  1007. if (balancesToLoad === 0) {
  1008. jQuery('#svd-balance b span.value.balance').text((parseInt(earnedTokens)+parseInt(reservedTokenAmount)).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","));
  1009. jQuery('#svd-balance').removeClass('hidden');
  1010. jQuery('#svd-balance-loading').addClass('hidden');
  1011. window.clearInterval(isBalanceReady);
  1012. }
  1013. },
  1014. 250
  1015. );
  1016.  
  1017. balancesToLoad++;
  1018. jQuery.ajax({
  1019. type: "POST",
  1020. data: JSON.stringify({"accessToken": accessToken}),
  1021. url: 'https://referrals.ico.savedroid.com',
  1022. success: function (data) {
  1023. try {
  1024. var response = JSON.parse(data);
  1025. var bonus = response.totalBonus;
  1026. var count = response.referralCount;
  1027.  
  1028. if (bonus > 0 || count > 0) {
  1029. jQuery('.referralcount').removeClass('hidden');
  1030. jQuery('.referralcount .curBonus').text(bonus.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' SVD');
  1031. jQuery('.referralcount .purchaseBonus').text(response.purchaseBonus.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' SVD');
  1032. jQuery('.referralcount .referralCount').text(count.toString());
  1033. jQuery('#referred-accounts-popup .referred-users').prepend('<h4><b>'+response.referredMails.length+' user' + ((response.referredMails.length < 2) ? '' : 's') + '</b> used your referral link yet!</h4>')
  1034. response.referredMails.forEach(function(email){
  1035. jQuery('#referred-accounts-popup .referred-users').find('ul').append('<li>'+email+'</li>');
  1036. });
  1037. jQuery('#referred-accounts-popup .referred-users').removeClass('hidden');
  1038. jQuery('.no-referrals').addClass('hidden');
  1039.  
  1040. } else {
  1041. jQuery('.referralcount').removeClass('hidden');
  1042. jQuery('.referralcount .curBonus').text('0 SVD');
  1043. jQuery('.referralcount .purchaseBonus').text('0 SVD');
  1044. jQuery('.referralcount .referralCount').text('0');
  1045. }
  1046. //console.log('return of referrals: ' + data);
  1047.  
  1048. accountBalance += parseInt(bonus);
  1049. earnedTokens += parseInt(bonus);
  1050. } catch (e) {
  1051. //console.log('error while loading referral bonus');
  1052.  
  1053. }
  1054.  
  1055.  
  1056. balancesToLoad--;
  1057. },
  1058. dataType: 'Text',
  1059. headers: {
  1060. 'X-Api-Key': 'zjOw04VTq37EjMBy4qmY06Q1AtRKoW29934F4zKE'
  1061. }
  1062. }).fail(function (err) {
  1063. //console.log(err);
  1064. //console.log('in fail');
  1065. balancesToLoad--;
  1066.  
  1067. });
  1068.  
  1069. if (jQuery('.payments').length > 0) {
  1070. balancesToLoad++;
  1071. jQuery.ajax({
  1072. type: "POST",
  1073. data: JSON.stringify({"accessToken": accessToken}),
  1074. url: 'https://payments.ico.savedroid.com',
  1075. success: function (data) {
  1076.  
  1077. //console.log('payments');
  1078. //console.log(data);
  1079. if (data.length > 0) {
  1080. var tableElement = jQuery('<table class="table table-hover"></table>');
  1081. var addColumn = function (trElement, text, type, className, colspan, isHtml) {
  1082. if (!type) {
  1083. type = 'td';
  1084. }
  1085. var tdElement = jQuery('<' + type + (colspan ? ' colspan="' + colspan + '"' : '') + '></\' + type + \'>');
  1086. if (className) {
  1087. tdElement.addClass(className);
  1088. }
  1089. if (isHtml) {
  1090. tdElement.html(text);
  1091. } else {
  1092. tdElement.text(text);
  1093. }
  1094. trElement.append(tdElement);
  1095. };
  1096. var theadElement = jQuery('<thead></thead>');
  1097. var trElement = jQuery('<tr></tr>');
  1098. theadElement.append(trElement);
  1099. addColumn(trElement, 'Time', 'th');
  1100. addColumn(trElement, 'Received amount', 'th');
  1101. addColumn(trElement, 'Payment method', 'th');
  1102. addColumn(trElement, 'Exchange rate', 'th');
  1103. addColumn(trElement, 'Tokens received', 'th');
  1104. addColumn(trElement, 'Status', 'th');
  1105. tableElement.append(theadElement);
  1106. var tbodyElement = jQuery('<tbody></tbody>');
  1107. tableElement.append(tbodyElement);
  1108. // sort by date
  1109. function compare(a,b) {
  1110. if (a.timestamp < b.timestamp)
  1111. return -1;
  1112. if (a.timestamp > b.timestamp)
  1113. return 1;
  1114. return 0;
  1115. }
  1116. data.sort(compare);
  1117. for (var i = 0; i < data.length; i++) {
  1118. var formattedTimeStamp = new Date(data[i].timestamp);
  1119. formattedTimeStamp = formattedTimeStamp.getUTCFullYear() + "/" +
  1120. ("0" + (formattedTimeStamp.getUTCMonth()+1)).slice(-2) + "/" +
  1121. ("0" + formattedTimeStamp.getUTCDate()).slice(-2) + " " +
  1122. ("0" + formattedTimeStamp.getUTCHours()).slice(-2) + ":" +
  1123. ("0" + formattedTimeStamp.getUTCMinutes()).slice(-2) + ":" +
  1124. ("0" + formattedTimeStamp.getUTCSeconds()).slice(-2);
  1125.  
  1126. switch (data[i].type) {
  1127. case 'bounty':
  1128. case 'lucky':
  1129. case 'dotf':
  1130. case 'holi':
  1131. case 'paid':
  1132. var trElement = jQuery('<tr class="row-' + data[i].type + '"></tr>');
  1133. tbodyElement.append(trElement);
  1134. addColumn(trElement, formattedTimeStamp, 'td', 'text-left');
  1135. var nominalPaymentAmount = data[i].paymentAmount;
  1136. if (data[i].source === 'banktransfer' || data[i].source === 'masterpayment') {
  1137. nominalPaymentAmount /= 100;
  1138. }
  1139. var formattedAmount = parseFloat(nominalPaymentAmount);
  1140. switch (data[i].source) {
  1141. case 'ethereum':
  1142.  
  1143. if (formattedAmount.toString().length > 10) {
  1144. formattedAmount = formattedAmount.toFixed(8);
  1145. }
  1146. formattedAmount = formattedAmount.toString() + ' ';
  1147. formattedAmount += 'ETH';
  1148. break;
  1149. case 'bitcoin':
  1150. if (formattedAmount.toString().length > 10) {
  1151. formattedAmount = formattedAmount.toFixed(8);
  1152. }
  1153. formattedAmount = formattedAmount.toString() + ' ';
  1154. formattedAmount += 'BTC';
  1155. break;
  1156. case 'refund':
  1157. formattedAmount = '';
  1158. break;
  1159. case 'creditcard':
  1160. case 'masterpayment':
  1161. case 'banktransfer':
  1162. case 'cryptovoucher':
  1163. case 'sofort':
  1164. formattedAmount = formattedAmount.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' ';
  1165. formattedAmount += 'EUR';
  1166. break;
  1167. default :
  1168. if (formattedAmount.toString().length > 10) {
  1169. formattedAmount = formattedAmount.toFixed(8);
  1170. }
  1171. formattedAmount = formattedAmount.toString() + ' ';
  1172. formattedAmount += data[i].source;
  1173. break;
  1174. }
  1175.  
  1176. addColumn(trElement, formattedAmount, 'td', 'text-right');
  1177. addColumn(trElement, capitalizeFirstLetter(data[i].source), 'td', 'text-center');
  1178. var tokens = parseFloat(data[i].tokens);
  1179. var exchangeRate = '1 : ' + Math.floor(tokens / nominalPaymentAmount).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  1180. if (data[i].source === 'refund') {
  1181. exchangeRate = '';
  1182. }
  1183. addColumn(trElement, exchangeRate, 'td', 'text-center');
  1184. var overallTokens = tokens;
  1185. if (data[i].timestamp < '2018-02-09T00:00:00.000Z') {
  1186. overallTokens = Math.floor(tokens * 1.3); // Pre-Sale bonus
  1187. }
  1188. earnedTokens += parseInt(overallTokens);
  1189. addColumn(trElement, overallTokens.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' SVD', 'td', 'text-right');
  1190. if (data[i].source === 'masterpayment' && data[i].paymentCode === 'CC.DB') {
  1191. addColumn(trElement, 'You\'ll be able to withdraw tokens in the <a href="https://play.google.com/store/apps/details?id=crypto.savedroid" target="_blank">crypto app</a>', 'td', 'text-left normal-whitespace', 1, true);
  1192. } else {
  1193. var dateTimestamp = new Date(data[i].timestamp);
  1194. dateTimestamp.setDate(dateTimestamp.getDate() + 19);
  1195. var dateCreatedAt = new Date(data[i].createdAt);
  1196. dateCreatedAt.setDate(dateTimestamp.getDate() + 12);
  1197. var dateMinting;
  1198. if (dateTimestamp > dateCreatedAt) {
  1199. dateMinting = dateTimestamp;
  1200. } else {
  1201. dateMinting = dateCreatedAt;
  1202. }
  1203. var today = new Date();
  1204. if (dateMinting > today) {
  1205. var formattedMintingDate = dateMinting.getUTCFullYear() + "/" +
  1206. ("0" + (dateMinting.getUTCMonth()+1)).slice(-2) + "/" +
  1207. ("0" + dateMinting.getUTCDate()).slice(-2);
  1208. addColumn(trElement, 'Payment confirmed! If not already done: finish KYC and set minting-mode and wallet in your profile to mint these tokens around <strong>' + formattedMintingDate + '</strong>.', 'td', 'text-left normal-whitespace', 1, true);
  1209. } else {
  1210. addColumn(trElement, 'You\'ll be able to withdraw tokens in the <a href="https://play.google.com/store/apps/details?id=crypto.savedroid" target="_blank">crypto app</a>', 'td', 'text-left normal-whitespace', 1, true);
  1211. }
  1212. }
  1213. break;
  1214. case 'minting':
  1215. var trElement = jQuery('<tr class="row-' + data[i].type + '"></tr>');
  1216. tbodyElement.append(trElement);
  1217. addColumn(trElement, formattedTimeStamp, 'td', 'text-left');
  1218. addColumn(trElement, '', 'td', 'text-center', 3);
  1219. var tokens = parseFloat(data[i].tokens);
  1220. var overallTokens = tokens;
  1221. earnedTokens += parseInt(overallTokens);
  1222. addColumn(trElement, overallTokens.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' SVD', 'td', 'text-right');
  1223. addColumn(trElement, 'Minted to ' + data[i].wallet, 'td', 'text-center');
  1224. break;
  1225. }
  1226. }
  1227. var responsiveTable = jQuery('<div class="table-responsive"></div>');
  1228. responsiveTable.append(tableElement);
  1229. jQuery('.payments .small-text').html('').append(responsiveTable);
  1230. jQuery('.payments .small-text').append('<br /><span id="start-kyc-text" class="resources"></span><br />Questions? Contact our <a href="https://t.me/savedroid_svd" style="text-decoration:underline;">Telegram support team</a> 24/7.');
  1231. updateKycStatus();
  1232. showKycStatus();
  1233. } else {
  1234. jQuery('.payments .small-text').html('No payments found.<br />Questions? Contact our <a href="https://t.me/savedroid_svd" style="text-decoration:underline;">Telegram support team</a> 24/7.')
  1235. }
  1236. jQuery('.payments .small-text').append('<br /><br /><a href="https://savedroid.zendesk.com/hc/en-us" target="_blank" style="text-transform:uppercase;font-weight:700;text-decoration:underline;">Common questions</a>');
  1237. balancesToLoad--;
  1238. },
  1239. dataType: 'json',
  1240. headers: {
  1241. 'X-Api-Key': 'sRQB9uuEIE4qLqdBlEtHD3PlhlgQdah358jb8Q3x'
  1242. }
  1243. }).fail(function (err) {
  1244. //console.log(err);
  1245. //console.log('in fail');
  1246. });
  1247. }/**/
  1248.  
  1249. balancesToLoad++;
  1250. cognitoUser.getUserAttributes(function (err, result) {
  1251. if (err) {
  1252. alert(err.message);
  1253. return;
  1254. }
  1255. localStorage.setItem('signupSuccess', true);
  1256.  
  1257. //console.log(result);
  1258.  
  1259. telegramUsername = '';
  1260.  
  1261. var hasReferal = false;
  1262. var hasName = false;
  1263. for (i = 0; i < result.length; i++) {
  1264. /*if (result[i].getName() === 'custom:paymentmethod') {
  1265. jQuery('.selectPaymentmethod [data-class=\'' + result[i].getValue() + '\']').click();
  1266. }*/
  1267. if (result[i].getName() === 'email') {
  1268. jQuery('span.cognitoemail').text(result[i].getValue());
  1269. jQuery('span.cognitoemailat').text(result[i].getValue().replace('@', '-at-'));
  1270. email = result[i].getValue();
  1271. }
  1272. if (result[i].getName() === 'sub') {
  1273. var link = 'https://ico.savedroid.com/?ref=' + result[i].getValue();
  1274. jQuery('a.referallink').attr('href', link);
  1275. jQuery('a.referallink').text(link);
  1276. username = result[i].getValue();
  1277. }
  1278. if (result[i].getName() === 'custom:referal') {
  1279. hasReferal = true;
  1280. referal = result[i].getValue();
  1281. }
  1282. if (result[i].getName() === 'name') {
  1283. hasName = true;
  1284. }
  1285. if (result[i].getName() === 'custom:wallet') {
  1286. etherwallet = result[i].getValue();
  1287. }
  1288. if (result[i].getName() === 'custom:btcwallet') {
  1289. btcwallet = result[i].getValue();
  1290. }
  1291.  
  1292. if (result[i].getName() === 'custom:telegram') {
  1293. telegramUsername = result[i].getValue();
  1294. jQuery('span.telegramUsername').text(telegramUsername);
  1295. if (telegramUsername) {
  1296. accountBalance += 100;
  1297. earnedTokens += 100;
  1298. }
  1299. }
  1300. if (result[i].getName() === 'custom:frommailchimp' && result[i].getValue() === 'unconfirmed') {
  1301. storeAttribute('custom:frommailchimp', 'confirmed');
  1302. }
  1303. }
  1304. balancesToLoad--;
  1305.  
  1306. if (hasReferal && !hasName) {
  1307. storeAttribute('name', referal);
  1308. }
  1309. if (!hasReferal) {
  1310. storeAttribute('custom:referal', localStorage.getItem('referal'));
  1311. storeAttribute('name', localStorage.getItem('referal'));
  1312. referal = localStorage.getItem('referal');
  1313. }
  1314.  
  1315.  
  1316. });
  1317. };
  1318.  
  1319. var initRefresh = function () {
  1320. var setCredentials = function () {
  1321. AWS.config.credentials = new AWS.CognitoIdentityCredentials({
  1322. IdentityPoolId: 'eu-central-1:0ab34b5b-8416-4f54-8650-50056d5d0c15',
  1323. Logins: {
  1324. 'cognito-idp.eu-central-1.amazonaws.com/eu-central-1_jjhzopINU': idToken
  1325. }
  1326. });
  1327. };
  1328.  
  1329. AWS.config.region = 'eu-central-1';
  1330. setCredentials();
  1331.  
  1332. setInterval(
  1333. function () {
  1334. // refresh the access token - first make sure we have the cognitoUser
  1335. if (cognitoUser === null) {
  1336. cognitoUser = userPool.getCurrentUser();
  1337. }
  1338.  
  1339. // get the session, so we can get the access token
  1340. if (cognitoUser != null) {
  1341. cognitoUser.getSession(function (err, session) {
  1342. if (err) {
  1343. alert(err.message);
  1344. return;
  1345. }
  1346. accessToken = session.getAccessToken().getJwtToken();
  1347. idToken = session.getIdToken().getJwtToken();
  1348.  
  1349. setCredentials();
  1350.  
  1351. AWS.config.credentials.refresh(function (error) {
  1352. if (error) {
  1353. console.error(error);
  1354. } else {
  1355. //console.log('Successfully refreshed');
  1356. }
  1357. });
  1358. });
  1359. }
  1360. },
  1361. 55 * 60 * 1000 // refresh after 55 minutes
  1362. )
  1363. };
  1364.  
  1365. var onAuthenticatedCallback;
  1366. var onAuthenticated = function(callback) {
  1367. onAuthenticatedCallback = callback;
  1368. }
  1369. var onNotAuthenticatedCallback;
  1370. var onNotAuthenticated = function(callback) {
  1371. onNotAuthenticatedCallback = callback;
  1372. }
  1373.  
  1374. var openForgetPassword = function () {
  1375. var popup = jQuery('#forget-password-popup');
  1376. showPopup(popup.find('.title').html(), popup.find('.description').html());
  1377. };
  1378.  
  1379. var passwordResetContext;
  1380. var pwUsername;
  1381. var pwPass;
  1382. var forgetPassword = function (email, callback, toInputVerificationCode, buttonElementForConfirm, buttonElement, resetSelectorFormConfirm) {
  1383. if (buttonElementForConfirm) {
  1384. var oldValueForConfirm = buttonElementForConfirm.val();
  1385. var oldBackgroundForConfirm = buttonElementForConfirm.css('background-color');
  1386.  
  1387. var resetButtonForConfirm = function () {
  1388. if (resetSelectorFormConfirm) {
  1389. buttonElementForConfirm = jQuery(resetSelectorFormConfirm);
  1390. }
  1391. buttonElementForConfirm.val(oldValueForConfirm);
  1392. buttonElementForConfirm.css('background-color', oldBackgroundForConfirm);
  1393. };
  1394. }
  1395. if (buttonElement) {
  1396. var oldValue = buttonElement.val();
  1397. buttonElement.val('Loading ...');
  1398. var oldBackground = buttonElement.css('background-color');
  1399. buttonElement.css('background-color', '#cccccc');
  1400. buttonElement.prop('disabled', true);
  1401.  
  1402. var resetButton = function () {
  1403. buttonElement.val(oldValue);
  1404. buttonElement.css('background-color', oldBackground);
  1405. buttonElement.prop('disabled', false);
  1406. };
  1407. }
  1408. //console.log('start forgetPassword');
  1409. var userData = {
  1410. Username: email,
  1411. Pool: userPool
  1412. };
  1413. pwUsername = email;
  1414. cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
  1415. //console.log(cognitoUser);
  1416. cognitoUser.forgotPassword({
  1417. onSuccess: function (result) {
  1418. if (callback) {
  1419. callback();
  1420. } else {
  1421. closePopup();
  1422. jQuery('.alertcontainer').html('');
  1423.  
  1424. login(pwUsername, pwPass);
  1425. }
  1426. //console.log('call result: ' + result);
  1427. },
  1428. onFailure: function (err) {
  1429. if (resetButton) {
  1430. resetButton();
  1431. }
  1432. if (resetButtonForConfirm) {
  1433. resetButtonForConfirm();
  1434. }
  1435. var alertElement = jQuery('#full-popup .alertcontainer');
  1436. if (alertElement.length) {
  1437. alertElement.html(getAlertHtml(err.message));
  1438. } else {
  1439. alert(err.message);
  1440. }
  1441. },
  1442. inputVerificationCode: function () {
  1443. if (toInputVerificationCode) {
  1444. toInputVerificationCode();
  1445. } else {
  1446. var popup = jQuery('#forget-password-confirmation-popup');
  1447. showPopup(popup.find('.title').html(), popup.find('.description').html());
  1448. }
  1449. passwordResetContext = this;
  1450. }
  1451. });
  1452. };
  1453.  
  1454. var confirmForgetPassword = function (code, password, buttonElement) {
  1455. if (buttonElement) {
  1456. var oldValue = buttonElement.val();
  1457. buttonElement.val('Loading ...');
  1458. var oldBackground = buttonElement.css('background-color');
  1459. buttonElement.css('background-color', '#cccccc');
  1460. }
  1461. pwPass = password;
  1462. //console.log('start confirmForgetPassword');
  1463. cognitoUser.confirmPassword(code, password, passwordResetContext);
  1464. };
  1465.  
  1466. var confirmUser = function (username, code, callback) {
  1467. var userData = {
  1468. Username: username,
  1469. Pool: userPool
  1470. };
  1471.  
  1472. var cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
  1473. cognitoUser.confirmRegistration(code, true, function (err, result) {
  1474. if (err) {
  1475. document.location.href = '/activation/?email=' + encodeURIComponent(username);
  1476. return;
  1477. }
  1478. //console.log('call result: ' + result);
  1479. if (callback) {
  1480. callback();
  1481. }
  1482. });
  1483. };
  1484.  
  1485. var disableMfa = function(callback) {
  1486. smsMfaSettings = {
  1487. PreferredMfa: false,
  1488. Enabled: false
  1489. };
  1490. cognitoUser.setUserMfaPreference(smsMfaSettings, null, function (err, result) {
  1491. if (err) {
  1492. alert(err);
  1493. }
  1494. cognitoUser.disableMFA(function(err2, result){
  1495. if(err2) {
  1496. alert(err2);
  1497. }
  1498. callback(err==null&&err2==null)
  1499. })
  1500. });
  1501. }
  1502.  
  1503. var enableMfa = function() {
  1504. cognitoUser.enableMFA(function(err, result) {
  1505. if (err) {
  1506. alert(err);
  1507. }
  1508. smsMfaSettings = {
  1509. PreferredMfa: true,
  1510. Enabled: true
  1511. };
  1512. cognitoUser.setUserMfaPreference(smsMfaSettings, null, function (err, result) {
  1513. if (err) {
  1514. alert(err);
  1515. }
  1516.  
  1517. closePopup();
  1518. jQuery('.alertcontainer').html('');
  1519.  
  1520. //console.log('set mfa preference', result)
  1521. });
  1522. })
  1523. }
  1524.  
  1525.  
  1526. var verifyPhoneNumberContext;
  1527. var verifyPhoneNumber = function () {
  1528.  
  1529. cognitoUser.getAttributeVerificationCode('phone_number', {
  1530. onSuccess: function (result) {
  1531. //console.log('got verification code', result);
  1532. enableMfa();
  1533.  
  1534. },
  1535. onFailure: function (err) {
  1536. //console.log('error on phone number verification', err);
  1537.  
  1538. var alertElement = jQuery('#phone-number-verification-popup .alertcontainer');
  1539. if (alertElement.length) {
  1540. alertElement.html(getAlertHtml(err.message));
  1541. } else {
  1542. alert(err.message);
  1543. }
  1544.  
  1545. verifyPhoneNumber();
  1546. },
  1547. inputVerificationCode: function () {
  1548. //console.log("show popup")
  1549. verifyPhoneNumberContext = this;
  1550.  
  1551. var popup = jQuery('#phone-number-verification-popup');
  1552. showPopup(popup.find('.title').html(), popup.find('.description').html());
  1553. }
  1554. });
  1555. };
  1556.  
  1557. var verifyPhoneNumberCode = function (code) {
  1558. cognitoUser.verifyAttribute('phone_number', code, verifyPhoneNumberContext);
  1559. };
  1560.  
  1561. var savePhoneNumber = function () {
  1562. var phoneNumber = jQuery('#full-popup #phone_number').val();
  1563.  
  1564. if (phoneNumber.length > 0) {
  1565. var attributeList = [];
  1566. var attribute = {
  1567. Name: 'phone_number',
  1568. Value: phoneNumber
  1569. };
  1570. var attribute = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserAttribute(attribute);
  1571. attributeList.push(attribute);
  1572.  
  1573. cognitoUser.updateAttributes(attributeList, function (err, result) {
  1574.  
  1575. if (err) {
  1576. //console.log('error on setting phone number', err);
  1577. return;
  1578. }
  1579.  
  1580. verifyPhoneNumber();
  1581. });
  1582. }
  1583. };
  1584.  
  1585. var onKeydownTokenAmount = function (e) {
  1586. e = e || window.event;
  1587.  
  1588. if (e.key == ".") {
  1589. e.preventDefault();
  1590. }
  1591.  
  1592. return true;
  1593. };
  1594.  
  1595. // send event to Google Analytics tracking of KYC (actually, we want to track how much the user invested)
  1596. var fireGtmKycEvent = function () {
  1597. ga('send', 'event', 'Purchase', 'click', 'SVD', tokensPaid);
  1598. };
  1599.  
  1600. var shouldFireGtmKycEvent = false;
  1601. var mayEnterDestinationWallet = false;
  1602. var tokensPaid = 0;
  1603.  
  1604. var submitKycForm = function (form, buttonElement) {
  1605. var firstName = form.find('#firstName').val();
  1606. var lastName = form.find('#lastName').val();
  1607. var country = form.find('#country').val() !== 'country of passport/ID' ? form.find('#country').val() : null;
  1608. var kycLevel = form.find('#kycLevel').val();
  1609. var deviceFingerPrint = form.find('#dfp').val();
  1610. var docType = form.find('#documentType').val();
  1611.  
  1612. var errorMessage = 'Please fill out all fields. Thanks a lot!';
  1613.  
  1614. var docTypeValid = true;
  1615. if (docType == 'none' && kycLevel > 1) {
  1616. docTypeValid = false;
  1617. errorMessage = "Please select a document type!";
  1618. }
  1619.  
  1620.  
  1621. var oldColor = buttonElement.css('background-color');
  1622. var oldText = buttonElement.val();
  1623. buttonElement.css('background-color', '#cccccc');
  1624. buttonElement.val('Loading ...');
  1625. buttonElement.prop('disabled', true);
  1626.  
  1627. var resetButton = function () {
  1628. buttonElement.css('background-color', oldColor);
  1629. buttonElement.val(oldText);
  1630. buttonElement.prop('disabled', false);
  1631. };
  1632.  
  1633. if (!firstName || !lastName || !country || !docTypeValid) {
  1634. //console.log(form.find('.alertcontainer'));
  1635. var alertElement = form.find('.alertcontainer');
  1636. if (alertElement.length) {
  1637. alertElement.html(getAlertHtml(errorMessage));
  1638. } else {
  1639. alert(errorMessage);
  1640. }
  1641. resetButton();
  1642. } else {
  1643. if (kycLevel == 1) {
  1644. jQuery.ajax({
  1645. type: "POST",
  1646. url: 'https://save-kyc1.ico.savedroid.com',
  1647. data: JSON.stringify({
  1648. accessToken: accessToken,
  1649. firstName: firstName,
  1650. lastName: lastName,
  1651. country: country,
  1652. deviceFingerPrint: deviceFingerPrint
  1653. }),
  1654. dataType: 'Text',
  1655. headers: {
  1656. 'X-Api-Key': 'DXTj2P2V2D7jEkFdFZfQ410qB6G1gXG68UmAsg6n'
  1657. },
  1658. success: function (res) {
  1659. updateKycStatus();
  1660. var result = JSON.parse(res);
  1661. if (result.message && result.message == 'ok') {
  1662. if (shouldFireGtmKycEvent) {
  1663. fireGtmKycEvent();
  1664. }
  1665. var popup = jQuery('#kyc-confirmation-popup');
  1666. showPopup(popup.find('.title').html(), popup.find('.description').html());
  1667. } else {
  1668. var alertElement = form.find('.alertcontainer');
  1669. if (alertElement.length) {
  1670. alertElement.html(getAlertHtml(result.message));
  1671. } else {
  1672. alert(result.message);
  1673. }
  1674. }
  1675. resetButton();
  1676. }
  1677. }).fail(function (err) {
  1678. //console.log('', err);
  1679. resetButton();
  1680. });
  1681. } else if (kycLevel >= 2) {
  1682. var documentFrontElementId = 'kyc2-document-front';
  1683. var documentBackElementId = 'kyc2-document-back';
  1684. var photoElementId = 'kyc2-photo';
  1685. var addressProofId = 'kyc3-address';
  1686.  
  1687. var documentFrontElement = document.getElementById(documentFrontElementId).files[0];
  1688. var documentBackElement = document.getElementById(documentBackElementId).files[0];
  1689. var photoElement = document.getElementById(photoElementId).files[0];
  1690. var addressProofElement = document.getElementById(addressProofId).files[0];
  1691.  
  1692. var sourceOfFunds = form.find('#source-of-funds').val() !== 'source of funds' ? form.find('#source-of-funds').val() : null;
  1693.  
  1694. // Check if front and photo are valid, back and addressProof are optional
  1695. if (typeof documentFrontElement === 'undefined' || typeof photoElement === 'undefined') {
  1696. var errorMessage = 'Please provide both documents to upload';
  1697. var alertElement = form.find('.alertcontainer');
  1698. if (alertElement.length) {
  1699. alertElement.html(getAlertHtml(errorMessage));
  1700. } else {
  1701. alert(errorMessage);
  1702. }
  1703. resetButton();
  1704. return;
  1705.  
  1706. }
  1707.  
  1708. if (kycLevel >= 4 && !sourceOfFunds) {
  1709. var errorMessage = 'Please provide the source of funds';
  1710. var alertElement = form.find('.alertcontainer');
  1711. if (alertElement.length) {
  1712. alertElement.html(getAlertHtml(errorMessage));
  1713. } else {
  1714. alert(errorMessage);
  1715. }
  1716. resetButton();
  1717. return;
  1718. }
  1719.  
  1720. var fileRegEx = '.*\.(png|jpeg|jpg|PNG|JPEG|JPG)$';
  1721. if (!documentFrontElement.name.match(fileRegEx)
  1722. || !photoElement.name.match(fileRegEx)
  1723. || (typeof documentBackElement !== 'undefined' && !documentBackElement.name.match(fileRegEx))
  1724. || (typeof addressProofElement !== 'undefined' && !addressProofElement.name.match(fileRegEx))) {
  1725. var errorMessage = 'Documents and photos must be in png/jpg format only!';
  1726. var alertElement = form.find('.alertcontainer');
  1727. if (alertElement.length) {
  1728. alertElement.html(getAlertHtml(errorMessage));
  1729. } else {
  1730. alert(errorMessage);
  1731. }
  1732. resetButton();
  1733. return;
  1734.  
  1735. }
  1736.  
  1737. var maxFileSize = 4 * 1024 * 1024; // 4MB
  1738. if (documentFrontElement.size > maxFileSize
  1739. || photoElement.size > maxFileSize
  1740. || (typeof documentBackElement !== 'undefined' && documentBackElement.size > maxFileSize)
  1741. || (typeof addressProofElement !== 'undefined' && addressProofElement.size > maxFileSize)) {
  1742. var errorMessage = 'The maximum file size is 4MB!';
  1743. var alertElement = form.find('.alertcontainer');
  1744. if (alertElement.length) {
  1745. alertElement.html(getAlertHtml(errorMessage));
  1746. } else {
  1747. alert(errorMessage);
  1748. }
  1749. resetButton();
  1750. return;
  1751.  
  1752. }
  1753.  
  1754. var onRetrieveUrlsCompleted = function (urlResults) {
  1755. if (urlResults.document_front.error || urlResults.photo.error || urlResults.document_back.error) {
  1756. var errorMessage = 'Please try again later.';
  1757. var alertElement = form.find('.alertcontainer');
  1758. if (alertElement.length) {
  1759. alertElement.html(getAlertHtml(errorMessage));
  1760. } else {
  1761. alert(errorMessage);
  1762. }
  1763. resetButton();
  1764.  
  1765. return;
  1766.  
  1767. }
  1768.  
  1769. var documentFrontUrl = urlResults.document_front.response.url;
  1770. var photoUrl = urlResults.photo.response.url;
  1771. var documentBackUrl = urlResults.document_back.response ? urlResults.document_back.response.url : null;
  1772. var addressProofUrl = urlResults.address_proof.response ? urlResults.address_proof.response.url : null;
  1773. var documentFrontFilename = urlResults.document_front.response.filename;
  1774. var photoFilename = urlResults.photo.response.filename;
  1775. var documentBackFilename = urlResults.document_back.response ? urlResults.document_back.response.filename : null;
  1776. var addressProofFilename = urlResults.address_proof.response ? urlResults.address_proof.response.filename : null;
  1777.  
  1778. var onUploadCompleted = function (uploadResults) {
  1779. if (username === '95ee52db-9dba-4f5d-8f07-a5e63cec5bfe') {
  1780. //console.log(uploadResults);
  1781. }
  1782. if (uploadResults.document_front.error || uploadResults.photo.error || uploadResults.document_back.error || uploadResults.address_proof.error) {
  1783. var errorMessage = 'Please try again later';
  1784. var alertElement = form.find('.alertcontainer');
  1785. if (alertElement.length) {
  1786. alertElement.html(getAlertHtml(errorMessage));
  1787. } else {
  1788. alert(errorMessage);
  1789. }
  1790. resetButton();
  1791.  
  1792. return;
  1793. }
  1794.  
  1795. var url;
  1796. var apiKey;
  1797.  
  1798. if (kycLevel == 2) {
  1799. url = 'https://save-kyc2.ico.savedroid.com';
  1800. apiKey = 'm3hJcJ6Tx7aFWP435iSWhaaxfQKD43l591kSoFm1';
  1801. } else if (kycLevel == 3) {
  1802. url = 'https://save-kyc3.ico.savedroid.com';
  1803. apiKey = 'EQoILDJTua9UuOdnbTeuT78RYiI7T7161juWFbvu';
  1804. } else if (kycLevel == 4) {
  1805. url = 'https://save-kyc4.ico.savedroid.com';
  1806. apiKey = 'wGtJMJjTuta1i1QsGDrL76rOqv1hLg583T4aFbmc';
  1807. }
  1808.  
  1809. jQuery.ajax({
  1810. type: "POST",
  1811. url: url,
  1812. data: JSON.stringify({
  1813. accessToken: accessToken,
  1814. firstName: firstName,
  1815. lastName: lastName,
  1816. country: country,
  1817. deviceFingerPrint: deviceFingerPrint,
  1818. documentFilename: documentFrontFilename,
  1819. documentBacksideFilename: documentBackFilename,
  1820. documentType: docType,
  1821. addressFilename: addressProofFilename,
  1822. photoFilename: photoFilename,
  1823. sourceOfFunds: sourceOfFunds
  1824. }),
  1825. dataType: 'Text',
  1826. headers: {
  1827. 'X-Api-Key': apiKey
  1828. },
  1829. success: function (res) {
  1830. updateKycStatus();
  1831. var result = JSON.parse(res);
  1832. if (result.message && result.message == 'ok') {
  1833. if (shouldFireGtmKycEvent) {
  1834. fireGtmKycEvent();
  1835. }
  1836. var popup = jQuery('#kyc-confirmation-popup');
  1837. showPopup(popup.find('.title').html(), popup.find('.description').html());
  1838. } else {
  1839. var alertElement = form.find('.alertcontainer');
  1840. if (alertElement.length) {
  1841. alertElement.html(getAlertHtml(result.message));
  1842. } else {
  1843. alert(result.message);
  1844. }
  1845. }
  1846. resetButton();
  1847. }
  1848. }).fail(function (err) {
  1849. var alertElement = form.find('.alertcontainer');
  1850. if (alertElement.length) {
  1851. alertElement.html(getAlertHtml(err));
  1852. } else {
  1853. alert(err);
  1854. }
  1855. resetButton();
  1856. });
  1857. };
  1858.  
  1859. var uploadResults = {
  1860. document_front: {},
  1861. document_back: {},
  1862. photo: {},
  1863. address_proof: {},
  1864. };
  1865.  
  1866. uploadFile(documentFrontElement, documentFrontUrl, function (errorDocumentFront) {
  1867. uploadResults.document_front.error = errorDocumentFront;
  1868. uploadFile(photoElement, photoUrl, function (errorPhoto) {
  1869. uploadResults.photo.error = errorPhoto;
  1870.  
  1871. var uploadState = {
  1872. document_back: 'none',
  1873. address_proof: 'none',
  1874. }
  1875.  
  1876. if (urlResults.document_back.response) {
  1877. uploadFile(documentBackElement, documentBackUrl, function (errorDocumentBack) {
  1878. uploadResults.document_back.error = errorDocumentBack;
  1879. uploadState.document_back = 'done';
  1880.  
  1881. });
  1882.  
  1883. uploadState.document_back = 'started';
  1884. }
  1885.  
  1886. if (urlResults.address_proof.response) {
  1887. uploadFile(addressProofElement, addressProofUrl, function (errorAddressProof) {
  1888. uploadResults.address_proof.error = errorAddressProof;
  1889. uploadState.address_proof = 'done';
  1890.  
  1891. });
  1892.  
  1893. uploadState.address_proof = 'started';
  1894. }
  1895.  
  1896. var waiting = setInterval(function () {
  1897. if (uploadState.document_back != 'started' && uploadState.address_proof != 'started') {
  1898. onUploadCompleted(uploadResults);
  1899. clearInterval(waiting);
  1900.  
  1901. }
  1902. }, 50);
  1903.  
  1904. })
  1905. });
  1906.  
  1907. }
  1908.  
  1909. var urlResults = {
  1910. document_front: {},
  1911. document_back: {},
  1912. photo: {},
  1913. address_proof: {},
  1914. };
  1915.  
  1916. getUploadUrl('document_front', documentFrontElement.name, function (errorDocumentFront, responseDocumentFront) {
  1917. urlResults['document_front'] = {
  1918. error: errorDocumentFront,
  1919. response: responseDocumentFront
  1920. };
  1921. getUploadUrl('photo', photoElement.name, function (errorPhoto, responsePhoto) {
  1922. urlResults['photo'] = {
  1923. error: errorPhoto,
  1924. response: responsePhoto
  1925. };
  1926.  
  1927. var urlRetrievalState = {
  1928. document_back: 'none',
  1929. address_proof: 'none',
  1930. }
  1931.  
  1932. if (typeof documentBackElement !== 'undefined') {
  1933. getUploadUrl('document_back', documentBackElement.name, function (errorDocumentBack, responseDocumentBack) {
  1934. urlResults['document_back'] = {
  1935. error: errorDocumentBack,
  1936. response: responseDocumentBack
  1937. }
  1938. urlRetrievalState.document_back = 'done';
  1939.  
  1940. });
  1941.  
  1942. urlRetrievalState.document_back = 'started';
  1943. }
  1944.  
  1945. if (typeof addressProofElement !== 'undefined') {
  1946. getUploadUrl('address_proof', addressProofElement.name, function (errorAddressProof, responseAddressProof) {
  1947. urlResults['address_proof'] = {
  1948. error: errorAddressProof,
  1949. response: responseAddressProof
  1950. }
  1951. urlRetrievalState.address_proof = 'done';
  1952.  
  1953. });
  1954.  
  1955. urlRetrievalState.address_proof = 'started';
  1956. }
  1957.  
  1958. var waiting = setInterval(function () {
  1959. if (urlRetrievalState.document_back != 'started' && urlRetrievalState.address_proof != 'started') {
  1960. onRetrieveUrlsCompleted(urlResults);
  1961. clearInterval(waiting);
  1962.  
  1963. }
  1964. }, 50);
  1965.  
  1966. });
  1967. });
  1968. }
  1969. }
  1970. };
  1971.  
  1972. var submitVIPForm = function (form, buttonElement, reservationId) {
  1973. console.log(reservationId)
  1974. var firstName = form.find('#firstName').val();
  1975. var lastName = form.find('#lastName').val();
  1976. var country = form.find('#country').val() !== 'country of passport/ID' ? form.find('#country').val() : null;
  1977. var kycLevel = form.find('#kycLevel').val();
  1978. var deviceFingerPrint = form.find('#dfp').val();
  1979. var docType = form.find('#documentType').val();
  1980.  
  1981. var errorMessage = 'Please fill out all fields. Thanks a lot!';
  1982.  
  1983. var docTypeValid = true;
  1984. if (docType == 'none') {
  1985. docTypeValid = false;
  1986. errorMessage = "Please select a document type!";
  1987. }
  1988.  
  1989.  
  1990. var oldColor = buttonElement.css('background-color');
  1991. var oldText = buttonElement.val();
  1992. buttonElement.css('background-color', '#cccccc');
  1993. buttonElement.val('Loading ...');
  1994. buttonElement.prop('disabled', true);
  1995.  
  1996. var resetButton = function () {
  1997. buttonElement.css('background-color', oldColor);
  1998. buttonElement.val(oldText);
  1999. buttonElement.prop('disabled', false);
  2000. };
  2001.  
  2002. if (!firstName || !lastName || !country || !docTypeValid) {
  2003. //console.log(form.find('.alertcontainer'));
  2004. var alertElement = form.find('.alertcontainer');
  2005. if (alertElement.length) {
  2006. alertElement.html(getAlertHtml(errorMessage));
  2007. } else {
  2008. alert(errorMessage);
  2009. }
  2010. resetButton();
  2011. } else {
  2012. var documentFrontElementId = 'kyc2-document-front';
  2013. var documentBackElementId = 'kyc2-document-back';
  2014. var photoElementId = 'kyc2-photo';
  2015. var addressProofId = 'kyc3-address';
  2016.  
  2017. var documentFrontElement = document.getElementById(documentFrontElementId).files[0];
  2018. var documentBackElement = document.getElementById(documentBackElementId).files[0];
  2019. var photoElement = document.getElementById(photoElementId).files[0];
  2020. var addressProofElement = document.getElementById(addressProofId).files[0];
  2021.  
  2022. var sourceOfFunds = form.find('#source-of-funds').val() !== 'source of funds' ? form.find('#source-of-funds').val() : null;
  2023.  
  2024. // Check if front and photo are valid, back and addressProof are optional
  2025. if (typeof documentFrontElement === 'undefined' || typeof photoElement === 'undefined') {
  2026. var errorMessage = 'Please provide both documents to upload';
  2027. var alertElement = form.find('.alertcontainer');
  2028. if (alertElement.length) {
  2029. alertElement.html(getAlertHtml(errorMessage));
  2030. } else {
  2031. alert(errorMessage);
  2032. }
  2033. resetButton();
  2034. return;
  2035.  
  2036. }
  2037.  
  2038.  
  2039. var fileRegEx = '.*\.(png|jpeg|jpg|PNG|JPEG|JPG)$';
  2040. if (!documentFrontElement.name.match(fileRegEx)
  2041. || !photoElement.name.match(fileRegEx)
  2042. || (typeof documentBackElement !== 'undefined' && !documentBackElement.name.match(fileRegEx))
  2043. || (typeof addressProofElement !== 'undefined' && !addressProofElement.name.match(fileRegEx))) {
  2044. var errorMessage = 'Documents and photos must be in png/jpg format only!';
  2045. var alertElement = form.find('.alertcontainer');
  2046. if (alertElement.length) {
  2047. alertElement.html(getAlertHtml(errorMessage));
  2048. } else {
  2049. alert(errorMessage);
  2050. }
  2051. resetButton();
  2052. return;
  2053.  
  2054. }
  2055.  
  2056. var maxFileSize = 4 * 1024 * 1024; // 4MB
  2057. if (documentFrontElement.size > maxFileSize
  2058. || photoElement.size > maxFileSize
  2059. || (typeof documentBackElement !== 'undefined' && documentBackElement.size > maxFileSize)
  2060. || (typeof addressProofElement !== 'undefined' && addressProofElement.size > maxFileSize)) {
  2061. var errorMessage = 'The maximum file size is 4MB!';
  2062. var alertElement = form.find('.alertcontainer');
  2063. if (alertElement.length) {
  2064. alertElement.html(getAlertHtml(errorMessage));
  2065. } else {
  2066. alert(errorMessage);
  2067. }
  2068. resetButton();
  2069. return;
  2070.  
  2071. }
  2072.  
  2073. var onRetrieveUrlsCompleted = function (urlResults) {
  2074. if (urlResults.document_front.error || urlResults.photo.error || urlResults.document_back.error) {
  2075. var errorMessage = 'Please try again later.';
  2076. var alertElement = form.find('.alertcontainer');
  2077. if (alertElement.length) {
  2078. alertElement.html(getAlertHtml(errorMessage));
  2079. } else {
  2080. alert(errorMessage);
  2081. }
  2082. resetButton();
  2083.  
  2084. return;
  2085.  
  2086. }
  2087.  
  2088. var documentFrontUrl = urlResults.document_front.response.url;
  2089. var photoUrl = urlResults.photo.response.url;
  2090. var documentBackUrl = urlResults.document_back.response ? urlResults.document_back.response.url : null;
  2091. var addressProofUrl = urlResults.address_proof.response ? urlResults.address_proof.response.url : null;
  2092. var documentFrontFilename = urlResults.document_front.response.filename;
  2093. var photoFilename = urlResults.photo.response.filename;
  2094. var documentBackFilename = urlResults.document_back.response ? urlResults.document_back.response.filename : null;
  2095. var addressProofFilename = urlResults.address_proof.response ? urlResults.address_proof.response.filename : null;
  2096.  
  2097. var onUploadCompleted = function (uploadResults) {
  2098. if (uploadResults.document_front.error || uploadResults.photo.error || uploadResults.document_back.error || uploadResults.address_proof.error) {
  2099. var errorMessage = 'Please try again later';
  2100. var alertElement = form.find('.alertcontainer');
  2101. if (alertElement.length) {
  2102. alertElement.html(getAlertHtml(errorMessage));
  2103. } else {
  2104. alert(errorMessage);
  2105. }
  2106. resetButton();
  2107.  
  2108. return;
  2109. }
  2110.  
  2111. var url = 'https://vip-customers.ico.savedroid.com';
  2112. var apiKey = 'dfGh3HZa3T71OUD6kiBSK82rTjCOSIWj6Zf9jRYw';
  2113.  
  2114.  
  2115. jQuery.ajax({
  2116. type: "PUT",
  2117. url: url,
  2118. data: JSON.stringify({
  2119. accessToken: accessToken,
  2120. firstName: firstName,
  2121. lastName: lastName,
  2122. country: country,
  2123. deviceFingerPrint: deviceFingerPrint,
  2124. documentFilename: documentFrontFilename,
  2125. documentBacksideFilename: documentBackFilename,
  2126. documentType: docType,
  2127. addressFilename: addressProofFilename,
  2128. photoFilename: photoFilename,
  2129. sourceOfFunds: sourceOfFunds,
  2130. reservationId : reservationId
  2131. }),
  2132. dataType: 'Text',
  2133. headers: {
  2134. 'X-Api-Key': apiKey
  2135. },
  2136. success: function (res) {
  2137. var result = JSON.parse(res);
  2138. if (result.message && result.message == 'success') {
  2139. var popup = jQuery('#vip-confirmation-popup');
  2140. showPopup(popup.find('.title').html(), popup.find('.description').html());
  2141.  
  2142. var check = setInterval(function() {
  2143. jQuery.ajax({
  2144. type: "POST",
  2145. data: JSON.stringify({"accessToken": accessToken}),
  2146. url: url,
  2147. success: function (data) {
  2148. if(data.approved == true) {
  2149. clearInterval(check)
  2150. startCcPayment(reservationId)
  2151. }
  2152. },
  2153. dataType: 'json',
  2154. headers: {
  2155. 'X-Api-Key': apiKey
  2156. }
  2157. })
  2158. }, 30000)
  2159.  
  2160. setTimeout(function() {
  2161. clearInterval(check)
  2162. jQuery('#full-popup .spinner').fadeOut()
  2163. jQuery('#full-popup .status-image').attr('src', '/img/johnny_confused.png')
  2164.  
  2165. jQuery('#full-popup p.status').html('Ohh no, our support team is very busy right now. We will send you an email as soon as the verification is done.')
  2166. }, 180000)
  2167.  
  2168. } else {
  2169. var alertElement = form.find('.alertcontainer');
  2170. if (alertElement.length) {
  2171. alertElement.html(getAlertHtml(result.message));
  2172. } else {
  2173. alert(result.message);
  2174. }
  2175. }
  2176. resetButton();
  2177. }
  2178. }).fail(function (err) {
  2179. var alertElement = form.find('.alertcontainer');
  2180. if (alertElement.length) {
  2181. alertElement.html(getAlertHtml(err));
  2182. } else {
  2183. alert(err);
  2184. }
  2185. resetButton();
  2186. });
  2187. };
  2188.  
  2189. var uploadResults = {
  2190. document_front: {},
  2191. document_back: {},
  2192. photo: {},
  2193. address_proof: {},
  2194. };
  2195.  
  2196. uploadFile(documentFrontElement, documentFrontUrl, function (errorDocumentFront) {
  2197. uploadResults.document_front.error = errorDocumentFront;
  2198. uploadFile(photoElement, photoUrl, function (errorPhoto) {
  2199. uploadResults.photo.error = errorPhoto;
  2200.  
  2201. var uploadState = {
  2202. document_back: 'none',
  2203. address_proof: 'none',
  2204. }
  2205.  
  2206. if (urlResults.document_back.response) {
  2207. uploadFile(documentBackElement, documentBackUrl, function (errorDocumentBack) {
  2208. uploadResults.document_back.error = errorDocumentBack;
  2209. uploadState.document_back = 'done';
  2210.  
  2211. });
  2212.  
  2213. uploadState.document_back = 'started';
  2214. }
  2215.  
  2216. if (urlResults.address_proof.response) {
  2217. uploadFile(addressProofElement, addressProofUrl, function (errorAddressProof) {
  2218. uploadResults.address_proof.error = errorAddressProof;
  2219. uploadState.address_proof = 'done';
  2220.  
  2221. });
  2222.  
  2223. uploadState.address_proof = 'started';
  2224. }
  2225.  
  2226. var waiting = setInterval(function () {
  2227. if (uploadState.document_back != 'started' && uploadState.address_proof != 'started') {
  2228. onUploadCompleted(uploadResults);
  2229. clearInterval(waiting);
  2230.  
  2231. }
  2232. }, 50);
  2233.  
  2234. })
  2235. });
  2236.  
  2237. }
  2238.  
  2239. var urlResults = {
  2240. document_front: {},
  2241. document_back: {},
  2242. photo: {},
  2243. address_proof: {},
  2244. };
  2245.  
  2246. getVipUploadUrl('document_front', documentFrontElement.name, function (errorDocumentFront, responseDocumentFront) {
  2247. urlResults['document_front'] = {
  2248. error: errorDocumentFront,
  2249. response: responseDocumentFront
  2250. };
  2251. getVipUploadUrl('photo', photoElement.name, function (errorPhoto, responsePhoto) {
  2252. urlResults['photo'] = {
  2253. error: errorPhoto,
  2254. response: responsePhoto
  2255. };
  2256.  
  2257. var urlRetrievalState = {
  2258. document_back: 'none',
  2259. address_proof: 'none',
  2260. }
  2261.  
  2262. if (typeof documentBackElement !== 'undefined') {
  2263. getVipUploadUrl('document_back', documentBackElement.name, function (errorDocumentBack, responseDocumentBack) {
  2264. urlResults['document_back'] = {
  2265. error: errorDocumentBack,
  2266. response: responseDocumentBack
  2267. }
  2268. urlRetrievalState.document_back = 'done';
  2269.  
  2270. });
  2271.  
  2272. urlRetrievalState.document_back = 'started';
  2273. }
  2274.  
  2275. if (typeof addressProofElement !== 'undefined') {
  2276. getVipUploadUrl('address_proof', addressProofElement.name, function (errorAddressProof, responseAddressProof) {
  2277. urlResults['address_proof'] = {
  2278. error: errorAddressProof,
  2279. response: responseAddressProof
  2280. }
  2281. urlRetrievalState.address_proof = 'done';
  2282.  
  2283. });
  2284.  
  2285. urlRetrievalState.address_proof = 'started';
  2286. }
  2287.  
  2288. var waiting = setInterval(function () {
  2289. if (urlRetrievalState.document_back != 'started' && urlRetrievalState.address_proof != 'started') {
  2290. onRetrieveUrlsCompleted(urlResults);
  2291. clearInterval(waiting);
  2292.  
  2293. }
  2294. }, 50);
  2295.  
  2296. });
  2297. });
  2298.  
  2299. }
  2300. };
  2301.  
  2302.  
  2303. var uploadFile = function(element, url, callback) {
  2304. jQuery.ajax({
  2305. url: url,
  2306. type: 'PUT',
  2307. data: element,
  2308. processData: false
  2309. }).done(function(){
  2310. callback();
  2311. }).fail(function(error){
  2312. //console.log("An error occurred, the files couldn't be sent!", error);
  2313. callback(error);
  2314. });
  2315. };
  2316.  
  2317.  
  2318. var getVipUploadUrl = function(prefix, filename, callback) {
  2319. jQuery.ajax({
  2320. type: "POST",
  2321. url: 'https://start-vip-file-upload.ico.savedroid.com',
  2322. data: JSON.stringify({accessToken: accessToken, filename: prefix + '_' + filename}),
  2323. dataType: 'Text',
  2324. headers: {
  2325. 'X-Api-Key': 'rmN73wlhrG7xGElDE8ZCV3QTcXtwBHte5qhyPXQl'
  2326. },
  2327. success: function (response) {
  2328. var result = JSON.parse(response);
  2329. callback(null, result);
  2330. }
  2331. }).fail(function (error) {
  2332. callback(error);
  2333. });
  2334. };
  2335.  
  2336. var getUploadUrl = function(prefix, filename, callback) {
  2337. jQuery.ajax({
  2338. type: "POST",
  2339. url: 'https://start-file-upload.ico.savedroid.com',
  2340. data: JSON.stringify({accessToken: accessToken, filename: prefix + '_' + filename}),
  2341. dataType: 'Text',
  2342. headers: {
  2343. 'X-Api-Key': 'URtecjLAcd83F8D8qcrRV7IHiO9pdHYY164pWaWV'
  2344. },
  2345. success: function (response) {
  2346. var result = JSON.parse(response);
  2347. callback(null, result);
  2348. }
  2349. }).fail(function (error) {
  2350. callback(error);
  2351. });
  2352. };
  2353.  
  2354. const getKycStatus = function (callback) {
  2355. jQuery.ajax({
  2356. type: "POST",
  2357. url: 'https://get-kyc-required.ico.savedroid.com',
  2358. data: JSON.stringify({accessToken: accessToken}),
  2359. dataType: 'Text',
  2360. headers: {
  2361. 'X-Api-Key': 'dqSrDom0xfaWYbx7dPD3L4RQxaJOt4yCaOnRJK8y'
  2362. },
  2363. success: callback
  2364. }).fail(function (err) {
  2365. //console.log('', err);
  2366. });
  2367. };
  2368.  
  2369. const updateKycStatus = function () {
  2370. getKycStatus(function (res) {
  2371. var response = JSON.parse(res);
  2372. kycStatus = response;
  2373. if (response.required === null) {
  2374. jQuery('#start-kyc-text').text("")
  2375. } else if (response.required > response.submitted) {
  2376. if (response.required == 1 && response.submitted == null) {
  2377. jQuery('#start-kyc-text').html('<a href="" onclick="showKycPopup(); return false;" style="width: auto; font-size: 1.2em; padding-left: 30px; padding-right: 30px; margin:0 auto 20px;">Proceed with KYC</a>');
  2378. } else if (response.required == 2 && (response.submitted === null || response.submitted < 2)) {
  2379. jQuery('#start-kyc-text').html('<a href="" onclick="showKycPopup(); return false;" style="width: auto; font-size: 1.2em; padding-left: 30px; padding-right: 30px; margin:0 auto 20px;">Proceed with KYC</a>');
  2380. } else if (response.required == 3 && (response.submitted === null || response.submitted < 3)) {
  2381. jQuery('#start-kyc-text').html('<a href="" onclick="showKycPopup(); return false;" style="width: auto; font-size: 1.2em; padding-left: 30px; padding-right: 30px; margin:0 auto 20px;">Proceed with KYC</a>');
  2382. } else if (response.required == 4 && (response.submitted === null || response.submitted < 4)) {
  2383. jQuery('#start-kyc-text').html('<a href="" onclick="showKycPopup(); return false;" style="width: auto; font-size: 1.2em; padding-left: 30px; padding-right: 30px; margin:0 auto 20px;">Proceed with KYC</a>');
  2384. }
  2385. } else if(response.submitted >= response.required && (response.completed == null || response.completed < response.submitted)) {
  2386. jQuery('#start-kyc-text').text("KYC in progress, this can take up to 14 days.")
  2387. } else if(response.completed >= response.required) {
  2388. jQuery('#start-kyc-text').text("KYC completed. The minting of tokens is made in batches and will happen in a few days.")
  2389. }
  2390. });
  2391. };
  2392.  
  2393. var kycStatus;
  2394. var showKycStatus = function() {
  2395. getKycStatus(function (res) {
  2396. var response = JSON.parse(res);
  2397. kycStatus = response;
  2398.  
  2399. if (response.required === null) {
  2400. jQuery('#start-kyc-text').text("")
  2401. } else if (response.required > response.submitted) {
  2402. if (response.submitted === null) {
  2403. shouldFireGtmKycEvent = true;
  2404. mayEnterDestinationWallet = true;
  2405. tokensPaid = response.tokensPaid;
  2406. jQuery('#eth-wallet-address').removeClass('hidden');
  2407. }
  2408.  
  2409. var popup = jQuery('#kyc-popup');
  2410. popup.find('#kycLevel').attr('value', response.required);
  2411.  
  2412. if (response.required == 1 && response.submitted == null) {
  2413. jQuery('#start-kyc-text').html('<a href="" onclick="showKycPopup(); return false;">Proceed with KYC</a>');
  2414. showKycPopup();
  2415. } else if (response.required >= 2 && (response.submitted === null || response.submitted < response.required)) {
  2416. popup.find('#kyc2-file-uploads').removeClass('hidden');
  2417. if (response.required >= 3) {
  2418. popup.find('#kyc3-address-verification').removeClass('hidden');
  2419. }
  2420. if (response.required >=4) {
  2421. popup.find('#kyc4-source-of-funds').removeClass('hidden');
  2422. }
  2423. showKycPopup();
  2424. }
  2425.  
  2426. } else if(response.submitted >= response.required && (response.completed == null || response.completed < response.submitted)) {
  2427. jQuery('#start-kyc-text').text("KYC in progress, this can take up to 14 days.")
  2428. } else if(response.completed >= response.required) {
  2429. jQuery('#start-kyc-text').text("KYC completed")
  2430. }
  2431. });
  2432. };
  2433.  
  2434. var showKycPopup = function() {
  2435. showPopup(jQuery('#kyc-popup').find('.title').html(), jQuery('#kyc-popup').find('.description').html());
  2436.  
  2437. // pre-fill popup with user's country
  2438. if (userCountry !== null)
  2439. {
  2440. jQuery('#country').val(userCountry);
  2441. }
  2442. }
  2443.  
  2444. var showVIPPopup = function(reservationId) {
  2445. showPopup(jQuery('#vip-popup').find('.title').html(), jQuery('#vip-popup').find('.description').html());
  2446.  
  2447. jQuery('#full-popup input[type=submit]').click(function() {
  2448. submitVIPForm(jQuery('#full-popup form'), jQuery(this), reservationId)
  2449. })
  2450. // pre-fill popup with user's country
  2451. if (userCountry !== null)
  2452. {
  2453. jQuery('#country').val(userCountry);
  2454. }
  2455. }
  2456.  
  2457. var onMasterPaymentSuccess = function(reservationId) {
  2458. if(reservationId) {
  2459. var reservation = tokenReservations.filter(function(res) {
  2460. return res.reservationId == reservationId
  2461. })
  2462. if(reservation.length > 0) {
  2463. reservation.state = "processing"
  2464. ga('send', 'event', 'PurchaseMainsale', 'paid', reservation[0].type, reservation[0].tokens);
  2465. jQuery("#"+reservation[0].reservationId).data().update(reservation)
  2466. }
  2467. }
  2468. }
  2469.  
  2470.  
  2471. var getReservations = function(first) {
  2472. //console.log("load reservations")
  2473. jQuery('#reservedtokens').addClass('hidden');
  2474.  
  2475. var list = jQuery('#reservation-list')
  2476. list.find("tbody").html("<tr><td><p class='empty small-text' style='padding-bottom: 30px;max-width: 80%;display: block;margin: auto;'><div class='spinner' style='display: inline;'><div class='bounce1'></div> <div class='bounce2'></div> <div class='bounce3'></div> </div></p></td></tr>")
  2477.  
  2478. balancesToLoad++;
  2479. if(accessToken) {
  2480. jQuery.ajax({
  2481. type: "POST",
  2482. data: JSON.stringify({
  2483. 'accessToken': accessToken
  2484. }),
  2485. url: 'https://get-reservations.ico.savedroid.com',
  2486. success: function(result) {
  2487. tokenReservations = result
  2488. if(buildReservationList) {
  2489. buildReservationList(result)
  2490. if (first) {
  2491. list.find('.start-payment:visible').click()
  2492. }
  2493. }
  2494. balancesToLoad--;
  2495.  
  2496. },
  2497. headers: {
  2498. 'X-Api-Key': 'g5UFauROAfIUtzACwKh35xtSWTUTkQ4vfha9BL30'
  2499. }
  2500. }).fail(function (err) {
  2501.  
  2502.  
  2503. buildReservationList(null)
  2504. });
  2505. }
  2506.  
  2507. }
  2508.  
  2509.  
  2510. var storeReservation = function (reservation, update, submitButton) {
  2511.  
  2512. var buttonElement = jQuery(submitButton);
  2513. var oldColor = buttonElement.css('background-color');
  2514. var oldText = buttonElement.val();
  2515. buttonElement.css('background-color', '#cccccc');
  2516. buttonElement.val('Loading ...');
  2517. buttonElement.prop('disabled', true);
  2518. var resetButton = function () {
  2519. buttonElement.css('background-color', oldColor);
  2520. buttonElement.val(oldText);
  2521. buttonElement.prop('disabled', false);
  2522. };
  2523.  
  2524. var jsondatastring = JSON.stringify({
  2525. "accessToken": accessToken,
  2526. "sub": username,
  2527. reservation : reservation,
  2528. 'country': userCountry
  2529.  
  2530. });
  2531. jQuery.ajax({
  2532. type: update ? "PUT" : "POST",
  2533. url: 'https://save-reservation.ico.savedroid.com',
  2534. data: jsondatastring,
  2535. statusCode: {
  2536. 403: function() {
  2537. location.reload();
  2538. }
  2539. },
  2540. success: function(result) {
  2541. var reservationId = JSON.parse(result).reservationId
  2542. if(update) {
  2543. var editedReservation = editedReservations.filter(function(res) { return res.reservationId == reservation.reservationId })
  2544. if(editedReservation.length > 0) {
  2545. ga('send', 'event', 'Reservation', 'edit', 'SVD', parseFloat(reservation.tokens) - parseFloat(editedReservation[0].tokens));
  2546. fbq('track', 'Reservation', {
  2547. action : 'edit',
  2548. amount : parseFloat(reservation.tokens) - parseFloat(editedReservation[0].tokens)
  2549. });
  2550. }
  2551. } else {
  2552. ga('send', 'event', 'Reservation', 'create', 'SVD', reservation.tokens);
  2553. fbq('track', 'Reservation', {
  2554. action : 'create',
  2555. amount : reservation.tokens
  2556. });
  2557. }
  2558. editedReservations = editedReservations.filter(function(res) { return res.reservationId != reservation.reservationId })
  2559.  
  2560. if(!reservation.state) {
  2561. reservation["reservationId"] = reservationId
  2562. tokenReservations.push(reservation)
  2563. } else {
  2564. showPopup("Yeah!", '<img alt="Big Johnny likes it" src="/img/big_johnny_thumbsup.png" scale="0" style=" width: 150px; display: block; margin: auto; margin-top: 30px; margin-bottom: 30px; "><p class="text-center">You successfully purchased ' + reservation.tokens.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',') + ' SVD!</p>')
  2565.  
  2566. }
  2567.  
  2568. jQuery(window).scrollTop(0);
  2569. getReservations()
  2570. },
  2571. dataType: 'Text',
  2572. headers: {
  2573. 'X-Api-Key': '1dhMrT7NFU9wQPMrcX5ZI7a0XPmJOYAl93IOB8y1'
  2574. }
  2575. }).fail(function (err) {
  2576. editedReservations = editedReservations.filter(function(res) { return res.reservationId != reservation.reservationId })
  2577. var alertElement = jQuery('#full-popup .alertcontainer');
  2578. var err = parseJSONIfNeeded(err.responseText)
  2579. if (alertElement.length) {
  2580. alertElement.html(getAlertHtml(err.message));
  2581. } else {
  2582. alert(err.message);
  2583. }
  2584. resetButton();
  2585. });
  2586.  
  2587. };
  2588.  
  2589. var parseJSONIfNeeded = function(value) {
  2590. if(value !== null && typeof value !== 'object' && typeof value === 'string') {
  2591. value = JSON.parse(value)
  2592. }
  2593. return value
  2594. }
  2595.  
  2596. var cancelReservation = function (reservation, success, fail) {
  2597.  
  2598. jQuery.ajax({
  2599. type: "DELETE",
  2600. url: 'https://save-reservation.ico.savedroid.com',
  2601. data: JSON.stringify({
  2602. sub : username,
  2603. reservation : reservation,
  2604. accessToken : accessToken
  2605. }),
  2606. success: success,
  2607. headers: {
  2608. 'X-Api-Key': '1dhMrT7NFU9wQPMrcX5ZI7a0XPmJOYAl93IOB8y1'
  2609. }
  2610. }).fail(function (err) {
  2611. fail()
  2612. var alertElement = jQuery('#full-popup .alertcontainer');
  2613. if (alertElement.length) {
  2614. alertElement.html(getAlertHtml(err.responseText.message));
  2615. } else {
  2616. alert(err.responseText.message);
  2617. }
  2618. });
  2619. }
  2620.  
  2621. var showToast = function(content) {
  2622. var snackbar = jQuery("#snackbar")
  2623. if(snackbar) {
  2624. snackbar.html(content)
  2625. snackbar.addClass("show")
  2626. setTimeout(function() {snackbar.removeClass("show")},4000)
  2627. }
  2628. }
  2629.  
  2630. var calculateAndFormatAmount = function(tokens, type, currency, exchangeRate) {
  2631. var formattedAmount;
  2632. var rate = exchangeRate || rates.get(currency || type);
  2633. var nominalPaymentAmount = parseFloat(tokens) / parseFloat(rate);
  2634.  
  2635. if (type == "ethereum" || type == "bitcoin") {
  2636. // for crypto, round to four decimals
  2637. nominalPaymentAmount = Math.ceil(nominalPaymentAmount * 10000) / 10000;
  2638.  
  2639. // only fix decimals if there are any decimals
  2640. if (nominalPaymentAmount % 1 > 0) {
  2641. nominalPaymentAmount = nominalPaymentAmount.toFixed(4);
  2642. }
  2643.  
  2644. formattedAmount = nominalPaymentAmount;
  2645. } else {
  2646. // for fiat, round to two decimals
  2647. nominalPaymentAmount = Math.ceil(nominalPaymentAmount * 100) / 100;
  2648.  
  2649. // only fix decimals if there are any decimals
  2650. if (nominalPaymentAmount % 1 > 0) {
  2651. nominalPaymentAmount = nominalPaymentAmount.toFixed(2);
  2652. }
  2653.  
  2654. // add commas for the big fiat numbers
  2655. formattedAmount = nominalPaymentAmount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  2656. }
  2657.  
  2658. return formattedAmount;
  2659. };
  2660.  
  2661. var tokenReservations = []
  2662. var deletedReservations = []
  2663. var editedReservations = []
  2664. var reservedTokenAmount = 0
  2665.  
  2666. var buildReservationList = function(reservations) {
  2667. console.log('buildReservationList for ' + reservations.length)
  2668. balancesToLoad++
  2669. var list = jQuery("#reservation-list")
  2670. list.find("tbody").empty()
  2671.  
  2672. jQuery('#reservedtokens').addClass('hidden');
  2673. jQuery('#reservedtokens span.value').empty()
  2674.  
  2675. reservedTokenAmount = 0;
  2676.  
  2677. if(reservations) {
  2678.  
  2679. if(reservations.length > 0) {
  2680. list.parent().show()
  2681. list.parent().siblings(".empty").remove()
  2682.  
  2683. balancesToLoad += reservations.length;
  2684.  
  2685. reservations.forEach(function(reservation){
  2686. if (reservation.state === 'processing' && reservation.type !== 'cryptovoucher' && !reservation.conflict) {
  2687. reservedTokenAmount += parseFloat(reservation.tokens)
  2688. }
  2689. list.find("tbody").append(new ReservationRow(reservation).view)
  2690. balancesToLoad--;
  2691. })
  2692.  
  2693.  
  2694. } else {
  2695. list.parent().hide()
  2696. list.parent().parent().find('p.empty').remove()
  2697. list.parent().after("<p class='empty small-text' style='padding-bottom: 30px;max-width: 80%;display: block;margin: auto;'>No purchases have been made with your account so far!</p>")
  2698. }
  2699.  
  2700.  
  2701. } else {
  2702. list.parent().hide()
  2703. list.parent().after("<p class='empty small-text' style='padding-bottom: 30px;max-width: 80%;display: block;margin: auto;'><div class='spinner' style='display: inline;'><div class='bounce1'></div> <div class='bounce2'></div> <div class='bounce3'></div> </div></p>")
  2704.  
  2705. }
  2706.  
  2707. var today = new Date();
  2708. jQuery('.date').text(today.toISOString());
  2709.  
  2710. balancesToLoad--;
  2711. var isBalanceReady = window.setInterval(
  2712. function () {
  2713. if (balancesToLoad === 0) {
  2714. var balance = (parseInt(reservedTokenAmount)+parseInt(earnedTokens));
  2715. if (balance < 0) {
  2716. balance = 0;
  2717. }
  2718. jQuery('#svd-balance b span.value.balance').text(balance.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","));
  2719. jQuery('#svd-balance').removeClass('hidden');
  2720. jQuery('#svd-balance-loading').addClass('hidden');
  2721. window.clearInterval(isBalanceReady);
  2722. }
  2723. },
  2724. 250
  2725. );
  2726. }
  2727.  
  2728. var showPresalePopup = function (reservation){
  2729. var popup = jQuery('#presale-popup');
  2730. showPopup(popup.find('.title').html(), popup.find('.description').html());
  2731. jQuery(".payment-option").addClass("hidden")
  2732. jQuery('#full-popup .fiat-options button[data-class]:hidden').first().trigger("click")
  2733.  
  2734.  
  2735. var adjustRates = function() {
  2736.  
  2737. var amount = jQuery('#full-popup #reservationamount').val()
  2738.  
  2739. if (amount == "") {
  2740. amount = 0
  2741. }
  2742.  
  2743.  
  2744. if(jQuery('#full-popup #reservationamount').val().replace(/\D/g,'').length > 8) {
  2745. amount = 10000000
  2746. }
  2747. /*
  2748. if(jQuery('#full-popup #reservationamount').val()[0] == 0) {
  2749. while(amount.charAt(0) === '0')
  2750. {
  2751. amount = amount.substr(1);
  2752. }
  2753. jQuery('#full-popup #reservationamount').val(amount)
  2754. }*/
  2755.  
  2756. jQuery('#full-popup #reservationamount').val(amount.toString().replace(/\D/g,'').replace(/\B(?=(\d{3})+(?!\d))/g, ","))
  2757.  
  2758. var value = amount.toString().replace(/\D/g,'')
  2759. jQuery('#full-popup .reservation-options button[data-type], #full-popup .fiat-options button[data-type]').each(function() {
  2760. var formattedAmount = calculateAndFormatAmount(value, jQuery(this).attr("data-class"), jQuery(this).attr("data-type"));
  2761. jQuery(this).find("span").text(formattedAmount);
  2762. })
  2763. refreshAltcoinsDropdown();
  2764. }
  2765.  
  2766. jQuery('#full-popup #reservationamount').change(function() {
  2767. // enforce Integer with minimum of 1000 tokens
  2768. if(jQuery('#full-popup #reservationamount').val().replace(/\D/g,'').length < 4) {
  2769. jQuery('#full-popup #reservationamount').val(Math.max(1000, parseInt(jQuery('#full-popup #reservationamount').val())));
  2770. }
  2771.  
  2772. if(jQuery('#full-popup #reservationamount').val().replace(/\D/g,'').length > 8) {
  2773. jQuery('#full-popup #reservationamount').val(10000000);
  2774. }
  2775. adjustRates()
  2776. });
  2777. jQuery('#full-popup #reservationamount').on("keyup", adjustRates);
  2778.  
  2779. $(document).on('keyup keypress', '#full-popup #reservationamount', function(e) {
  2780. if(e.which == 13) {
  2781. adjustRates()
  2782. e.preventDefault();
  2783. return false;
  2784. }
  2785. });
  2786.  
  2787. jQuery('#full-popup .fiat-options button[data-class]').click(function() {
  2788. jQuery('#full-popup .fiat-options button[data-class]').addClass("disabled")
  2789. jQuery(this).removeClass("disabled")
  2790.  
  2791. })
  2792.  
  2793. jQuery('#full-popup .payment-type').click(function() {
  2794. jQuery('#full-popup .payment-type').removeClass("selected")
  2795. jQuery(this).addClass("selected")
  2796. if (jQuery(this).data('class') === 'sofort') {
  2797. var amount = parseInt(jQuery('#full-popup #reservationamount').val().replace(/\D/g,''));
  2798. console.log(amount);
  2799. if (amount >= 100000) {
  2800. jQuery('#full-popup .warningcontainer').html(getAlertHtml('!!! SOFORT MAXIMUM LIMIT !!!\n' +
  2801. 'Please note that the maximum limit of your SOFORT payment equals the Online Banking transfer limit of your checking account. So if you want to purchase SVD tokens for a total value exceeding your Online Banking transfer limit please either split your SOFORT payments across several days OR select an alternative payment method, i.e. Credit Card, ETH or BTC. Thanks a lot!',
  2802. 'warning'));
  2803. }
  2804. }
  2805. jQuery('#full-popup .cchint').toggleClass('hidden', jQuery(this).data('class') !== 'creditcard');
  2806. jQuery('#full-popup .cryptovoucher-checkout').toggleClass('hidden', jQuery(this).data('class') !== "cryptovoucher");
  2807. jQuery('#full-popup .regular-checkout').toggleClass('hidden', jQuery(this).data('class') == "cryptovoucher");
  2808. });
  2809.  
  2810. jQuery('#full-popup .reservation-options button[data-class]').click(function() {
  2811. jQuery(".payment-option").addClass("hidden")
  2812. jQuery('#full-popup .reservation-options button[data-class]').addClass("disabled")
  2813. jQuery(this).removeClass("disabled")
  2814.  
  2815. switch (jQuery(this).attr("data-class")) {
  2816. case 'ethereum': jQuery(".payment-option.eth-wallet").removeClass("hidden");break;
  2817. case 'bitcoin': jQuery(".payment-option.btc-wallet").removeClass("hidden");break;
  2818. case 'XLM': jQuery(".payment-option.xlm-wallet").removeClass("hidden");break;
  2819. case 'DOGE': jQuery(".payment-option.doge-wallet").removeClass("hidden");break;
  2820. case 'altcoins': jQuery(".payment-option.altcoins-wallet").removeClass("hidden");refreshAltcoinsDropdown();break;
  2821. default: jQuery(".payment-option.fiat-options." + jQuery(this).attr("data-type")).removeClass("hidden");jQuery('#full-popup .fiat-options .payment-type:not([disabled]):visible').first().trigger("click");break;
  2822. }
  2823. })
  2824.  
  2825.  
  2826.  
  2827. jQuery('.reservation-options button').click(
  2828. function(){
  2829. return false;
  2830. }
  2831. );
  2832.  
  2833. var update = false
  2834. if(reservation) {
  2835. update = true
  2836.  
  2837. jQuery("#full-popup #reservationamount").val(parseFloat(reservation.tokens))
  2838.  
  2839.  
  2840. if(reservation.type != "ethereum" && reservation.type != "DOGE" && reservation.type != "XLM" && reservation.type !== "bitcoin") {
  2841. var currency = reservation.currency || "EUR"
  2842. if(reservation.type == 'creditcard'
  2843. || reservation.type == 'banktransfer'
  2844. || reservation.type == 'sofort'
  2845. || reservation.type == 'cryptovoucher') {
  2846.  
  2847. jQuery('#full-popup .reservation-options button[data-type=' + currency + ']').trigger("click")
  2848. jQuery('#full-popup .fiat-options.' + currency + ' button[data-class=' + reservation.type + ']').trigger("click")
  2849.  
  2850. } else {
  2851. jQuery('#full-popup .reservation-options button[data-type=altcoins]').trigger("click")
  2852. jQuery('.altcoins-select option[value="'+ currency +'"]').prop('selected', true)
  2853. jQuery('.altcoins-select').change()
  2854. }
  2855.  
  2856. } else {
  2857. jQuery('#full-popup .reservation-options button[data-class=' + reservation.type + ']').trigger("click")
  2858. }
  2859.  
  2860. }
  2861.  
  2862.  
  2863. var reservation = reservation || {}
  2864.  
  2865. adjustRates()
  2866.  
  2867. jQuery('#full-popup input.paymentsubmit').click(function() {
  2868.  
  2869. var alertElement = jQuery('#full-popup .alertcontainer');
  2870.  
  2871. var type = jQuery('#full-popup .payment-type.selected').attr("data-class")
  2872.  
  2873. var accepted = true
  2874.  
  2875. editedReservations.push(JSON.parse(JSON.stringify(reservation)))
  2876. reservation.currency = jQuery('#full-popup .reservation-options .payment-type:not(.disabled)').attr("data-type")
  2877. reservation.tokens = jQuery('#full-popup #reservationamount').val().replace(/\D/g,'')
  2878. reservation.wallet = jQuery('#full-popup .payment-option:visible input.walletaddress').val()
  2879. reservation.type = type
  2880.  
  2881. if (type=="cryptovoucher"){
  2882.  
  2883. storeReservation(reservation, update, jQuery(this));
  2884.  
  2885. window.open("https://cryptovoucher.io/buy-voucher?utm_source=SVD&utm_medium=website&utm_campaign=sale");
  2886. getReservations();
  2887. closePopup();
  2888. return;
  2889. }
  2890. jQuery('#full-popup input.terms:visible').each(function(index,cb) { if(!cb.checked) { accepted = cb.checked} })
  2891. if(!accepted) {
  2892. return alertElement.html(getAlertHtml("Please accept the Terms and Conditions"))
  2893. }
  2894.  
  2895. if(reservation.type == 'creditcard' && reservation.tokens > 500000) {
  2896. return alertElement.html(getAlertHtml("Maximum SVD amount for creditcard payment is " + ((500000 / rates.get(reservation.currency))).toFixed(0).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + " " +reservation.currency))
  2897. }
  2898.  
  2899. if(reservation.type == 'banktransfer' && reservation.tokens < 50000) {
  2900. return alertElement.html(getAlertHtml("Minimum SVD amount is 50,000 for bank transfer"))
  2901. }
  2902.  
  2903.  
  2904. if(reservation.type == "altcoins" && reservation.tokens < 100000) {
  2905. return alertElement.html(getAlertHtml("Minimum SVD amount is 100,000 for ERC20 Tokens"));
  2906. }
  2907.  
  2908. if(reservation.type == "altcoins") {
  2909. reservation.type = $( ".altcoins-select option:selected" ).attr('value')
  2910. reservation.currency = $( ".altcoins-select option:selected" ).attr('value')
  2911. }
  2912.  
  2913. storeReservation(reservation, update, jQuery(this))
  2914. })
  2915.  
  2916.  
  2917. }
  2918.  
  2919. var deleteReservation = function(reservation) {
  2920. var popup = jQuery('.delete-popup');
  2921. showPopup(popup.find('.title').html(), popup.find('.description').html(), true);
  2922. var fullPopup = jQuery('#full-popup');
  2923. fullPopup.find('.cancel-purchase').click(function (e) {
  2924. closePopup();
  2925. var canceled = false;
  2926.  
  2927. showToast($('<div class="col-sm-11 col-md-11"><span style="width: 80%;margin: auto;display: block;">Your purchase of ' + reservation.tokens.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' SVD has been deleted.</span></div><div class="col-sm-1 col-md-1 revert"><button alt="revert" style="background:none;border:none;"><img title="Revert" src="/img/ic_revert.png" style="display:inline; width:25px;margin-right:5px" scale="0">revert</button></div></div>'));
  2928. deletedReservations.push(reservation.reservationId);
  2929. buildReservationList(tokenReservations.filter(function(res) { return deletedReservations.indexOf(res.reservationId) < 0 }));
  2930.  
  2931. jQuery("#snackbar .revert").click(function() {
  2932. deletedReservations.splice(deletedReservations.indexOf(reservation.reservationId), 1);
  2933. canceled = true;
  2934. buildReservationList(tokenReservations.filter(function(res) { return deletedReservations.indexOf(res.reservationId) < 0 }));
  2935. })
  2936. setTimeout(function() {
  2937. if(!canceled) {
  2938. cancelReservation(reservation, function () {
  2939. deletedReservations.splice(deletedReservations.indexOf(reservation.reservationId), 1)
  2940. ga('send', 'event', 'Reservation', 'delete', 'SVD', -reservation.tokens);
  2941. fbq('track', 'Reservation', {
  2942. action : 'delete',
  2943. amount : reservation.tokens
  2944. });
  2945. getReservations();
  2946. }, function() {
  2947. deletedReservations.splice(deletedReservations.indexOf(reservation.reservationId), 1);
  2948. showToast($('<span style="padding-left:40px;padding-right:40px;">Oh no! There was a problem, please try again</span>'));
  2949. buildReservationList(tokenReservations.filter(function(res) { return deletedReservations.indexOf(res.reservationId) < 0 }));
  2950. })
  2951. }
  2952. }, 4000);
  2953. });
  2954.  
  2955. fullPopup.find('.keep-purchase').click(function (e) {
  2956. closePopup();
  2957. ga('send', 'event', 'Reservation', 'delete-cancel');
  2958. });
  2959. }
  2960.  
  2961. var getUrlParameter = function getUrlParameter(sParam) {
  2962. var sPageURL = decodeURIComponent(window.location.search.substring(1)),
  2963. sURLVariables = sPageURL.split('&'),
  2964. sParameterName,
  2965. i;
  2966.  
  2967. for (i = 0; i < sURLVariables.length; i++) {
  2968. sParameterName = sURLVariables[i].split('=');
  2969.  
  2970. if (sParameterName[0] === sParam) {
  2971. return sParameterName[1] === undefined ? true : sParameterName[1];
  2972. }
  2973. }
  2974. };
  2975.  
  2976. var action = getUrlParameter('action');
  2977. var reservationId = getUrlParameter('reservationId');
  2978.  
  2979. if (action && reservationId) {
  2980. var editReservationsInterval = setInterval(function () {
  2981. if (tokenReservations.length > 0) {
  2982. clearInterval(editReservationsInterval);
  2983.  
  2984. var reservationToHandle;
  2985. tokenReservations.forEach(function (reservation) {
  2986. if (reservation.reservationId === reservationId) {
  2987. reservationToHandle = reservation;
  2988. }
  2989. });
  2990.  
  2991. if (reservationToHandle && !reservationToHandle.state) {
  2992. switch(action) {
  2993. case 'retryKYC' :
  2994. showVIPPopup(reservationId);
  2995. break;
  2996. case 'editReservation':
  2997. showPresalePopup(reservationToHandle);
  2998. break;
  2999. case 'retryPayment':
  3000. var nominalPaymentAmount = parseFloat(reservationToHandle.tokens) / parseFloat(rates.get(reservationToHandle.currency || reservationToHandle.type))
  3001. if (reservationToHandle.type === 'sofort') {
  3002. startSofortPayment(reservationId);
  3003. } else if (reservationToHandle.type === 'creditcard') {
  3004. startCcPayment(reservationId);
  3005. } else if (reservationToHandle.type === 'ethereum') {
  3006. showEthSuccess2(nominalPaymentAmount, reservationId, reservationToHandle.tokens);
  3007. } else if (reservationToHandle.type === 'bitcoin') {
  3008. showBtcSuccess(nominalPaymentAmount, reservationId, reservationToHandle.tokens);
  3009. } else if (reservationToHandle.type === 'banktransfer') {
  3010. showBanktransfer(nominalPaymentAmount, reservationToHandle.state, reservationToHandle.reservationId);
  3011. } else {
  3012. showTokenSuccess(nominalPaymentAmount, reservationId, reservationToHandle.tokens, reservationToHandle.type)
  3013. }
  3014. break;
  3015. default:
  3016. break;
  3017. }
  3018. }
  3019. }
  3020. }, 500);
  3021. }
  3022.  
  3023.  
  3024. jQuery(document).ready(
  3025. function () {
  3026. if (cognitoUser === null) {
  3027. cognitoUser = userPool.getCurrentUser();
  3028. if (cognitoUser != null) {
  3029. cognitoUser.getSession(function (err, session) {
  3030. if (err) {
  3031. alert(err.message);
  3032. return;
  3033. }
  3034. accessToken = session.getAccessToken().getJwtToken();
  3035. idToken = session.getIdToken().getJwtToken();
  3036.  
  3037. if(onAuthenticatedCallback) {
  3038. onAuthenticatedCallback()
  3039. }
  3040. initRefresh();
  3041.  
  3042. updateUserDisplay(action ? false : true);
  3043.  
  3044. });
  3045. } else {
  3046. if(onNotAuthenticatedCallback) {
  3047. onNotAuthenticatedCallback()
  3048. }
  3049. updateUserDisplay();
  3050. }
  3051. } else {
  3052. updateUserDisplay();
  3053. }
  3054. }
  3055. );
  3056.  
  3057.  
  3058. function ReservationRow(reservation) {
  3059.  
  3060. console.log('ReservationRow for ' + reservation.reservationId + ' - ' + reservation.state)
  3061.  
  3062. var self = this
  3063. var countdownInterval;
  3064. var reservationType;
  3065. var reservation = reservation;
  3066.  
  3067. var startPaymentText = 'Pay now!';
  3068.  
  3069. switch (reservation.type)
  3070. {
  3071. case "creditcard":
  3072. reservationType = "Credit card";
  3073. break;
  3074. case "banktransfer":
  3075. reservationType = "Bank transfer";
  3076. break;
  3077. case "cryptovoucher":
  3078. reservationType = "Crypto Voucher";
  3079. break;
  3080. case 'ethereum':
  3081. case 'bitcoin':
  3082. startPaymentText = 'Pay now!';
  3083. reservationType = capitalizeFirstLetter(reservation.type);
  3084. break;
  3085. default:
  3086. reservationType = capitalizeFirstLetter(reservation.type);
  3087. break;
  3088. }
  3089.  
  3090. var elements = {
  3091. amount : jQuery('<td class="text-right"></td>').html(reservation.tokens.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") +' SVD'),
  3092. type : jQuery('<td class="text-left"></td>').html(reservationType),
  3093. exchangerate : jQuery('<td class="text-left"><div class="spinner"><div class="bounce1"></div> <div class="bounce2"></div> <div class="bounce3"></div> </div></td>'),
  3094. price : jQuery('<td class="text-right"><div class="spinner"><div class="bounce1"></div> <div class="bounce2"></div> <div class="bounce3"></div> </div></td>'),
  3095. status : jQuery('<td class="text-left" style="font-weight: bold;">Pay&nbsp;latest&nbsp;in&nbsp;<p style="width:100px; color : #ff794f; display: inline; font-weight: bold;" class="clockdiv"><span class="hours"></span>:<span class="minutes"></span>:<span class="seconds"></span></p></td>'),
  3096. actions : jQuery('<td class="text-center actions"><span class="delete-reservation">Delete</span></td>'),
  3097. }
  3098.  
  3099. this.view = jQuery("<tr id='"+ reservation.reservationId + "'/>")
  3100.  
  3101. var getTimeRemaining = function(endtime) {
  3102.  
  3103. var t = (endtime * 1000) - Date.parse(new Date());
  3104. var seconds = Math.floor((t / 1000) % 60);
  3105. var minutes = Math.floor((t / 1000 / 60) % 60);
  3106. var hours = Math.floor((t / (1000 * 60 * 60)) % 24);
  3107. var days = Math.floor(t / (1000 * 60 * 60 * 24));
  3108. return {
  3109. 'total': t,
  3110. 'days': days,
  3111. 'hours': hours,
  3112. 'minutes': minutes,
  3113. 'seconds': seconds
  3114. };
  3115. }
  3116.  
  3117. var calculateEndTime = function(created) {
  3118. var createdTimestamp = Math.round((created ? new Date(created) : new Date()).getTime()/1000);
  3119. var mainsaleStart = 1518184800;
  3120. var expirationOffset = 36000;
  3121. if (createdTimestamp<mainsaleStart || !created){
  3122. return mainsaleStart+expirationOffset;
  3123. } else {
  3124. return createdTimestamp+expirationOffset;
  3125. }
  3126. }
  3127.  
  3128. var initializeClock = function(el, endtime) {
  3129.  
  3130. var clock = el
  3131. var hoursSpan = clock.find('.hours');
  3132. var minutesSpan = clock.find('.minutes');
  3133. var secondsSpan = clock.find('.seconds');
  3134.  
  3135. function updateClock() {
  3136. var t = getTimeRemaining(endtime);
  3137.  
  3138. if(t.hours < 5) {
  3139. elements.status.find('.clockdiv').addClass("animated").addClass("pulse").addClass("infinite")
  3140. }
  3141. hoursSpan.html(t.hours.toString().slice(-2))
  3142. minutesSpan.html(('0' + t.minutes).slice(-2))
  3143. secondsSpan.html(('0' + t.seconds).slice(-2))
  3144.  
  3145. if (t.total <= 0) {
  3146. clearInterval(countdownInterval);
  3147. //self.view.fadeOut(400, function() { self.view.remove()})
  3148. }
  3149. }
  3150.  
  3151. updateClock();
  3152. countdownInterval = setInterval(updateClock, 1000);
  3153. }
  3154.  
  3155. var onRateStateChanged = function(state) {
  3156.  
  3157. if(state == rates.STATE.DONE) {
  3158. var formattedAmount = calculateAndFormatAmount(reservation.tokens, reservation.type, reservation.currency, reservation.exchangeRate) + '&nbsp;';
  3159. if(reservation.currency) {
  3160. formattedAmount += reservation.currency;
  3161. } else {
  3162. switch (reservation.type) {
  3163. case 'ethereum':
  3164. formattedAmount += 'ETH';
  3165. break;
  3166. case 'bitcoin':
  3167. formattedAmount += 'BTC';
  3168. break;
  3169. case 'creditcard':
  3170. formattedAmount += 'EUR';
  3171. break;
  3172. case 'sofort':
  3173. formattedAmount += 'EUR';
  3174. break;
  3175. case 'banktransfer':
  3176. formattedAmount += 'EUR';
  3177. break;
  3178. default :
  3179. formattedAmount += reservation.type;
  3180. break;
  3181. }
  3182. }
  3183.  
  3184. var exchangeRate = reservation.exchangeRate ? reservation.exchangeRate : rates.get([reservation.currency || reservation.type]);
  3185.  
  3186. elements.exchangerate.empty().html('1 : ' + (parseFloat(exchangeRate) < 1 ? parseFloat(exchangeRate).toFixed(4) : Math.round(exchangeRate).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")))
  3187. elements.price.empty().html(formattedAmount)
  3188. }
  3189.  
  3190. }
  3191.  
  3192. ReservationRow.startPayment = function(reservation) {
  3193. }
  3194.  
  3195. var startPayment = function() {
  3196. ReservationRow.startPayment(reservation)
  3197. }
  3198.  
  3199. this.startPayment = startPayment;
  3200.  
  3201. this.update = function(reservation) {
  3202. reservation = reservation
  3203. console.log(reservation);
  3204. rates.onChange(onRateStateChanged)
  3205.  
  3206. self.view.empty()
  3207. Object.keys(elements).forEach(function(el) {
  3208. self.view.append(elements[el])
  3209. })
  3210.  
  3211. if(reservation.state) {
  3212. elements.status.css("cursor", "");
  3213. var text = reservation.state;
  3214. switch (reservation.state) {
  3215. case 'paid' :
  3216. text = 'Payment confirmed, see applied SVD in your payments below.';
  3217. elements.actions.empty().addClass("hide-mobile-row")
  3218. break;
  3219. case 'processing' :
  3220. if (reservation.txHash) {
  3221. text = 'Identifier: ' + reservation.txHash + '. ';
  3222. } else {
  3223. text = 'Thanks for your payment. ';
  3224.  
  3225. }
  3226. if(reservation.conflict) {
  3227. text = 'There are issues with your payment. Please contact our support via telegram.'
  3228. } else {
  3229. text += 'We\'ll notify you about next steps if required.'
  3230. }
  3231. if (reservation.type === 'cryptovoucher') {
  3232. text = '';
  3233. var paymentAction = jQuery('<span class="start-cryptovoucher-payment" style="cursor: pointer; margin-bottom: 5px;color: white;background-color: #ff794f;display: block;min-width: 130px;border-radius: 10px; padding: 5px; text-transform:uppercase; font-weight:700; box-shadow: 0px 0px 5px rgba(0,0,0,.8);">Buy now!</span>');
  3234. paymentAction.click(function () {
  3235. window.open("https://cryptovoucher.io/buy-voucher?utm_source=SVD&utm_medium=website&utm_campaign=sale_direct");
  3236. });
  3237. elements.actions.prepend(paymentAction);
  3238. elements.actions.find(".start-payment").remove()
  3239. } else {
  3240. elements.actions.empty()
  3241. elements.actions.addClass("hide-mobile-row")
  3242. }
  3243. break;
  3244. case 'expired' :
  3245. case 'waiting' :
  3246. text = 'Purchase timed out.';
  3247. //elements.actions.find(".buy-new").removeClass('hidden')
  3248. elements.actions.find(".edit-reservation").remove()
  3249. elements.actions.find(".start-payment").remove()
  3250. break;
  3251. }
  3252.  
  3253. elements.status.html(text)
  3254.  
  3255. }
  3256.  
  3257. elements.actions.find(".delete-reservation").click(function() { deleteReservation(reservation) })
  3258. //elements.actions.find(".buy-new").click(function () {showPresalePopup(); });
  3259. }
  3260.  
  3261. var init = function(reservation) {
  3262. self.view.data(self)
  3263. self.update(reservation)
  3264. }
  3265.  
  3266. init(reservation)
  3267. }
  3268.  
  3269. function FXRatesManager() {
  3270. var self = this
  3271. var listeners = []
  3272. var dataSources = [
  3273. new DataSource('https://rates.ico.savedroid.com/ethereum.json', function(data) { return { ETH : JSON.parse(data).value * 100, ethereum : JSON.parse(data).value * 100}}),
  3274. new DataSource('https://rates.ico.savedroid.com/bitcoin.json', function(data) { return { BTC : JSON.parse(data).value * 100, bitcoin : JSON.parse(data).value * 100}}),
  3275. new DataSource('https://rates.ico.savedroid.com/usd.json', function(data) { return { USD : JSON.parse(data).value * 100}}),
  3276. new DataSource('https://rates.ico.savedroid.com/other.json', function(data) {
  3277. return data.reduce(function (map, obj) {
  3278. map[obj.coin] = obj.value;
  3279. return map;
  3280. }, {});
  3281. }),
  3282. ]
  3283.  
  3284. this.STATE = {
  3285. LOADING : "LOADING",
  3286. DONE : "DONE",
  3287. ERRORED : "ERRORED"
  3288. }
  3289.  
  3290. this.currentState = self.STATE.LOADING
  3291. this.rates = {}
  3292.  
  3293. function DataSource(url, processor) {
  3294. var self = this
  3295. var errorCallback;
  3296. this.load = function(callback) {
  3297. jQuery.get(url, function (data) {
  3298. callback(processor(data))
  3299. }).fail(errorCallback);
  3300. return self
  3301. }
  3302. this.catch = function(callback) {
  3303. errorCallback = callback
  3304. }
  3305. }
  3306.  
  3307. var init = function() {
  3308.  
  3309. var added = 0;
  3310. dataSources.forEach(function(dataSource) {
  3311. dataSource.load(function(rate) {
  3312. Object.assign(self.rates, rate)
  3313. console.log(rate);
  3314. added++;
  3315.  
  3316. if(added >= dataSources.length) {
  3317. Object.assign(self.rates, {"creditcard": 100, "banktransfer": 100, "EUR" : 100, "sofort" : 100})
  3318. stateChanged(self.STATE.DONE)
  3319. }
  3320. }).catch(function(err) {
  3321. console.log(err);
  3322. stateChanged(self.STATE.ERRORED)
  3323. })
  3324.  
  3325. })
  3326. }
  3327.  
  3328. var stateChanged = function(state) {
  3329. self.currentState = state
  3330. listeners.forEach(function(listener) {
  3331. listener(state)
  3332. })
  3333. }
  3334.  
  3335. this.onChange = function(callback) {
  3336. listeners.push(callback)
  3337. if(self.currentState != self.STATE.LOADING) {
  3338. callback(self.currentState)
  3339. }
  3340. }
  3341.  
  3342. this.get = function(key) {
  3343. return self.rates[key]
  3344. }
  3345.  
  3346. init()
  3347. }
  3348.  
  3349. //jQuery('.buy-button').click(function(){showPresalePopup()});
  3350.  
  3351. function shareClickHandler(e) {
  3352. var amount;
  3353. var platform = jQuery(e.srcElement).data("platform");
  3354.  
  3355. if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1){
  3356. platform = e.target.dataset.platform;
  3357. }
  3358.  
  3359. if(jQuery(e.srcElement).data("amount") != undefined){
  3360. amount = jQuery(e.srcElement).data("amount");
  3361. }
  3362.  
  3363. switch (platform) {
  3364. case "fb":
  3365. openFbShareDialog(amount);
  3366. break;
  3367. case "tw":
  3368. openTwShareDialog(amount);
  3369. break;
  3370. case "vk":
  3371. openVKontakteDialog(amount);
  3372. break;
  3373. case "od":
  3374. openOdnoklassnikiDialog(amount);
  3375. break;
  3376. case "qz":
  3377. openQZoneDialog(amount);
  3378. break;
  3379. case "wc":
  3380. openWeChatDialog(amount);
  3381. break;
  3382. case "kt":
  3383. openKakaoTalkDialog(amount);
  3384. break;
  3385. case "wa":
  3386. openWhatsapp(amount);
  3387. break;
  3388. case "mail":
  3389. openMail(amount);
  3390. break;
  3391. }
  3392. }
  3393.  
  3394. function openWhatsapp(amount) {
  3395. var quoteString;
  3396. var sdUrl = 'https://ico.savedroid.com/'
  3397. var refLink = '';
  3398.  
  3399. if (amount){
  3400. quoteString = 'I just purchased ' + amount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' SVD to make cryptocurrencies available for everyone. savedroid creates a unique AI-fueled ecosystem of crypto saving and investing for the masses!'
  3401. } else {
  3402. quoteString = 'Join the revolution now! savedroid creates a unique AI-fueled ecosystem of crypto saving and investing for the masses!'
  3403. }
  3404.  
  3405. if(cognitoUser){
  3406.  
  3407. refLink = '?ref=' + cognitoUser.username;
  3408. }
  3409.  
  3410. var text = encodeURIComponent(quoteString+" "+sdUrl+refLink);
  3411. var url = "whatsapp://send?text="+text;
  3412. window.location.replace(url);
  3413.  
  3414. ga('send', {
  3415. hitType: 'event',
  3416. eventCategory: 'SocialSharing',
  3417. eventAction: 'wa',
  3418. eventValue: amount
  3419. });
  3420. }
  3421.  
  3422. function openMail(amount) {
  3423. var quoteString;
  3424. var sdUrl = 'https://ico.savedroid.com/'
  3425. var refLink = '';
  3426.  
  3427. if (amount){
  3428. quoteString = 'I just purchased ' + amount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' SVD to make cryptocurrencies available for everyone.\nsavedroid creates a unique AI-fueled ecosystem of crypto saving and investing for the masses!\n\n'
  3429. } else {
  3430. quoteString = 'Join the revolution now!\nsavedroid creates a unique AI-fueled ecosystem of crypto saving and investing for the masses!\n\n'
  3431. }
  3432.  
  3433. if(cognitoUser){
  3434. refLink = '?ref=' + cognitoUser.username;
  3435. }
  3436. var subject = encodeURIComponent("I have a recommendation for you: savedroid ICO")
  3437. var text = encodeURIComponent(quoteString+sdUrl+refLink);
  3438. var url = "mailto:?subject="+subject+"&body="+text;
  3439.  
  3440. window.location.replace(url);
  3441. ga('send', {
  3442. hitType: 'event',
  3443. eventCategory: 'SocialSharing',
  3444. eventAction: 'mail',
  3445. eventValue: amount
  3446. });
  3447. }
  3448.  
  3449. function openFbShareDialog(amount) {
  3450. var quoteString;
  3451. var refLink = '';
  3452.  
  3453. if (amount){
  3454. quoteString = 'I just purchased ' + amount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' SVD to make cryptocurrencies available for everyone. savedroid creates a unique AI-fueled ecosystem of crypto saving and investing for the masses!'
  3455. } else {
  3456. quoteString ='Join the revolution now! savedroid creates a unique AI-fueled ecosystem of crypto saving and investing for the masses!'
  3457. }
  3458.  
  3459. if(cognitoUser){
  3460. refLink = '?ref=' + cognitoUser.username;
  3461. }
  3462.  
  3463. var urlParams = {
  3464. app_id: '1622950757978663',
  3465. quote: quoteString,
  3466. display: 'popup',
  3467. href: 'https://ico.savedroid.com/'+refLink
  3468. }
  3469.  
  3470. var url = "https://www.facebook.com/dialog/share?" + jQuery.param(urlParams);
  3471.  
  3472. window.open(url);
  3473. ga('send', {
  3474. hitType: 'event',
  3475. eventCategory: 'SocialSharing',
  3476. eventAction: 'fb',
  3477. eventValue: amount
  3478. });
  3479. }
  3480.  
  3481. function openTwShareDialog(amount) {
  3482. var quoteString;
  3483. var refLink = '';
  3484.  
  3485. if (amount){
  3486. quoteString = 'I just purchased ' + amount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' SVD to make cryptocurrencies available for everyone.'
  3487. } else {
  3488. quoteString ='Join the revolution now! savedroid creates a unique AI-fueled ecosystem of crypto saving and investing for the masses!'
  3489. }
  3490.  
  3491. if(cognitoUser){
  3492. refLink = '?ref=' + cognitoUser.username;
  3493. }
  3494.  
  3495. var urlParams = {
  3496. url: 'https://ico.savedroid.com/'+refLink,
  3497. via: 'savedroidAG',
  3498. hashtags: 'savedroidICO,ico',
  3499. text: quoteString
  3500. }
  3501.  
  3502. var url = "https://twitter.com/share?" + jQuery.param(urlParams);
  3503.  
  3504. window.open(url);
  3505. ga('send', {
  3506. hitType: 'event',
  3507. eventCategory: 'SocialSharing',
  3508. eventAction: 'tw',
  3509. eventValue: amount
  3510. });
  3511. }
  3512.  
  3513. function openVKontakteDialog(amount) {
  3514. var quoteString;
  3515. var refLink = '';
  3516.  
  3517. if (amount){
  3518. quoteString = 'I just purchased ' + amount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' SVD to make cryptocurrencies available for everyone.'
  3519. } else {
  3520. quoteString ='Join the revolution now! savedroid creates a unique AI-fueled ecosystem of crypto saving and investing for the masses!'
  3521. }
  3522.  
  3523. if (cognitoUser) {
  3524. refLink = '?ref=' + cognitoUser.username;
  3525. }
  3526.  
  3527. var urlParams = {
  3528. url: 'https://ico.savedroid.com/' + refLink,
  3529. title: 'savedroid ICO',
  3530. description: quoteString
  3531. };
  3532.  
  3533. var url = "https://vk.com/share.php?" + jQuery.param(urlParams);
  3534.  
  3535. window.open(url);
  3536. ga('send', {
  3537. hitType: 'event',
  3538. eventCategory: 'SocialSharing',
  3539. eventAction: 'vk',
  3540. eventValue: amount
  3541. });
  3542. };
  3543.  
  3544. function openOdnoklassnikiDialog(amount) {
  3545. var quoteString;
  3546. var refLink = '';
  3547.  
  3548. if (amount){
  3549. quoteString = 'I just purchased ' + amount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' SVD to make cryptocurrencies available for everyone.'
  3550. } else {
  3551. quoteString ='Join the revolution now! savedroid creates a unique AI-fueled ecosystem of crypto saving and investing for the masses!'
  3552. }
  3553.  
  3554. if (cognitoUser) {
  3555. refLink = '?ref=' + cognitoUser.username;
  3556. }
  3557.  
  3558. var urlParams = {
  3559. url: 'https://ico.savedroid.com/' + refLink,
  3560. title: 'savedroid ICO',
  3561. description: quoteString
  3562. };
  3563.  
  3564. var url = "https://connect.ok.ru/offer?" + jQuery.param(urlParams);
  3565.  
  3566. window.open(url);
  3567. ga('send', {
  3568. hitType: 'event',
  3569. eventCategory: 'SocialSharing',
  3570. eventAction: 'od',
  3571. eventValue: amount
  3572. });
  3573. };
  3574.  
  3575. function openQZoneDialog(amount) {
  3576. var refLink = '';
  3577.  
  3578. if (cognitoUser) {
  3579. refLink = '?ref=' + cognitoUser.username;
  3580. }
  3581.  
  3582. var urlParams = {
  3583. url: 'https://ico.savedroid.com/' + refLink
  3584. };
  3585.  
  3586. var url = "https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?" + jQuery.param(urlParams);
  3587.  
  3588. window.open(url);
  3589. ga('send', {
  3590. hitType: 'event',
  3591. eventCategory: 'SocialSharing',
  3592. eventAction: 'qz',
  3593. eventValue: amount
  3594. });
  3595. };
  3596.  
  3597. function openWeChatDialog(amount) {
  3598. window.open("weixin://dl/chat");
  3599. ga('send', {
  3600. hitType: 'event',
  3601. eventCategory: 'SocialSharing',
  3602. eventAction: 'kt',
  3603. eventValue: amount
  3604. });
  3605. };
  3606.  
  3607. function openKakaoTalkDialog(amount) {
  3608. var quoteString;
  3609. var refLink = '';
  3610.  
  3611. if (amount){
  3612. quoteString = 'I just purchased ' + amount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' SVD to make cryptocurrencies available for everyone.';
  3613. } else {
  3614. quoteString ='Join the revolution now! savedroid creates a unique AI-fueled ecosystem of crypto saving and investing for the masses!';
  3615. }
  3616.  
  3617. if (cognitoUser) {
  3618. refLink = '?ref=' + cognitoUser.username;
  3619. }
  3620.  
  3621. Kakao.init('6451adb1b34179ee372e6a65c6eecc1c');
  3622. Kakao.Link.sendDefault({
  3623. objectType: 'feed',
  3624. content: {
  3625. title: 'savedroid ICO',
  3626. description: quoteString,
  3627. imageUrl: 'https://ico.savedroid.com/img/droid_logo.jpg',
  3628. link: {
  3629. mobileWebUrl: 'https://ico.savedroid.com/' + refLink,
  3630. webUrl: 'https://ico.savedroid.com/' + refLink
  3631. }
  3632. }
  3633. });
  3634.  
  3635. ga('send', {
  3636. hitType: 'event',
  3637. eventCategory: 'SocialSharing',
  3638. eventAction: 'kt',
  3639. eventValue: amount
  3640. });
  3641. };
  3642.  
  3643. var altcoins = {
  3644. "0x": "ZRX",
  3645. "aelf": "ELF",
  3646. "Aeternity": "AE",
  3647. "Aion": "AION",
  3648. "Augur": "REP",
  3649. "Bancor": "BNT",
  3650. "Basic Attention": "BAT",
  3651. "Binance Coin": "BNB",
  3652. "Bytom": "BTM",
  3653. "ChainLink": "LINK",
  3654. "Cindicator": "CND",
  3655. "Civic": "CVC",
  3656. "Dent": "DENT",
  3657. "DigixDAO": "DGD",
  3658. "Dragonchain": "DRGN",
  3659. "Enigma": "ENG",
  3660. "Enjin Coin": "ENJ",
  3661. "EOS": "EOS",
  3662. "Ethos": "ETHOS",
  3663. "FunFair": "FUN",
  3664. "Genesis Vision": "GVT",
  3665. "Gnosis": "GNO",
  3666. "Golem": "GNT",
  3667. "ICON": "ICX",
  3668. "Iconomi": "ICN",
  3669. "IOStoken": "IOST",
  3670. "KuCoin Shares": "KCS",
  3671. "Kyber Network": "KNC",
  3672. "Loopring": "LRC",
  3673. "Maker": "MKR",
  3674. "Nebulas": "NAS",
  3675. "OmiseGO": "OMG",
  3676. "Polymath": "POLY",
  3677. "Populous": "PPT",
  3678. "Power Ledger": "POWR",
  3679. "QASH": "QASH",
  3680. "Qtum": "QTUM",
  3681. "Quantstamp": "QSP",
  3682. "Raiden Network": "RDN",
  3683. "RChain": "RHOC",
  3684. "Request Network": "REQ",
  3685. "Revain": "R",
  3686. "SALT": "SALT",
  3687. "Santiment Network": "SAN",
  3688. "SingularityNET": "AGI",
  3689. "Status": "SNT",
  3690. "Storj": "STORJ",
  3691. "TenX": "PAY",
  3692. "Tether": "USDT",
  3693. "TRON": "TRX",
  3694. "VeChain": "VEN",
  3695. "Waltonchain": "WTC",
  3696. "WAX": "WAX",
  3697. "Zilliqa": "ZIL"
  3698. }
  3699.  
  3700. function refreshAltcoinsDropdown(selection){
  3701. var tokenAmount = parseInt(jQuery('#full-popup #reservationamount').val().replace(/\D/g,''));
  3702. var selected = jQuery("#full-popup .altcoins-select option:selected").prop("value");
  3703. var dropdown = jQuery("#full-popup .altcoins-select");
  3704.  
  3705. dropdown.empty();
  3706. dropdown.append('<option '+ ((selected == '') ? 'selected' : '') +' value="" disabled>Select your ERC20 token</option>');
  3707. jQuery.each( altcoins, function( key, value ) {
  3708. var amount = calculateAndFormatAmount(tokenAmount, "altcoins", value);
  3709. dropdown.append('<option ' + ((selected == value) ? 'selected' : '') + ' value="' + value + '">'+key+' '+'('+value+') &ndash; Price: '+ amount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' '+ value +'</option>');
  3710. });
  3711. }
  3712.  
  3713. jQuery(document).ready(function(){
  3714.  
  3715. });
  3716.  
  3717.  
  3718.  
  3719. function openJobBountyTC(){
  3720. var popup = jQuery('#jobbounty-tc-popup');
  3721. showPopup(popup.find('.title').html(), popup.find('.description').html());
  3722. }
  3723.  
  3724. var getPolls = function (callbackSuccess){
  3725. var jsondatastring = JSON.stringify({
  3726. "accessToken": accessToken
  3727. });
  3728.  
  3729. jQuery.ajax({
  3730. type: "POST",
  3731. url: "https://poll.ico.savedroid.com",
  3732. data: jsondatastring,
  3733. success: callbackSuccess,
  3734. dataType: 'Text',
  3735. headers: {
  3736. 'X-Api-Key': 'nF4ts2zqlw4JIVoOWzBAJ4sKUHHEYeUP7XIXSY4j'
  3737. }
  3738. }).fail(function (err) {
  3739. //console.log(err);//callbackFail(err);
  3740. });
  3741. }
  3742.  
  3743. var showPollSuccess = function(poll){
  3744. jQuery('#'+poll+' .poll-buttons').hide();
  3745. var alertElement = jQuery('#'+poll+' .alertcontainer');
  3746. alertElement.html(getAlertHtml("Your vote was submitted successfully!", "success"));
  3747. }
  3748.  
  3749. var showPoll = function(polls){
  3750. var poll = JSON.parse(polls).polls[0];
  3751.  
  3752. jQuery('#'+poll).removeClass('hidden');
  3753. jQuery('#'+poll+' .poll-button').click(function(e){
  3754. var buttonElement = jQuery(this);
  3755. var poll = buttonElement.data('poll');
  3756. storePollAnswer(buttonElement.data('poll'), buttonElement.data('result'));
  3757. })
  3758. }
  3759.  
  3760. var storePollAnswer = function (poll, response) {
  3761. var jsondatastring = JSON.stringify({
  3762. "accessToken": accessToken,
  3763. "poll": poll,
  3764. "response": response
  3765. });
  3766. jQuery.ajax({
  3767. type: "POST",
  3768. url: 'https://poll.ico.savedroid.com',
  3769. data: jsondatastring,
  3770. success: showPollSuccess(poll),
  3771. dataType: 'Text',
  3772. headers: {
  3773. 'X-Api-Key': 'nF4ts2zqlw4JIVoOWzBAJ4sKUHHEYeUP7XIXSY4j'
  3774. }
  3775. }).fail(function (err) {
  3776. var alertElement = jQuery('#'+poll+' .alertcontainer');
  3777. alertElement.html(getAlertHtml("Oooops, something went wrong! Try to refresh the browser and try it again!"));
  3778. });
  3779. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement