/**
 * Класс для работы с формой в корзине
 * @namespace $G.Catalog
 */
$G.Catalog.Form = function() {

    var SCROLL_DURATION = 300;

    var ERROR_TIMEOUT = 2500;

    var SLIDE_DURATION = 300;

    /** @type {Object} DOM-element формы */
    var form;
    var $form = $();

    /** @type {Array} поля, обязательные к заполнению */
    var requiredFields = new Array();

    var _submiting = false;

    /**
     * Настройка
     */
    function setup() {
        $form.submit(_submitHandler);
        $form.find('label.required').each(function() {
            var field = document.getElementById(this.getAttribute('for'));
            if (field) {
                requiredFields.push(field.name);
            }
        });
    }

    /**
     * Проверка полей формы
     * @return {Object} Хэш (поле, значение) или null
     */
    function checkFields() {
        var errors = false;
        var arr = $form.serializeArray();
        var data = {};
        $form.find('label').removeClass('error');
        var pass, pass2;
        for (var i = 0; i < arr.length; i ++) {
            if ((requiredFields.indexOf(arr[i].name) == -1) || (/\S/.test(arr[i].value))) {
                data[arr[i].name] = arr[i].value;
            } else {
                $form.find('input[name="' + arr[i].name + '"]').siblings('label').addClass('error');
                errors = true;
            }
            if (arr[i].name == 'pass')
                pass = arr[i].value;
            if (arr[i].name == 'pass2')
                pass2 = arr[i].value;
        }
        if (((pass) || (pass2)) && (pass != pass2)) {
            $form.find('input[name="pass"],input[name="pass2"]').siblings('label').addClass('error');
            errors = true;
            showErrorText('Пароль и подтверждение не совпадают');
        }
        return (errors) ? null : data;
    }

    /**
     * Хэндлер отправки формы
     */
    function _submitHandler(e) {
        if (!_submiting) {
            var data = checkFields();
            if (data) {
                _submiting = true;
                $form.find('input[type="submit"]').addClass('progress');
                $G.getJSON(data, _orderHandler);
            } else {
                $(Browser.getScrollBody()).animate({
                    scrollTop: $form.offset().top - 20
                }, SCROLL_DURATION, 'swing');
            }
        }
        return false;
    }

    /**
     * Хэндлер обработки ответа
     */
    function _orderHandler(data) {
        _submiting = false;
        $form.find('input[type="submit"]').removeClass('progress');
        if (data.errors) {
            $form.find('label').removeClass('error');
            for (var i = 0; i < data.errors.length; i++) {
                $form.find('input[name="' + data.errors[i] + '"]').siblings('label').addClass('error');
            }
        }

        // Если в ответе ошибка
        if (data.errort)
            showErrorText(data.errort)

        // Если пришел контент - подменим форму им
        if (data.c)
            showContent(data.c);

        // Если пришел ключ, о том что данные изменены
        if (data.ok == 'edit') {
            // Покажем окошечко
            var w = new $G.Window({
                align          : 'center-center',
                width          : 300,
                height         : 36,
                animation      : true
            });
            w.attachEventListener('draw', function(_window) {
                _window.$content.html('<div class="eshop-search-null">Спасибо. Ваши данные изменены.</div>');
            });
            w.show();
        }

        if (data.pdf)
            window.location.assign(data.pdf);
    }

    /**
     * Показать сообщение об ошибке
     * @param {String} text Текст ошибки
     */
    function showErrorText(text) {
        var $error = $form.find('.error-text').html(text).show();
        window.setTimeout(function() {
            $error.fadeOut();
        }, ERROR_TIMEOUT);
    }

    /**
     * Показать контент на форме
     * @para, {String} html ХТМЛ
     */
    function showContent(html) {
        var $d = $(document.createElement('div'))
            .addClass('text')
            .html(html)
            .hide()
            .insertAfter($form);
        $form.slideUp(SLIDE_DURATION);
        $d.slideDown(SLIDE_DURATION);
    }

    return {
        /**
         * Инициализация
         * @param {Object} formEl DOM-element формы
         */
        init: function(formEl) {
            form = formEl;
            $form = $(form);
            setup();
        }
    }
}();

