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