Configuration information for a single possible division type
 /// <summary> Remove a division type from this profile </summary>
 /// <param name="Division_Config"> Division type to remove </param>
 public void Remove_Division_Type( QualityControl_Division_Config Division_Config )
 {
     divisionTypes.Remove(Division_Config);
     divisionTypeLookup.Remove(Division_Config.TypeName);
 }
        private void read_qc_profiles(XmlReader ReaderXml)
        {
            int unnamed_profile_counter = 1;

            while (ReaderXml.Read())
            {
                if (ReaderXml.NodeType == XmlNodeType.Element)
                {
                    switch (ReaderXml.Name.ToLower())
                    {
                        case "profile":
                            QualityControl_Profile profile = new QualityControl_Profile();
                            XmlReader child_readerXml = ReaderXml.ReadSubtree();
                            if (ReaderXml.MoveToAttribute("name"))
                                profile.Profile_Name = ReaderXml.Value.Trim();
                            if (ReaderXml.MoveToAttribute("description"))
                                profile.Profile_Description = ReaderXml.Value;
                            if (ReaderXml.MoveToAttribute("isDefault"))
                            {
                                bool tempValue;
                                if (bool.TryParse(ReaderXml.Value, out tempValue))
                                {
                                    profile.Default_Profile = tempValue;
                                }
                            }
                            // Enforce a name for this profile (should have one according to XSD)
                            if (profile.Profile_Name.Length == 0)
                            {
                                profile.Profile_Name = "Unnamed" + unnamed_profile_counter;
                                unnamed_profile_counter++;
                            }

                            while (child_readerXml.Read())
                            {
                                if (child_readerXml.NodeType == XmlNodeType.Element && child_readerXml.Name.ToLower() == "divisiontype")

                                    //  while (readerXml.ReadToNextSibling("DivisionType"))
                                {
                                    if (child_readerXml.Name.ToLower() == "divisiontype")
                                    {
                                        QualityControl_Division_Config thisConfig = new QualityControl_Division_Config();
                                        if (child_readerXml.MoveToAttribute("type"))
                                        {
                                            thisConfig.TypeName = child_readerXml.Value;
                                        }
                                        if (child_readerXml.MoveToAttribute("isNameable"))
                                            thisConfig.isNameable = Convert.ToBoolean(child_readerXml.Value);
                                        profile.Add_Division_Type(thisConfig);

                                    }
                                }
                            }
                            Add_Profile(profile);
                   //         Add_METS_Writing_Profile(profile);
                            break;

                        case "package_scope":
                            break;

                        case "division_scope":
                            break;

                        case "file_scope":
                            break;

                        case "dmdsec":
                            break;

                        case "amdsec":
                            break;

                        //case "readerwriterref":
                        //    if (readerXml.MoveToAttribute("ID"))
                        //    {
                        //        string id = readerXml.Value.ToUpper();
                        //        if ((readerWriters.ContainsKey(id)) && (profile != null))
                        //        {
                        //            METS_Section_ReaderWriter_Config readerWriter = readerWriters[id];
                        //            if (inPackage)
                        //            {
                        //                if (inDmdSec)
                        //                    profile.Add_Package_Level_DmdSec_Writer_Config(readerWriter);
                        //                else
                        //                    profile.Add_Package_Level_AmdSec_Writer_Config(readerWriter);
                        //            }
                        //            else if (inDivision)
                        //            {
                        //                if (inDmdSec)
                        //                    profile.Add_Division_Level_DmdSec_Writer_Config(readerWriter);
                        //                else
                        //                    profile.Add_Division_Level_AmdSec_Writer_Config(readerWriter);
                        //            }
                        //            else if (inFile)
                        //            {
                        //                if (inDmdSec)
                        //                    profile.Add_File_Level_DmdSec_Writer_Config(readerWriter);
                        //                else
                        //                    profile.Add_File_Level_AmdSec_Writer_Config(readerWriter);
                        //            }
                        //        }
                        //    }
                        //    break;
                    }
                }
            }
        }
 /// <summary> Add a new division type to this profile </summary>
 /// <param name="Division_Config"> New division type to add </param>
 public void Add_Division_Type(QualityControl_Division_Config Division_Config )
 {
     divisionTypes.Add(Division_Config);
     divisionTypeLookup[Division_Config.TypeName] = Division_Config;
 }
        /// <summary> Set the default profile with the default values </summary>
        public void Set_Default_Values()
        {
            // Clear everything, just in case
            Clear();

            // Create the default profile
            QualityControl_Profile newProfile = new QualityControl_Profile
            {
                Default_Profile = true,
                Profile_Name = "System Default",
                Profile_Description = "Default profile used when no config file is present"
            };
            Add_Profile(newProfile);

            // Add back cover
            QualityControl_Division_Config div1 = new QualityControl_Division_Config
            {
                ID = 1, TypeName = "Back Cover", isActive = true, isNameable = false, BaseTypeName = "Cover"
            };
            div1.Add_Translation(Web_Language_Enum.Spanish, "Portada Posterior");
            div1.Add_Translation(Web_Language_Enum.French, "Couverture Arrière");
            newProfile.Add_Division_Type(div1);

            // Add back matter
            QualityControl_Division_Config div2 = new QualityControl_Division_Config
            {
                ID = 2, TypeName = "Back Matter", isActive = true, isNameable = false
            };
            div2.Add_Translation(Web_Language_Enum.Spanish, "Materia Posterior");
            div2.Add_Translation(Web_Language_Enum.French, "Matière Arrière");
            newProfile.Add_Division_Type(div2);

            // Add chapter ( misorder of the object names here and below matters not)
            QualityControl_Division_Config div4 = new QualityControl_Division_Config
            {
                ID = 3, TypeName = "Chapter", isActive = true, isNameable = true
            };
            div4.Add_Translation(Web_Language_Enum.Spanish, "Capítulo");
            div4.Add_Translation(Web_Language_Enum.French, "Chapitre");
            newProfile.Add_Division_Type(div4);

            // Add front cover
            QualityControl_Division_Config div3 = new QualityControl_Division_Config
            {
                ID = 4, TypeName = "Front Cover", isActive = true, isNameable = false, BaseTypeName = "Cover"
            };
            div3.Add_Translation(Web_Language_Enum.Spanish, "Portada Delantera");
            div3.Add_Translation(Web_Language_Enum.French, "Couverture Frente");
            newProfile.Add_Division_Type(div3);

            // Add front matter
            QualityControl_Division_Config div5 = new QualityControl_Division_Config
            {
                ID = 5, TypeName = "Front Matter", isActive = true, isNameable = false
            };
            div5.Add_Translation(Web_Language_Enum.Spanish, "Materia Delantera");
            div5.Add_Translation(Web_Language_Enum.French, "Préliminaires");
            newProfile.Add_Division_Type(div5);

            // Add index
            QualityControl_Division_Config div6 = new QualityControl_Division_Config
            {
                ID = 6, TypeName = "Index", isActive = true, isNameable = true
            };
            div6.Add_Translation(Web_Language_Enum.Spanish, "Indice");
            div6.Add_Translation(Web_Language_Enum.French, "Indice");
            newProfile.Add_Division_Type(div6);

            // Add introduction
            QualityControl_Division_Config div7 = new QualityControl_Division_Config
            {
                ID = 7, TypeName = "Introduction", isActive = true, isNameable = false, BaseTypeName = "Chapter"
            };
            div7.Add_Translation(Web_Language_Enum.Spanish, "Introducción");
            div7.Add_Translation(Web_Language_Enum.French, "Introduction");
            newProfile.Add_Division_Type(div7);

            // Add spine
            QualityControl_Division_Config div8 = new QualityControl_Division_Config
            {
                ID = 8, TypeName = "Spine", isActive = true, isNameable = false
            };
            div8.Add_Translation(Web_Language_Enum.Spanish, "Canto");
            div8.Add_Translation(Web_Language_Enum.French, "Épine de livre");
            newProfile.Add_Division_Type(div8);

            // Add table of contents
            QualityControl_Division_Config div9 = new QualityControl_Division_Config
            {
                ID = 9, TypeName = "Table of Contents", isActive = true, isNameable = false, BaseTypeName = "Contents"
            };
            div9.Add_Translation(Web_Language_Enum.Spanish, "Contenidos");
            div9.Add_Translation(Web_Language_Enum.French, "Table des Matières");
            newProfile.Add_Division_Type(div9);

            // Add title page
            QualityControl_Division_Config div10 = new QualityControl_Division_Config
            {
                ID = 10, TypeName = "Title Page", isActive = true, isNameable = false, BaseTypeName = "Title"
            };
            div10.Add_Translation(Web_Language_Enum.Spanish, "Titre");
            div10.Add_Translation(Web_Language_Enum.French, "Titulario");
            newProfile.Add_Division_Type(div10);
        }
 /// <summary> Remove a division type from this profile </summary>
 /// <param name="Division_Config"> Division type to remove </param>
 public void Remove_Division_Type(QualityControl_Division_Config Division_Config)
 {
     Division_Types.Remove(Division_Config);
     divisionTypeLookup.Remove(Division_Config.TypeName);
 }
 /// <summary> Add a new division type to this profile </summary>
 /// <param name="Division_Config"> New division type to add </param>
 public void Add_Division_Type(QualityControl_Division_Config Division_Config)
 {
     Division_Types.Add(Division_Config);
     divisionTypeLookup[Division_Config.TypeName] = Division_Config;
 }
        /// <summary> Set the default profile with the default values </summary>
        public void Set_Default_Values()
        {
            // Clear everything, just in case
            Clear();

            // Create the default profile
            QualityControl_Profile newProfile = new QualityControl_Profile
            {
                Default_Profile     = true,
                Profile_Name        = "System Default",
                Profile_Description = "Default profile used when no config file is present"
            };

            Add_Profile(newProfile);

            // Add back cover
            QualityControl_Division_Config div1 = new QualityControl_Division_Config
            {
                ID = 1, TypeName = "Back Cover", isActive = true, isNameable = false, BaseTypeName = "Cover"
            };

            div1.Add_Translation(Web_Language_Enum.Spanish, "Portada Posterior");
            div1.Add_Translation(Web_Language_Enum.French, "Couverture Arrière");
            newProfile.Add_Division_Type(div1);

            // Add back matter
            QualityControl_Division_Config div2 = new QualityControl_Division_Config
            {
                ID = 2, TypeName = "Back Matter", isActive = true, isNameable = false
            };

            div2.Add_Translation(Web_Language_Enum.Spanish, "Materia Posterior");
            div2.Add_Translation(Web_Language_Enum.French, "Matière Arrière");
            newProfile.Add_Division_Type(div2);

            // Add chapter ( misorder of the object names here and below matters not)
            QualityControl_Division_Config div4 = new QualityControl_Division_Config
            {
                ID = 3, TypeName = "Chapter", isActive = true, isNameable = true
            };

            div4.Add_Translation(Web_Language_Enum.Spanish, "Capítulo");
            div4.Add_Translation(Web_Language_Enum.French, "Chapitre");
            newProfile.Add_Division_Type(div4);

            // Add front cover
            QualityControl_Division_Config div3 = new QualityControl_Division_Config
            {
                ID = 4, TypeName = "Front Cover", isActive = true, isNameable = false, BaseTypeName = "Cover"
            };

            div3.Add_Translation(Web_Language_Enum.Spanish, "Portada Delantera");
            div3.Add_Translation(Web_Language_Enum.French, "Couverture Frente");
            newProfile.Add_Division_Type(div3);

            // Add front matter
            QualityControl_Division_Config div5 = new QualityControl_Division_Config
            {
                ID = 5, TypeName = "Front Matter", isActive = true, isNameable = false
            };

            div5.Add_Translation(Web_Language_Enum.Spanish, "Materia Delantera");
            div5.Add_Translation(Web_Language_Enum.French, "Préliminaires");
            newProfile.Add_Division_Type(div5);

            // Add index
            QualityControl_Division_Config div6 = new QualityControl_Division_Config
            {
                ID = 6, TypeName = "Index", isActive = true, isNameable = true
            };

            div6.Add_Translation(Web_Language_Enum.Spanish, "Indice");
            div6.Add_Translation(Web_Language_Enum.French, "Indice");
            newProfile.Add_Division_Type(div6);

            // Add introduction
            QualityControl_Division_Config div7 = new QualityControl_Division_Config
            {
                ID = 7, TypeName = "Introduction", isActive = true, isNameable = false, BaseTypeName = "Chapter"
            };

            div7.Add_Translation(Web_Language_Enum.Spanish, "Introducción");
            div7.Add_Translation(Web_Language_Enum.French, "Introduction");
            newProfile.Add_Division_Type(div7);

            // Add spine
            QualityControl_Division_Config div8 = new QualityControl_Division_Config
            {
                ID = 8, TypeName = "Spine", isActive = true, isNameable = false
            };

            div8.Add_Translation(Web_Language_Enum.Spanish, "Canto");
            div8.Add_Translation(Web_Language_Enum.French, "Épine de livre");
            newProfile.Add_Division_Type(div8);

            // Add table of contents
            QualityControl_Division_Config div9 = new QualityControl_Division_Config
            {
                ID = 9, TypeName = "Table of Contents", isActive = true, isNameable = false, BaseTypeName = "Contents"
            };

            div9.Add_Translation(Web_Language_Enum.Spanish, "Contenidos");
            div9.Add_Translation(Web_Language_Enum.French, "Table des Matières");
            newProfile.Add_Division_Type(div9);

            // Add title page
            QualityControl_Division_Config div10 = new QualityControl_Division_Config
            {
                ID = 10, TypeName = "Title Page", isActive = true, isNameable = false, BaseTypeName = "Title"
            };

            div10.Add_Translation(Web_Language_Enum.Spanish, "Titre");
            div10.Add_Translation(Web_Language_Enum.French, "Titulario");
            newProfile.Add_Division_Type(div10);
        }
        private static void read_qc_profiles(XmlReader ReaderXml, QualityControl_Configuration Config )
        {
            int unnamed_profile_counter = 1;

            while (ReaderXml.Read())
            {
                if (ReaderXml.NodeType == XmlNodeType.Element)
                {
                    switch (ReaderXml.Name.ToLower())
                    {
                        case "profile":
                            QualityControl_Profile profile = new QualityControl_Profile();
                            XmlReader child_readerXml = ReaderXml.ReadSubtree();
                            if (ReaderXml.MoveToAttribute("name"))
                                profile.Profile_Name = ReaderXml.Value.Trim();
                            if (ReaderXml.MoveToAttribute("description"))
                                profile.Profile_Description = ReaderXml.Value;
                            if (ReaderXml.MoveToAttribute("isDefault"))
                            {
                                bool tempValue;
                                if (bool.TryParse(ReaderXml.Value, out tempValue))
                                {
                                    profile.Default_Profile = tempValue;
                                }
                            }
                            // Enforce a name for this profile (should have one according to XSD)
                            if (profile.Profile_Name.Length == 0)
                            {
                                profile.Profile_Name = "Unnamed" + unnamed_profile_counter;
                                unnamed_profile_counter++;
                            }

                            QualityControl_Division_Config thisConfig = new QualityControl_Division_Config();
                            while (child_readerXml.Read())
                            {
                                if (child_readerXml.NodeType == XmlNodeType.Element && child_readerXml.Name.ToLower() == "divisiontype")
                                {
                                    thisConfig = new QualityControl_Division_Config();

                                    if (child_readerXml.MoveToAttribute("type"))
                                    {
                                        thisConfig.TypeName = child_readerXml.Value;
                                    }
                                    if (child_readerXml.MoveToAttribute("isNameable"))
                                        thisConfig.isNameable = Convert.ToBoolean(child_readerXml.Value);
                                    if (child_readerXml.MoveToAttribute("base"))
                                    {
                                        string baseType = child_readerXml.Value;
                                        if (!String.Equals(baseType, thisConfig.TypeName, StringComparison.OrdinalIgnoreCase))
                                        {
                                            thisConfig.BaseTypeName = baseType;
                                        }
                                    }
                                    profile.Add_Division_Type(thisConfig);
                                }
                                else if (child_readerXml.NodeType == XmlNodeType.Element && child_readerXml.Name.ToLower() == "translation")
                                {
                                    if (thisConfig != null)
                                    {
                                        string language = (child_readerXml.MoveToAttribute("language")) ? child_readerXml.Value : String.Empty;
                                        string text = (child_readerXml.MoveToAttribute("text")) ? child_readerXml.Value : String.Empty;

                                        if ((!String.IsNullOrEmpty(language)) && (!String.IsNullOrEmpty(text)))
                                        {
                                            thisConfig.Add_Translation(Web_Language_Enum_Converter.Code_To_Enum(language), text );
                                        }
                                    }
                                }
                            }

                            Config.Add_Profile(profile);
                            break;

                    }
                }
            }
        }