(function( $ ){
    $.fn.auth = function(callback) {
        var container = this;
        var init = function() {
            $.post(userRegistrationFormUrl, function(data) {
                container.html(data);
                $('#registration_close_id').click(function() {
                    container.html('');
                    return false;
                });
                $('#registration_form_id input[name="email"]').focus();
                $('#registration_phone_id').mask('(999) 999-9999');
                $('#switch_auth_id').click(function() {
                    $.post($(this).attr('href'), function(data) {
                        container.html(data);
                        $('#auth_form_id input[name="email"]').focus();
                        $('#auth_close_id').click(function() {
                            container.html('');
                            return false;
                        });
                        $('#auth_form_id').ajaxForm({
                            beforeSubmit: function() {
                                document.body.style.cursor = 'wait';
                            },
                            dataType:  "html",
                            success: function(response) {
                                document.body.style.cursor = 'default';
                                try {
                                    var json = $.parseJSON(response);
                                    $('#auth_info_id').html(json.message);
                                } catch(e) {
                                    container.html('');
                                    callback();
                                }
                            }
                        });
                        $('#switch_registration_id').click(init);
                    });
                    return false;
                });
                $('#registration_geo_region_id').change(function() {
                    $('#registration_geo_city_id').attr('disabled', true);
                    $.post(
                        $(this).attr('cities'), 
                        { 
                            id : $(this).attr('value') 
                        }, 
                        function(data) {
                            $('#registration_geo_city_id')
                                .html(data)
                                .attr('disabled', false)
                            ;
                        }
                    );
                });
                $('#registration_form_id').ajaxForm({
                    beforeSubmit: function(data, form, options) {
                        document.body.style.cursor = 'wait';
                        form.find('input[type="submit"]').attr('disabled', true);
                    },
                    dataType:  "json",
                    success: function(response, status, xhr, form) {
                        document.body.style.cursor = 'default';
                        if (response.messages) {
                            form.find('input[type="submit"]').attr('disabled', false);
                            var messages = [];
                            $.each(response.messages, function(key, value) {
                                messages.push(value);
                            });
                            var message = messages.join('<br/>');
                            $('#registration_info_id').html(message);
                        } else if (response.url) {
                            form.find('input').attr('disabled', true);
                            form.find('select').attr('disabled', true);
                            form.find('input[type="submit"]').attr('disabled', false);
                            form.find('input[name="code"]').attr('disabled', false).focus();
                            form.attr('action', response.url);
                        } else {
                            container.html('');
                            callback();
                        }
                    }
                });
            });
            return false;
        };
        init();
    };
})( jQuery );
