﻿Ext.ns("eKonx.Membership");
Ext.ns("eKonx.Res.Membership");
Ext.ns("eKonx.Urls.Membership");
Ext.ns("eKonx.Plugins.Membership");

eKonx.Res.Membership =
{
	Title: "Пользователи и роли",
	TreeRoot: "Управление правами",
	RolesList: "Список ролей в системе",
	PermissionsInRole: "Права роли",
	IDPrefix: "em_"
}

eKonx.Urls.Membership =
{
	GetOrganizationUsers: "Account/GetOrganizationUsers",
	SaveOrganizationUsers: "Account/SaveOrganizationUsers",
	GetMembershipTree: "Account/GetMembershipTree",
	GetCurrentOrganizationRolePermissions: "Account/GetCurrentOrganizationRolePermissions",
	SaveCurrentOrganizationRolePermissions: "Account/SaveCurrentOrganizationRolePermissions"
}

eKonx.Plugins.Membership.CheckColumn = new Ext.grid.CheckColumn(
{
	header: eKonx.Res.Common.Allowed,
	dataIndex: 'Accepted',
	id: 'accepted',
	width: 55,
	editable: true
});

eKonx.Membership = Ext.extend(
Ext.Panel,
{
	membershipConfig:
	{
		title: eKonx.Res.Membership.Title,
		layout: 'border',
		height: 500,
		items:
		[
			{
				xtype: 'treepanel',
				region: 'west',
				width: 200,
				minSize: 200,
				split: true,
				useArrows: true,
				margins: '5 0 5 5',
				id: eKonx.Res.Membership.IDPrefix + 'membershipTree',
				loader: new Ext.tree.TreeLoader(
				{
					dataUrl: eKonx.Urls.Membership.GetMembershipTree,
					preloadChildren: true,
					requestMethod: "get"
				}),
				root:
				{
					text: eKonx.Res.Membership.TreeRoot,
					id: eKonx.Res.Membership.IDPrefix + 'root',
					expanded: true
				},
				selModel: new Ext.tree.DefaultSelectionModel(
				{
					listeners:
					{
						'selectionchange': function(model, node)
						{
							this.tree.ownerCt.showComponent(node.id);
						}
					}
				})
			},
			{
				region: 'center',
				xtype: 'panel',
				layout: 'fit',
				id: eKonx.Res.Membership.IDPrefix + 'center',
				margins: "5 5 5 0",
				items: []
			}
		]
	},
	constructor: function(config)
	{
		config = config || {};
		Ext.apply(config, this.membershipConfig);
		eKonx.Membership.superclass.constructor.call(this, config);
		this.components.permissionsInRole = new eKonx.Membership.PermissionsInRole();
	},
	listeners:
	{
		beforerender: function()
		{
			var tree = this.findById(eKonx.Res.Membership.IDPrefix + "membershipTree");
			tree.root.expand(true);
			this.showComponent();
		}
	},
	showComponent: function(selectedNodeId)
	{
		do
		{
			if (selectedNodeId == "_users")
			{
				this.showComp(this.components.usersList);
				break;
			}
			var roleId = parseInt(selectedNodeId);
			if ((!roleId) ||
				(selectedNodeId == (eKonx.Res.Membership.IDPrefix + 'root')))
			{
				this.showComp(this.components.description);
				break;
			}
			if (roleId)
			{
				this.components.permissionsInRole.roleID = roleId;
				this.components.permissionsInRole.organizationID = eKonx.Cache.User.OrganizationID;
				this.showComp(this.components.permissionsInRole);
				break;
			}
		}
		while (false);
	},
	showComp: function(comp)
	{
		var center = this.findById(eKonx.Res.Membership.IDPrefix + 'center');
		if (center.items.length > 0) center.items.items[0].hide();
		center.removeAll(false);
		center.add(comp);
		comp.show();
		comp.doLayout();
		center.doLayout();
		this.doLayout();
		this.currentComponent = comp;
	},
	currentComponent: null,
	components:
	{
		description: new Ext.Panel(
		{
			html: eKonx.Urls.Membership.PageDescription,
			id: eKonx.Res.Membership.IDPrefix + 'description',
			border: false
		}),
		usersList: new Ext.grid.EditorGridPanel(
		{
			xtype: 'editorgrid',
			layout: 'fit',
			id: eKonx.Res.Membership.IDPrefix + 'usersList',
			clicksToEdit: 1,
			plugins: eKonx.Plugins.Membership.CheckColumn,
			cm: new Ext.grid.ColumnModel([]),
			bbar: new Ext.PagingToolbar(
			{
				items:
				[
					{
						margins: '0 10 0 0',
						xtype: "tbfill"
					},
					{
						xtype: 'button',
						text: "Save",
						handler: function()
						{
							var st = this.findParentByType("editorgrid").getStore();
							st.save();
							st.commitChanges();
						}
					}
				]
			}),
			store: new Ext.data.JsonStore(
			{
				storeId: 'usersAndRolesStore',
				root: "root",
				autoLoad: false,
				autoSave: false,
				idProperty: 'ID',
				proxy: new Ext.data.HttpProxy(
				{
					api:
					{
						read: eKonx.Urls.Membership.GetOrganizationUsers,
						update: eKonx.Urls.Membership.SaveOrganizationUsers
					},
					method: 'POST'
				}),
				writer: new Ext.data.JsonWriter({}),
				fields:
				[
					{ name: "Name", type: "string" },
					{ name: "FamilyName", type: "string" },
					{ name: "Sex" },
					{ name: "Born", type: "date" },
					{ name: "Email", type: "string" },
					{ name: "Accepted", type: "boolean" },
					{ name: "OrganizationID" },
					{ name: "RoleID" }
				]
			}),
			listeners:
			{
				beforerender: function()
				{
					this.getColumnModel().setConfig(
					[
						{
							id: 'name',
							header: eKonx.Res.Common.Name,
							dataIndex: 'Name',
							editable: false
						},
						{
							id: 'familyName',
							header: eKonx.Res.Common.FamilyName,
							dataIndex: 'FamilyName',
							editable: false
						},
						{
							id: 'sex',
							header: eKonx.Res.Common.Sex,
							dataIndex: 'Sex',
							editable: false,
							renderer: function(value)
							{
								if (value === true) return eKonx.Res.Common.WSex;
								if (value === false) return eKonx.Res.Common.MSex;
								return "";
							}
						},
						{
							id: 'born',
							header: 'Born',
							editable: false,
							dataIndex: 'Born'
						},
						{
							id: 'email',
							header: 'Email',
							editable: false,
							dataIndex: 'Email'
						},
						eKonx.Plugins.Membership.CheckColumn,
						eKonx.Cache.GetColumn("OrganizationRoles", eKonx.Res.Common.Role, "RoleID", eKonx.Res.Common.Select + " " + eKonx.Res.Common.Role + "...", 100)
					],
					true);

					var st = this.getStore();
					st.reload();
					this.getBottomToolbar().bindStore(st);
				},
				afterrender: function()
				{
				}
			}
		})//end of users list
	}
});
