-
-
Save denisz/44da26bd92391c52b3988b3def7b277d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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