var perPage = 30;
var page = 1;
var selectors;
var current = {language: document.documentElement.lang, period: 'today', group: '', geo: '', country: '', region: '', search: '', nick: '', page: 1};
var totalRows = 0;

function updateLiveInternetCounter()
{
 new Image().src = '//counter.yadro.ru/hit?r='+
 ((typeof(screen)=='undefined')?'':';s'+screen.width+
 '*'+screen.height+'*'+(screen.colorDepth?screen.colorDepth:
 screen.pixelDepth))+';u'+escape(document.URL)+
 ';'+Math.random();
}

function niceNumber(n)
{
    n = Math.floor(n);
    if (Math.abs(n) < 1000) return n;

    return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' ');
}

function safeText(s)
{
    return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
}

function emptyRow(nick)
{
    return {nick: nick, visitors: 0, visitorsDiv: null, rowDiv: null};
}

function aHref(key, value, cloud, aux)
{
    var period = key == 'period' ? value : current.period;
    var geo = key == 'geo' ? value : current.geo;
    var group = key == 'group' ? value : current.group;
    var search = key == 'search' ? value : current.search;
    var page = key == 'page' ? value : 1;
    var language = key == 'language' ? value : current.language;
    return "<a href='#" +
        (period && period != 'today' ? 'period=' + period + ';' : '') +
        (geo ? 'geo=' + geo + ';' : '') +
        (group ? 'group=' + group + ';' : '') +
        (search ? 'search=' + encodeURIComponent(search) + ';' : '') +
        (page > 1 ? 'page=' + page + ';' : '') +
        "' " + (cloud >= 0 ? ' class="cloud' + cloud + '" ' : '') + aux +
        " onClick='return getRows(\"" + key + "\", \"" + encodeURIComponent(value) + "\");'>";
}

function getSelectors()
{
    var request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP.3.0");
    request.open("GET", '/rating/index.json?what=selectors;lang=' + current.language, true);
    request.onreadystatechange = function() {
        if (request.readyState == 4 && request.status == 200) {
            selectors = JSON.parse(request.responseText);
            showMessages();
            showSelectors();
            prevInit();
            getRows();
        }
    }
    request.send(null);
}

function showSelectors()
{
    var h = '';
    var i;
    for (i = 0; i < selectors.language.length; i++) {
        if (selectors.language[i][0] == current.language)
            current.languageTitle = selectors.language[i][1];
    }
    for (i = 0; i < selectors.period.length; i++) {
        if (selectors.period[i][0] == current.period) {
            current.periodName = selectors.period[i][1];
            break;
        }
    }
    if (i == selectors.period.length) current.periodName = selectors.period[0][1];

    for (i = 0; i < selectors.group.length; i++) {
        if (selectors.group[i][0] == current.group) {
            current.groupName = selectors.group[i][1];
            break;
        }
    }
    if (i == selectors.group.length) current.groupName = selectors.group[0][1];

    for (i = 0; i < selectors.country.length; i++) {
        if (selectors.country[i][0] == current.country) {
            current.countryName = selectors.country[i][1];
            break;
        }
    }
    if (i == selectors.country.length) current.countryName = selectors.country[0][1];

    for (i = 0; i < selectors.region.length; i++) {
        if (selectors.region[i][0] == current.geo) {
            current.regionName = selectors.region[i][1];
            break;
        }
    }
    if (i == selectors.region.length) current.regionName = selectors.region[0][1];

    h += '<div class="city">' +
        '<span>' + current.groupName + '<img src="/i/stat/arrow.gif" alt=""></span><div>';
    for (i = 0; i < selectors.group.length; i++) {
        h += aHref('group', selectors.group[i][0], selectors.group[i][2], '') + selectors.group[i][1] + '</a>';
    }
    h += '</div></div>';

    h += '<div class="city">' +
        '<span>' + current.regionName + '<img src="/i/stat/arrow.gif" alt=""></span><div>';
    for (i = 0; i < selectors.region.length; i++) {
        h += aHref('geo', selectors.region[i][0], selectors.region[i][2], '') + selectors.region[i][1] + '</a>';
    }
    h += '</div></div>';

    h += '<div class="city">' +
        '<span>' + current.countryName + '<img src="/i/stat/arrow.gif" alt=""></span><div>';
    for (i = 0; i < selectors.country.length; i++) {
        h += aHref('geo', selectors.country[i][0], selectors.country[i][2], '') + selectors.country[i][1] + '</a>';
    }
    h += '</div></div>';

    h += '<div class="sort"><div>';
    for (i = 0; i < selectors.period.length; i++) {
        h += aHref('period', selectors.period[i][0], -1, selectors.period[i][0] == current.period ? 'class="act"' : '') + selectors.period[i][1] + '</a>';
    }
    h += '</div></div>';

/*
    h += '<div class="flag-block hbl">' +
        '<div class="ico" style="background-image:url(/i/flag/' + current.language + '.gif);" id="flag_ico"></div>' +
        '<div class="select">';
    for (i = 0; i < selectors.language.length; i++) {
        h += '<div>' +
            aHref('language', selectors.language[i][0], -1, '') +
            '<img src="/i/flag/' + selectors.language[i][0] + '.gif" alt="">' +
            selectors.language[i][1] + '</a></div>';
    }
    h += '</div></div>';
*/
    document.getElementById("selectors").innerHTML = h;
    
    h = '<span>' + aHref('search', '') + current.groupName + '</a></span> [' + 
        (current.geo == current.country ? current.countryName : current.regionName) + ', ' +
        current.periodName + 
        (current.search ? ', ' + selectors.messages["search"] + ': <b>&laquo;' + safeText(current.search) + '&raquo;</b>' : '') +
        ']'; 
        document.getElementById("rating_title").innerHTML = h;

}

function showMessages()
{
    for (var key in selectors.messages){
        var e = document.getElementById('msg_' + key);
        if (e) e.innerHTML = selectors.messages[key];
    }
    document.title = "Ядро: " + selectors.messages["rating_title"];
}

function getRows(key, value)
{
    if (key) {
        updateLiveInternetCounter();
        current.page = 1;
        value = decodeURIComponent(value);
        if (key == 'period') current.period = value;
        else if (key == 'geo') current.geo = value;
        else if (key == 'group') current.group = value;
        else if (key == 'search') current.search = value;
        else if (key == 'page') current.page = parseInt(value);
        else if (key == 'language') {
            current.language = value;
            document.cookie = "lang=" + encodeURIComponent(value) + '; expires=Wed, 17-Aug-2016 18:14:04 GMT; path=/';
            getSelectors();
            return true;
        }
        var g = current.geo.split('/');
        current.country = g[0];
        current.region = g.length > 1 ? g[1] : '';
        showSelectors();
    }
    var request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP.3.0");
    request.open("GET", '/rating/' + current.geo + '/' + current.group + '/' + current.period + '.tsv?' +
        (current.page > 1 ? 'page=' + current.page : '') +
        (current.search ? ';search=' + encodeURIComponent(current.search) : ''),
        true);
    request.onreadystatechange = function() {
        if (request.readyState == 4 && request.status == 200) handleRows(request.responseText);
    }
    request.send(null);
    return true;
}


function handleRows(text)
{
    var count = 0;
    var rows = text.split('\n');
    var header = rows[0].split('\t');
    //var now = header[4];
    data = new Array(rows.length - 1);
    totalRows = parseInt(header[1]);

    for (var i = 1; i < rows.length; i++) {
        // 0:url 1:title 2:visitors 3:delta 4:shift 5:id 6:mark
        // 7:domain 8:prevDelta 9:visitorsDiv 10:timestamp
        var v = rows[i].split('\t');
        if (v.length < 4) continue;

        var d = emptyRow(v[0]);

        d.url = v[1];
        d.title = v[2];
        d.visitors  = parseInt(v[3]);
        d.domain = (d.url.indexOf('/') > 0) ? d.url.substring(0, d.url.indexOf('/')) : d.url;
        d.share = parseInt(v[4]);
        d.access = v[5];
        //d.mark = v[6] ? ' result-hot' : '';
        d.pos = count;
        data[count++] = d;
    }
    showPage();
}

function rowCode(i)
{
    var d = data[i];
    var pos = (current.page - 1) * perPage + i + 1;
    if (!d) return "";

    var code =
    '<div class="result result-sm' + (pos == 10 ? ' news-10' : '') + (current.nick && d.nick == current.nick ? ' result-hot' : '') + ' clearFix">'+ // onclick="location.href=\'http://'+  d.url +'\'"> '+
    '<div class="result-pos' + (pos <= 10 ? ' bold' : '') + '">' + niceNumber(pos) + '</div>'+
    '<div class="result-logo">' +
    (d.domain ? '<a href="http://' + d.domain + '" target=_blank><img src="/favicon/' + d.domain +'.ico" width="16" height="16" border="0"/></a>' : '') +
    '</div>'+
    '<div class="result-num">' + niceNumber(d.visitors) + '</div>'+
    '<div class="result-link">'+
    '<div class="stat"><a href="/stat/' + d.nick + '/">' + selectors.messages.stat_of_site + '</a></div>'+
    '<div class="text"><a target="_blank" href="http://' + d.url + '" target=_blank>' + d.title + '</a></div>' +
    (d.share ? '<span>' + d.share + '%</span>' : '') +
    '</div></div>';
    return code;
}


function pagesNavigation()
{
    var h = '';

    if (current.geo)
        h = '<a href="/stat/' + current.geo + '/' + (current.group ? current.group + '/' : '') +
            '">' + selectors.messages.stat_of_group + '</a>, ' +
        niceNumber(totalRows) + ' ' + selectors.messages.sites;
    else 
        h = '';
    document.getElementById("stat_of_group").innerHTML = h;

    var pagesCount = Math.floor((totalRows - 1) / perPage) + 1;
    if (current.page > pagesCount) current.page = pagesCount;
    if (pagesCount <= 1) {
        document.getElementById('paging').innerHTML = '';
        return;
    }

    h = '';

    for (var p = 1; p <= pagesCount; p++) {
        if (p == current.page) {
            h +='<a class="act" nohref>' + p + '</a> ';
        } else if (p == 3 && current.page > 6) {
            h += '<span>...</span> ';
            p = current.page - 3;
        } else if (p == current.page + 3 && pagesCount > current.page + 5) {
            h += '<span>...</span> ';
            p = pagesCount - 2;
        } else {
            h += aHref('page', p, -1, '') + p + '</a> ';
        }
    }

    document.getElementById('paging').innerHTML = h;
}



function showPage()
{
    document.body.scrollTop = 0 + 'px';
    document.body.scrollLeft = 0 + 'px';

    var h = '';
    for (i = 0; i < data.length; i++) h += rowCode(i);

    var d = document.getElementById('rows');
    if (d) d.innerHTML = h;

    pagesNavigation();
}

function doSearch()
{
    var i = document.getElementById("inp_search");
    if (i) getRows("search", encodeURIComponent(i.value));
    return false;
}


function prevInit() 
{
        if ( Modernizr.touch ) {
        $('.city').click(function() {
            if($(this).hasClass('show')){
                $(this).removeClass('show');
            } else {
                $('.city').removeClass('show');
                $('.sort').removeClass('show');
                $(this).addClass('show');
            }
        });
        $('.sort').click(function() {
            if($(this).hasClass('show')){
                $(this).removeClass('show');
            } else {
                $('.city').removeClass('show');
                $('.sort').removeClass('show');
                $(this).addClass('show');
            }
        });
    } else {
        $('.city').hover(
            function(){
                $(this).stop(true,true).addClass('show');
            },
            function(){
                $(this).stop(true,true).removeClass('show');
            }
        );
    };
    
    
        $("body").click(function (event) {
            if(event.target.id == "flag_ico"){
                $(".hbl").removeClass("act");
                $(".flag-block").addClass("act")
            }else if(event.target.id == "personal_ico"){
                $(".hbl").removeClass("act");
                $(".personal-block").addClass("act")
            }else if(event.target.id == "search_ico" || event.target.id == "form_search" || event.target.id == "inp_search" || event.target.id == "btn_search" || event.target.id == "bl_search"){
                var i = document.getElementById("inp_search");
                if (i) i.value = current.search;
                        
                $(".hbl").removeClass("act");
                $(".search-block").addClass("act")
            }else{
                $(".hbl").removeClass("act");
            }
        });
        
        $("#btn_search").click(function () {
            return doSearch();
            //$('#form_search').submit();
            //return false;
        });
        
//        $(window).scroll(function(){
//            var top = $(this).scrollTop();
//            var elem = $('#header');
//            elem.css('top', top);
//        });
        
}

function setParameters(str)
{
    var p = str.substr(1).split(';');
    for (var i = 0; i < p.length; i++) {
        var a = p[i].split('=');
        a[1] = decodeURIComponent(a[1]);
        var s = a[1];
        if (a.length > 1) s = s.replace(/[ -,:-?\\]/g, "");
        if (a[0] == 'page') current.page = parseInt(a[1]);
        else if (a[0] == 'group') current.group = s;
        else if (a[0] == 'period') current.period = s;
        else if (a[0] == 'search') current.search = a[1];
        else if (a[0] == 'lang') current.language = a[1];
        else if (a[0] == 'nick') current.nick = a[1];
        else if (a[0] == 'country') current.country = s;
        else if (a[0] == 'region') current.region = s;
        else if (a[0] == 'geo') {
            var g = a[1].split('/');
            current.geo = a[1];
            current.country = g[0];
            current.region = g.length > 1 ? g[1] : '';
        }
    }
}

if (document.cookie) {
    var p = document.cookie.split(';');
    for (var i = 0; i < p.length; i++) {
        var a = p[i].split('=');
        a[0] = a[0].replace(/ /g, "");
        if (a.length > 1) a[1] = a[1].replace(/[ -,:-?\\]/g, "");
        if (a[0] == 'lang') current.language = a[1];
    }
}

if (document.location.pathname) { // for compability with old addressing: /rating/ru/495/today.html
    var p = document.location.pathname.split('/');
    if (p.length > 3) {
        var i = 2;
        if (p[i].length == 2) {
            current.country = p[i++];
            if (p.length > i + 1 && parseInt(p[i])) {
                current.region = p[i++];
                current.geo = current.country + '/' + current.region;
            } else {
                current.geo = current.country;
            }
            if (p.length > i + 1) current.group = p[i++];
        }
    }
    var a = p[p.length - 1].split('.');
    if (a.length > 1) current.period = a[0];
    if (document.location.search) setParameters(document.location.search);
}

if (document.location.hash) setParameters(document.location.hash);

getSelectors();