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

			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;
			}

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

			role = BXRoleManager.Create(roleName, tbRoleTitle.Text, cbActive.Checked, tbComment.Text, policy.Policy);
			if (role == null)
				throw new Exception(GetMessageRaw("Message.UnableToCreateRole"));

			roleId = role.RoleId;
			hfRoleId.Value = roleId.ToString();

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

			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);

			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);

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

			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 (BXEventException e)
		{
			foreach (string s in e.Messages)
				errorMessage.AddErrorMessage(s);
		}
		catch (Exception e)
		{
			errorMessage.AddErrorMessage(e.Message);
		}
		return false;
	}
	protected void Page_Init(object sender, EventArgs e)
	{
		roleId = base.GetRequestInt("id");
		hfRoleId.Value = Request.Form[hfRoleId.UniqueID];
		if (roleId > 0)
			hfRoleId.Value = roleId.ToString();
		Int32.TryParse(hfRoleId.Value, out roleId);
		if (roleId > 0)
		{
			role = BXRoleManager.GetById(roleId);
			if (role == null)
			{
				roleId = 0;
				hfRoleId.Value = roleId.ToString();
			}
		}

		if (roleId <= 0)
		{
			string roleName = base.GetRequestString("name");
			if (!String.IsNullOrEmpty(roleName))
			{
				role = BXRoleManager.GetByName(roleName);
				if (role != null)
				{
					roleId = role.RoleId;
					hfRoleId.Value = roleId.ToString();
				}
			}
		}

		if (!this.BXUser.IsCanOperate(BXRoleOperation.Operations.AuthorizationSettingsView))
			BXAuthentication.AuthenticationRequired();

		currentUserCanModifySettings = this.BXUser.IsCanOperate(BXRoleOperation.Operations.AuthorizationSettingsManage);
		
		UserOperationsRoles.Items.Clear();
		UserOperationsRoles.Items.AddRange(ActiveRolesNonStandard.Select(x => new ListItem(Encode(x.Title), x.RoleId.ToString())).ToArray());
		UserOperationsContainer.DataSource = userOperations;
		UserOperationsContainer.DataBind();

		PrepareForInsertScript();
	}