aboutsummaryrefslogtreecommitdiffstats
path: root/public/js/calculator.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/js/calculator.js')
-rw-r--r--public/js/calculator.js231
1 files changed, 231 insertions, 0 deletions
diff --git a/public/js/calculator.js b/public/js/calculator.js
new file mode 100644
index 00000000..88fcbd22
--- /dev/null
+++ b/public/js/calculator.js
@@ -0,0 +1,231 @@
+(function() {
+ var ADDRESS_FAIL, EXCHANGE_FAIL, SOCKET_FAIL, activateTip, clear, fail, fetchExchangeRate, finalize, g, get, setup, setupSocket, tip, updateTotal;
+
+ EXCHANGE_FAIL = "Error fetching exchange rate";
+
+ SOCKET_FAIL = "Error connecting to payment server";
+
+ ADDRESS_FAIL = "Invalid address";
+
+ tip = 1;
+
+ g = typeof exports !== "undefined" && exports !== null ? exports : this;
+
+ $(function() {
+ g.user = $('#user').val();
+ g.title = get('title');
+ g.address = get('address');
+ g.symbol = get('symbol');
+ g.currency = get('currency');
+ g.commission = parseFloat(get('commission'));
+ g.logo = get('logo');
+ g.errors = [];
+ g.receivable = 0;
+ if (g.user) {
+ $.ajax({
+ url: g.user + '.json',
+ dataType: 'json',
+ success: function(data) {
+ if (data != null) {
+ g.title = data.title;
+ g.address = data.address;
+ g.currency = data.currency;
+ g.symbol = data.symbol;
+ g.commission = data.commission;
+ g.logo = data.logo;
+ }
+ return setup();
+ }
+ });
+ } else {
+ setup();
+ }
+ $('#tip button').click(function() {
+ var value;
+ value = $(this).html().slice(0, -1);
+ $(this).siblings().css('font-weight', 'normal').removeClass('active');
+ $(this).css('font-weight', 'bold');
+ tip = 1 + (parseFloat(value) / 100);
+ return updateTotal();
+ });
+ $('#tip button').first().click();
+ $('#amount').keyup(updateTotal);
+ return $('#amount').focus(function() {
+ $('#received').hide();
+ $('#payment').fadeIn('slow');
+ $(this).val('');
+ return updateTotal();
+ });
+ });
+
+ activateTip = function(p) {};
+
+ setup = function() {
+ var address;
+ g.address || (g.address = '');
+ g.commission || (g.commission = 0);
+ g.symbol || (g.symbol = 'quadrigacx');
+ if (g.title) {
+ $('#title').html(g.title).show();
+ }
+ if (g.logo) {
+ $('#logo').attr('src', g.logo).show();
+ } else if (!g.title) {
+ $('#logo').attr('src', 'img/bitcoin.png').show();
+ }
+ $('#logo').click(function() {
+ return $(location).attr("href", "/" + g.user + "/edit");
+ });
+ address = g.address;
+ if ((g.user != null) && g.user) {
+ address = "<a href='http://blockchain.info/address/" + address + "'>" + address + "</a>";
+ }
+ if (check_address(g.address)) {
+ $('#address').html(address);
+ } else {
+ fail(ADDRESS_FAIL);
+ }
+ $('#symbol').html(g.symbol + " bid");
+ $('#currency').html(g.currency);
+ $('#received').hide();
+ return fetchExchangeRate();
+ };
+
+ fetchExchangeRate = function() {
+ $.ajax({
+ url: "ticker?currency=" + g.currency + "&symbol=" + g.symbol + "&type=bid",
+ success: function(exchange) {
+ if (exchange != null) {
+ clear(EXCHANGE_FAIL);
+ } else {
+ fail(EXCHANGE_FAIL);
+ return;
+ }
+ if (!g.setupComplete) {
+ finalize();
+ }
+ g.exchange = exchange - exchange * g.commission * 0.01;
+ $('#exchange').val(g.exchange.toFixed(2));
+ return updateTotal();
+ },
+ error: function() {
+ return fail(EXCHANGE_FAIL);
+ }
+ });
+ return setTimeout(fetchExchangeRate, 900000);
+ };
+
+ finalize = function() {
+ $('#amount').focus();
+ return g.setupComplete = true;
+ };
+
+ setupSocket = function() {
+ setTimeout(setupSocket, 10000);
+ if (!(g.websocket && g.websocket.readyState === 1)) {
+ g.websocket = new WebSocket("wss://ws.blockchain.info/inv");
+ g.websocket.onopen = function() {
+ return g.websocket.send('{"op":"addr_sub", "addr":"' + g.address + '"}');
+ };
+ g.websocket.onerror = function() {
+ g.websocket = null;
+ return fail(SOCKET_FAIL);
+ };
+ g.websocket.onclose = function() {
+ return setupSocket();
+ };
+ return g.websocket.onmessage = function(e) {
+ var from_address, received, results;
+ results = eval('(' + e.data + ')');
+ from_address = '';
+ received = 0;
+ $.each(results.x.out, function(i, v) {
+ if (v.addr === g.address) {
+ return received += v.value / 100000000;
+ }
+ });
+ $.each(results.x.inputs, function(i, v) {
+ from_address = v.prev_out.addr;
+ if (v.prev_out.addr === g.address) {
+ return input -= v.prev_out.value / 100000000;
+ }
+ });
+ if (g.receivable <= received) {
+ $('#amount').blur();
+ $('#payment').hide();
+ $('#received').fadeIn('slow');
+ }
+ if (g.user) {
+ return $.post("/" + g.user + "/transactions", {
+ address: from_address,
+ date: moment().format("YYYY-MM-DD HH:mm:ss"),
+ received: received,
+ exchange: g.exchange
+ });
+ }
+ };
+ }
+ };
+
+ updateTotal = function() {
+ var amount, total;
+ amount = parseFloat($('#amount').val() * tip);
+ total = (amount * 1000 / g.exchange).toFixed(5);
+ g.receivable = (amount / g.exchange).toFixed(8);
+ if (!$.isNumeric(total)) {
+ total = '';
+ }
+ $('#total').html(total.toString());
+ $('#qr').html('');
+ return new QRCode('qr', "bitcoin:" + g.address + "?amount=" + (g.receivable.toString()));
+ };
+
+ fail = function(msg) {
+ g.errors.push(msg);
+ g.errors = g.errors.uniq();
+ $('#calculator').hide();
+ return $('#error').show().html(g.errors.toString());
+ };
+
+ clear = function(msg) {
+ var i;
+ i = g.errors.indexOf(msg);
+ if (i >= 0) {
+ g.errors.splice(i, 1);
+ }
+ if (g.errors.length > 0) {
+ return $('#error').show().html(g.errors.toString());
+ } else {
+ $('#error').hide();
+ return $('#calculator').fadeIn('slow');
+ }
+ };
+
+ get = function(name) {
+ var regex, regexS, results;
+ name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
+ regexS = "[\\?&]" + name + "=([^&#]*)";
+ regex = new RegExp(regexS);
+ results = regex.exec(window.location.search);
+ if (results === null) {
+ return "";
+ } else {
+ return decodeURIComponent(results[1].replace(/\+/g, " "));
+ }
+ };
+
+ Array.prototype.uniq = function() {
+ var key, output, value, _i, _ref, _results;
+ output = {};
+ for (key = _i = 0, _ref = this.length; 0 <= _ref ? _i < _ref : _i > _ref; key = 0 <= _ref ? ++_i : --_i) {
+ output[this[key]] = this[key];
+ }
+ _results = [];
+ for (key in output) {
+ value = output[key];
+ _results.push(value);
+ }
+ return _results;
+ };
+
+}).call(this);