
/**
 * Событие готовности документа
 */
$(document).ready(init);


/**
 * Обработчик ошибок ajax запросов
 */
$(document).ajaxError(function(event, request, settings)
{
    var matches;
    if (null !== (matches = settings.url.toString().match(/tool\/(.+?)\/\?domain=(.+)$/i)))
    {
        loader_update(-1);
        if (matches[1] == 'whois')
        {
            loader_update(-1);
        }
        else
        {
            $('tr#' + get_row_id(matches[2]) + ' td.' + matches[1]).removeClass('loading');
        }
        $('#errors').css('display', 'block');
        $('#errors textarea').val($('#errors textarea').val() + matches[1] + ': ' + matches[2] + '\n');
    }
});


/**
 * Глобальные переменные
 */

// количество активных загрузок
var processes = 0;

// количество проверяемых доменов
var dom_processes = 0;

// паттерн корректного домена
var ptrn_domain = /(?:www\.|)(?:[a-z0-9-]+\.)+[a-z]{2,4}/i;


/**
 * Инициализация интерфейса
 */
function init()
{
    $('#btn-check').click(btn_check_onclick);
    $('#btn-export-reg').click(btn_export_reg_onclick);
    $('#btn-export-unreg').click(btn_export_unreg_onclick);
    loader_update();
}


/**
 * Возвращает id строки таблицы результатов для указанного домена
 */
function get_row_id(domain)
{
    return 'row_' + domain.toLowerCase().replace(/-/g, '_').replace(/\./g, '_');
}


/**
 * Запрос к url по домену domain на получение данных в ячейку elm
 */
function request_data(elm, url, domain, func)
{
    // alert(url);
    loader_update(1);
    elm.addClass('loading');
    elm.text('');
    jQuery.getJSON(url, {domain: domain}, func);
}


/**
 * Обработчик нажатия кнопки «Проверить»
 */
function btn_check_onclick()
{
    // очищаем таблицы результатов
    errors_clean();
    // очищаем таблицы результатов
    results_clean();
    // запускаем обработку доменов
    process_domains();
    // Обновляем индикатор загрузки
    loader_update();
}


/**
 * Обработчик нажатия кнопки «Экспорт зарег.»
 */
function btn_export_reg_onclick()
{
    var i, j, line, items, csv = '';
    var rows = $('#results-reg table tbody tr').get();
    var lines = [];
    for (i=0; i<rows.length; i++)
    {
        items = $('td', rows[i]).get();
        line = [];
        for (j=0; j<items.length; j++)
        {
            line[line.length] = $(items[j]).text();
        }
        lines[lines.length] = line.join(';');
    }
    csv += ';Индексация домена;;;;;Пузомерки;;;;Каталоги;;;;Whois;;;;;;;\n';
    csv += 'Домен;Google;Yandex;Rambler;Yahoo;MSN;ТИЦ;PR;AR;CRV;WA;Yaca;Dmoz;YD;Age;Expires;IP;GBL;YBL;OL;RSS;Склейка\n';
    csv += lines.join('\n');

    $('#csv-data').val(csv);
    $('#frm-csv').submit();
}


/**
 * Обработчик нажатия кнопки «Экспорт незарег.»
 */
function btn_export_unreg_onclick()
{
    var i, j, line, items, csv = '';
    var rows = $('#results-unreg table tbody tr').get();
    var lines = [];
    for (i in rows)
    {
        items = $('td', rows[i]).get();
        line = [];
        for (j in items)
        {
            line.push($(items[j]).text());
        }
        lines.push(line.join(';'));
    }
    csv += ';Пузомерки;;;;Каталоги;;;;Ссылки\n';
    csv += 'Домен;ТИЦ;PR;AR;CRV;WA;Yaca;Dmoz;YD;GBL;YBL\n';
    csv += lines.join('\n');

    $('#csv-data').val(csv);
    $('#frm-csv').submit();
}


/**
 * Обновление индикатора загрузки
 * Если есть активные загрузки, то текстовое поле и кнопка недоступны
 */
function loader_update(diff)
{
    diff = diff | 0;
    processes += diff;
    if (processes > 0)
    {
        $('#btn-export-unreg').attr('disabled', true);
        $('#btn-export-reg').attr('disabled', true);
        $('#txt-domains').attr('disabled', true);
        $('#btn-check').attr('disabled', true);
        $('#loader').css('visibility', 'visible');
        $('#loader').text('Загрузка данных');
    }
    else
    {
        $('#txt-domains').attr('disabled', false);
        $('#btn-check').attr('disabled', false);
        $('#loader').css('visibility', 'hidden');
        if ($('#results-reg table tbody tr').length > 0)
        {
            $('#btn-export-reg').attr('disabled', false);
        }
        if ($('#results-unreg table tbody tr').length > 0)
        {
            $('#btn-export-unreg').attr('disabled', false);
        }
    }
}


/**
 * Очищает таблицы результатов
 */
function results_clean()
{
    $('#results-reg table tbody').empty();
    $('#results-unreg table tbody').empty();
}


/**
 * Очищает и скрывает поле ошибок
 */
function errors_clean()
{
    $('#errors').css('display', 'none');
    $('#errors textarea').val('');
}


/**
 * Обработка доменов, введенных в textarea
 */
function process_domains()
{
    // все строки из textarea
    var lines = $('#txt-domains').val().split('\n');

    // получаем только домены
    var domains = jQuery.map(lines, function(val, key)
    {
        // проверяем кооректность написания домена (по регулярному выражению)
        var domain = jQuery.trim(val).match(ptrn_domain);
        if (null !== domain)
        {
            // ограничитель максимального количества проверяемых доменов
            if (dom_processes < max_check)
            {
                // увеличиваем счетчик обрабатываемых доменов
                dom_processes++;
                // увеличиваем счетчик процессов
                loader_update(1);
                // приводим имя домена к нижнему регистру
                domain = domain[0].toLowerCase();
                // if (domain.substr(0, 4) == 'www.') domain = domain.substr(4);
                // отправляем на сервер запрос по получению whois данных о домене
                jQuery.getJSON('tool/whois/', {domain: domain}, cb_receive_whois);
            }
            else
            {
                return null;
            }
        }
        return domain;
    });

    // записываем корректные домены в textarea
    $('#txt-domains').val(domains.join('\n'));
}


/**
 * Получены whois данные
 */
function cb_receive_whois(res, state)
{
    dom_processes--;
    loader_update(-1);
    if ('yes' === res.registered)
    {
        $('#results-reg table tbody').append('<tr id="' + get_row_id(res.domain) + '"><td class="domain"><a href="http://' + res.domain + '/">' + res.domain + '</a></td><td class="index-google">&nbsp;</td><td class="index-yandex">&nbsp;</td><td class="index-rambler">&nbsp;</td><td class="index-yahoo">&nbsp;</td><td class="index-msn">&nbsp;</td><td class="rank-tcy">&nbsp;</td><td class="rank-pr">&nbsp;</td><td class="rank-ar">&nbsp;</td><td class="rank-crv">&nbsp;</td><td class="cat-wa">&nbsp;</td><td class="cat-yaca">&nbsp;</td><td class="cat-dmoz">&nbsp;</td><td class="cat-yahoo">&nbsp;</td><td class="age">&nbsp;</td><td class="expires">&nbsp;</td><td class="ip">&nbsp;</td><td class="bl-google">&nbsp;</td><td class="bl-yahoo">&nbsp;</td><td class="ol">&nbsp;</td><td class="rss">&nbsp;</td><td class="glue">&nbsp;</td></tr>');
        $('tr#' + get_row_id(res.domain) + ' td.age').append(res.age);
        $('tr#' + get_row_id(res.domain) + ' td.expires').append(res.expires);
        request_data($('tr#' + get_row_id(res.domain) + ' td.ip'), 'tool/ip/', res.domain, cb_receive_ip);
        request_data($('tr#' + get_row_id(res.domain) + ' td.index-google'), 'tool/index-google/', res.domain, cb_receive_index_google);
        request_data($('tr#' + get_row_id(res.domain) + ' td.index-yandex'), 'tool/index-yandex/', res.domain, cb_receive_index_yandex);
        request_data($('tr#' + get_row_id(res.domain) + ' td.index-rambler'), 'tool/index-rambler/', res.domain, cb_receive_index_rambler);
        request_data($('tr#' + get_row_id(res.domain) + ' td.index-yahoo'), 'tool/index-yahoo/', res.domain, cb_receive_index_yahoo);
        request_data($('tr#' + get_row_id(res.domain) + ' td.index-msn'), 'tool/index-msn/', res.domain, cb_receive_index_msn);
        request_data($('tr#' + get_row_id(res.domain) + ' td.ol'), 'tool/ol/', res.domain, cb_receive_ol);
        request_data($('tr#' + get_row_id(res.domain) + ' td.rss'), 'tool/rss/', res.domain, cb_receive_rss);
        request_data($('tr#' + get_row_id(res.domain) + ' td.glue'), 'tool/glue/', res.domain, cb_receive_glue);
    }
    else
    {
        $('#results-unreg table tbody').append('<tr id="' + get_row_id(res.domain) + '"><td class="domain"><a href="http://' + res.domain + '/">' + res.domain + '</a></td><td class="rank-tcy">&nbsp;</td><td class="rank-pr">&nbsp;</td><td class="rank-ar">&nbsp;</td><td class="rank-crv">&nbsp;</td><td class="cat-wa">&nbsp;</td><td class="cat-yaca">&nbsp;</td><td class="cat-dmoz">&nbsp;</td><td class="cat-yahoo">&nbsp;</td><td class="bl-google">&nbsp;</td><td class="bl-yahoo">&nbsp;</td></tr>');
    }
    request_data($('tr#' + get_row_id(res.domain) + ' td.rank-pr'), 'tool/rank-pr/', res.domain, cb_receive_pr);
    request_data($('tr#' + get_row_id(res.domain) + ' td.rank-tcy'), 'tool/rank-tcy/', res.domain, cb_receive_tcy);
    request_data($('tr#' + get_row_id(res.domain) + ' td.rank-ar'), 'tool/rank-ar/', res.domain, cb_receive_alexa);
    request_data($('tr#' + get_row_id(res.domain) + ' td.rank-crv'), 'tool/rank-crv/', res.domain, cb_receive_crv);
    request_data($('tr#' + get_row_id(res.domain) + ' td.cat-wa'), 'tool/cat-wa/', res.domain, cb_receive_cat_wa);
    request_data($('tr#' + get_row_id(res.domain) + ' td.cat-yaca'), 'tool/cat-yaca/', res.domain, cb_receive_cat_yaca);
    request_data($('tr#' + get_row_id(res.domain) + ' td.cat-yahoo'), 'tool/cat-yahoo/', res.domain, cb_receive_cat_yahoo);
    request_data($('tr#' + get_row_id(res.domain) + ' td.cat-dmoz'), 'tool/cat-dmoz/', res.domain, cb_receive_cat_dmoz);
    request_data($('tr#' + get_row_id(res.domain) + ' td.bl-google'), 'tool/bl-google/', res.domain, cb_receive_bl_google);
    request_data($('tr#' + get_row_id(res.domain) + ' td.bl-yahoo'), 'tool/bl-yahoo/', res.domain, cb_receive_bl_yahoo);
}


/**
 * Получено кол-во проиндексированных страниц в гугле
 */
function cb_receive_ip(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.ip').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.ip').append(res['ip']);
}


/**
 * Получено кол-во проиндексированных страниц в гугле
 */
function cb_receive_index_google(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.index-google').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.index-google').append(res['index-google']);
}


/**
 * Получено кол-во проиндексированных страниц в яндексе
 */
function cb_receive_index_yandex(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.index-yandex').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.index-yandex').append(res['index-yandex']);
}


/**
 * Получено кол-во проиндексированных страниц в рамблере
 */
function cb_receive_index_rambler(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.index-rambler').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.index-rambler').append(res['index-rambler']);
}


/**
 * Получено кол-во проиндексированных страниц в yahoo
 */
function cb_receive_index_yahoo(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.index-yahoo').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.index-yahoo').append(res['index-yahoo']);
}


/**
 * Получено кол-во проиндексированных страниц в msn
 */
function cb_receive_index_msn(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.index-msn').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.index-msn').append(res['index-msn']);
}


/**
 * Получен Google PageRank
 */
function cb_receive_pr(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.rank-pr').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.rank-pr').append(res['rank-pr']);
}


/**
 * Получен тематический индекс цитирования Яндекса
 */
function cb_receive_tcy(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.rank-tcy').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.rank-tcy').append(res['rank-tcy']);
}


/**
 * Получен Alexa Rank
 */
function cb_receive_alexa(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.rank-ar').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.rank-ar').append(res['rank-ar']);
}


/**
 * Получен Compete Rank и Visits
 */
function cb_receive_crv(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.rank-crv').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.rank-crv').append(res['compete-rank'] + ', ' + res['compete-visits']);
}


/**
 * Получены данные о наличии домена в Web Archive
 */
function cb_receive_cat_wa(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.cat-wa').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.cat-wa').append(res['cat-wa']);
}


/**
 * Получены данные о наличии домена в Yandex Catalog
 */
function cb_receive_cat_yaca(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.cat-yaca').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.cat-yaca').append(res['cat-yaca']);
}


/**
 * Получены данные о наличии домена в Yahoo Directory
 */
function cb_receive_cat_yahoo(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.cat-yahoo').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.cat-yahoo').append(res['cat-yahoo']);
}


/**
 * Получены данные о наличии домена в Dmoz
 */
function cb_receive_cat_dmoz(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.cat-dmoz').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.cat-dmoz').append(res['cat-dmoz']);
}


/**
 * Получены данные об обратных ссылках в гугле
 */
function cb_receive_bl_google(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.bl-google').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.bl-google').append(res['bl-google']);
}


/**
 * Получены данные об обратных ссылках в гугле
 */
function cb_receive_bl_yahoo(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.bl-yahoo').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.bl-yahoo').append(res['bl-yahoo']);
}


/**
 * Получены данные о внешних ссылках
 */
function cb_receive_ol(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.ol').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.ol').append(res['ol']);
}


/**
 * Получены данные о внешних ссылках
 */
function cb_receive_rss(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.rss').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.rss').append(res['rss']);
}


/**
 * Получены данные о склейке домена
 */
function cb_receive_glue(res, state)
{
    loader_update(-1);
    $('tr#' + get_row_id(res.domain) + ' td.glue').removeClass('loading');
    $('tr#' + get_row_id(res.domain) + ' td.glue').append(res['glue']);
}
