(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); }());