public override void ToJSON(JObject ParentObject)
        {
            //! the data should be stored this way in the DB and not transformed into it, but we can't do this in Magnolia because of design mode and field type shenanigans

            /*
             * data is coming from the server in two dictionaries: a mapping of value to string, and an array of held permissions
             *                          Options: {
             *                             'nt_1_Create': 'Role',
             *                             'nt_1_tab_1_View': 'Role, Role',
             *                             ...
             *                          }
             *                          Values: [
             *                            'nt_1_Create',
             *                            'nt_1_tab_5_Create',
             *                            ...
             *                         ]
             *
             * We need it in the format: Options: [
             *                            { name: 'Role',
             *                              Create: true,
             *                              Edit: true,
             *                              Delete: true,
             *                              View: true,
             *                              Children: [
             *                                 { name: 'Role Tab',
             *                                   Create: true,
             *                                   Edit: true,
             *                                   Delete: true,
             *                                   View: true,
             *                                   leaf: true
             *                                 }]
             *                             },
             *                             ...
             *                             ]
             *
             */

            ParentObject[_ValueSubField.ToXmlNodeName(true)] = Value.ToString();

            JObject OptionsArray = new JObject();

            ParentObject["options"] = OptionsArray;

            //first build the skeleton of the object we want to return
            foreach (CswNbtMetaDataNodeType NT in _CswNbtResources.MetaData.getNodeTypes())
            {
                JObject NewNT = new JObject();
                NewNT["itemname"] = NT.NodeTypeName;
                NewNT["create"]   = false;
                NewNT["edit"]     = false;
                NewNT["view"]     = false;
                NewNT["delete"]   = false;
                NewNT["itemid"]   = NT.NodeTypeId;
                JArray Children = new JArray();
                foreach (CswNbtMetaDataNodeTypeTab Tab in NT.getNodeTypeTabs())
                {
                    JObject NewTab = new JObject();
                    NewTab["itemname"] = Tab.TabName + " Tab";
                    NewTab["create"]   = false;
                    NewTab["edit"]     = false;
                    NewTab["view"]     = false;
                    NewTab["delete"]   = false;
                    NewTab["itemid"]   = Tab.TabId;
                    NewTab["leaf"]     = true;

                    Children.Add(NewTab);
                }
                NewNT["children"] = Children;
                OptionsArray[NT.NodeTypeId.ToString()] = NewNT;
            }

            //now iterate the values we've stored and assign them to the correct permissions in the skeleton:
            foreach (string Permission in Value)
            {
                string[] PermissionComponents = Permission.Split('_');
                bool     IsTab              = PermissionComponents.Length == 5;
                string   Nodetype           = PermissionComponents[1];
                string   PermissionCategory = PermissionComponents[PermissionComponents.Length - 1].ToLower();

                //our permissions data needs a good cleaning... there are invalid nodetypes in the Values dictionary
                if (ParentObject["options"][Nodetype] != null)
                {
                    if (false == IsTab)
                    {
                        //if we're not dealing with a tab, we can just set the proper permission
                        ParentObject["options"][Nodetype][PermissionCategory] = true;
                    }
                    else
                    {
                        string TabId = PermissionComponents[3];
                        //for tabs we have no choice but to iterate to find the correct tab, because of client-side restrictions
                        foreach (JObject Tab in ParentObject["options"][Nodetype]["children"])
                        {
                            if (Tab["itemid"].ToString() == TabId.ToString())
                            {
                                Tab[PermissionCategory] = true;
                            }
                        } //for each tab in the returned JObject
                    }     //else -- if the permission is a tab
                }         //if this nodetype exists
            }             //for each permission stored in the database
        }                 // ToJSON()