'use strict';

(function($){
    var isValidating = false;

    var validating = function(form) {
        var $form = form;
        var formData = $form.serializeArray();
        var uri = $form.attr('action') + '_checkxhr';
        var data = {};
        for (var j = 0; j < formData.length; j++) {
            data[formData[j]['name']] = formData[j]['value'];
        }
        $.ajax({
            url: uri,
            dataType: "json",
            data: data,
            type: 'post',
            success: function(response) {
                var errors = [];
                for (var _fieldName in response.fields) {
                    var _field = response.fields[_fieldName];
                    var _errorText = '';
                    if ((_field.errors) && (_field.status === 'error')) {
                         _errorText += _field.errors.join('<br />');
                    }
                    if (_field.suggest) {
                        _errorText += '<br />' + _field.suggest.label + ':';
                        for (var _suggest in _field.suggest.options) {
                            var _option = _field.suggest.options[_suggest];
                            _errorText += ' <a href="#" class="suggest">' + _option + '</a>';
                        }
                    }
                    var $field = $form.find('input[name="' + _fieldName + '"]');
                    $field.closest('div').find('span').remove();
                    if (_errorText !== '') {
                        $('<span class="error_message">' + _errorText + '</span>')
                            .find('a.suggest').click(function(e) {
                                e.preventDefault();
                                $field.val($(this).text());
                                $field.change();
                            })
                            .end()
                            .insertAfter($field);
                    }
                }
                if (!response.valid) { $form.addClass('not-valid'); }
            },
            complete: function() {
                isValidating = false;
            }
        });
    };
    
    var validate = function(form) {
        if (!isValidating) {
            var $form = form;
            isValidating = true;
            setTimeout(function() {
                validating($form);
            }, 300);
        }
    };

    $.widget('ui.xaxosValidate', {
        options: { success: null },

        _init: function() {
            var $options = this.options;
            var $element = this.element;

            var formElements = this.element.find(':input');
            var remoteFormElements = this.element.find('.remotevalidation');
            formElements.change(function() {
                $(this).addClass('dirty');
            });
            formElements.keyup(function() {
                $(this).addClass('dirty');
            });
            remoteFormElements.change(function() {
                validate($element);
            });
            if (typeof $options.success === 'function') {
                this.element.ajaxForm({
                    success: $options.success
                });
            } else {
                this.element.ajaxForm({
                    target: this.element.closest('.form').parent()
                });
            }
        }
    });

})(jQuery);
