From de9e4bac9240d2c1683f8c32c760a97647f98df1 Mon Sep 17 00:00:00 2001 From: jzaefferer Date: Tue, 5 Oct 2010 23:37:26 +0200 Subject: [PATCH] Updated converter experiment. Now using localStorage to store selected conversions, with a first version for editing. --- experiments/converter/application.js | 69 ++++++++++++++++++ experiments/converter/index.html | 102 +++++++++++++-------------- experiments/converter/storage.js | 54 ++++++++++++++ 3 files changed, 171 insertions(+), 54 deletions(-) create mode 100644 experiments/converter/application.js create mode 100644 experiments/converter/storage.js diff --git a/experiments/converter/application.js b/experiments/converter/application.js new file mode 100644 index 00000000..75c35f58 --- /dev/null +++ b/experiments/converter/application.js @@ -0,0 +1,69 @@ +$(function() { + var symbols = { + "USD": "$", + "EUR": "€", + "GBP": "£", + "Miles": "m", + "Kilometer": "km", + "inch": "\"", + "centimeter": "cm" + }; + + function list() { + var ul = $("#conversions").empty().removeAttr("data-mobilized", false); + $.each(all, function(index, conversion) { + // if last update was less then a minute ago, don't update + if (conversion.type == "currency" && !conversion.rate || conversion.updated && conversion.updated + 60000 < +new Date) { + console.log(conversion.updated) + var self = conversion; + var url = "http://query.yahooapis.com/v1/public/yql?q=select%20rate%2Cname%20from%20csv%20where%20url%3D'http%3A%2F%2Fdownload.finance.yahoo.com%2Fd%2Fquotes%3Fs%3D" + conversion.from + conversion.to + "%253DX%26f%3Dl1n'%20and%20columns%3D'rate%2Cname'&format=json&diagnostics=true&callback=?"; + $.getJSON(url, function(result) { + self.rate = parseFloat(result.query.results.row.rate); + // TODO trigger a custom event instead of keyup? + $("#term").keyup(); + self.updated = +new Date; + conversions.store(); + }); + } + $("#conversion-field").tmpl(conversion, { + symbols: symbols + }).appendTo(ul); + }); + $.mobilize(ul); + } + var all = conversions.all(); + list(); + $("#term").keyup(function() { + var value = this.value; + $.each(all, function(index, conversion) { + $("#" + conversion.from + conversion.to).val( conversion.rate + ? Math.ceil(value * conversion.rate * 100) / 100 + : "Rate not available, yet." + ); + }); + }).keyup().focus(); + $("form").submit(function() { + $("#term").blur(); + return false; + }); + $("#add").click(function() { + all.push({ + type: "currency", + from: $("#currency-options-from").val(), + to: $("#currency-options-to").val() + }); + conversions.store(); + list(); + return false; + }); + $("#clear").click(function() { + conversions.clear(); + list(); + return false; + }); + $("#restore").click(function() { + conversions.restore(); + list(); + return false; + }); +}); \ No newline at end of file diff --git a/experiments/converter/index.html b/experiments/converter/index.html index 4279ce8c..f5c7d869 100644 --- a/experiments/converter/index.html +++ b/experiments/converter/index.html @@ -7,57 +7,11 @@ - + + @@ -65,24 +19,64 @@
+ Edit

Converter demo

-
+
- +
    -
    +
    + +
    + +
    +

    Edit conversions

    +
    + +
    + sort conversions, add new ones or delete some + Add currency conversion + Restore default + Delete all conversions +
    +
    + +
    +
    +

    Add conversion

    + Cancel +
    + +
    +

    Demo description

    + From + + To + + Add conversion +
    +
    + \ No newline at end of file diff --git a/experiments/converter/storage.js b/experiments/converter/storage.js new file mode 100644 index 00000000..1f2dc1f0 --- /dev/null +++ b/experiments/converter/storage.js @@ -0,0 +1,54 @@ +(function() { + var defaults = [ + { + type: "currency", + from: "USD", + to: "EUR" + }, + { + type: "distance", + from: "Miles", + to: "Kilometer", + rate: 1.609344 + }, + { + type: "distance", + from: "inch", + to: "centimeter", + rate: 2.54 + } + ]; + + // TODO fallback to whatever else when localStorage isn't available + function get() { + return JSON.parse(localStorage.getItem("conversions")); + } + function set(value) { + console.log("storing conversion: "+ JSON.stringify(value)) + localStorage.setItem("conversions", JSON.stringify(value)); + } + + var conversions = get("conversions"); + if (!conversions) { + conversions = $.extend([], defaults); + } + set(conversions); + window.conversions = { + store: function() { + set(conversions); + }, + all: function() { + return conversions; + }, + clear: function() { + conversions.length = 0; + this.store(); + }, + restore: function() { + conversions.length = 0; + $.extend(conversions, defaults); + this.store(); + } + }; + +})();