Skip to content

Instantly share code, notes, and snippets.

@aprildy
Created October 12, 2018 09:26
Show Gist options
  • Save aprildy/3324ec265aabed7429018e2f19433f23 to your computer and use it in GitHub Desktop.
Save aprildy/3324ec265aabed7429018e2f19433f23 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 = 70;
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;
updateRate();
}
} catch (e) {
console.error(e);
}
};
xhr.send();
}
function toFixed(x, n) { //x - число, n - количество знаков
if(isNaN(x) || isNaN(n)) return false;
var m = Math.pow(10,n);
return Math.round(x*m)/m;
}
function updateRate() {
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 * 70;
var fix = parseInt(items[i].getAttribute("data-fixed"), 10);
var prefix = items[i].getAttribute("data-currency-prefix") || "";
var suffix = items[i].getAttribute("data-currency-suffix") || "";
var resultPrice =
items[i].innerHTML = format("%price%", { "price": toFixed(price, fix), "suffix": suffix, "prefix": prefix});
}
}
function ready() {
if (currentDate > lastUpdateAt) {
requestActualRate();
}
updateRate();
}
document.addEventListener("DOMContentLoaded", ready);
}());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment