// Ensure User namespace
UserAdmin.User = UserAdmin.User || {};

(function(UA) {
    UA.SimpleOrgForm = function(options) {
        var _self = {},
            _manager,
            _form,
            _options = $.extend({
                id: 'ua-simpleorgform',
                url: UA.handlerPath + 'users.ashx'
            }, options),
            $dialog;

        _self.show = function() {
            $dialog.dialog('open');
        };

        function _showMessage(message, delay) {
            $('p', $dialog).text(message).show();
            if (delay) {
                setTimeout(function() {
                    $('p', $dialog).slideUp();
                }, delay);
            }
        }

        function _checkDuplicate(success) {
            var name = $('input', $dialog).val();
            $.ajax({
                url: _options.url,
                dataType: 'json',
                data: { name: name },
                success: function(data) {
                    if (data) {
                        _showMessage('An Organization with that name already exists.', 3000);
                    } else {
                        success(name);
                    }
                },
                error: function() {
                    _showMessage('Error occurred checked Organization name.');
                }
            });
        }

        function _addOrganization(name, success) {
            $.ajax({
                url: _options.url,
                dataType: 'json',
                type: 'POST',
                data: { Name: name },
                success: success,
                error: function() {
                    if (console) {
                        console.log(arguments);
                    }
                    _showMessage('Error occurred adding Organization.');
                }
            });
        }

        _self.init = function(manager, form) {
            _manager = manager;
            _form = form;
            var html = ['<div id="' + _options.id + '" class="ua-form-simpleform">',
                    '<h1>Organization Name</h1>',
                    '<p class="ui-state-error" style="display:none"></p>',
                    '<input type="text" class="ui-state-default" style="width:80%" />',
                '</div>'];

            $dialog = $(html.join('')).dialog({
                autoOpen: false,
                width: 350,
                buttons: {
                    'Ok': function() {
                        _checkDuplicate(function(name) {
                            _addOrganization(name, function(data) {
                                _manager.refreshList('orgs');
                                $dialog.dialog('close');
                            });
                        });
                    },
                    'Cancel': function() {
                        $(this).dialog('close');
                    }
                }
            });
        };

        return _self;
    };

    UA.User.Form = function(options) {
        var _self = {},
			_manager,
			_form,
			_lazyLoadList = {},
			_options = $.extend({
			    id: 'ua-user-form',
			    title: 'User Form',
			    target: '#ua-container',
			    url: UA.handlerPath + 'users.ashx',
			    dialog: true,
			    openOn: 'ua-manager-formopen',
			    organizationsUrl: UA.handlerPath + 'organizations.ashx',
			    passwordUrl: UA.handlerPath + 'userpassword.ashx',
			    lists: {}, // pattern: "'key': { defaultVal:'foo', list:{ 'val1':'text 1', 'val2', 'text 2' } }"
			    simpleForms: { org: UA.SimpleOrgForm({ url: options.organizationsUrl }) },
			    groups: { 'acct': 'Account', 'bio': 'Biographical Info', 'addr': 'Address Info', 'roles': 'Roles' },
			    fieldsUrl: UA.handlerPath + 'fields.ashx',
			    buttons: { 'Save':function() {} },
			    saveButton: 'Save',
			    clearButton: 'Clear'
			}, options);

        var $fieldsets = {};
        var $container;

        _self.init = function(manager, dataObj) {
            _manager = manager;

            _form = UA.Common.Form({
                id: _options.id,
                formType: 'User',
                target: _options.target,

                title: _options.title,
                url: _options.url,
                passwordUrl: _options.passwordUrl,
                openOn: _options.openOn,
                dialog: _options.dialog,

                groups: _options.groups,
                fieldsUrl: _options.fieldsUrl,
                fields: _options.fields,
                context: _options.context,
                lists: _options.lists,
                simpleForms: _options.simpleForms,
                buttons: _options.buttons,
                saveButton: _options.saveButton,
                clearButton: _options.clearButton,

                saved: function(user) {
                    $(_manager).trigger('ua-manager-usersaved');
                },

                lazyLoaders: {
                    'roles': {
                        typeName: 'ua-manager-rolesloaded',
                        processor: function(data) {
                            var simple = {};
                            $.each(data.roles, function(i, role) {
                                simple[role.RoleId] = role.Name;
                            });
                            return simple;
                        }
                    },
                    'orgs': {
                        typeName: 'ua-manager-orgsloaded',
                        processor: function(data) {
                            var simple = {};
                            $.each(data.orgs, function(i, org) {
                                simple[org.OrganizationId] = org.Name;
                            });
                            return simple;
                        }
                    }
                }
            });

            _form.init(_manager, dataObj);
        };
        
        _self.load = function(dataObj) {
            _form.load(dataObj);
        };

        return _self;
    };
})(UserAdmin);