private void save(bool closeAfterSave)
        {
            var groupIDForTag = AdminProxy.GetGroupIDForTag(txtTag.Text);

            //if (String.IsNullOrEmpty(txtTag.Text)){
            //    MessageBox.Show(this, "You must specify a tag for the group.", "Tag Required");
            //    txtTag.Focus();
            //    return;
            //} else if (groupIDForTag > -1 && groupIDForTag != ID) {
            //    MessageBox.Show(this, "You must specify a unique tag for the group.\n" + txtTag.Text + " is already taken.", "Unique Tag Required");
            //    txtTag.Focus();
            //    txtTag.SelectAll();
            //    return;
            //}

            if (AdminProxy.IsReservedGroupTagValue(txtTag.Text) && txtTag.Enabled)
            {
                MessageBox.Show(this, getDisplayMember("save{reservedtag_body}", "{0} is a reserved tag name and cannot be used.\nPlease specify a different value.", txtTag.Text),
                                getDisplayMember("save{reservedtag_body}", "Reserved Tag"));
                return;
            }

            ID = AdminProxy.SaveGroup(ID, txtTag.Text, txtName.Text, txtDescription.Text);

            RefreshData();
            MainFormUpdateStatus(getDisplayMember("save{done}", "Saved group {0}", txtName.Text), true);

            if (closeAfterSave)
            {
                if (Modal)
                {
                    this.DialogResult = DialogResult.OK;
                    this.Close();
                }
                else
                {
                    MainFormSelectParentTreeNode();
                }
            }
        }
        public override void RefreshData()
        {
            this.Text = "Group - " + MainFormCurrentNodeText("") + " - " + this.AdminProxy.Connection.ServerName + (Toolkit.IsProcessElevated() ? " - Administrator " : "");

            var ds = AdminProxy.ListGroups(ID < 0 ? int.MaxValue : ID);

            // fill permissions tab
            lvPermissions.Items.Clear();

            foreach (DataRow dr in ds.Tables["list_groups"].Rows)
            {
                txtName.Text = dr["group_name"].ToString();
                txtTag.Text  = dr["group_tag"].ToString();

                if (AdminProxy.IsReservedGroupTagValue(txtTag.Text))
                {
                    txtTag.Enabled = false;
                }
                else
                {
                    txtTag.Enabled = true;
                }

                txtDescription.Text = dr["description"].ToString();

                DataRow[] drPerms = ds.Tables["permissions_by_group"].Select("sys_group_id = " + dr["sys_group_id"]);
                if (drPerms != null && drPerms.Length > 0)
                {
                    foreach (DataRow drp in drPerms)
                    {
                        var lvi = new ListViewItem(drp["title"].ToString(), 0);
                        lvi.Tag = Toolkit.ToInt32(drp["sys_permission_id"], -1);
                        lvi.UseItemStyleForSubItems = false;
                        string dv  = drp["dataview_name"].ToString();
                        string tbl = drp["table_name"].ToString();
                        if (String.IsNullOrEmpty(dv) && String.IsNullOrEmpty(tbl))
                        {
                            lvi.SubItems.Add("-- any resource --");
                        }
                        else
                        {
                            if (!String.IsNullOrEmpty(dv))
                            {
                                lvi.SubItems.Add(dv + " (dataview)");
                            }
                            else
                            {
                                lvi.SubItems.Add(tbl);
                            }
                        }
                        lvi.SubItems.Add(drp["perm_is_enabled"].ToString().ToUpper());
                        addPermItem(lvi, drp["create_permission_text"].ToString());
                        addPermItem(lvi, drp["read_permission_text"].ToString());
                        addPermItem(lvi, drp["update_permission_text"].ToString());
                        addPermItem(lvi, drp["delete_permission_text"].ToString());

                        // get restriction info...
                        var drFields = ds.Tables["group_perm_field_info"].Select("sys_permission_id = " + drp["sys_permission_id"]);
                        if (drFields == null || drFields.Length == 0)
                        {
                            lvi.SubItems.Add("-");
                        }
                        else
                        {
                            // pull perm field info into english-like display...
                            var sb = new StringBuilder();
                            foreach (var drField in drFields)
                            {
                                if (sb.Length > 0)
                                {
                                    sb.Append(" and ");
                                }
                                if (drField["compare_mode"].ToString() == "parent")
                                {
                                    sb.Append(drField["parent_table_name"] + "." + drField["parent_table_field_name"] + " " + drField["parent_compare_operator"] + " " + drField["parent_compare_value"] + " (for all children)");
                                }
                                else
                                {
                                    if (Toolkit.ToInt32(drField["sys_dataview_field_id"], -1) > -1)
                                    {
                                        sb.Append(drField["dataview_name"] + "." + drField["dataview_field_name"] + " " + drField["compare_operator"] + " " + drField["compare_value"] + " (dataview)");
                                    }
                                    else if (Toolkit.ToInt32(drField["sys_table_field_id"], 1) > -1)
                                    {
                                        sb.Append(drField["table_name"] + "." + drField["table_field_name"] + " " + drField["compare_operator"] + " " + drField["compare_value"] + " ");
                                    }
                                    else
                                    {
                                        sb.Append("INVALID -- must map a field from either Data View or Table!!!");
                                    }
                                }
                            }
                            lvi.SubItems.Add(sb.ToString());
                        }
                        lvPermissions.Items.Add(lvi);
                    }
                }


                lvUsers.Items.Clear();
                var dtUsers = ds.Tables["users_by_group"];
                if (dtUsers != null)
                {
                    var drUsers = dtUsers.Select("sys_group_id = " + dr["sys_group_id"]);

                    foreach (DataRow drUser in drUsers)
                    {
                        var lvi = new ListViewItem(new string[] {
                            drUser["user_name"].ToString(),
                            drUser["full_name"].ToString(),
                            drUser["is_enabled"].ToString()
                        });
                        lvi.ImageIndex = 1;
                        lvi.Tag        = drUser["sys_user_id"];
                        lvUsers.Items.Add(lvi);
                    }
                }
            }

            MarkClean();
        }