Skip to content

Instantly share code, notes, and snippets.

@denisz
Created October 9, 2018 18:32
Show Gist options
  • Save denisz/44da26bd92391c52b3988b3def7b277d to your computer and use it in GitHub Desktop.
Save denisz/44da26bd92391c52b3988b3def7b277d to your computer and use it in GitHub Desktop.
(function() {
//str = 'My Name is %NAME% and my age is %AGE%.'
//{"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"}
function format(str, replacements) {
var _replacements = {};
for (var k in replacements) {
_replacements["%" + k + "%"] = replacements[k];
}
return str.replace(/%\w+%/g, function(all) {
return _replacements[all] || all;
});
}
function padZero(num, len) {
var s= String(num), c= '0';
len= len || 2;
while(s.length < len) s= c + s;
return s;
}
function getISODate() {
var d = new Date();
return format("%DD%/%MM%/%YYYY%", { "DD": padZero(d.getDate()), "MM": padZero(d.getMonth() + 1), "YYYY": d.getFullYear() })
}
var kDefaultRate = 60;
var keyForStorage = "btx_rate";
var keyUpdatedAt = "btx_updated_at";
var currentDate = (new Date()).setHours(0,0,0,0);
var lastUpdateAt = parseInt(localStorage.getItem(keyUpdatedAt)) || 0;
var currentRate = parseFloat(localStorage.getItem(keyForStorage)) || kDefaultRate;
function requestActualRate() {
var yql = "https://query.yahooapis.com/v1/public/yql";
var url_cbr = format("http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=%D%&date_req2=%D%&VAL_NM_RQ=R01235", {"D": getISODate()});
// noinspection SqlDialectInspection
// noinspection SqlNoDataSourceInspection
var query = format("select Record.Value from xml where url = '%U%'", {"U": url_cbr})
var url = yql + "?q=" + encodeURIComponent(query) + "&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
console.log(url);
console.log(query);
console.log(url_cbr);
var XHR = ("onload" in new XMLHttpRequest()) ? XMLHttpRequest : XDomainRequest;
var xhr = new XHR();
xhr.open("GET", url, true);
xhr.onload = function(){
try {
var json = JSON.parse(this.responseText);
var rateStr = ("" + json.query.results.ValCurs.Record.Value).replace(',', '.');
var rate = parseFloat(rateStr);
if (rate) {
localStorage.setItem(keyForStorage, rate);
localStorage.setItem(keyUpdatedAt, currentDate);
currentRate = rate;
broadcastChangeRate();
}
} catch (e) {
console.error(e);
}
};
xhr.send();
}
function broadcastChangeRate() {
var items = document.querySelectorAll("*[data-price]");
for (var i = 0, l = items.length; i < l; i++) {
var base = parseFloat(items[i].getAttribute("data-price")) || 1;
var price = base * currentRate;
var prefix = items[i].getAttribute("data-currency-prefix") || "";
var suffix = items[i].getAttribute("data-currency-suffix") || "";
items[i].innerHTML = format("%prefix%%price%%suffix%", { "price": price, "suffix": suffix, "prefix": prefix});
}
}
function ready() {
if (currentDate > lastUpdateAt) {
requestActualRate();
}
broadcastChangeRate();
}
document.addEventListener("DOMContentLoaded", ready);
}());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment