/// <summary> Add a citation set </summary>
        /// <param name="SetName"> Name of the set </param>
        /// <returns> Pre-existing citation set with that name, or just a newly added set </returns>
        public CitationSet Add_CitationSet(string SetName)
        {
            // Does this exist? ( skipping dictionary since unlikely to be more than one or two )
            foreach (CitationSet thisSet in CitationSets)
            {
                if (String.Compare(thisSet.Name, SetName, StringComparison.OrdinalIgnoreCase) == 0)
                    return thisSet;
            }

            // Add a new one then
            CitationSet newSet = new CitationSet {Name = SetName};
            CitationSets.Add(newSet);
            return newSet;
        }
        /// <summary> Add a citation set </summary>
        /// <param name="SetName"> Name of the set </param>
        /// <returns> Pre-existing citation set with that name, or just a newly added set </returns>
        public CitationSet Add_CitationSet(string SetName)
        {
            // Does this exist? ( skipping dictionary since unlikely to be more than one or two )
            foreach (CitationSet thisSet in CitationSets)
            {
                if (String.Compare(thisSet.Name, SetName, StringComparison.OrdinalIgnoreCase) == 0)
                {
                    return(thisSet);
                }
            }

            // Add a new one then
            CitationSet newSet = new CitationSet {
                Name = SetName
            };

            CitationSets.Add(newSet);
            return(newSet);
        }
        private void add_ui_citation_set_info(TextWriter Output, CitationSet SetInfo )
        {
            Output.WriteLine("  <table class=\"sbkSeav_BaseTable sbkSeav_UiCitationTable\">");
            Output.WriteLine("    <tr>");
            Output.WriteLine("      <th class=\"sbkSeav_UiCitationTable_TermCol\">Metadata Term</th>");
            Output.WriteLine("      <th class=\"sbkSeav_UiCitationTable_DisplayCol\">Display Term</th>");
            Output.WriteLine("      <th class=\"sbkSeav_UiCitationTable_SearchCodeCol\">Search Code</th>");
            Output.WriteLine("      <th class=\"sbkSeav_UiCitationTable_OtherCol\">Other</th>");
            Output.WriteLine("    </tr>");

            // Add each field set
            foreach (CitationFieldSet fieldSet in SetInfo.FieldSets)
            {
                // Add a row for this
                Output.WriteLine("    <tr class=\"sbkSeav_UiCitationTable_SetRow\">");
                Output.WriteLine("      <td colspan=\"4\">" + fieldSet.Heading + " ( " + fieldSet.ID + " )</td>");
                Output.WriteLine("    </tr>");

                // Now, add each individual citation element
                foreach (CitationElement thisElement in fieldSet.Elements)
                {
                    Output.WriteLine("    <tr>");
                    Output.WriteLine("      <td style=\"padding-left: 50px;\">" + thisElement.MetadataTerm + "</td>");
                    Output.WriteLine("      <td>" + thisElement.DisplayTerm + "</td>");
                    Output.WriteLine("      <td class=\"sbkSeav_TableCenterCell\">" + thisElement.SearchCode + "</td>");
                    Output.WriteLine("      <td>");
                    if ( !String.IsNullOrEmpty(thisElement.ItemProp ))
                        Output.WriteLine("        microservice itemprop of '" + thisElement.ItemProp + "'.<br />");
                    if ( thisElement.OverrideDisplayTerm == CitationElement_OverrideDispayTerm_Enum.subterm )
                        Output.WriteLine("        display label can be override by subterm (or display term).<br />");
                    if ((thisElement.SectionWriter != null) && ( !String.IsNullOrEmpty(thisElement.SectionWriter.Class_Name)))
                    {
                        if ( !String.IsNullOrEmpty(thisElement.SectionWriter.Assembly))
                            Output.WriteLine("        custom display ( " + thisElement.SectionWriter.Assembly + "." + thisElement.SectionWriter.Class_Name + " ).<br />");
                        else
                            Output.WriteLine("        custom display ( " + thisElement.SectionWriter.Class_Name + " ).<br />");
                    }
                    Output.WriteLine("      </td>");
                    Output.WriteLine("    </tr>");
                }
            }
            Output.WriteLine("  </table>");
        }
        private void set_defaults()
        {
            // Create the new set
            CitationSet defaultSet = new CitationSet {
                Name = "DEFAULT"
            };

            DefaultCitationSet = "DEFAULT";

            // Add the purl in its own field set
            CitationFieldSet purlSet = new CitationFieldSet {
                ID = "PURL"
            };

            purlSet.Elements.Add(new CitationElement("Permanent Link", "Permanent Link", null, null));
            defaultSet.FieldSets.Add(purlSet);

            // Add the main material information field set
            CitationFieldSet materialSet = new CitationFieldSet {
                ID = "MATERIAL", Heading = "Material Information"
            };

            materialSet.Elements.Add(new CitationElement("Title", "Title", null, "name"));
            materialSet.Elements.Add(new CitationElement("Series Title", "Series Title", "TI", null));
            materialSet.Elements.Add(new CitationElement("Uniform Title", "Uniform Title", null, null));
            materialSet.Elements.Add(new CitationElement("Alternate Title", "Alternate Title", null, null, CitationElement_OverrideDispayTerm_Enum.subterm));
            materialSet.Elements.Add(new CitationElement("Translated Title", "Translated Title", null, null));
            materialSet.Elements.Add(new CitationElement("Abbreviated Title", "Abbreviated Title", null, null));
            materialSet.Elements.Add(new CitationElement("Creator", "Creator", "AU", null));
            materialSet.Elements.Add(new CitationElement("Conference", "Conference", null, null));
            materialSet.Elements.Add(new CitationElement("Affiliation", "Affiliation", null, null));
            materialSet.Elements.Add(new CitationElement("Donor", "Donor", "DO", null));
            materialSet.Elements.Add(new CitationElement("Place of Publication", "Place of Publication", "PP", null));
            materialSet.Elements.Add(new CitationElement("Publisher", "Publisher", "PU", "publisher"));
            materialSet.Elements.Add(new CitationElement("Manufacturer", "Manufacturer", null, null));
            materialSet.Elements.Add(new CitationElement("Creation Date", "Creation Date", null, "dateCreated"));
            materialSet.Elements.Add(new CitationElement("Publication Date", "Publication Date", null, "datePublished"));
            materialSet.Elements.Add(new CitationElement("Copyright Date", "Copyright Date", null, "copyrightYear"));
            materialSet.Elements.Add(new CitationElement("Frequency", "Frequency", null, null));
            materialSet.Elements.Add(new CitationElement("Language", "Language", "LA", "inLanguage"));
            materialSet.Elements.Add(new CitationElement("Edition", "Edition", null, "edition"));
            materialSet.Elements.Add(new CitationElement("State / Edition", "State / Edition", null, "edition"));
            materialSet.Elements.Add(new CitationElement("Physical Description", "Permanent Link", null, null));
            materialSet.Elements.Add(new CitationElement("Scale", "Scale", null, null));
            materialSet.Elements.Add(new CitationElement("Materials", "Materials", "MA", null));
            materialSet.Elements.Add(new CitationElement("Measurements", "Measurements", null, null));
            materialSet.Elements.Add(new CitationElement("Cultural Context", "Cultural Context", null, null));
            materialSet.Elements.Add(new CitationElement("Style/Period", "Style/Period", null, null));
            materialSet.Elements.Add(new CitationElement("Technique", "Technique", null, null));
            materialSet.Elements.Add(new CitationElement("Physical Location", "Physical Location", null, null));
            defaultSet.FieldSets.Add(materialSet);

            // Add the thesis / dissertation field set
            CitationFieldSet thesesSet = new CitationFieldSet {
                ID = "THESIS", Heading = "Thesis/Dissertation Information"
            };

            thesesSet.Elements.Add(new CitationElement("Degree", "Degree", null, null));
            thesesSet.Elements.Add(new CitationElement("Degree Grantor", "Degree Grantor", null, null));
            thesesSet.Elements.Add(new CitationElement("Degree Divisions", "Degree Divisions", "EJ", null));
            thesesSet.Elements.Add(new CitationElement("Degree Disciplines", "Degree Disciplines", "EI", null));
            thesesSet.Elements.Add(new CitationElement("Committee Chair", "Committee Chair", "EC", null));
            thesesSet.Elements.Add(new CitationElement("Committee Co-Chair", "Committee Co-Chair", "EC", null));
            thesesSet.Elements.Add(new CitationElement("Committee Members", "Committee Members", "EC", null));
            defaultSet.FieldSets.Add(thesesSet);

            // Add the Darwin Core field set
            CitationFieldSet darwinSet = new CitationFieldSet {
                ID = "DARWIN", Heading = "Zoological Taxonomic Information"
            };

            darwinSet.Elements.Add(new CitationElement("Scientific Name", "Scientific Name", null, null));
            darwinSet.Elements.Add(new CitationElement("Kingdom", "Kingdom", null, null));
            darwinSet.Elements.Add(new CitationElement("Phylum", "Phylum", null, null));
            darwinSet.Elements.Add(new CitationElement("Class", "Class", null, null));
            darwinSet.Elements.Add(new CitationElement("Order", "Order", null, null));
            darwinSet.Elements.Add(new CitationElement("Family", "Family", null, null));
            darwinSet.Elements.Add(new CitationElement("Genus", "Genus", null, null));
            darwinSet.Elements.Add(new CitationElement("Species", "Species", null, null));
            darwinSet.Elements.Add(new CitationElement("Taxonomic Rank", "Taxonomic Rank", null, null));
            darwinSet.Elements.Add(new CitationElement("Common Name", "Common Name", null, null));
            defaultSet.FieldSets.Add(darwinSet);

            // Add the IEEE-LOM learning object field set
            CitationFieldSet lomSet = new CitationFieldSet {
                ID = "LOM", Heading = "Learning Resource Information"
            };

            lomSet.Elements.Add(new CitationElement("Aggregation Level", "Aggregation Level", null, null));
            lomSet.Elements.Add(new CitationElement("Learning Resource Type", "Learning Resource Type", null, null));
            lomSet.Elements.Add(new CitationElement("Status", "Status", null, null));
            lomSet.Elements.Add(new CitationElement("Interactivity Type", "Interactivity Type", null, null));
            lomSet.Elements.Add(new CitationElement("Interactivity Level", "Interactivity Level", null, null));
            lomSet.Elements.Add(new CitationElement("Difficulty Level", "Difficulty Level", null, null));
            lomSet.Elements.Add(new CitationElement("Intended User Roles", "Intended User Roles", null, null));
            lomSet.Elements.Add(new CitationElement("Context", "Context", null, null));
            lomSet.Elements.Add(new CitationElement("Typical Age Range", "Typical Age Range", null, "typicalAgeRange"));
            lomSet.Elements.Add(new CitationElement("Typical Learning Time", "Typical Learning Time", null, null));
            lomSet.Elements.Add(new CitationElement("System Requirements", "System Requirements", null, null));
            defaultSet.FieldSets.Add(lomSet);

            // Add the subjects field set
            CitationFieldSet subjectSet = new CitationFieldSet {
                ID = "SUBJECTS", Heading = "Subjects"
            };

            subjectSet.Elements.Add(new CitationElement("Subjects / Keywords", "Subjects / Keywords", null, null));
            subjectSet.Elements.Add(new CitationElement("Genre", "Genre", null, null));
            subjectSet.Elements.Add(new CitationElement("Temporal Coverage", "Temporal Coverage", null, null));
            subjectSet.Elements.Add(new CitationElement("Spatial Coverage", "Spatial Coverage", null, null));
            subjectSet.Elements.Add(new CitationElement("Coordinates", "Coordinates", null, null));
            subjectSet.Elements.Add(new CitationElement("Target Audience", "Target Audience", null, null));
            defaultSet.FieldSets.Add(subjectSet);

            // Add the notes field set
            CitationFieldSet notesSet = new CitationFieldSet {
                ID = "NOTES", Heading = "Notes"
            };

            notesSet.Elements.Add(new CitationElement("Abstract", "Abstract", null, "description", CitationElement_OverrideDispayTerm_Enum.subterm));
            notesSet.Elements.Add(new CitationElement("Note", "General Note", null, "notes", CitationElement_OverrideDispayTerm_Enum.subterm));
            notesSet.Elements.Add(new CitationElement("Inscription", "Inscription", null, null));
            notesSet.Elements.Add(new CitationElement("User Tags", "User Tags", null, null));
            defaultSet.FieldSets.Add(notesSet);

            // Add the record information field set
            CitationFieldSet recordSet = new CitationFieldSet {
                ID = "RECORD", Heading = "Record Information"
            };

            recordSet.Elements.Add(new CitationElement("Source Institution", "Source Institution", null, "sourceOrganization"));
            recordSet.Elements.Add(new CitationElement("Holding Location", "Holding Location", null, "contentLocation"));
            recordSet.Elements.Add(new CitationElement("Rights Management", "Rights Management", null, "rights"));
            recordSet.Elements.Add(new CitationElement("Embargo Date", "Embargo Date", null, null));
            recordSet.Elements.Add(new CitationElement("Resource Identifier", "Resource Identifier", null, "identifier"));
            recordSet.Elements.Add(new CitationElement("Classification", "Classification", null, "classification"));
            recordSet.Elements.Add(new CitationElement("System ID", "System ID", null, null));
            defaultSet.FieldSets.Add(recordSet);

            // Add the related items field set
            CitationFieldSet relatedSet = new CitationFieldSet {
                ID = "RELATED", Heading = "Related Items"
            };

            relatedSet.Elements.Add(new CitationElement("Related Item", "Related Item", null, null, CitationElement_OverrideDispayTerm_Enum.subterm));
            defaultSet.FieldSets.Add(relatedSet);

            // Add the entire citation set
            CitationSets.Add(defaultSet);
        }
        private void set_defaults()
        {
            // Create the new set
            CitationSet defaultSet = new CitationSet {Name = "DEFAULT"};
            DefaultCitationSet = "DEFAULT";

            // Add the purl in its own field set
            CitationFieldSet purlSet = new CitationFieldSet {ID = "PURL"};
            purlSet.Elements.Add(new CitationElement("Permanent Link", "Permanent Link", null, null ));
            defaultSet.FieldSets.Add(purlSet);

            // Add the main material information field set
            CitationFieldSet materialSet = new CitationFieldSet {ID = "MATERIAL", Heading = "Material Information"};
            materialSet.Elements.Add(new CitationElement("Title", "Title", null, "name"));
            materialSet.Elements.Add(new CitationElement("Series Title", "Series Title", "TI", null));
            materialSet.Elements.Add(new CitationElement("Uniform Title", "Uniform Title", null, null));
            materialSet.Elements.Add(new CitationElement("Alternate Title", "Alternate Title", null, null, CitationElement_OverrideDispayTerm_Enum.subterm));
            materialSet.Elements.Add(new CitationElement("Translated Title", "Translated Title", null, null));
            materialSet.Elements.Add(new CitationElement("Abbreviated Title", "Abbreviated Title", null, null));
            materialSet.Elements.Add(new CitationElement("Creator", "Creator", "AU", null));
            materialSet.Elements.Add(new CitationElement("Conference", "Conference", null, null));
            materialSet.Elements.Add(new CitationElement("Affiliation", "Affiliation", null, null));
            materialSet.Elements.Add(new CitationElement("Donor", "Donor", "DO", null));
            materialSet.Elements.Add(new CitationElement("Place of Publication", "Place of Publication", "PP", null));
            materialSet.Elements.Add(new CitationElement("Publisher", "Publisher", "PU", "publisher"));
            materialSet.Elements.Add(new CitationElement("Manufacturer", "Manufacturer", null, null));
            materialSet.Elements.Add(new CitationElement("Creation Date", "Creation Date", null, "dateCreated"));
            materialSet.Elements.Add(new CitationElement("Publication Date", "Publication Date", null, "datePublished"));
            materialSet.Elements.Add(new CitationElement("Copyright Date", "Copyright Date", null, "copyrightYear"));
            materialSet.Elements.Add(new CitationElement("Frequency", "Frequency", null, null));
            materialSet.Elements.Add(new CitationElement("Language", "Language", "LA", "inLanguage"));
            materialSet.Elements.Add(new CitationElement("Edition", "Edition", null, "edition"));
            materialSet.Elements.Add(new CitationElement("State / Edition", "State / Edition", null, "edition"));
            materialSet.Elements.Add(new CitationElement("Physical Description", "Permanent Link", null, null));
            materialSet.Elements.Add(new CitationElement("Scale", "Scale", null, null));
            materialSet.Elements.Add(new CitationElement("Materials", "Materials", "MA", null));
            materialSet.Elements.Add(new CitationElement("Measurements", "Measurements", null, null));
            materialSet.Elements.Add(new CitationElement("Cultural Context", "Cultural Context", null, null));
            materialSet.Elements.Add(new CitationElement("Style/Period", "Style/Period", null, null));
            materialSet.Elements.Add(new CitationElement("Technique", "Technique", null, null));
            materialSet.Elements.Add(new CitationElement("Physical Location", "Physical Location", null, null));
            defaultSet.FieldSets.Add(materialSet);

            // Add the thesis / dissertation field set
            CitationFieldSet thesesSet = new CitationFieldSet { ID = "THESIS", Heading = "Thesis/Dissertation Information" };
            thesesSet.Elements.Add(new CitationElement("Degree", "Degree", null, null));
            thesesSet.Elements.Add(new CitationElement("Degree Grantor", "Degree Grantor", null, null));
            thesesSet.Elements.Add(new CitationElement("Degree Divisions", "Degree Divisions", "EJ", null));
            thesesSet.Elements.Add(new CitationElement("Degree Disciplines", "Degree Disciplines", "EI", null));
            thesesSet.Elements.Add(new CitationElement("Committee Chair", "Committee Chair", "EC", null));
            thesesSet.Elements.Add(new CitationElement("Committee Co-Chair", "Committee Co-Chair", "EC", null));
            thesesSet.Elements.Add(new CitationElement("Committee Members", "Committee Members", "EC", null));
            defaultSet.FieldSets.Add(thesesSet);

            // Add the Darwin Core field set
            CitationFieldSet darwinSet = new CitationFieldSet { ID = "DARWIN", Heading = "Zoological Taxonomic Information" };
            darwinSet.Elements.Add(new CitationElement("Scientific Name", "Scientific Name", null, null));
            darwinSet.Elements.Add(new CitationElement("Kingdom", "Kingdom", null, null));
            darwinSet.Elements.Add(new CitationElement("Phylum", "Phylum", null, null));
            darwinSet.Elements.Add(new CitationElement("Class", "Class", null, null));
            darwinSet.Elements.Add(new CitationElement("Order", "Order", null, null));
            darwinSet.Elements.Add(new CitationElement("Family", "Family", null, null));
            darwinSet.Elements.Add(new CitationElement("Genus", "Genus", null, null));
            darwinSet.Elements.Add(new CitationElement("Species", "Species", null, null));
            darwinSet.Elements.Add(new CitationElement("Taxonomic Rank", "Taxonomic Rank", null, null));
            darwinSet.Elements.Add(new CitationElement("Common Name", "Common Name", null, null));
            defaultSet.FieldSets.Add(darwinSet);

            // Add the IEEE-LOM learning object field set
            CitationFieldSet lomSet = new CitationFieldSet { ID = "LOM", Heading = "Learning Resource Information" };
            lomSet.Elements.Add(new CitationElement("Aggregation Level", "Aggregation Level", null, null));
            lomSet.Elements.Add(new CitationElement("Learning Resource Type", "Learning Resource Type", null, null));
            lomSet.Elements.Add(new CitationElement("Status", "Status", null, null));
            lomSet.Elements.Add(new CitationElement("Interactivity Type", "Interactivity Type", null, null));
            lomSet.Elements.Add(new CitationElement("Interactivity Level", "Interactivity Level", null, null));
            lomSet.Elements.Add(new CitationElement("Difficulty Level", "Difficulty Level", null, null));
            lomSet.Elements.Add(new CitationElement("Intended User Roles", "Intended User Roles", null, null));
            lomSet.Elements.Add(new CitationElement("Context", "Context", null, null));
            lomSet.Elements.Add(new CitationElement("Typical Age Range", "Typical Age Range", null, "typicalAgeRange"));
            lomSet.Elements.Add(new CitationElement("Typical Learning Time", "Typical Learning Time", null, null));
            lomSet.Elements.Add(new CitationElement("System Requirements", "System Requirements", null, null));
            defaultSet.FieldSets.Add(lomSet);

            // Add the subjects field set
            CitationFieldSet subjectSet = new CitationFieldSet { ID = "SUBJECTS", Heading = "Subjects" };
            subjectSet.Elements.Add(new CitationElement("Subjects / Keywords", "Subjects / Keywords", null, null));
            subjectSet.Elements.Add(new CitationElement("Genre", "Genre", null, null));
            subjectSet.Elements.Add(new CitationElement("Temporal Coverage", "Temporal Coverage", null, null));
            subjectSet.Elements.Add(new CitationElement("Spatial Coverage", "Spatial Coverage", null, null));
            subjectSet.Elements.Add(new CitationElement("Coordinates", "Coordinates", null, null));
            subjectSet.Elements.Add(new CitationElement("Target Audience", "Target Audience", null, null));
            defaultSet.FieldSets.Add(subjectSet);

            // Add the notes field set
            CitationFieldSet notesSet = new CitationFieldSet { ID = "NOTES", Heading = "Notes" };
            notesSet.Elements.Add(new CitationElement("Abstract", "Abstract", null, "description", CitationElement_OverrideDispayTerm_Enum.subterm));
            notesSet.Elements.Add(new CitationElement("Note", "General Note", null, "notes", CitationElement_OverrideDispayTerm_Enum.subterm));
            notesSet.Elements.Add(new CitationElement("Inscription", "Inscription", null, null));
            notesSet.Elements.Add(new CitationElement("User Tags", "User Tags", null, null));
            defaultSet.FieldSets.Add(notesSet);

            // Add the record information field set
            CitationFieldSet recordSet = new CitationFieldSet { ID = "RECORD", Heading = "Record Information" };
            recordSet.Elements.Add(new CitationElement("Source Institution", "Source Institution", null, "sourceOrganization"));
            recordSet.Elements.Add(new CitationElement("Holding Location", "Holding Location", null, "contentLocation"));
            recordSet.Elements.Add(new CitationElement("Rights Management", "Rights Management", null, "rights"));
            recordSet.Elements.Add(new CitationElement("Embargo Date", "Embargo Date", null, null));
            recordSet.Elements.Add(new CitationElement("Resource Identifier", "Resource Identifier", null, "identifier"));
            recordSet.Elements.Add(new CitationElement("Classification", "Classification", null, "classification"));
            recordSet.Elements.Add(new CitationElement("System ID", "System ID", null, null));
            defaultSet.FieldSets.Add(recordSet);

            // Add the related items field set
            CitationFieldSet relatedSet = new CitationFieldSet { ID = "RELATED", Heading = "Related Items" };
            relatedSet.Elements.Add(new CitationElement("Related Item", "Related Item", null, null, CitationElement_OverrideDispayTerm_Enum.subterm));
            defaultSet.FieldSets.Add(relatedSet);

            // Add the entire citation set
            CitationSets.Add(defaultSet);
        }
        private static void read_citation_set_details(XmlReader ReaderXml, CitationSet Config)
        {
            CitationFieldSet currFieldSet = null;
            CitationElement currElement = null;

            while (ReaderXml.Read())
            {
                if (ReaderXml.NodeType == XmlNodeType.Element)
                {
                    switch (ReaderXml.Name.ToLower())
                    {
                        case "fieldset":
                            if (ReaderXml.MoveToAttribute("ID"))
                            {
                                // Pull the attributes, basic info about this field set
                                string fieldSetId = ReaderXml.Value.Trim();
                                string defaultHeading = null;
                                string order = "append";
                                string afterid = "";
                                if (ReaderXml.MoveToAttribute("Heading"))
                                    defaultHeading = ReaderXml.Value.Trim();

                                // Does this field set already exist? ( in which case order and after id don't matter )
                                if (ReaderXml.MoveToAttribute("Order"))
                                    order = ReaderXml.Value.Trim().ToLower();
                                if (ReaderXml.MoveToAttribute("AfterID"))
                                    afterid = ReaderXml.Value.Trim();

                                // Ensure the order is one of the terms supported
                                if ((order != "first") && (order != "after") && (order != "append"))
                                    order = "append";

                                // Add this field set
                                currFieldSet = Config.AddFieldSet(fieldSetId, defaultHeading, order, afterid);
                            }
                            else
                            {
                                currFieldSet = null;
                            }
                            break;

                        case "language":
                            // Get the language code and term
                            string code = String.Empty;
                            if (ReaderXml.MoveToAttribute("Code"))
                                code = ReaderXml.Value.Trim().ToLower();
                            ReaderXml.Read();
                            string term = ReaderXml.Value.Trim();

                            // WHich level is this form?
                            if (!String.IsNullOrEmpty(code))
                            {
                                if (currElement != null)
                                {
                                    currElement.Add_Translation(Web_Language_Enum_Converter.Code_To_Enum(code), term);
                                }
                                else if (currFieldSet != null)
                                {
                                    currFieldSet.Add_Translation(Web_Language_Enum_Converter.Code_To_Enum(code), term);
                                }
                            }
                            break;

                        case "clear":
                            if ( currFieldSet != null )
                                currFieldSet.Clear_Elements();
                            break;

                        case "append":
                            // Collect the basic values
                            string appendMetadataTerm = (ReaderXml.MoveToAttribute("MetadataTerm")) ? ReaderXml.Value.Trim() : String.Empty;
                            string appendDisplayTerm = (ReaderXml.MoveToAttribute("DisplayTerm")) ? ReaderXml.Value.Trim() : appendMetadataTerm;
                            string appendItemProp = (ReaderXml.MoveToAttribute("ItemProp")) ? ReaderXml.Value.Trim() : null;
                            string appendSearchCode = (ReaderXml.MoveToAttribute("SearchCode")) ? ReaderXml.Value.Trim() : null;
                            currElement = new CitationElement
                            {
                                MetadataTerm = appendMetadataTerm,
                                DisplayTerm = appendDisplayTerm,
                                ItemProp = appendItemProp,
                                SearchCode = appendSearchCode
                            };

                            // Set the override display enumeration
                            string appendOverrideDisplay = (ReaderXml.MoveToAttribute("OverrideDisplayTerm")) ? ReaderXml.Value.Trim() : String.Empty;
                            switch (appendOverrideDisplay.ToLower())
                            {
                                case "subterm":
                                    currElement.OverrideDisplayTerm = CitationElement_OverrideDispayTerm_Enum.subterm;
                                    currElement.IndividualFields = true;
                                    break;

                                default:
                                    currElement.OverrideDisplayTerm = CitationElement_OverrideDispayTerm_Enum.NONE;
                                    break;
                            }

                            // Only actually add it if the metadata term is valid
                            if ((!String.IsNullOrEmpty(appendMetadataTerm)) && (currFieldSet != null))
                                currFieldSet.Append_Element(currElement);
                            break;

                        case "insert":
                            // Collect the basic values
                            string insertMetadataTerm = (ReaderXml.MoveToAttribute("MetadataTerm")) ? ReaderXml.Value.Trim() : String.Empty;
                            string insertDisplayTerm = (ReaderXml.MoveToAttribute("DisplayTerm")) ? ReaderXml.Value.Trim() : insertMetadataTerm;
                            string insertItemProp = (ReaderXml.MoveToAttribute("ItemProp")) ? ReaderXml.Value.Trim() : null;
                            string insertSearchCode = (ReaderXml.MoveToAttribute("SearchCode")) ? ReaderXml.Value.Trim() : null;
                            currElement = new CitationElement
                            {
                                MetadataTerm = insertMetadataTerm,
                                DisplayTerm = insertDisplayTerm,
                                ItemProp = insertItemProp,
                                SearchCode = insertSearchCode
                            };

                            // Set the override display enumeration
                            string insertOverrideDisplay = (ReaderXml.MoveToAttribute("OverrideDisplayTerm")) ? ReaderXml.Value.Trim() : String.Empty;
                            switch (insertOverrideDisplay.ToLower())
                            {
                                case "subterm":
                                    currElement.OverrideDisplayTerm = CitationElement_OverrideDispayTerm_Enum.subterm;
                                    currElement.IndividualFields = true;
                                    break;

                                default:
                                    currElement.OverrideDisplayTerm = CitationElement_OverrideDispayTerm_Enum.NONE;
                                    break;
                            }

                            // Only actually add it if the metadata term is valid
                            if ((!String.IsNullOrEmpty(insertMetadataTerm)) && (currFieldSet != null))
                            {
                                if (ReaderXml.MoveToAttribute("After"))
                                {
                                    currFieldSet.Insert_Element_After(currElement, ReaderXml.Value.Trim());
                                }
                                else if (ReaderXml.MoveToAttribute("Before"))
                                {
                                    currFieldSet.Insert_Element_Before(currElement, ReaderXml.Value.Trim());
                                }
                                else
                                {
                                    currFieldSet.Append_Element(currElement);
                                }
                            }
                            break;

                        case "remove":
                            if (( currFieldSet != null ) && ( ReaderXml.MoveToAttribute("Code")))
                                currFieldSet.Remove_Element(ReaderXml.Value.Trim());
                            currElement = null;
                            break;

                        case "sectionwriter":
                            if (currElement != null)
                            {
                                string assembly = (ReaderXml.MoveToAttribute("assembly")) ? ReaderXml.Value.Trim() : null;
                                string writer_class = (ReaderXml.MoveToAttribute("class")) ? ReaderXml.Value.Trim() : null;
                                if (!String.IsNullOrEmpty(writer_class))
                                {
                                    currElement.SectionWriter = new SectionWriter(assembly, writer_class);
                                }
                            }
                            break;

                    }
                }
                else if (ReaderXml.NodeType == XmlNodeType.EndElement)
                {
                    // This is closing out a field set or a single element
                    switch (ReaderXml.Name.ToLower())
                    {
                        case "fieldset":
                            currFieldSet = null;
                            currElement = null;
                            break;

                        case "append":
                        case "insert":
                        case "remove":
                            currElement = null;
                            break;
                    }
                }
            }
        }