/**
 * Generates the User Group Tree
 *
 * @class MODx.tree.UserGroup
 * @extends MODx.tree.Tree
 * @param {Object} config An object of options.
 * @xtype modx-tree-usergroup
 */
MODx.tree.UserGroup = function(config) {
    config = config || {};
    Ext.applyIf(config,{
        title: _('user_groups')
        ,id: 'modx-tree-usergroup'
        ,url: MODx.config.connector_url
        ,action: 'Security/Group/GetNodes'
        ,sortAction: 'Security/Group/Sort'
        ,rootIconCls: 'icon-group'
        ,root_id: 'n_ug_0'
        ,root_name: _('user_groups')
        ,enableDD: true
        ,ddGroup: 'modx-usergroup-dd'
        ,rootVisible: true
        ,ddAppendOnly: true
        ,useDefaultToolbar: true
        ,tbar: [{
            text: _('user_group_new')
            ,cls: 'primary-button'
            ,scope: this
            ,handler: this.createUserGroup.createDelegate(this,[true],true)
        }]
    });
    MODx.tree.UserGroup.superclass.constructor.call(this,config);
};
Ext.extend(MODx.tree.UserGroup,MODx.tree.Tree,{
    windows: {}

    /**
     * Handles tree clicks
     * @param {Object} n The node clicked
     * @param {Object} e The event object
     */
    ,_handleClick: function (n,e) {
        e.stopEvent();
        e.preventDefault();

        if (this.disableHref) {return true;}
        if (e.ctrlKey) {return true;}
        return true;
    }

    ,addUser: function(item,e) {
        var n = this.cm.activeNode;
        var ug = n.id.substr(2).split('_');ug = ug[1];
        if (ug === undefined) {ug = 0;}
        var r = {usergroup: ug};

        if (!this.windows.adduser) {
            this.windows.adduser = MODx.load({
                xtype: 'modx-window-usergroup-adduser'
                ,listeners: {
                    'success': {fn:this.refresh,scope:this}
                }
            });
        } else {
            this.windows.adduser.reset();
        }
        this.windows.adduser.setValues(r);
        this.windows.adduser.show(e.target);
    }

    ,createUserGroup: function(item,e,tbar) {
        tbar = tbar || false;
        var p;
        if (tbar === false) {
            var n = this.cm.activeNode;
            p = n.id.substr(2).split('_');p = p[1];
            if (p === undefined) {p = 0;}
        } else {p = 0;}

        var r = {'parent': p};

        if (!this.windows.createUsergroup) {
            this.windows.createUsergroup = MODx.load({
                xtype: 'modx-window-usergroup-create'
                ,listeners: {
                    'success': {fn:this.refresh,scope:this}
                }
            });
        } else {
            this.windows.createUsergroup.reset();
        }
        this.windows.createUsergroup.fp.form.setValues(r);
        this.windows.createUsergroup.show(e.target);
    }

    ,updateUserGroup: function(item,e) {
        var n = this.cm.activeNode;
        var id = n.id.substr(2).split('_');id = id[1];

        MODx.loadPage('security/usergroup/update', 'id=' + id);
    }

    ,getMenu: function() {
        var m = [];
        var n = this.cm.activeNode;
        var ui = n.getUI();

        switch (n.attributes.type) {
            case 'usergroup':
                if (MODx.perm.usergroup_user_edit && ui.hasClass('padduser')) {
                    m.push({
                        text: _('user_group_user_add')
                        ,handler: this.addUser
                    });
                    m.push('-');
                }
                if (MODx.perm.usergroup_new && ui.hasClass('pcreate')) {
                    m.push({
                        text: _('user_group_create')
                        ,handler: this.createUserGroup
                    });
                }
                if (MODx.perm.usergroup_edit && ui.hasClass('pupdate')) {
                    m.push({
                        text: _('user_group_update')
                        ,handler: this.updateUserGroup
                    });
                }
                if (MODx.perm.usergroup_delete && ui.hasClass('premove')) {
                    m.push('-');
                    m.push({
                        text: _('user_group_remove')
                        ,handler: this.removeUserGroup
                    });
                }
                break;
            case 'user':
                break;
        }

        return m;
    }

    ,removeUserGroup: function(item,e) {
        var n = this.cm.activeNode;
        var id = n.id.substr(2).split('_');id = id[1];
        var user_group = n.text;

        MODx.msg.confirm({
            text: _('user_group_remove_confirm',{
                user_group: user_group
            })
            ,url: this.config.url
            ,params: {
                action: 'Security/Group/Remove'
                ,id: id
            }
            ,listeners: {
                'success': {fn:this.refresh,scope:this}
            }
        });
    }

    ,removeUser: function(item,e) {
        var n = this.cm.activeNode;
        var user_id = n.id.substr(2).split('_');user_id = user_id[1];
        var group_id = n.parentNode.id.substr(2).split('_');group_id = group_id[1];

        MODx.msg.confirm({
            text: _('user_group_user_remove_confirm')
            ,url: this.config.url
            ,params: {
                action: 'Security/Group/User/Remove'
                ,user: user_id
                ,usergroup: group_id
            }
            ,listeners: {
                'success':{fn:this.refresh,scope:this}
            }
        });
    }

    ,_handleDrop: function(e) {
        var id = e.data.node.attributes.id.substr(2).split('_');
        id = parseInt(id[1]);

        if (id === 0) return false; // block Anonymous from moving
        if (id === 1) return false; // block Administrator from moving

        return true;
    }
});
Ext.reg('modx-tree-usergroup',MODx.tree.UserGroup);

/**
 * @class MODx.window.CreateUserGroup
 * @extends MODx.Window
 * @param {Object} config An object of configuration user groups
 * @xtype modx-window-usergroup-create
 */
MODx.window.CreateUserGroup = function(config) {
    config = config || {};
    this.ident = config.ident || 'cugrp'+Ext.id();
    Ext.applyIf(config,{
        title: _('create_user_group')
        ,id: this.ident
        ,width: 700
        ,stateful: false
        ,url: MODx.config.connector_url
        ,action: 'Security/Group/Create'
        ,fields: [{
            name: 'parent'
            ,id: 'modx-'+this.ident+'-parent'
            ,xtype: 'hidden'
        },{
            xtype: 'textfield'
            ,fieldLabel: _('name')
            ,description: MODx.expandHelp ? '' : _('user_group_desc_name')
            ,name: 'name'
            ,id: 'modx-'+this.ident+'-name'
            ,allowBlank: false
            ,anchor: '100%'
        },{
            xtype: MODx.expandHelp ? 'label' : 'hidden'
            ,forId: 'modx-'+this.ident+'-name'
            ,html: _('user_group_desc_name')
            ,cls: 'desc-under'
        },{
            xtype: 'textarea'
            ,fieldLabel: _('description')
            ,description: MODx.expandHelp ? '' : _('user_group_desc_description')
            ,name: 'description'
            ,id: 'modx-'+this.ident+'-description'
            ,anchor: '100%'
        },{
            xtype: MODx.expandHelp ? 'label' : 'hidden'
            ,forId: 'modx-'+this.ident+'-description'
            ,html: _('user_group_desc_description')
            ,cls: 'desc-under'
        },{
            xtype: 'fieldset'
            ,collapsible: true
            ,collapsed: false
            ,autoHeight: true
            ,title: _('user_group_aw')
            ,items: [{
                html: '<p style="margin: 5px 0 0">'+_('user_group_aw_desc')+'</p>'
                ,cls: 'desc-under'
            },{
                layout: 'column'
                ,border: false
                ,defaults: {
                    layout: 'form'
                    ,labelAlign: 'top'
                    ,anchor: '100%'
                    ,border: false
                }
                ,items: [{
                    columnWidth: .5
                    ,items: [{
                        xtype: 'textfield'
                        ,name: 'aw_users'
                        ,fieldLabel: _('user_group_aw_users')
                        ,description: _('user_group_aw_users_desc')
                        ,id: this.ident+'-aw-users'
                        ,anchor: '100%'
                        ,value: ''
                    },{
                        xtype: MODx.expandHelp ? 'label' : 'hidden'
                        ,forId: this.ident+'-aw-users'
                        ,html: _('user_group_aw_users_desc')
                        ,cls: 'desc-under'
                    },{
                        fieldLabel: _('user_group_aw_resource_groups')
                        ,description: _('user_group_aw_resource_groups_desc')
                        ,name: 'aw_resource_groups'
                        ,id: this.ident+'-aw-resource-groups'
                        ,xtype: 'textfield'
                        ,value: ''
                        ,anchor: '100%'
                    },{
                        xtype: MODx.expandHelp ? 'label' : 'hidden'
                        ,forId: this.ident+'-aw-resource-groups'
                        ,html: _('user_group_aw_resource_groups_desc')
                        ,cls: 'desc-under'
                    },{
                        boxLabel: _('user_group_aw_parallel')
                        ,description: _('user_group_aw_parallel_desc')
                        ,name: 'aw_parallel'
                        ,id: this.ident+'-aw-parallel'
                        ,xtype: 'checkbox'
                        ,checked: false
                        ,inputValue: 1
                        ,anchor: '100%'
                    },{
                        xtype: MODx.expandHelp ? 'label' : 'hidden'
                        ,forId: this.ident+'-aw-parallel'
                        ,html: _('user_group_aw_parallel_desc')
                        ,cls: 'desc-under'
                    }]
                },{
                    columnWidth: .5
                    ,items: [{
                        xtype: 'textfield'
                        ,name: 'aw_contexts'
                        ,fieldLabel: _('contexts')
                        ,description: MODx.expandHelp ? '' : _('user_group_aw_contexts_desc')
                        ,id: this.ident+'-aw-contexts'
                        ,anchor: '100%'
                        ,value: 'web'
                    },{
                        xtype: MODx.expandHelp ? 'label' : 'hidden'
                        ,forId: this.ident+'-aw-contexts'
                        ,html: _('user_group_aw_contexts_desc')
                        ,cls: 'desc-under'
                    },{
                        xtype: 'modx-combo-policy'
                        ,baseParams: {
                            action: 'Security/Access/Policy/GetList'
                            ,group: 'Administrator'
                            ,combo: true
                        }
                        ,name: 'aw_manager_policy'
                        ,fieldLabel: _('user_group_aw_manager_policy')
                        ,description: MODx.expandHelp ? '' : _('user_group_aw_manager_policy_desc')
                        ,id: this.ident+'-aw-manager-policy'
                        ,anchor: '100%'
                        ,allowBlank: true
                    },{
                        xtype: MODx.expandHelp ? 'label' : 'hidden'
                        ,forId: this.ident+'-aw-manager-policy'
                        ,html: _('user_group_aw_manager_policy_desc')
                        ,cls: 'desc-under'
                    },{
                        fieldLabel: _('user_group_aw_categories')
                        ,description: _('user_group_aw_categories_desc')
                        ,name: 'aw_categories'
                        ,id: this.ident+'-aw-categories'
                        ,xtype: 'textfield'
                        ,value: ''
                        ,anchor: '100%'
                    },{
                        xtype: MODx.expandHelp ? 'label' : 'hidden'
                        ,forId: this.ident+'-aw-categories'
                        ,html: _('user_group_aw_categories_desc')
                        ,cls: 'desc-under'
                    }]
                }]
            }]
        }]
        ,keys: []
    });
    MODx.window.CreateUserGroup.superclass.constructor.call(this,config);
};
Ext.extend(MODx.window.CreateUserGroup,MODx.Window);
Ext.reg('modx-window-usergroup-create',MODx.window.CreateUserGroup);

/**
 * @class MODx.window.AddUserToUserGroup
 * @extends MODx.Window
 * @param {Object} config An object of configuration user groups
 * @xtype modx-window-usergroup-adduser
 */
MODx.window.AddUserToUserGroup = function(config) {
    config = config || {};
    this.ident = config.ident || 'adtug'+Ext.id();
    Ext.applyIf(config,{
        title: _('user_group_user_add')
        ,id: this.ident
        ,url: MODx.config.connector_url
        ,action: 'Security/Group/User/Create'
        ,fields: [{
            fieldLabel: _('name')
            ,description: MODx.expandHelp ? '' : _('user_group_user_add_user_desc')
            ,name: 'user'
            ,hiddenName: 'user'
            ,xtype: 'modx-combo-user'
            ,editable: true
            ,typeAhead: true
            ,allowBlank: false
            ,id: 'modx-'+this.ident+'-user'
            ,anchor: '100%'
        },{
            xtype: MODx.expandHelp ? 'label' : 'hidden'
            ,forId: 'modx-'+this.ident+'-role'
            ,html: _('user_group_user_add_user_desc')
            ,cls: 'desc-under'
        },{
            fieldLabel: _('role')
            ,description: MODx.expandHelp ? '' : _('user_group_user_add_role_desc')
            ,name: 'role'
            ,hiddenName: 'role'
            ,xtype: 'modx-combo-role'
            ,id: 'modx-'+this.ident+'-role'
            ,allowBlank: false
            ,anchor: '100%'
        },{
            xtype: MODx.expandHelp ? 'label' : 'hidden'
            ,forId: 'modx-'+this.ident+'-role'
            ,html: _('user_group_user_add_role_desc')
            ,cls: 'desc-under'
        },{
            name: 'usergroup'
            ,xtype: 'hidden'
            ,id: 'modx-'+this.ident+'-user-group'
        }]
    });
    MODx.window.AddUserToUserGroup.superclass.constructor.call(this,config);
};
Ext.extend(MODx.window.AddUserToUserGroup,MODx.Window);
Ext.reg('modx-window-usergroup-adduser',MODx.window.AddUserToUserGroup);
