$(function() { var symbols = { "USD": "$", "EUR": "€", "GBP": "£", "Miles": "m", "Kilometer": "km", "inch": "\"", "centimeter": "cm" }; function list() { var ul = $("#conversions").empty().page( "destroy" ), ulEdit = $("#edit-conversions").empty().page( "destroy" ); $.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) { 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); $("#conversion-edit-field").tmpl(conversion, { symbols: symbols }).appendTo(ulEdit); }); ul.page(); // TODO trigger a custom event instead of keyup? $("#term").keyup(); } var all = conversions.all(); $("#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." ); }); }).focus(); list(); $("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; }); $("#edit-conversions").click(function(event) { var target = $(event.target).closest(".deletebutton"); if (target.length) { conversions.remove(target.prev("label").attr("for")); list(); } return false; }) });