
// кол-во обрабатываемых запросов
var count_processes = 0;

// счетчик запросов на домен
var queries_per_domain = [];

/**
 * Удаляет пробельные символы в начале строки
 */
String.prototype.ltrim = function()
{
    return this.replace(/^\s+/, '');
}

/**
 * Удаляет пробельные символы в конце строки
 */
String.prototype.rtrim = function()
{
    return this.replace(/\s+$/, '');
}

/**
 * Удаляет пробельные символы в начале и конце строки
 */
String.prototype.trim = function()
{
    return this.ltrim().rtrim();
}

/**
 * Обработчик нажатия кнопки «Проверить» 1
 */
function btn_check_1_onclick()
{
    var lines = [];
    var i, line, domain, query, engine, req;

    // обнуляем счетчик незавершенных процессов
    count_processes = 0;

    // обнуляем счетчик запросов на домен
    queries_per_domain = [];

    // очищаем таблицу с результатами
    cleanResults();

    // домен
    domain = AJS.$('domain').value.trim();

    // строки запросов
    lines = AJS.$('queries').value.trim().split('\n');

    // определяем поисковики, в которых надо искать
    for (i in search_engines)
    {
        // текуший поисковик
        engine = search_engines[i];

        // обнуляем счетчик запросов на домен
        queries_per_domain[engine] = [];

        // если надо проверять
        if (AJS.$('check_' + engine).checked)
        {
            // перебираем строки textarea
            for (j in lines)
            {
                // удаляем пробелы в начале и конце строки
                query = lines[j].trim();

                if ('undefined' === typeof(queries_per_domain[engine][domain]))
                {
                    queries_per_domain[engine][domain] = 0;
                }

                // если количество запросов на домен не превышает допустимое количество
                if (queries_per_domain[engine][domain] <= max_queries_per_domain)
                {
                    // увеличиваем счетчик запросов на домен
                    queries_per_domain[engine][domain]++;

                    // увеличиваем счетчик обрабатываемых запросов
                    count_processes++;

                    // отображаем иконку загрузки и кол-во обрабатываемых запросов
                    showProcessesCount();

                    // создаем Ajax запрос
                    req = AJS.loadJSONDoc("check.php", null, 'POST');
                    req.addCallback(onCheckComplite);
                    req.addErrback(onCheckError);

                    // отправляем запрос на сервер
                    req.sendReq({
                        // поисковик
                        engine: engine,
                        // проверяемый домен
                        domain: domain,
                        // проверяемый запрос
                        query: query
                    });
                }
            }
        }
    }
}

/**
 * Обработчик нажатия кнопки «Проверить» 2
 */
function btn_check_2_onclick()
{
    var lines = [], check_engines = [], line_parts = [];
    var i, j, line, domain, query, engine, req;

    // обнуляем счетчик незавершенных процессов
    count_processes = 0;

    // обнуляем счетчик запросов на домен
    queries_per_domain = [];

    // очищаем таблицу с результатами
    cleanResults();

    // строки textarea
    lines = AJS.$('dom_queries').value.trim().split('\n');

    // определяем поисковики, в которых надо искать
    for (i in search_engines)
    {
        if (AJS.$('check_' + search_engines[i]).checked)
        {
            check_engines.push(search_engines[i]);
            queries_per_domain[search_engines[i]] = [];
        }
    }

    // перебираем строки textarea
    for (i in lines)
    {
        // удаляем пробелы в начале и конце строки
        line = lines[i].trim();

        // если строка в формате «domain query»
        if (line.match(/\s+/))
        {
            // разбиваем строку на части
            line_parts = line.split(/\s+/);

            // текущий домен
            domain = line_parts[0].toLowerCase();

            // текущий запрос
            query  = line_parts.slice(1).join(' ');

            // перебираем необходимые поисковики
            for (j in check_engines)
            {
                // текущий поисковик
                engine = check_engines[j];

                // инциализация счетчика запросов на домен
                if ('undefined' === typeof(queries_per_domain[engine][domain]))
                {
                    queries_per_domain[engine][domain] = 0;
                }

                // если количество запросов на домен не превышает допустимое количество
                if (queries_per_domain[engine][domain] < max_queries_per_domain * check_engines.length)
                {
                    // увеличиваем счетчик запросов на домен
                    queries_per_domain[engine][domain]++;

                    // увеличиваем счетчик обрабатываемых запросов
                    count_processes++;

                    // отображаем иконку загрузки и кол-во обрабатываемых запросов
                    showProcessesCount();

                    // создаем Ajax запрос
                    req = AJS.loadJSONDoc("check.php", null, 'POST');
                    req.addCallback(onCheckComplite);
                    req.addErrback(onCheckError);

                    // отправляем запрос на сервер
                    req.sendReq({
                        // поисковик
                        engine: engine,
                        // проверяемый домен
                        domain: domain,
                        // проверяемый запрос
                        query: query
                    });
                }
            }
        }
    }
}

function onCheckError(response, req)
{
    // уменьшаем счетчик обрабатываемых запросов
    count_processes--;
    // отображаем иконку загрузки и кол-во обрабатываемых запросов
    showProcessesCount();
}

/**
 * Обработчик полученных результатов проверки
 * Добавляет в таблицу строку с результатами проверки позиции
 */
function onCheckComplite(response, req)
{
    // уменьшаем счетчик обрабатываемых запросов
    count_processes--;

    // уменьшаем счетчик запросов на домен
    queries_per_domain[response.engine][response.domain]--;

    // отображаем иконку загрузки и кол-во обрабатываемых запросов
    showProcessesCount();

    AJS.ACN(AJS.$('result-rows'), AJS.TR(
        AJS.TD(response.engine),
        AJS.TD(response.domain),
        AJS.TD(response.query),
        AJS.TD(response.position)
    ));
}

/**
 * Очищает таблицу с результатами
 */
function cleanResults()
{
    AJS.RCN(AJS.$('result'),
        AJS.H3('Позиции по запросам (глубина поиска: ' + check_depth + ')'),
        AJS.TABLE(
            AJS.THEAD(
                AJS.TR(
                    // {onclick: 'sortTable("result-rows", 0, true);'}
                    AJS.TH('Поисковик'),
                    AJS.TH('Домен'),
                    AJS.TH('Запрос'),
                    AJS.TH('Позиция')
                )
            ),
            AJS.TBODY({id: 'result-rows'})
        )
    );

    var ths = AJS.$bytc('th', '', AJS.$('result'));
    for (var i in ths)
    {
        // AJS.AEV(ths[i], 'click', new Function('', 'sortTable("result-rows", ' + i + ', true);'));
        ths[i].onclick = new Function('', 'sortTable("result-rows", ' + i + ', true);');
    }
}

/**
 * Отобразить иконку загрузки и кол-во обрабатываемых запросов
 */
function showProcessesCount()
{
    AJS.swapDOM(AJS.$('processing'), AJS.SPAN({id: 'processing'}, 'Запросов обрабатывается: ' + count_processes));
    if (count_processes > 0)
    {
        // делаем недоступным поле ввода
        if (AJS.$('domain')) AJS.$('domain').setAttribute('disabled', 'disabled');
        if (AJS.$('queries')) AJS.$('queries').setAttribute('disabled', 'disabled');
        if (AJS.$('dom_queries')) AJS.$('dom_queries').setAttribute('disabled', 'disabled');
        // делаем недоступной кнопку «Проверить»
        if (AJS.$('btn_check_1')) AJS.$('btn_check_1').setAttribute('disabled', 'disabled');
        if (AJS.$('btn_check_2')) AJS.$('btn_check_2').setAttribute('disabled', 'disabled');
        // делаем текстовое поле видимым
        AJS.setStyle(AJS.$('processing'), 'display', 'block');
    }
    else
    {
        // делаем доступным поле ввода
        if (AJS.$('domain')) AJS.$('domain').removeAttribute('disabled');
        if (AJS.$('queries')) AJS.$('queries').removeAttribute('disabled');
        if (AJS.$('dom_queries')) AJS.$('dom_queries').removeAttribute('disabled');
        // делаем доступной кнопку «Проверить»
        if (AJS.$('btn_check_1')) AJS.$('btn_check_1').removeAttribute('disabled');
        if (AJS.$('btn_check_2')) AJS.$('btn_check_2').removeAttribute('disabled');
        // делаем текстовое поле скрытым
        AJS.setStyle(AJS.$('processing'), 'display', 'none');
    }
}
