$(document).ready(function() {

    var validElements = {};
    var code = '';
    
    function disableSubmit(){
        $('#submit_button').attr('disabled', 'disabled');
    }
    
    function enableSubmit(){
        $('#submit_button').attr('disabled', '');
    }
    
    function getInput(name){
        return $('#registration_form input[name=' + name + ']');
    }
    
    function setFieldStatus(field, status, errorText){
        
        var el = $('#registration_form .' + field + '-field .bullet');
        
        var errorContainer = $('#registration_form .' + field + '-field .form-error');
        
        if (!status) {
            el.removeClass('green');
            el.removeClass('red');
            el.addClass('yellow');
            errorContainer.text('');
            validElements[field] = false;
        } else if (status == 'ok') {
            el.removeClass('yellow');
            el.removeClass('red');
            el.addClass('green');
            errorContainer.text('');
            validElements[field] = true;
        } else if (status == 'error') {
            el.removeClass('green');
            el.removeClass('yellow');
            el.addClass('red');
            
            if (!errorText) {
                errorText = 'The field has an incorrect format';
            }
            el.one('click', function(){
                errorContainer.text(errorText);
            });
            validElements[field] = false;
        }
    }
    
    function validate(name){
        var el = getInput(name);
        var error = false;
        if (el) {
            var val = el.val();
            if (!el.val()) {
                error = 'This field is required';
            } else if (name == 'password') {
                if (val.length < 6) {
                    error = 'Password is too short (minimum 6 characters)';
                } else if (val == '111111' || val == '123456' || val == 'qwerty' || val == '654321') {
                    error = 'Password is not sufficiently reliable.';
                }
                
            } else if (name == 'email') {
                if (val.length > 100) {
                    error = 'The value is too long';
                }
            } else {
                if (val.length > 30) {
                    error = 'The value is too long';
                }
            }
        }
        
        if (error) {
            setFieldStatus(name, 'error', error);
            return false;
        } else {
            setFieldStatus(name, 'ok');
            return true;
        }
    }
    
    function validateForm(){
        
        var valid = true;
        
        $('#registration_form .form-field input').each(function(){
            valid = valid && validate(this.name);
        });
        
        if (!valid) {
            $('#registration_form .bullet').click();
            return false;
        } else {
            return true;
        }
    }
    
    function showSuccessMessage(email){
        
        var a = email.split('@');
        var mail = a[1];
        
        $('#registration_form table').hide();
        
        $('#email-help-link').html('<a target="_blank" href="http://' + mail + '"> Go to ' + mail + '</a>').show();
        $('#user-email').text(email);
        
        $('#activation_form table').show();
    }
    
    disableSubmit();
    
    var input = $('#registration_form .form-field input');
    
    input.bind('focus', function(el){
        if (this.name == 'password') {
            enableSubmit();
        }
        if (!validElements[this.name]) {
            setFieldStatus(this.name);
        }
    });
    
    input.bind('change', function(){
        validate(this.name);
    });
    
    $('#registration_form').bind('submit', function(){
        
        if (validateForm()) {
            
            //clean errors
            $("#error-message").hide();
            
            var url = Master.Url.json('site', 'auth', 'registration');
            
            var email = this.email.value;
            
            var data = {
                reg_submit: 1,
                email: this.email.value,
                password: this.password.value,
                name: this.name.value,
                surname: this.surname.value,
                code: code
            }
            
            var callback = function(res){
                enableSubmit();
                $('#registration_form .loading_message').hide();
                if (res.success) {
                    showSuccessMessage(email);
                } else {
                    if (res.messages) {
                        for (var name in res.messages) {
                            if (res.messages.hasOwnProperty(name)) {
                                if (getInput(name)) {
//                                    if (name == 'email') {
//                                        if (res.messages[name] == 'Value is not unique') {
//                                            setFieldStatus(name, 'error', 'Такой Email уже зарегистрирован в системе.');
//                                        } else {
//                                            setFieldStatus(name, 'error', 'Не верный Email');
//                                        }
//                                    } else {
                                        var str = '';
                                        try {
                                            if (res.messages instanceof Array) {
                                                for (var i in res.messages[name]) {
                                                    if (res.messages[name].hasOwnProperty(i)) {
                                                        str += res.messages[name][i] + '. ';
                                                    }
                                                }
                                            } else {
                                                throw 'not array'
                                            }
                                        } catch(e){
                                            str = '' + res.messages[name];
                                        }
                                        if (!str) {
                                            str = 'The field is not filled correctly';
                                        }
                                        setFieldStatus(name, 'error', str);
//                                    }
                                } else {
                                    $("#error-message").text(res.messages[name]).show();
                                }
                            }
                        }
                    } else if (res.message) {
                        $("#error-message").text(res.message).show();
                    } else {
                        $("#error-message").text("An error has occurred").show();
                    }
                    $('#registration_form .bullet').click();
                }
            };
            disableSubmit();
            $('#registration_form .loading_message').show();
            $.post(url, data, callback, 'json');
        }
        
        return false;
    });
    
    $("#error-message").ajaxError(function(event, request, settings){
        $(this).text("An error has occurred").show();
    });
    
    
    var path = window.location.pathname;
    var a;
    var reg;
    reg = /\/email\/([^\/]*)/;
    a = path.match(reg);
    
    if (a) {
        var email = a[1];
        getInput('email').val(email);
        validate('email');
    }
    reg = /\/code\/([^\/]*)/;
    a = path.match(reg);
    if (a && a[1].length == 8) {
        code = a[1];
    }

    getInput('name').focus();

});
