protected void Roles_Init(object sender, BXCustomAdminFilter.InitEventArgs e)
	{
		var val = HttpContext.Current.Request.QueryString["filter_roles"];
		if (val != null)
		{
			foreach (ListItem li in RolesList.Items)
			{
				if (li.Value == val)
				{
					li.Selected = true;
					e.Initialized = true;
					return;
				}
			}			
		}
	}
	protected void Roles_LoadState(object sender, BXCustomAdminFilter.StateEventArgs e)
	{
		if (e.State.Contains("roles"))
		{
			var roles = e.State["roles"] as string[];
			if (roles != null)
			{
				foreach (ListItem li in RolesList.Items)
					li.Selected = Array.IndexOf(roles, li.Value) >= 0;
			}			
		}
		if (e.State.Contains("subroles"))
		{
			var v = e.State["subroles"];
			if (v != null && v is bool)
				IncludeSubRoles.Checked = (bool)v;			
		}
	}
	protected void Roles_SaveState(object sender, BXCustomAdminFilter.StateEventArgs e)
	{
		e.State["roles"] = (from ListItem li in RolesList.Items where li.Selected select li.Value).ToArray();
		e.State["subroles"] = IncludeSubRoles.Checked;
	}
	protected void Roles_BuildFilter(object sender, BXCustomAdminFilter.BuildFilterEventArgs e)
	{
		List<int> roles = new List<int>();
		foreach(ListItem li in RolesList.Items)
		{
			int i;
			if (li.Selected && int.TryParse(li.Value, out i) && i > 0 && !roles.Contains(i))
				roles.Add(i);
		}
		if (roles.Count == 0)
			return;

		e.Result.Add("CheckRoles", roles, IncludeSubRoles.Checked ? BXSqlFilterOperators.In : BXSqlFilterOperators.Equal);
	}