/// <summary> Refreshes the values from the database settings </summary>
        /// <returns> A fully builder instance-wide setting object </returns>
        public static InstanceWide_Settings Build_Settings(Database_Instance_Configuration DbInstance)
        {
            InstanceWide_Settings returnValue = new InstanceWide_Settings();

            // Don't read the configuration file now.. we already have the db data
            Engine_Database.Connection_String = DbInstance.Connection_String;

            DataSet sobekCMSettings = Engine_Database.Get_Settings_Complete(false, null);

            if (sobekCMSettings == null)
            {
                return(null);
            }

            Refresh(returnValue, sobekCMSettings);

            return(returnValue);
        }
        /// <summary> Refreshes the values from the database settings </summary>
        /// <returns> A fully builder instance-wide setting object </returns>
        public static InstanceWide_Settings Build_Settings(string ConfigFileLocation)
        {
            InstanceWide_Settings returnValue = new InstanceWide_Settings();

            // Read the main configuration file, with database and error information
            // returnValue.Servers.Base_Directory = AppDomain.CurrentDomain.BaseDirectory;
            Read_Configuration_File(returnValue, ConfigFileLocation);

            // Set the error URL
            UrlWriterHelper.Unhandled_Error_URL = returnValue.Servers.System_Error_URL;

            // Set the connection string to the database
            Engine_Database.Connection_String       = returnValue.Database_Connection.Connection_String;
            SobekCM_Item_Database.Connection_String = returnValue.Database_Connection.Connection_String;

            // Get the settings
            DataSet sobekCMSettings = Engine_Database.Get_Settings_Complete(false, null);

            Refresh(returnValue, sobekCMSettings);

            return(returnValue);
        }
        /// <summary> Gets the administrative setting values, which includes display information
        /// along with the current value and key </summary>
        /// <param name="Response"></param>
        /// <param name="UrlSegments"></param>
        /// <param name="QueryString"></param>
        /// <param name="Protocol"></param>
        /// <param name="IsDebug"></param>
        public void GetAdminSettings(HttpResponse Response, List <string> UrlSegments, NameValueCollection QueryString, Microservice_Endpoint_Protocol_Enum Protocol, bool IsDebug)
        {
            Custom_Tracer tracer = new Custom_Tracer();

            try
            {
                tracer.Add_Trace("AdministrativeServices.GetAdminSettings", "Pulling dataset from the database");

                // Get the complete aggregation
                DataSet adminSet = Engine_Database.Get_Settings_Complete(true, tracer);

                // If the returned value from the database was NULL, there was an error
                if ((adminSet == null) || (adminSet.Tables.Count == 0) || (adminSet.Tables[0].Rows.Count == 0))
                {
                    Response.ContentType = "text/plain";
                    Response.Output.WriteLine("Error completing request");

                    if (IsDebug)
                    {
                        Response.Output.WriteLine("DataSet returned from the database was either NULL or empty");
                        if (Engine_Database.Last_Exception != null)
                        {
                            Response.Output.WriteLine();
                            Response.Output.WriteLine(Engine_Database.Last_Exception.Message);
                            Response.Output.WriteLine();
                            Response.Output.WriteLine(Engine_Database.Last_Exception.StackTrace);
                        }

                        Response.Output.WriteLine();
                        Response.Output.WriteLine(tracer.Text_Trace);
                    }

                    Response.StatusCode = 500;
                    return;
                }

                tracer.Add_Trace("AdministrativeServices.GetAdminSettings", "Build the list of return objects");
                Admin_Setting_Collection returnValue = new Admin_Setting_Collection();

                try
                {
                    DataColumn keyColumn        = adminSet.Tables[0].Columns["Setting_Key"];
                    DataColumn valueColumn      = adminSet.Tables[0].Columns["Setting_Value"];
                    DataColumn tabPageColumn    = adminSet.Tables[0].Columns["TabPage"];
                    DataColumn headingColumn    = adminSet.Tables[0].Columns["Heading"];
                    DataColumn hiddenColumn     = adminSet.Tables[0].Columns["Hidden"];
                    DataColumn reservedColumn   = adminSet.Tables[0].Columns["Reserved"];
                    DataColumn helpColumn       = adminSet.Tables[0].Columns["Help"];
                    DataColumn optionsColumn    = adminSet.Tables[0].Columns["Options"];
                    DataColumn idColumn         = adminSet.Tables[0].Columns["SettingID"];
                    DataColumn dimensionsColumn = adminSet.Tables[0].Columns["Dimensions"];

                    //Setting_Key, Setting_Value, TabPage, Heading, Hidden, Reserved, Help, Options

                    // Build the return values
                    foreach (DataRow thisRow in adminSet.Tables[0].Rows)
                    {
                        // Build the value object
                        Admin_Setting_Value thisValue = new Admin_Setting_Value
                        {
                            Key       = thisRow[keyColumn].ToString(),
                            Value     = thisRow[valueColumn] == DBNull.Value ? null : thisRow[valueColumn].ToString(),
                            TabPage   = thisRow[tabPageColumn] == DBNull.Value ? null : thisRow[tabPageColumn].ToString(),
                            Heading   = thisRow[headingColumn] == DBNull.Value ? null : thisRow[headingColumn].ToString(),
                            Hidden    = bool.Parse(thisRow[hiddenColumn].ToString()),
                            Reserved  = short.Parse(thisRow[reservedColumn].ToString()),
                            Help      = thisRow[helpColumn] == DBNull.Value ? null : thisRow[helpColumn].ToString(),
                            SettingID = short.Parse(thisRow[idColumn].ToString())
                        };

                        // Get dimensions, if some were provided
                        if (thisRow[dimensionsColumn] != DBNull.Value)
                        {
                            string dimensions = thisRow[dimensionsColumn].ToString();
                            if (!String.IsNullOrWhiteSpace(dimensions))
                            {
                                short testWidth;
                                short testHeight;

                                // Does this include width AND height?
                                if (dimensions.IndexOf("|") >= 0)
                                {
                                    string[] splitter = dimensions.Split("|".ToCharArray());
                                    if ((splitter[0].Length > 0) && (short.TryParse(splitter[0], out testWidth)))
                                    {
                                        thisValue.Width = testWidth;
                                        if ((splitter[1].Length > 0) && (short.TryParse(splitter[1], out testHeight)))
                                        {
                                            thisValue.Height = testHeight;
                                        }
                                    }
                                }
                                else
                                {
                                    if (short.TryParse(dimensions, out testWidth))
                                    {
                                        thisValue.Width = testWidth;
                                    }
                                }
                            }
                        }

                        // Get the options
                        if (thisRow[optionsColumn] != DBNull.Value)
                        {
                            string[] options = thisRow[optionsColumn].ToString().Split("|".ToCharArray());
                            foreach (string thisOption in options)
                            {
                                thisValue.Add_Option(thisOption.Trim());
                            }
                        }

                        // Add to the return value
                        returnValue.Settings.Add(thisValue);
                    }
                }
                catch (Exception ex)
                {
                    Response.ContentType = "text/plain";
                    Response.Output.WriteLine("Error completing request");

                    if (IsDebug)
                    {
                        Response.Output.WriteLine("Error creating the Builder_Settings object from the database tables");
                        Response.Output.WriteLine();
                        Response.Output.WriteLine(ex.Message);
                        Response.Output.WriteLine();
                        Response.Output.WriteLine(ex.StackTrace);
                        Response.Output.WriteLine();
                        Response.Output.WriteLine(tracer.Text_Trace);
                    }

                    Response.StatusCode = 500;
                    return;
                }

                // If this was debug mode, then just write the tracer
                if (IsDebug)
                {
                    Response.ContentType = "text/plain";
                    Response.Output.WriteLine("DEBUG MODE DETECTED");
                    Response.Output.WriteLine();
                    Response.Output.WriteLine(tracer.Text_Trace);

                    return;
                }

                // Get the JSON-P callback function
                string json_callback = "parseAdminSettings";
                if ((Protocol == Microservice_Endpoint_Protocol_Enum.JSON_P) && (!String.IsNullOrEmpty(QueryString["callback"])))
                {
                    json_callback = QueryString["callback"];
                }

                // Use the base class to serialize the object according to request protocol
                Serialize(returnValue, Response, Protocol, json_callback);
            }
            catch (Exception ee)
            {
                if (IsDebug)
                {
                    Response.ContentType = "text/plain";
                    Response.Output.WriteLine("EXCEPTION CAUGHT!");
                    Response.Output.WriteLine();
                    Response.Output.WriteLine(ee.Message);
                    Response.Output.WriteLine();
                    Response.Output.WriteLine(ee.StackTrace);
                    Response.Output.WriteLine();
                    Response.Output.WriteLine(tracer.Text_Trace);
                    return;
                }

                Response.ContentType = "text/plain";
                Response.Output.WriteLine("Error completing request");
                Response.StatusCode = 500;
            }
        }