private bool UpdateRole()
	{
		try
		{
			if (!currentUserCanModifySettings)
				throw new Exception(GetMessageRaw("Message.InsufficientRightsToEditRole"));

			if (String.IsNullOrEmpty(tbRoleName.Text))
				throw new Exception(GetMessageRaw("Message.RoleNameRequired"));

			BXSecurityPolicy policy = new BXSecurityPolicy();
			if (!cbCheckwordTimeoutParent.Checked)
			{
				int checkwordTimeout;
				if (Int32.TryParse(tbCheckwordTimeout.Text, out checkwordTimeout))
					policy.CheckwordTimeoutDraft = checkwordTimeout;
			}
			if (!cbMaxStoreNumParent.Checked)
			{
				int maxStoreNumParent;
				if (Int32.TryParse(tbMaxStoreNum.Text, out maxStoreNumParent))
					policy.MaxStoreNumDraft = maxStoreNumParent;
			}
			if (!cbSessionIPMaskParent.Checked)
			{
				policy.SessionIPMaskDraft = tbSessionIPMask.Text;
			}
			if (!cbStoreIPMaskParent.Checked)
			{
				policy.StoreIPMaskDraft = tbStoreIPMask.Text;
			}
			if (!cbSessionTimeoutParent.Checked)
			{
				int sessionTimeoutParent;
				if (Int32.TryParse(tbSessionTimeout.Text, out sessionTimeoutParent))
					policy.SessionTimeoutDraft = sessionTimeoutParent;
			}
			if (!cbStoreTimeoutParent.Checked)
			{
				int storeTimeoutParent;
				if (Int32.TryParse(tbStoreTimeout.Text, out storeTimeoutParent))
					policy.StoreTimeoutDraft = storeTimeoutParent;
			}

			role.Active = cbActive.Checked;
			role.RoleTitle = tbRoleTitle.Text;
			role.Comment = tbComment.Text;
			role.Policy = policy.Policy;

			string roleName = tbRoleName.Text;
			if (!String.IsNullOrEmpty(role.ProviderName))
			{
				if (roleName.StartsWith(role.ProviderName + @"\", StringComparison.InvariantCultureIgnoreCase))
					roleName = roleName.Substring(role.ProviderName.Length + 1);
				roleName = role.ProviderName + @"\" + roleName;
			}
			role.RoleName = roleName;

			role.Update();

			List<string> subRolesTmp1 = new List<string>();
			foreach (ListItem item in lbSubRoles.Items)
				if (item.Selected)
					subRolesTmp1.Add(item.Value);

			role.RemoveFromSubRoles();
			if (subRolesTmp1.Count > 0)
			{
				string[] subRolesTmp = subRolesTmp1.ToArray();
				role.AddToSubRoles(subRolesTmp);
			}

			List<string> taskNamesTmp1 = new List<string>();
			foreach (ListItem item in lbTasks.Items)
				if (item.Selected)
					taskNamesTmp1.Add(item.Value);

			role.RemoveFromTasks();
			if (taskNamesTmp1.Count > 0)
			{
				string[] taskNamesTmp = taskNamesTmp1.ToArray();
				role.AddToTasks(taskNamesTmp);
			}

			List<string> operationNamesTmp1 = new List<string>();
			foreach (Control cntrl in Form.Controls)
				WalkThrowControlsGet(cntrl, ref operationNamesTmp1);

			role.RemoveFromOperations();
			if (operationNamesTmp1.Count > 0)
			{
				string[] operationNamesTmp = operationNamesTmp1.ToArray();
				role.AddToOperations(operationNamesTmp);
			}

						
			foreach (var r in ActiveRoles)
			foreach (var op in userOperations)
			{
				try
				{
					BXRoleManager.RemoveRoleFromOperations(role.RoleName, op, "main", "r" + r.RoleId.ToString());
				}
				catch
				{
		
				}
			}

			var separate = UserOperationsSeparate.Checked;
			var userOps =
				from RepeaterItem i in UserOperationsContainer.Items 
				where ((CheckBox)i.FindControl("Operation")).Checked
				select new 
				{ 
					Name = userOperationNames[i], 
					Limited = separate ? ((CheckBox)i.FindControl("Limit")).Checked : UserOperationsLimit.Checked,
					Roles = separate ? (ListControl)i.FindControl("Roles") : UserOperationsRoles
				};
		
			string[] roleNameArray = new[] { role.RoleName };
			foreach (var op in userOps)
			{
				if (!op.Limited)
					role.AddToOperations(new [] { op.Name });
				else
				{
					var opNameArray = new [] { op.Name };
										
					BXRoleManager.AddRolesToOperations(roleNameArray, opNameArray, "main", "r2");
					BXRoleManager.AddRolesToOperations(roleNameArray, opNameArray, "main", "r3");

					foreach (var opRole in (from ListItem i in op.Roles.Items where i.Selected select i.Value))
						BXRoleManager.AddRolesToOperations(roleNameArray, opNameArray, "main", "r" + opRole);
				}
			}

			return true;
		}
		catch (Exception e)
		{
			errorMessage.AddErrorMessage(e.Message);
		}

		return false;
	}
	private void LoadData()
	{
		lbSubRoles.Items.Clear();
		
		foreach (BXRole roleTmp in ActiveRoles)
		{
			if (role == null || !String.Equals(role.RoleName, roleTmp.RoleName, StringComparison.InvariantCultureIgnoreCase))
				lbSubRoles.Items.Add(new ListItem(roleTmp.Title, roleTmp.RoleName));
		}

		lbTasks.Items.Clear();
		BXRoleTaskCollection tasksTmp = BXRoleTaskManager.GetList(null, new BXOrderBy_old("TaskName", "Asc"));
		foreach (BXRoleTask taskTmp in tasksTmp)
			lbTasks.Items.Add(new ListItem(taskTmp.Title, taskTmp.TaskName));

		string moduleIdTmp = null;
		CheckBoxList lbOperationsTmp = new CheckBoxList();
		BXRoleOperationCollection operationsTmp = BXRoleOperationManager.GetList(null, new BXOrderBy_old("ModuleId", "Asc", "OperationName", "Asc"));
		foreach (BXRoleOperation operationTmp in operationsTmp)
		{
			if (String.IsNullOrEmpty(moduleIdTmp) || !moduleIdTmp.Equals(operationTmp.ModuleId, StringComparison.InvariantCultureIgnoreCase))
			{
				moduleIdTmp = operationTmp.ModuleId;
				Control cntrl = WalkThrowControlsSearch(Form, String.Format("lbOperations_{0}", moduleIdTmp));
				lbOperationsTmp = (CheckBoxList)cntrl;
				lbOperationsTmp.Items.Clear();
			}

			//remove special user operations from the common list
			if (!Array.Exists(userOperations, x => string.Equals(x, operationTmp.OperationName, StringComparison.OrdinalIgnoreCase)))
				lbOperationsTmp.Items.Add(new ListItem(Encode(operationTmp.OperationFriendlyName), operationTmp.OperationName));
		}

		if (role == null)
		{
			roleId = -1;
			hfRoleId.Value = roleId.ToString();

			ddProviderName.Visible = true;
			lbProviderName.Visible = false;

			trUsersCount.Visible = false;
			trRolesCount.Visible = false;

			cbCheckwordTimeoutParent.Checked = true;
			cbMaxStoreNumParent.Checked = true;
			cbSessionIPMaskParent.Checked = true;
			cbSessionTimeoutParent.Checked = true;
			cbStoreIPMaskParent.Checked = true;
			cbStoreTimeoutParent.Checked = true;

			tbCheckwordTimeout.Enabled = false;
			tbMaxStoreNum.Enabled = false;
			tbSessionIPMask.Enabled = false;
			tbSessionTimeout.Enabled = false;
			tbStoreIPMask.Enabled = false;
			tbStoreTimeout.Enabled = false;

			cbActive.Checked = true;

			ddProviderName.Items.Add(new ListItem(GetMessageRaw("BuiltIn"), ""));
			foreach (RoleProvider pr in Roles.Providers)
				ddProviderName.Items.Add(pr.Name);
			ddProviderName.SelectedIndex = 0;
		}
		else
		{
			ddProviderName.Visible = false;
			lbProviderName.Visible = true;

			trUsersCount.Visible = true;
			trRolesCount.Visible = true;

			lbProviderName.Text = HttpUtility.HtmlEncode((!String.IsNullOrEmpty(role.ProviderName) ? role.ProviderName : GetMessageRaw("BuiltIn")));
			tbRoleName.Text = role.ProviderRoleName;
			tbRoleTitle.Text = role.RoleTitle;
			tbComment.Text = role.Comment;
			lbUsersCount.Text = role.UsersCount.ToString();
			lbRolesCount.Text = role.RolesCount.ToString();
			cbActive.Checked = role.Active;

			string[] subRolesTmp = BXRoleManager.GetList(new BXFormFilter(new BXFormFilterItem("Parent.RoleName", role.RoleName, BXSqlFilterOperators.Equal)), new BXOrderBy_old("RoleName", "Asc")).ToStringArray();
			List<string> subRolesTmp1 = new List<string>(subRolesTmp);
			foreach (ListItem item in lbSubRoles.Items)
				if (subRolesTmp1.Contains(item.Value))
					item.Selected = true;

			string[] subTasksTmp = BXRoleTaskManager.GetList(
					new BXFormFilter(
						new BXFormFilterItem("Role.RoleName", role.RoleName, BXSqlFilterOperators.Equal),
						new BXFormFilterItem("Role.ModuleId", "", BXSqlFilterOperators.Equal)
					),
					new BXOrderBy_old("TaskName", "Asc")
				).ToStringArray();
			List<string> subTasksTmp1 = new List<string>(subTasksTmp);
			foreach (ListItem item in lbTasks.Items)
				if (subTasksTmp1.Contains(item.Value))
					item.Selected = true;

			string[] subOperationsTmp = BXRoleOperationManager.GetList(
				new BXFormFilter(
					new BXFormFilterItem("Role.RoleName", role.RoleName, BXSqlFilterOperators.Equal),
					new BXFormFilterItem("Role.ModuleId", "", BXSqlFilterOperators.Equal)
				),
				new BXOrderBy_old("OperationName", "Asc")
			)
			.ToStringArray();

			List<string> subOperationsTmp1 = new List<string>(subOperationsTmp);
			foreach (Control cntrl in Form.Controls)
				WalkThrowControlsSelect(cntrl, ref subOperationsTmp1);

			BXSecurityPolicy policy = new BXSecurityPolicy(role.Policy);
			FillPolicyFieldsInt(policy.CheckwordTimeoutDraft, tbCheckwordTimeout, cbCheckwordTimeoutParent);
			FillPolicyFieldsInt(policy.MaxStoreNumDraft, tbMaxStoreNum, cbMaxStoreNumParent);
			FillPolicyFieldsString(policy.SessionIPMaskDraft, tbSessionIPMask, cbSessionIPMaskParent);
			FillPolicyFieldsInt(policy.SessionTimeoutDraft, tbSessionTimeout, cbSessionTimeoutParent);
			FillPolicyFieldsString(policy.StoreIPMaskDraft, tbStoreIPMask, cbStoreIPMaskParent);
			FillPolicyFieldsInt(policy.StoreTimeoutDraft, tbStoreTimeout, cbStoreTimeoutParent);


			LoadUserOperations(subOperationsTmp);
		}
	}