$(function() {
    var shadow_screen = $('.training-request-form-shadow');
    var form = $('.training-request-form');
    var wrapper = $('.trf__wrapper');
    var info = $('.trf__info');
    var report_screen = $('.trf__report-screen');
    var show_form_button = $(".showTRF");
    var close_button = $('.trf__close-button');
    var send_button = $('.trf__send-button');
    var close_process_id = null;

    var form_training_select = form.find('#trf__training');
    var form_city_select = form.find("#trf__city");

    var training = null;
    var city = null;

    form_city_select.bind('change', function() {
        if ($(form_city_select).val() != 'Москва') {
            form_training_select.val('Основной инстинкт. Базовый тренинг').attr('disabled', true);
        } else {
            form_training_select.removeAttr('disabled');
        }
    });

    form_training_select.bind('change', function() {
        if ($(form_training_select).val() == 'Секреты мужской психологии') {
            form_city_select.val('Москва').attr('disabled', true);
        } else {
            form_city_select.removeAttr('disabled');
        }
    });

    show_form_button.bind('click', function() {
        var training_name_field = $(this).next('.training-name');

        if (training_name_field[0] != undefined) {
            training = training_name_field.val();
        }

        var info_block = $(this).parents('.info-block');

        if (info_block[0] != undefined) {
            var city_select = info_block.find(".city-select");

            if (city_select[0] != undefined) {
                city = city_select.val();
            } else {
                var city_field = info_block.find(".city-field");

                if (city_field[0] != undefined) {
                    city = city_field.val();
                }
            }
        } else {
            var city_select = $("#city-select");

            if (city_select[0] != undefined) {
                city = city_select.val();
            }
        }

        showTRF.call(this);
    });
    close_button.bind('click', hideTRF);
    send_button.bind('click', function() {
        if(checkTRF()) {
            sendTRF();
        }
    });

// Интерфейс и управление { ----------------------------------------------------

    /**
     * Отображение формы
     */
    function showTRF() {
        if (form.is(':hidden')) {
            resetTRF();

            if (training !== null) {
                form_training_select.val(training).trigger('change');
            }

            if (city !== null) {
                form_city_select.val(city).trigger('change');
            }

            shadow_screen.fadeTo(0, 0.7, function() {
                form.fadeIn(300);
            });
        }
    }

    /**
     * Скрытие формы
     */
    function hideTRF() {
        if (!form.is(':hidden')) {
            form.fadeOut(200, function() {
                clearTimeout(close_process_id);
                shadow_screen.hide();
            });
        }
    }

    /**
     * Отправка данных
     */
    function sendTRF() {
        var report_text = $('<div class="trf__report-text" style="font-size: 24px;">Отправка данных...</div>');

        wrapper.slideUp(500);

        report_text.appendTo(report_screen);
        report_screen.fadeIn(500, function() {
            postTRF();
        });
    }

    /**
     * Передача post
     */
    function postTRF() {
        $.post('/event/event/subscribe', {
            fio: $('#trf__fio').val(),
            age: $('#trf__age').val(),
            city: $('#trf__city').val(),
            phone: $('#trf__phone').val(),
            email: $('#trf__email').val(),
            training: $('#trf__training').val(),
            comment: $('#trf__comment').val()
        },
        function(data) {
            if (data == 1) {
                reportTRF('Ваше сообщение отправлено.<br>Мы&nbsp;с&nbsp;вами обязательно свяжемся.');
            } else {
                reportTRF(data);
            }
        });
    }

    /**
     * Вывод ответа сервера
     */
    function reportTRF(text) {
        var report_text = $('<div class="trf__report-text" style="font-size: 24px;">' + text + '</div>');

        report_screen.slideUp(300, function() {
            report_text.appendTo(report_screen.empty()).hide().fadeIn(300);
            report_screen.slideDown(300, function () {
                close_process_id = setTimeout(function() {
                    hideTRF();
                }, 5000);
            });
        });
    }

    /**
     * Сброс формы
     */
    function resetTRF() {
        clearFields();
        info.hide();
        report_screen.empty().hide();
        wrapper.show();
    }

    /**
     * Очистка полей формы
     */
    function clearFields() {
        $('#trf__fio').val('');
        $('#trf__age').val('');
        $('#trf__phone').val('');
        $('#trf__email').val('');
        $('#trf__comment').val('');

        $('#trf__city').val($("#trf__city option:first").val());
        $('#trf__training').val($("#trf__training option:first").val());
    }

    /**
     * Отображение информации в форме
     */
    function showInfo(text) {
        if (!info.is(':hidden')) {
            info.fadeOut(200, function() {
                info.empty();
                info.html(text);
                info.fadeIn(200);
            });
        } else {
            info.empty();
            info.html(text);
            info.slideDown(200);
        }
    }

// Интерфейс и управление } ----------------------------------------------------
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Валидация { -----------------------------------------------------------------

    function trim(text) {
        var trimmed_text = text.replace(/(^\s+)|(\s+$)/g, '');

        return trimmed_text;
    }

    /**
     * Проверка полей формы
     */
    function checkTRF() {
        var errors = false;
        var message = null;

        var require_fileds = form.find('.require');

        for (var i = 0, n = require_fileds.length; i < n; i++) {
            var field = $(require_fileds[i]);

            field.val(trim(field.val()));

            if (field.val() == '') {
                errors = true;
                message = 'Все поля помеченные ( * ) обязательны к заполнению';
            }
        }

        var email = $('#trf__email').val();

        if (!errors && !email.match(/^.+@.+\..{2,3}$/i)) {
            errors = true;
            message = 'Некорректный адрес e-mail';
        }

        if (errors) {
            showInfo(message);
        }

        return !errors;
    }

// Валидация } -----------------------------------------------------------------
});
