// Main object -->
var CheckForm = {}
var obj_loader = '' //строка с именем поля для отображения процесса загрузки
// -->

 //Функция для вывода информации об остатке подсказок и т.д.(для решения проблем с IE)
    function replace_html(el, html) {
	if( el ) {
                var oldEl = (typeof el === "string" ? document.getElementById(el) : el);
                var newEl = document.createElement(oldEl.nodeName);

                // Получение id и class старого элемента
                newEl.id = oldEl.id;
                newEl.className = oldEl.className;

                //вставка HTML и добавление в DOM
                newEl.innerHTML = html;
                if(oldEl.parentNode)
        	        oldEl.parentNode.replaceChild(newEl, oldEl);
                else
		        oldEl.innerHTML = html;

                //возвращение нового элемента
                return newEl;
	       }
    };

// Input's contents check -->
CheckForm.Initial = function(){

    var formArray = document.forms; // Все формы -->
    if (formArray.length > 0) { // Если есть хотя бы одна форма -->
        for (var i=0; i<formArray.length; i++) {    // Пробегаем по всем формам -->

            (function(i) {  // Замыкаем на 'i' -->

                var formCur = formArray[i]; // Конкретная форма -->

                var formId = formCur.id.substr(0,8);    // Получаем 'id' формы без номера из 'TestForm' -->
                var formNum = formCur.id.substr(8); // Получаем номер формы из 'TestForm' -->

                if (formId == 'TestForm') { // Форма с нужным 'id' (все остальные формы отсеиваем) -->

                    var formButton = document.getElementById('TestButton'+formNum); // Конкретная кнопка конкретной формы -->

                    var inputArray = formCur.getElementsByTagName('INPUT'); // Массив инпутов конкретной формы -->
                    var active = false; // Убрать "фокус" с полей -->

                    for (var j=0; j<inputArray.length; j++) {   // Пробегаем по всем инпутам -->
                        var inputCur = inputArray[j];   // Конкретный инпут -->
                        if (inputCur.id == 'FormName'+j) {  // Инпут с нужным 'id' -->
                            inputCur.onfocus = function(){  // Если элемент был в фокусе -->
                                active = this.id;
                                this.className = 'test-focus-input';
                            }
                            inputCur.onblur = function(){   // Если элементы вышел из фокуса -->
                                    this.className = '';
                            }
                        }
                    }

                    var result = {};    // JSON данные для передачи запроса-->
                    var data = '';  // POST сформированные данные -->

                    formCur.onsubmit = function(){  // При отправке конкретной формы (Проверить) -->
                        obj_loader = this.id;
                        var formNum = this.id.substr(8);    // Получаем порядковый номер формы из 'TestForm' -->
                        for (var j=0; j<inputArray.length; j++) {   // Пробегаем по всем инпутам -->
                            var inputCur = inputArray[j];   // Конкретный инпут -->
                            if (inputCur.id == 'FormName'+j) {  // Инпут с нужным 'id' -->
                                result[j] = inputCur.value;
                            }
                        }

                        data = '&cmd=test&test='+formNum+'&data='+JSON.stringify(result);
                        AjaxPOSTrequest(window.location, data);

                        // Очищаем поля -->
                        active = false;
                        result = {};
                        data = '';

                        return false;
                    }

                    formButton.onclick = function(){    // При клике на кнопку (Подсказка) -->
                        obj_loader = this.id;
                        var formNum = this.id.substr(10);   // Получаем порядковый номер формы из 'TestButton' -->
                        if (active != false) {  // Если хотя бы одно поле было в фокусе -->
                            for (var j=0; j<inputArray.length; j++) {   // Пробегаем по всем инпутам -->
                                var inputCur = inputArray[j];   // Конкретный инпут -->
                                if (inputCur.id == 'FormName'+j) {  // Инпут с нужным 'id' -->
                                    if (inputCur.id == active) {    // Только тот, который был в фокусе последним-->
                                        inputCur.style.className = 'test-focus-input';
                                        inputCur.focus();
                                        result = inputCur.value;
                                        data = '&test='+formNum+'&xid='+j+'&data=';
                                    }
                                }
                            }
                        }
                        else{   // Ни одно поле не было в фокусе -->
                            alert('Выберите поле!');
                            return false;
                        }

                        data = '&cmd=help'+data+JSON.stringify(result);
                        AjaxPOSTrequest(window.location, data);

                        // Очищаем поля -->
                        result = {};
                        data = '';
                    }
                }

            })(i);

        }
    }

}
// -->

// Input's result check -->
CheckForm.Result = function(obj){
    var result = JSON.parse(obj);   // Распарсим результат (из JSON в JS Object) -->
    // Запрос "Проверить" -->
    /*
    res: ;

    test_message: ; - информация после успешного прохождения
    text: ; - сообщение
    test: ; - номер теста
    status: ; - массив "верности" ответов

    // Запрос "Подсказка" -->
    res: ;

    data: ; - одна буква
    text: ; - сообщение
    test: ; - номер теста
    xid: ; - номер инпута

    */
    // -->

    var formCur = document.getElementById('TestForm'+result.test);  // Текушая форма -->
    var formMessage = document.getElementById('TestMessage'+result.test);   // Сюда выводим сообщения (сообщения выводятся в любом случае) -->
    var formResult = document.getElementById('TestResult'+result.test); // Блок для вывода информации при успешной сдаче теста -->

    var formSubmit = document.getElementById('SubmitButton'+result.test);   // Конкретная кнопка конкретной формы (Проверить) -->
    var formButton = document.getElementById('TestButton'+result.test); // Конкретная кнопка конкретной формы (Подсказка) -->

   

    if (result.data) {
        var inputArray = formCur.getElementsByTagName('INPUT'); // Массив инпутов конкретной формы -->
        for (var i=0; i<inputArray.length; i++) {   // Пробегаем по всем инпутам -->
            var inputCur = inputArray[i];   // Конкретный инпут -->
            if (inputCur.id == 'FormName'+result.xid) { // Инпут с нужным 'id' -->
                inputCur.value = result.data;
            }
        }
    }
        
    if (result.text) {
        formMessage.className = 'test-form-message-hover';
        replace_html('TestMessage'+result.test,result.text);
    }

    if (result.status) {
        for (var i=0; i<result.status.length; i++) {    // Пробегаем по всем вариантам ответов -->
            if (result.status[i] == '1') {  // Находим верный вариант, запоминаем номер инпута -->
                var inputArray = formCur.getElementsByTagName('INPUT'); // Массив инпутов конкретной формы -->
                for (var j=0; j<inputArray.length; j++) {   // Пробегаем по всем инпутам -->
                    var inputCur = inputArray[j];   // Конкретный инпут -->
                    if (inputCur.id == 'FormName'+i) {  // Инпут с нужным 'id' -->
                        inputCur.parentNode.className = 'test-ok-word';
                        inputCur.parentNode.innerHTML = inputCur.value+'<input type="hidden" name="FormName'+i+'" value="'+inputCur.value+'" id="FormName'+i+'" />';
                    }
                }
            }
        }
    }

    if (result.test_message) {
        formResult.className = 'test-finish-block-hover';
        formResult.innerHTML = result.test_message;

        // Делаем кнопки неактивными (при успешном прохождении теста) -->
        formSubmit.disabled = 'disabled';
        formButton.disabled = 'disabled';

        CheckForm.Initial();    // После успешного прохождения теста - запускаем функцию снова  -->
    }

}

// Ajax request a method 'POST' -->
function AjaxPOSTrequest(url, data){

    // Шаг 1: Создать объект для запроса к серверу (кроссброузерный метод) -->
    var request;

    if (window.XMLHttpRequest) {    // Для нормальных броузеров  -->
        request = new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {    // Для ie -->
        request = new ActiveXObject('Microsoft.XMLHTTP');
    }
    else{
        alert('Ошибка! Объект \'XMLHttpRequest\' не поддерживается...');
    }

    // Шаг 2: Создать асинхронный запрос 'POST' для заданного 'URL'-адреса -->
    request.open('POST', url, true);
    // Шаг 3: 'onreadystatechange' активируется при получении ответа сервера
    request.onreadystatechange = function(){
        
        if(obj_loader){
            digits = /\d+/.exec(obj_loader); //извлекаем id выбранного теста
            digits = digits.toString();
            loader = document.getElementById('TestMessage' + digits);
            loader.innerHTML = "Загрузка...";
            loader.className = 'test-form-message_loader';
        }

        if (request.readyState == 4) {  // Прием запроса завершился -->
            if (request.status == 200) {    // Если запрос увенчался успехом (200 = 'OK') -->

                if(request.getResponseHeader('Content-Type') == 'text/json; charset=utf-8'){    // Если тип заголовка 'text/json' -->
                    CheckForm.Result(request.responseText);
                }
                else{
                    alert('Ошибка! Указанный тип данных не поддерживается...');
                }

            }
            else{
                alert('Ошибка! Запрос не увенчался успехом: ' + request.status + ' ' + request.statusText);
            }
        }
    }

    // Для 'POST'-запроса пределяем дополнительный заголовок -->
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

    // Шаг 4: Передать запрос (поскольку это запрос 'POST', в качестве тела запроса передается переменная) -->
    request.send(data);
}
// -->
