/// <summary> Constructor for a new instance of the Delete_Item_MySobekViewer class </summary>
        /// <param name="User"> Authenticated user information </param>
        /// <param name="Current_Mode"> Mode / navigation information for the current request</param>
        /// <param name="Current_Item"> Individual digital resource to be deleted by the user </param>
        /// <param name="All_Items_Lookup"> Allows individual items to be retrieved by various methods as <see cref="SobekCM.Library.Application_State.Single_Item"/> objects.</param>
        /// <param name="Tracer">Trace object keeps a list of each method executed and important milestones in rendering</param>
        public Delete_Item_MySobekViewer(User_Object User,
            SobekCM_Navigation_Object Current_Mode, 
			SobekCM_Item Current_Item,
            Item_Lookup_Object All_Items_Lookup,
            Custom_Tracer Tracer)
            : base(User)
        {
            Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "Delete this item");

            // Save mode and set defaults
            currentMode = Current_Mode;
            item = Current_Item;
            errorCode = -1;

            // Second, ensure this is a logged on user and system administrator before continuing
            Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "Validate user permissions" );
            if ((User == null)  || ( !User.LoggedOn ))
            {
                Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "User does not have delete permissions", Custom_Trace_Type_Enum.Error );
                errorCode = 1;
            }
            else
            {
                bool canDelete = false;
                if ((User.Can_Delete_All) || (User.Is_System_Admin))
                {
                    canDelete = true;
                }
                else
                {
                    // In this case, we actually need to build this!
                    try
                    {
            //					SobekCM_Item testItem = SobekCM_Item_Factory.Get_Item(Current_Mode.BibID, Current_Mode.VID, null, Tracer);
                        if (User.Can_Delete_This_Item(item))
                            canDelete = true;
                    }
                    catch
                    {
                        canDelete = false;
                    }
                }

                if (!canDelete)
                {
                    Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "User does not have delete permissions", Custom_Trace_Type_Enum.Error);
                    errorCode = 1;
                }
            }

            // Ensure the item is valid
            if (errorCode == -1)
            {
                Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "Validate item exists");
                if (!All_Items_Lookup.Contains_BibID_VID(Current_Mode.BibID, Current_Mode.VID))
                {
                    Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "Item indicated is not valid", Custom_Trace_Type_Enum.Error);
                    errorCode = 2;
                }
            }

             // If this is a postback, handle any events first
            if ((currentMode.isPostBack) && ( errorCode < 0 ))
            {
                Debug.Assert(User != null, "User != null");

                // Pull the standard values
                string save_value = HttpContext.Current.Request.Form["admin_delete_item"];
                string text_value = HttpContext.Current.Request.Form["admin_delete_confirm"];

                // Better say "DELETE", or just send back to the item
                if (( save_value == null ) || ( save_value.ToUpper() != "DELETE" ) || ( text_value.ToUpper() != "DELETE"))
                {
                    HttpContext.Current.Response.Redirect(Current_Mode.Base_URL + currentMode.BibID + "/" + currentMode.VID, false);
                    HttpContext.Current.ApplicationInstance.CompleteRequest();
                    currentMode.Request_Completed = true;
                }
                else
                {
                    if (currentMode.BibID.ToUpper() == "TEMP000001")
                    {
                        for (int deleteVID = 2124; deleteVID <= 2134; deleteVID++)
                        {
                            currentMode.VID = deleteVID.ToString().PadLeft(5, '0');
                            Delete_Item(User, All_Items_Lookup, Tracer);
                        }
                    }
                    else
                    {
                        Delete_Item(User, All_Items_Lookup, Tracer);
                    }

                }
            }
        }
        /// <summary> Constructor for a new instance of the Delete_Item_MySobekViewer class </summary>
        /// <param name="User"> Authenticated user information </param>
        /// <param name="Current_Mode"> Mode / navigation information for the current request</param>
        /// <param name="All_Items_Lookup"> Allows individual items to be retrieved by various methods as <see cref="SobekCM.Library.Application_State.Single_Item"/> objects.</param>
        /// <param name="Tracer">Trace object keeps a list of each method executed and important milestones in rendering</param>
        public Delete_Item_MySobekViewer(User_Object User,
            SobekCM_Navigation_Object Current_Mode, 
            Item_Lookup_Object All_Items_Lookup,
            
            Custom_Tracer Tracer)
            : base(User)
        {
            Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "Delete this item");

            // Save mode and set defaults
            currentMode = Current_Mode;
            errorCode = -1;

            // First, ensure this is a logged on user and system administrator before continuing
            Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "Validate user permissions" );
            if ((User == null) || ((!User.Is_System_Admin) && (User.UserName.ToLower() != "neldamaxs")))
            {
                Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "User does not have delete permissions", Custom_Trace_Type_Enum.Error );
                errorCode = 1;
            }

            // Second, ensure the item is valid
            if( errorCode == -1 )
            {
                Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "Validate item exists" );
                if (!All_Items_Lookup.Contains_BibID_VID( Current_Mode.BibID, Current_Mode.VID))
                {
                    Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "Item indicated is not valid", Custom_Trace_Type_Enum.Error );
                    errorCode = 2;
                }
            }

            // Get the current item details
            string bib_location = String.Empty;
            string vid_location = String.Empty;
            if ( errorCode == -1 )
            {
                // Get item details
                DataSet itemDetails = SobekCM_Database.Get_Item_Details(currentMode.BibID, currentMode.VID, Tracer);

                // If the itemdetails was null, this item is somehow invalid item then
                if ( itemDetails == null )
                {
                    Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "Item indicated is not valid", Custom_Trace_Type_Enum.Error );
                    errorCode = 2;
                }
                else
                {
                    // Get the location for this METS file from the returned value
                    DataRow mainItemRow = itemDetails.Tables[2].Rows[0];
                    bib_location = SobekCM_Library_Settings.Image_Server_Network + mainItemRow["File_Location"].ToString().Replace("/", "\\");
                    vid_location = bib_location + "\\" + currentMode.VID;
                }
            }

             // If this is a postback, handle any events first
            if ((currentMode.isPostBack) && ( errorCode < 0 ))
            {
                Debug.Assert(User != null, "User != null");

                // Pull the standard values
                string save_value = HttpContext.Current.Request.Form["admin_delete_item"];
                string text_value = HttpContext.Current.Request.Form["admin_delete_confirm"];

                // Better say "DELETE", or just send back to the item
                if (( save_value == null ) || ( save_value.ToUpper() != "DELETE" ) || ( text_value.ToUpper() != "DELETE"))
                {
                    HttpContext.Current.Response.Redirect(Current_Mode.Base_URL + currentMode.BibID + "/" + currentMode.VID);
                }
                else
                {
                    errorCode = 0;

                    // Perform the database delete
                    Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "Perform database update");
                    bool database_result = SobekCM_Database.Delete_SobekCM_Item(currentMode.BibID, currentMode.VID, User.Is_System_Admin, String.Empty );

                    if (!database_result)
                    {
                        Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "Error performing delete in the database", Custom_Trace_Type_Enum.Error);
                        errorCode = 3;
                    }
                    else
                    {
                        // Move the folder to deletes
                        try
                        {
                            Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "Move resource files to DELETED folder");

                            // Make sure upper deleted folder exists, or create it
                            string delete_folder = SobekCM_Library_Settings.Image_Server_Network + "DELETED";
                            if (!Directory.Exists(delete_folder))
                                Directory.CreateDirectory(delete_folder);

                            // Create the bib level folder next
                            string bib_folder = SobekCM_Library_Settings.Image_Server_Network + "DELETED\\" + currentMode.BibID;
                            if (!Directory.Exists(bib_folder))
                                Directory.CreateDirectory(bib_folder);

                            // Ensure the VID folder does not exist
                            string vid_folder = SobekCM_Library_Settings.Image_Server_Network + "DELETED\\" + currentMode.BibID + "\\" + currentMode.VID;
                            if (Directory.Exists(vid_folder))
                                Directory.Move(vid_folder, vid_folder + "_OLD");

                            // Move the VID folder over now
                            Directory.Move(vid_location, vid_folder);

                            // Check if this was the last VID under this BIB
                            if (Directory.GetDirectories(bib_location).Length == 0)
                            {
                                // Move all files over to the bib folder then
                                string[] bib_files = Directory.GetFiles(bib_location);
                                foreach (string thisFile in bib_files)
                                {
                                    string fileName = (new FileInfo(thisFile)).Name;
                                    string new_file = bib_folder + "\\" + fileName;
                                    File.Move(thisFile, new_file);
                                }
                            }
                        }
                        catch (Exception ee)
                        {
                            Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", "Error moving the folder and files to the DELETED folder", Custom_Trace_Type_Enum.Error);
                            Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", ee.Message, Custom_Trace_Type_Enum.Error);
                            Tracer.Add_Trace("Delete_Item_MySobekViewer.Constructor", ee.StackTrace, Custom_Trace_Type_Enum.Error);
                            errorCode = 4;
                        }

                        // Remove from the item list
                        All_Items_Lookup.Remove_Item(currentMode.BibID, currentMode.VID);

                        // Also remove from the cache
                        Cached_Data_Manager.Remove_Digital_Resource_Object(currentMode.BibID, currentMode.VID, Tracer);
                    }
                }
            }
        }
        private void Perform_Database_Search(Custom_Tracer Tracer, List<string> Terms, List<string> Web_Fields, int ActualCount, SobekCM_Navigation_Object Current_Mode, int Current_Sort, Item_Aggregation Aggregation_Object, Item_Lookup_Object All_Items_Lookup, int Results_Per_Page, bool Potentially_Include_Facets, out Search_Results_Statistics Complete_Result_Set_Info, out List<List<iSearch_Title_Result>> Paged_Results, bool Need_Search_Statistics)
        {
            if (Tracer != null)
            {
                Tracer.Add_Trace("SobekCM_Assistant.Perform_Database_Sear`ch", "Query the database for search results");
            }

            // Get the list of facets first
            List<short> facetsList = Aggregation_Object.Facets;
            if (!Potentially_Include_Facets)
                facetsList.Clear();

            // Set the return values to NULL initially
            Complete_Result_Set_Info = null;

            const bool includePrivate = false;

            // Special code for searching by bibid, oclc, or aleph
            if (ActualCount == 1)
            {
                // Is this a BIBID search?
                if ((Web_Fields[0] == "BI") && ( Terms[0].IndexOf("*") < 0 ) && ( Terms[0].Length >= 10 ))
                {
                    string bibid = Terms[0].ToUpper();
                    string vid = String.Empty;
                    if (bibid.Length > 10)
                    {
                        if ((bibid.IndexOf("_") == 10) && ( bibid.Length > 11 ))
                        {
                            vid = bibid.Substring(11).PadLeft(5, '0');
                            bibid = bibid.Substring(0, 10);
                        }
                        else if ((bibid.IndexOf(":") == 10) && ( bibid.Length > 11 ))
                        {
                            vid = bibid.Substring(11).PadLeft(5, '0');
                            bibid = bibid.Substring(0, 10);
                        }
                        else if (bibid.Length == 15)
                        {
                            vid = bibid.Substring(10);
                            bibid = bibid.Substring(0, 10);
                        }
                    }

                    if (bibid.Length == 10)
                    {
                        if (vid.Length == 5)
                        {
                            if (All_Items_Lookup.Contains_BibID_VID(bibid, vid))
                            {
                                string redirect_url = Current_Mode.Base_URL + bibid + "/" + vid;
                                if ( Current_Mode.Writer_Type == Writer_Type_Enum.HTML_LoggedIn )
                                    redirect_url = Current_Mode.Base_URL + "l/" + bibid + "/" + vid;
                                HttpContext.Current.Response.Redirect(redirect_url);
                            }
                        }
                        else
                        {
                            if (All_Items_Lookup.Contains_BibID(bibid))
                            {
                                string redirect_url = Current_Mode.Base_URL + bibid;
                                if (Current_Mode.Writer_Type == Writer_Type_Enum.HTML_LoggedIn)
                                    redirect_url = Current_Mode.Base_URL + "l/" + bibid;
                                HttpContext.Current.Response.Redirect(redirect_url);
                            }
                        }
                    }
                }

                // Was this a OCLC search?
                if ((Web_Fields[0] == "OC") && (Terms[0].Length > 0))
                {
                    bool is_number = Terms[0].All(Char.IsNumber);

                    if (is_number)
                    {
                        long oclc = Convert.ToInt64(Terms[0]);
                        Multiple_Paged_Results_Args returnArgs = SobekCM_Database.Items_By_OCLC_Number(oclc, false, Results_Per_Page, Current_Sort, Need_Search_Statistics, Tracer);
                        if (Need_Search_Statistics)
                            Complete_Result_Set_Info = returnArgs.Statistics;
                        Paged_Results = returnArgs.Paged_Results;
                        return;
                    }
                }

                // Was this a ALEPH search?
                if ((Web_Fields[0] == "AL") && (Terms[0].Length > 0))
                {
                    bool is_number = Terms[0].All(Char.IsNumber);

                    if (is_number)
                    {
                        int aleph = Convert.ToInt32(Terms[0]);
                        Multiple_Paged_Results_Args returnArgs = SobekCM_Database.Items_By_ALEPH_Number(aleph, false, Results_Per_Page, Current_Sort, Need_Search_Statistics, Tracer);
                        if (Need_Search_Statistics)
                            Complete_Result_Set_Info = returnArgs.Statistics;
                        Paged_Results = returnArgs.Paged_Results;
                        return;
                    }
                }
            }

            List<short> links = new List<short>();
            List<short> db_fields = new List<short>();
            List<string> db_terms = Terms.ToList();

            // Step through all the web fields and convert to db fields
            for (int i = 0; i < ActualCount; i++)
            {
                if (Web_Fields[i].Length > 1)
                {
                    // Find the joiner
                    if ((Web_Fields[i][0] == '+') || (Web_Fields[i][0] == '=') || (Web_Fields[i][0] == '-'))
                    {
                        if (i != 0)
                        {
                            if (Web_Fields[i][0] == '+')
                                links.Add(0);
                            if (Web_Fields[i][0] == '=')
                                links.Add(1);
                            if (Web_Fields[i][0] == '-')
                                links.Add(2);
                        }
                        Web_Fields[i] = Web_Fields[i].Substring(1);
                    }
                    else
                    {
                        if (i != 0)
                        {
                            links.Add(0);
                        }
                    }

                    // Find the db field number
                    db_fields.Add(Metadata_Field_Number(Web_Fields[i]));
                }

                // Also add starting and ending quotes to all the valid searches
                if (db_terms[i].Length > 0)
                {
                    if ((db_terms[i].IndexOf("\"") < 0) && (db_terms[i].IndexOf(" ") < 0))
                    {
                        // Since this is a single word, see what type of special codes to include
                        switch (Current_Mode.Search_Precision)
                        {
                            case Search_Precision_Type_Enum.Contains:
                                db_terms[i] = "\"" + db_terms[i] + "\"";
                                break;

                            case Search_Precision_Type_Enum.Inflectional_Form:
                                // If there are any non-characters, don't use inflectional for this term
                                bool inflectional = db_terms[i].All(Char.IsLetter);
                                if (inflectional)
                                {
                                    db_terms[i] = "FORMSOF(inflectional," + db_terms[i] + ")";
                                }
                                else
                                {
                                    db_terms[i] = "\"" + db_terms[i] + "\"";
                                }
                                break;

                            case Search_Precision_Type_Enum.Synonmic_Form:
                                // If there are any non-characters, don't use thesaurus for this term
                                bool thesaurus = db_terms[i].All(Char.IsLetter);
                                if (thesaurus)
                                {
                                    db_terms[i] = "FORMSOF(thesaurus," + db_terms[i] + ")";
                                }
                                else
                                {
                                    db_terms[i] = "\"" + db_terms[i] + "\"";
                                }
                                break;
                        }
                    }
                    else
                    {
                        if (Current_Mode.Search_Precision != Search_Precision_Type_Enum.Exact_Match)
                        {
                            db_terms[i] = "\"" + db_terms[i] + "\"";
                        }
                    }
                }
            }

            // If this is an exact match, just do the search
            if (Current_Mode.Search_Precision == Search_Precision_Type_Enum.Exact_Match)
            {
                Multiple_Paged_Results_Args returnArgs = SobekCM_Database.Perform_Metadata_Exact_Search_Paged(db_terms[0], db_fields[0], includePrivate, Current_Mode.Aggregation, Results_Per_Page, Current_Mode.Page, Current_Sort, Need_Search_Statistics, facetsList, Need_Search_Statistics, Tracer);
                if (Need_Search_Statistics)
                    Complete_Result_Set_Info = returnArgs.Statistics;
                Paged_Results = returnArgs.Paged_Results;
            }
            else
            {
                // Finish filling up the fields and links
                while (links.Count < 9)
                    links.Add(0);
                while (db_fields.Count < 10)
                    db_fields.Add(-1);
                while (db_terms.Count < 10)
                    db_terms.Add(String.Empty);

                // See if this is a simple search, which can use a more optimized search routine
                bool simplified_search = db_fields.All(field => (field <= 0));

                // Perform either the simpler metadata search, or the more complex
                if (simplified_search)
                {
                    StringBuilder searchBuilder = new StringBuilder();
                    for (int i = 0; i < db_terms.Count; i++)
                    {
                        if (db_terms[i].Length > 0)
                        {
                            if (i > 0)
                            {
                                if (i > links.Count)
                                {
                                    searchBuilder.Append(" AND ");
                                }
                                else
                                {
                                    switch (links[i - 1])
                                    {
                                        case 0:
                                            searchBuilder.Append(" AND ");
                                            break;

                                        case 1:
                                            searchBuilder.Append(" OR ");
                                            break;

                                        case 2:
                                            searchBuilder.Append(" AND NOT ");
                                            break;
                                    }
                                }
                            }

                            searchBuilder.Append(db_terms[i]);
                        }
                    }

                    Multiple_Paged_Results_Args returnArgs = SobekCM_Database.Perform_Metadata_Search_Paged(searchBuilder.ToString(), includePrivate, Current_Mode.Aggregation, Results_Per_Page, Current_Mode.Page, Current_Sort, Need_Search_Statistics, facetsList, Need_Search_Statistics, Tracer);
                    if (Need_Search_Statistics)
                        Complete_Result_Set_Info = returnArgs.Statistics;
                    Paged_Results = returnArgs.Paged_Results;
                }
                else
                {
                    // Perform search in the database
                    Multiple_Paged_Results_Args returnArgs = SobekCM_Database.Perform_Metadata_Search_Paged(db_terms[0], db_fields[0], links[0], db_terms[1], db_fields[1], links[1], db_terms[2], db_fields[2], links[2], db_terms[3],
                                                                                                            db_fields[3], links[3], db_terms[4], db_fields[4], links[4], db_terms[5], db_fields[5], links[5], db_terms[6], db_fields[6], links[6], db_terms[7], db_fields[7], links[7], db_terms[8], db_fields[8],
                                                                                                            links[8], db_terms[9], db_fields[9], includePrivate, Current_Mode.Aggregation, Results_Per_Page, Current_Mode.Page, Current_Sort, Need_Search_Statistics, facetsList, Need_Search_Statistics, Tracer);
                    if (Need_Search_Statistics)
                        Complete_Result_Set_Info = returnArgs.Statistics;
                    Paged_Results = returnArgs.Paged_Results;
                }
            }
        }
        /// <summary> Parse the query and set the internal variables </summary>
        /// <param name="QueryString"> QueryString collection passed from the main page </param>
        /// <param name="navigator"> Navigation object to hold the mode information </param>
        /// <param name="Base_URL">Requested base URL (without query string, etc..)</param>
        /// <param name="User_Languages"> Languages preferred by user, per their browser settings </param>
        /// <param name="Code_Manager"> List of valid collection codes, including mapping from the Sobek collections to Greenstone collections </param>
        /// <param name="Aggregation_Aliases"> List of all existing aliases for existing aggregations</param>
        /// <param name="All_Items_Lookup"> [REF] Lookup object used to pull basic information about any item loaded into this library</param>
        /// <param name="URL_Portals"> List of all web portals into this system </param>
        /// <param name="Tracer"> Trace object keeps a list of each method executed and important milestones in rendering</param>
        public void Parse_Query(NameValueCollection QueryString,
			SobekCM_Navigation_Object navigator,
			string Base_URL,
			string[] User_Languages,
			Aggregation_Code_Manager Code_Manager,
			Dictionary<string, string> Aggregation_Aliases,
			ref Item_Lookup_Object All_Items_Lookup,
			Portal_List URL_Portals,
			Custom_Tracer Tracer )
        {
            // Set default mode to error
            navigator.Mode = Display_Mode_Enum.Error;

            // If this has 'verb' then this is an OAI-PMH request
            if ( QueryString["verb"] != null )
            {
                navigator.Writer_Type = Writer_Type_Enum.OAI;
                return;
            }

            // Is there a TOC state set?
            if (QueryString["toc"] != null)
            {
                if (QueryString["toc"] == "y")
                {
                    navigator.TOC_Display = TOC_Display_Type_Enum.Show;
                }
                else if ( QueryString["toc"] == "n" )
                {
                    navigator.TOC_Display = TOC_Display_Type_Enum.Hide;
                }
            }

            // Determine the default language, per the browser settings
            if (User_Languages != null)
            {
                foreach (string thisLanguage in User_Languages)
                {
                    if (thisLanguage.IndexOf("en") == 0)
                    {
                        navigator.Default_Language = Web_Language_Enum.English;
                        break;
                    }

                    if (thisLanguage.IndexOf("fr") == 0)
                    {
                        navigator.Default_Language = Web_Language_Enum.French;
                        break;
                    }

                    if (thisLanguage.IndexOf("es") == 0)
                    {
                        navigator.Default_Language = Web_Language_Enum.Spanish;
                        break;
                    }
                }
            }

            // Is there a language defined?  If so, load right into the navigator
            navigator.Language = navigator.Default_Language;
            if ( QueryString["l"] != null )
            {
                if (( QueryString["l"] == "es" ) || ( QueryString["l"] == "sp" ))
                {
                    navigator.Language = Web_Language_Enum.Spanish;
                }
                if ( QueryString["l"] == "fr" )
                {
                    navigator.Language = Web_Language_Enum.French;
                }
                if (QueryString["l"] == "en")
                {
                    navigator.Language = Web_Language_Enum.English;
                }
            }

            // If there is flag indicating to show the trace route, save it
            if (QueryString["trace"] != null)
            {
                navigator.Trace_Flag = QueryString["trace"].ToUpper() == "NO" ? Trace_Flag_Type_Enum.No : Trace_Flag_Type_Enum.Explicit;
            }
            else
            {
                navigator.Trace_Flag = Trace_Flag_Type_Enum.Unspecified;
            }

            // Did the user request to have it render like it would for a search robot?
            if (QueryString["robot"] != null)
            {
                navigator.Is_Robot = true;
            }

            // Was a fragment specified in the query string?
            if (QueryString["fragment"] != null)
            {
                navigator.Fragment = QueryString["fragment"];
            }

            // Parse URL request different now, depending on if this is a legacy URL type or the new URL type
            navigator.Mode = Display_Mode_Enum.None;

            // CHECK FOR LEGACY VALUES
            // Check for legacy bibid / vid information, since this will be supported indefinitely
            if (( QueryString["b"] != null ) || ( QueryString["bib"] != null ))
            {
                navigator.BibID = QueryString["b"] ?? QueryString["bib"];

                if ( navigator.BibID.Length > 0 )
                {
                    navigator.Mode = Display_Mode_Enum.Item_Display;

                    if ( QueryString["v"] != null )
                        navigator.VID = QueryString["v"];
                    else if ( QueryString["vid"] != null )
                        navigator.VID = QueryString["vid"];
                }

                // No other item information is collected here anymore.. just return
                return;
            }

            // Get the valid URL Portal
            navigator.Default_Aggregation = "all";
            Portal urlPortal = URL_Portals.Get_Valid_Portal(Base_URL);
            navigator.SobekCM_Instance_Abbreviation = urlPortal.Abbreviation;
            navigator.SobekCM_Instance_Name = urlPortal.Name;
            navigator.Portal_PURL = urlPortal.Base_PURL;
            if (urlPortal.Default_Aggregation.Length > 0)
            {
                navigator.Default_Aggregation = urlPortal.Default_Aggregation;
                navigator.Aggregation = urlPortal.Default_Aggregation;
            }
            if (urlPortal.Default_Web_Skin.Length > 0)
            {
                navigator.Default_Skin = urlPortal.Default_Web_Skin;
                navigator.Skin = urlPortal.Default_Web_Skin;
                navigator.Skin_in_URL = false;
            }

            // Collect the interface string
            if (QueryString["n"] != null)
            {
                string currSkin = HttpUtility.HtmlEncode(QueryString["n"].ToLower().Replace("'", ""));

                // Save the interface
                if (currSkin.Length > 0)
                {
                    if (currSkin.IndexOf(",") > 0)
                        currSkin = currSkin.Substring(0, currSkin.IndexOf(","));
                    navigator.Skin = currSkin.ToLower();
                    navigator.Skin_in_URL = true;
                }
            }

            // Set the default mode
            navigator.Mode = Display_Mode_Enum.Aggregation_Home;
            navigator.Home_Type = Home_Type_Enum.List;

            // Get any url rewrite which occurred
            if (QueryString["urlrelative"] != null)
            {
                string urlrewrite = QueryString["urlrelative"].ToLower();
                if (urlrewrite.Length > 0)
                {
                    // Split the url relative list
                    string[] url_relative_info = urlrewrite.Split("/".ToCharArray());
                    List<string> url_relative_list = (from thisPart in url_relative_info where thisPart.Length > 0 select thisPart.ToLower()).ToList();

                    // Determine the main writer (html, json, xml, oai-pmh, etc..)
                    navigator.Writer_Type = Writer_Type_Enum.HTML;
                    if ( url_relative_list.Count > 0 )
                    {
                        switch (url_relative_list[0])
                        {
                            case "l":
                                navigator.Writer_Type = Writer_Type_Enum.HTML_LoggedIn;
                                url_relative_list.RemoveAt(0);
                                break;

                            case "my":
                                navigator.Writer_Type = Writer_Type_Enum.HTML_LoggedIn;
                                break;

                            case "json":
                                navigator.Writer_Type = Writer_Type_Enum.JSON;
                                url_relative_list.RemoveAt(0);
                                break;

                            case "dataset":
                                navigator.Writer_Type = Writer_Type_Enum.DataSet;
                                url_relative_list.RemoveAt(0);
                                break;

                            case "xml":
                                navigator.Writer_Type = Writer_Type_Enum.XML;
                                url_relative_list.RemoveAt(0);
                                break;

                            case "textonly":
                                navigator.Writer_Type = Writer_Type_Enum.Text;
                                url_relative_list.RemoveAt(0);
                                break;
                        }
                    }

                    // Is the first part of the list one of these constants?
                    if (( url_relative_list.Count > 0 ) && ( url_relative_list[0].Length > 0 ))
                    {
                        switch ( url_relative_list[0] )
                        {
                            case "gatorlink":
                            case "shibboleth":
                                navigator.Mode = Display_Mode_Enum.My_Sobek;
                                navigator.My_Sobek_Type = My_Sobek_Type_Enum.Shibboleth_Landing;
                                break;

                            case "internal":
                                navigator.Mode = Display_Mode_Enum.Internal;
                                navigator.Internal_Type = Internal_Type_Enum.Aggregations_List;
                                if ( url_relative_list.Count > 1 )
                                {
                                    switch( url_relative_list[1] )
                                    {
                                        case "aggregations":
                                            navigator.Internal_Type = Internal_Type_Enum.Aggregations_List;
                                            if (url_relative_list.Count > 2)
                                            {
                                                if (url_relative_list[2] == "list")
                                                {
                                                    if (url_relative_list.Count > 3)
                                                        navigator.Info_Browse_Mode = url_relative_list[3];
                                                }
                                                else
                                                {
                                                    navigator.Internal_Type = Internal_Type_Enum.Aggregations;
                                                    navigator.Info_Browse_Mode = url_relative_list[2].Replace("_"," ");
                                                }
                                            }
                                            break;

                                        case "cache":
                                            navigator.Internal_Type = Internal_Type_Enum.Cache;
                                            break;

                                        case "new":
                                            navigator.Internal_Type = Internal_Type_Enum.New_Items;
                                            if (url_relative_list.Count > 2)
                                            {
                                                navigator.Info_Browse_Mode = url_relative_list[2];
                                            }
                                            break;

                                        case "failures":
                                            navigator.Internal_Type = Internal_Type_Enum.Build_Failures;
                                            if (url_relative_list.Count > 2)
                                                navigator.Info_Browse_Mode = url_relative_list[2];
                                            break;

                                        case "wordmarks":
                                            navigator.Internal_Type = Internal_Type_Enum.Wordmarks;
                                            break;
                                    }
                                }
                                break;

                            case "contact":
                                navigator.Mode = Display_Mode_Enum.Contact;
                                if ( url_relative_list.Count > 1 )
                                {
                                    if (url_relative_list[1] == "sent")
                                    {
                                        navigator.Mode = Display_Mode_Enum.Contact_Sent;
                                    }
                                    else
                                    {
                                        navigator.Aggregation = url_relative_list[1];
                                    }
                                }
                                if (QueryString["em"] != null)
                                    navigator.Error_Message = QueryString["em"];
                                break;

                            case "folder":
                                navigator.Mode = Display_Mode_Enum.Public_Folder;
                                if (url_relative_list.Count >= 2)
                                {
                                    try
                                    {
                                        navigator.FolderID = Convert.ToInt32(url_relative_list[1]);
                                    }
                                    catch
                                    {
                                        navigator.FolderID = -1;
                                    }

                                    // Look for result display type
                                    if (url_relative_list.Count >=3 )
                                    {
                                        switch (url_relative_list[2])
                                        {
                                            case "brief":
                                                navigator.Result_Display_Type = Result_Display_Type_Enum.Brief;
                                                break;
                                            case "export":
                                                navigator.Result_Display_Type = Result_Display_Type_Enum.Export;
                                                break;
                                            case "citation":
                                                navigator.Result_Display_Type = Result_Display_Type_Enum.Full_Citation;
                                                break;
                                            case "image":
                                                navigator.Result_Display_Type = Result_Display_Type_Enum.Full_Image;
                                                break;
                                            case "map":
                                                navigator.Result_Display_Type = Result_Display_Type_Enum.Map;
                                                break;
                                            case "table":
                                                navigator.Result_Display_Type = Result_Display_Type_Enum.Table;
                                                break;
                                            case "thumbs":
                                                navigator.Result_Display_Type = Result_Display_Type_Enum.Thumbnails;
                                                break;
                                            default:
                                                navigator.Result_Display_Type = Result_Display_Type_Enum.Brief;
                                                break;
                                        }
                                    }

                                    // Look for a page number
                                    if (url_relative_list.Count >= 4 )
                                    {
                                        string possible_page = url_relative_list[3];
                                        if ((possible_page.Length > 0) && (is_String_Number(possible_page)))
                                        {
                                            ushort page_result;
                                            UInt16.TryParse(possible_page, out page_result);
                                            navigator.Page = page_result;
                                        }
                                    }
                                }
                                break;

                            case "my":
                                navigator.Mode = Display_Mode_Enum.My_Sobek;
                                if (QueryString["return"] != null)
                                    navigator.Return_URL = QueryString["return"];
                                if ( url_relative_list.Count > 1 )
                                {
                                    switch( url_relative_list[1] )
                                    {
                                        case "logon":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Logon;
                                            if (QueryString["return"] != null)
                                                navigator.Return_URL = QueryString["return"];
                                            break;

                                        case "home":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Home;
                                            if (QueryString["return"] != null)
                                                navigator.Return_URL = QueryString["return"];
                                            break;

                                        case "delete":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Delete_Item;
                                            if (url_relative_list.Count > 2)
                                                navigator.BibID = url_relative_list[2].ToUpper();
                                            if (url_relative_list.Count > 3)
                                                navigator.VID = url_relative_list[3];
                                            break;

                                        case "submit":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.New_Item;
                                            if (url_relative_list.Count > 2)
                                                navigator.My_Sobek_SubMode = url_relative_list[2];
                                            break;

                                        case "behaviors":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Edit_Item_Behaviors;
                                            if (url_relative_list.Count > 2)
                                                navigator.BibID = url_relative_list[2].ToUpper();
                                            if (url_relative_list.Count > 3)
                                                navigator.VID = url_relative_list[3];
                                            if (url_relative_list.Count > 4)
                                                navigator.My_Sobek_SubMode = url_relative_list[4];
                                            break;

                                        case "edit":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Edit_Item_Metadata;
                                            if (url_relative_list.Count > 2)
                                                navigator.BibID = url_relative_list[2].ToUpper();
                                            if (url_relative_list.Count > 3)
                                                navigator.VID = url_relative_list[3];
                                            if (url_relative_list.Count > 4)
                                                navigator.My_Sobek_SubMode = url_relative_list[4];
                                            break;

                                        case "files":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.File_Management;
                                            if (url_relative_list.Count > 2)
                                                navigator.BibID = url_relative_list[2].ToUpper();
                                            if (url_relative_list.Count > 3)
                                                navigator.VID = url_relative_list[3];
                                            if (url_relative_list.Count > 4)
                                                navigator.My_Sobek_SubMode = url_relative_list[4];
                                            break;

                                        case "addvolume":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Group_Add_Volume;
                                            if (url_relative_list.Count > 2)
                                                navigator.BibID = url_relative_list[2].ToUpper();
                                            if (url_relative_list.Count > 3)
                                                navigator.My_Sobek_SubMode = url_relative_list[3];
                                            break;

                                        case "autofill":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Group_AutoFill_Volumes;
                                            if (url_relative_list.Count > 2)
                                                navigator.BibID = url_relative_list[2].ToUpper();
                                            if (url_relative_list.Count > 3)
                                                navigator.My_Sobek_SubMode = url_relative_list[3];
                                            break;

                                        case "massupdate":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Group_Mass_Update_Items;
                                            if (url_relative_list.Count > 2)
                                                navigator.BibID = url_relative_list[2].ToUpper();
                                            if (url_relative_list.Count > 3)
                                                navigator.My_Sobek_SubMode = url_relative_list[3];
                                            break;

                                        case "groupbehaviors":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Edit_Group_Behaviors;
                                            if (url_relative_list.Count > 2)
                                                navigator.BibID = url_relative_list[2].ToUpper();
                                            if (url_relative_list.Count > 3)
                                                navigator.My_Sobek_SubMode = url_relative_list[3];
                                            break;

                                        case "serialhierarchy":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Edit_Group_Serial_Hierarchy;
                                            if (url_relative_list.Count > 2)
                                                navigator.BibID = url_relative_list[2].ToUpper();
                                            if (url_relative_list.Count > 3)
                                                navigator.My_Sobek_SubMode = url_relative_list[3];
                                            break;

                                        case "bookshelf":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Folder_Management;
                                            navigator.Result_Display_Type = Result_Display_Type_Enum.Bookshelf;
                                            if (url_relative_list.Count > 2)
                                            {
                                                navigator.My_Sobek_SubMode = url_relative_list[2];
                                                if (url_relative_list.Count > 3)
                                                {
                                                    switch (navigator.My_Sobek_SubMode)
                                                    {
                                                        case "brief":
                                                            navigator.Result_Display_Type = Result_Display_Type_Enum.Brief;
                                                            navigator.My_Sobek_SubMode = url_relative_list[3];
                                                            break;

                                                        case "export":
                                                            navigator.Result_Display_Type = Result_Display_Type_Enum.Export;
                                                            navigator.My_Sobek_SubMode = url_relative_list[3];
                                                            break;

                                                        case "thumbs":
                                                            navigator.Result_Display_Type = Result_Display_Type_Enum.Thumbnails;
                                                            navigator.My_Sobek_SubMode = url_relative_list[3];
                                                            break;

                                                        case "table":
                                                            navigator.Result_Display_Type = Result_Display_Type_Enum.Table;
                                                            navigator.My_Sobek_SubMode = url_relative_list[3];
                                                            break;

                                                        case "citation":
                                                            navigator.Result_Display_Type = Result_Display_Type_Enum.Full_Citation;
                                                            navigator.My_Sobek_SubMode = url_relative_list[3];
                                                            break;

                                                        case "image":
                                                            navigator.Result_Display_Type = Result_Display_Type_Enum.Full_Image;
                                                            navigator.My_Sobek_SubMode = url_relative_list[3];
                                                            break;

                                                        default:
                                                            if (is_String_Number(url_relative_list[3]))
                                                            {
                                                                ushort page_result;
                                                                UInt16.TryParse(url_relative_list[3], out page_result);
                                                                navigator.Page = page_result;
                                                            }
                                                            break;
                                                    }
                                                }
                                                if ((url_relative_list.Count > 4) && ( is_String_Number( url_relative_list[4] )))
                                                {
                                                    ushort page_result;
                                                    UInt16.TryParse(url_relative_list[4], out page_result);
                                                    navigator.Page = page_result;
                                                }
                                            }
                                            break;

                                        case "preferences":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Preferences;
                                            break;

                                        case "logout":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Log_Out;
                                            if (QueryString["return"] != null)
                                                navigator.Return_URL = QueryString["return"];
                                            break;

                                        case "gatorlink":
                                        case "shibboleth":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Shibboleth_Landing;
                                            if (QueryString["return"] != null)
                                                navigator.Return_URL = QueryString["return"];
                                            break;

                                        case "searches":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.Saved_Searches;
                                            break;

                                        case "tags":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.User_Tags;
                                            if (url_relative_list.Count > 2)
                                                navigator.My_Sobek_SubMode = url_relative_list[2];
                                            break;

                                        case "stats":
                                            navigator.My_Sobek_Type = My_Sobek_Type_Enum.User_Usage_Stats;
                                            if (url_relative_list.Count > 2)
                                                navigator.My_Sobek_SubMode = url_relative_list[2];
                                            break;
                                    }
                                }
                                break;

                            case "admin":
                                navigator.Mode = Display_Mode_Enum.Administrative;
                                navigator.Admin_Type = Admin_Type_Enum.Home;
                                if (QueryString["return"] != null)
                                    navigator.Return_URL = QueryString["return"];
                                if (url_relative_list.Count > 1)
                                {
                                    switch (url_relative_list[1])
                                    {
                                        case "builder":
                                            navigator.Admin_Type = Admin_Type_Enum.Builder_Status;
                                            break;

                                        case "aggregations":
                                            navigator.Admin_Type = Admin_Type_Enum.Aggregations_Mgmt;
                                            if (url_relative_list.Count > 2)
                                                navigator.My_Sobek_SubMode = url_relative_list[2];
                                            break;

                                        case "editaggr":
                                            navigator.Admin_Type = Admin_Type_Enum.Aggregation_Single;
                                            if (url_relative_list.Count > 2)
                                                navigator.Aggregation = url_relative_list[2];
                                            if (url_relative_list.Count > 3)
                                                navigator.My_Sobek_SubMode = url_relative_list[3];
                                            break;

                                        case "aliases":
                                            navigator.Admin_Type = Admin_Type_Enum.Forwarding;
                                            break;

                                        case "webskins":
                                            navigator.Admin_Type = Admin_Type_Enum.Interfaces;
                                            break;

                                        case "projects":
                                            navigator.Admin_Type = Admin_Type_Enum.Projects;
                                            if (url_relative_list.Count > 2)
                                                navigator.My_Sobek_SubMode = url_relative_list[2];
                                            break;

                                        case "restrictions":
                                            navigator.Admin_Type = Admin_Type_Enum.IP_Restrictions;
                                            if (url_relative_list.Count > 2)
                                                navigator.My_Sobek_SubMode = url_relative_list[2];
                                            break;

                                        case "portals":
                                            navigator.Admin_Type = Admin_Type_Enum.URL_Portals;
                                            break;

                                        case "users":
                                            navigator.Admin_Type = Admin_Type_Enum.Users;
                                            if (url_relative_list.Count > 2)
                                                navigator.My_Sobek_SubMode = url_relative_list[2];
                                            break;

                                        case "groups":
                                            navigator.Admin_Type = Admin_Type_Enum.User_Groups;
                                            if (url_relative_list.Count > 2)
                                                navigator.My_Sobek_SubMode = url_relative_list[2];
                                            break;

                                        case "wordmarks":
                                            navigator.Admin_Type = Admin_Type_Enum.Wordmarks;
                                            break;

                                        case "reset":
                                            navigator.Admin_Type = Admin_Type_Enum.Reset;
                                            break;

                                        case "headings":
                                            navigator.Admin_Type = Admin_Type_Enum.Thematic_Headings;
                                            if (url_relative_list.Count > 2)
                                                navigator.My_Sobek_SubMode = url_relative_list[2];
                                            break;

                                        case "settings":
                                            navigator.Admin_Type = Admin_Type_Enum.Settings;
                                            if (url_relative_list.Count > 2)
                                                navigator.My_Sobek_SubMode = url_relative_list[2];
                                            break;
                                    }
                                }
                                break;

                            case "preferences":
                                navigator.Mode = Display_Mode_Enum.Preferences;
                                break;

                            case "stats":
                            case "statistics":
                                navigator.Mode = Display_Mode_Enum.Statistics;
                                if ( url_relative_list.Count > 1 )
                                {
                                    switch( url_relative_list[1] )
                                    {
                                        case "itemcount":
                                            navigator.Statistics_Type = Statistics_Type_Enum.Item_Count_Standard_View;
                                            if ( url_relative_list.Count > 2 )
                                            {
                                                switch( url_relative_list[2])
                                                {
                                                    case "arbitrary":
                                                        navigator.Statistics_Type = Statistics_Type_Enum.Item_Count_Arbitrary_View;
                                                        if (url_relative_list.Count > 3)
                                                        {
                                                            navigator.Info_Browse_Mode = url_relative_list[3];
                                                        }
                                                        break;

                                                    case "growth":
                                                        navigator.Statistics_Type = Statistics_Type_Enum.Item_Count_Growth_View;
                                                        break;

                                                    case "text":
                                                        navigator.Statistics_Type = Statistics_Type_Enum.Item_Count_Text;
                                                        break;

                                                    case "standard":
                                                        navigator.Statistics_Type = Statistics_Type_Enum.Item_Count_Standard_View;
                                                        break;
                                                }
                                            }
                                            break;

                                        case "searches":
                                            navigator.Statistics_Type = Statistics_Type_Enum.Recent_Searches;
                                            break;

                                        case "usage":
                                            navigator.Statistics_Type = Statistics_Type_Enum.Usage_Overall;
                                            if ( url_relative_list.Count > 2 )
                                            {
                                                switch( url_relative_list[2])
                                                {
                                                    case "all":
                                                        navigator.Statistics_Type = Statistics_Type_Enum.Usage_Overall;
                                                        break;

                                                    case "history":
                                                        navigator.Statistics_Type = Statistics_Type_Enum.Usage_Collection_History;
                                                        if ( url_relative_list.Count > 3 )
                                                        {
                                                            switch( url_relative_list[3] )
                                                            {
                                                                case "text":
                                                                    navigator.Statistics_Type = Statistics_Type_Enum.Usage_Collection_History_Text;
                                                                    break;

                                                                default:
                                                                    navigator.Info_Browse_Mode = url_relative_list[3];
                                                                    break;
                                                            }

                                                            if ((String.IsNullOrEmpty(navigator.Info_Browse_Mode)) && (url_relative_list.Count > 4))
                                                                navigator.Info_Browse_Mode = url_relative_list[4];
                                                        }
                                                        break;

                                                    case "collections":
                                                        navigator.Statistics_Type = Statistics_Type_Enum.Usage_Collections_By_Date;
                                                        if (url_relative_list.Count > 3)
                                                            navigator.Info_Browse_Mode = url_relative_list[3];
                                                        break;

                                                    case "definitions":
                                                        navigator.Statistics_Type = Statistics_Type_Enum.Usage_Definitions;
                                                        break;

                                                    case "titles":
                                                        navigator.Statistics_Type = Statistics_Type_Enum.Usage_Titles_By_Collection;
                                                        if (( String.IsNullOrEmpty( navigator.Info_Browse_Mode )) && ( url_relative_list.Count > 4 ))
                                                            navigator.Info_Browse_Mode = url_relative_list[4];
                                                        break;

                                                    case "items":
                                                        navigator.Statistics_Type = Statistics_Type_Enum.Usage_Item_Views_By_Date;
                                                        if ( url_relative_list.Count > 3 )
                                                        {
                                                            switch( url_relative_list[3] )
                                                            {
                                                                case "date":
                                                                    navigator.Statistics_Type = Statistics_Type_Enum.Usage_Item_Views_By_Date;
                                                                    break;

                                                                case "top":
                                                                    navigator.Statistics_Type = Statistics_Type_Enum.Usage_Items_By_Collection;
                                                                    break;

                                                                case "text":
                                                                    navigator.Statistics_Type = Statistics_Type_Enum.Usage_By_Date_Text;
                                                                    break;

                                                                default:
                                                                    navigator.Info_Browse_Mode = url_relative_list[3];
                                                                    break;
                                                            }

                                                            if (( String.IsNullOrEmpty( navigator.Info_Browse_Mode )) && ( url_relative_list.Count > 4 ))
                                                                navigator.Info_Browse_Mode = url_relative_list[4];
                                                        }
                                                        break;

                                                }
                                            }
                                            break;
                                    }
                                }
                                break;

                            case "partners":
                                if (navigator.Default_Aggregation == "all")
                                {
                                    navigator.Mode = Display_Mode_Enum.Aggregation_Home;
                                    navigator.Aggregation = String.Empty;
                                    navigator.Home_Type = Home_Type_Enum.Partners_List;
                                    if ((url_relative_list.Count > 1) && (url_relative_list[1] == "thumbs"))
                                    {
                                        navigator.Home_Type = Home_Type_Enum.Partners_Thumbnails;
                                    }
                                }
                                else
                                {
                                    aggregation_querystring_analyze(navigator, QueryString, navigator.Default_Aggregation, url_relative_list);
                                }
                                break;

                            case "tree":
                                navigator.Mode = Display_Mode_Enum.Aggregation_Home;
                                navigator.Aggregation = String.Empty;
                                navigator.Home_Type = Home_Type_Enum.Tree_Collapsed;
                                if ((url_relative_list.Count > 1) && (url_relative_list[1] == "expanded"))
                                {
                                    navigator.Home_Type = Home_Type_Enum.Tree_Expanded;
                                }
                                break;

                            case "brief":
                                navigator.Mode = Display_Mode_Enum.Aggregation_Home;
                                navigator.Aggregation = String.Empty;
                                navigator.Home_Type = Home_Type_Enum.Descriptions;
                                break;

                            case "personalized":
                                navigator.Mode = Display_Mode_Enum.Aggregation_Home;
                                navigator.Aggregation = String.Empty;
                                navigator.Home_Type = Home_Type_Enum.Personalized;
                                break;

                            case "all":
                                //if ( navigator.Default_Aggregation == "all" )
                                //    aggregation_querystring_analyze(navigator, QueryString, "all", url_relative_list.GetRange(1, url_relative_list.Count - 1));
                                //else
                                    aggregation_querystring_analyze(navigator, QueryString, navigator.Default_Aggregation, url_relative_list);
                                break;

                            case "new":
                                //if (navigator.Default_Aggregation != "all")
                                    aggregation_querystring_analyze(navigator, QueryString, navigator.Default_Aggregation, url_relative_list);
                                break;

                            case "map":
                            case "advanced":
                            case "text":
                            case "results":
                            case "contains":
                            case "exact":
                            case "resultslike":
                            case "browseby":
                            case "info":
                                aggregation_querystring_analyze(navigator, QueryString, navigator.Default_Aggregation, url_relative_list);
                                break;

                            // This was none of the main constant mode settings,
                            default:
                                // First check to see if the first term was an item aggregation alias, which
                                // allows for the alias to overwrite an existing aggregation code (limited usability
                                // but can be used to hide an existing aggregation easily)
                                if (Aggregation_Aliases.ContainsKey(url_relative_list[0]))
                                {
                                    // Perform all aggregation_style checks next
                                    string aggregation_code = Aggregation_Aliases[url_relative_list[0]];
                                    navigator.Aggregation_Alias = url_relative_list[0];
                                    aggregation_querystring_analyze( navigator, QueryString, aggregation_code, url_relative_list.GetRange(1, url_relative_list.Count - 1));
                                }
                                else if ( Code_Manager.isValidCode( url_relative_list[0] ))
                                {
                                    // This is an item aggregation call
                                    // Perform all aggregation_style checks next
                                    aggregation_querystring_analyze( navigator, QueryString, url_relative_list[0], url_relative_list.GetRange(1, url_relative_list.Count - 1 ));
                                }
                                else if ((SobekCM_Database.Verify_Item_Lookup_Object(true, ref All_Items_Lookup, Tracer)) && (All_Items_Lookup.Contains_BibID(url_relative_list[0].ToUpper())))
                                {
                                    // This is a BibID for an existing title with at least one public item
                                    navigator.BibID = url_relative_list[0].ToUpper();
                                    navigator.Mode = Display_Mode_Enum.Item_Display;

                                    // Is the next part a VID?
                                    int current_list_index = 1;
                                    if (url_relative_list.Count > 1)
                                    {
                                        string possible_vid = url_relative_list[1].Trim().PadLeft(5, '0');
                                        if ((All_Items_Lookup.Contains_BibID_VID(navigator.BibID, possible_vid)) || ( possible_vid == "00000" ))
                                        {
                                            navigator.VID = possible_vid;
                                            current_list_index++;
                                        }
                                    }

                                    // Look for the item print mode now
                                    if ((url_relative_list.Count > current_list_index) && (url_relative_list[current_list_index] == "print"))
                                    {
                                        // This is an item print request
                                        navigator.Mode = Display_Mode_Enum.Item_Print;

                                        // Since we need special characters for ranges, etc.. the viewer code
                                        // is in the options query string variable in this case
                                        if (QueryString["options"] != null)
                                        {
                                            navigator.ViewerCode = QueryString["options"];
                                        }
                                    }
                                    else
                                    {
                                        // Look for the viewercode next
                                        if (url_relative_list.Count > current_list_index)
                                        {
                                            string possible_viewercode = url_relative_list[current_list_index].Trim();

                                            // Get the view code
                                            if (possible_viewercode.Length > 0)
                                            {
                                                // Get the viewer code
                                                navigator.ViewerCode = possible_viewercode;

                                                // Now, get the page
                                                if ((navigator.ViewerCode.Length > 0) && (Char.IsNumber(navigator.ViewerCode[0])))
                                                {
                                                    // Look for the first number
                                                    int numberEnd = navigator.ViewerCode.Length;
                                                    int count = 0;
                                                    foreach (char thisChar in navigator.ViewerCode)
                                                    {
                                                        if (!Char.IsNumber(thisChar))
                                                        {
                                                            numberEnd = count;
                                                            break;
                                                        }
                                                        count++;
                                                    }

                                                    // Get the page
                                                    navigator.Page = Convert.ToUInt16(navigator.ViewerCode.Substring(0, numberEnd));
                                                }
                                            }
                                            else
                                            {
                                                // Sequence is set to 1
                                                navigator.Page = 1;
                                            }

                                            // Used or discarded the possible viewer code (used unless length of zero )
                                            current_list_index++;

                                            // Look for a subpage now, if there since there was a (possible) viewer code
                                            if (url_relative_list.Count > current_list_index)
                                            {
                                                string possible_subpage = url_relative_list[current_list_index].Trim();
                                                if (is_String_Number(possible_subpage))
                                                {
                                                    navigator.SubPage = Convert.ToUInt16(possible_subpage);
                                                }
                                            }
                                        }
                                    }

                                    // Check for any view port option information in the query string
                                    if (QueryString["vo"] != null)
                                    {
                                        string viewport_options = QueryString["vo"];
                                        if (viewport_options.Length > 0)
                                        {
                                            navigator.Viewport_Size = Convert.ToUInt16("0" + viewport_options[0]);

                                            if (viewport_options.Length > 1)
                                            {
                                                navigator.Viewport_Zoom = (ushort)(Convert.ToUInt16("0" + viewport_options[1]) + 1);
                                                if (navigator.Viewport_Zoom > 5)
                                                    navigator.Viewport_Zoom = 5;
                                                if (navigator.Viewport_Zoom < 1)
                                                    navigator.Viewport_Zoom = 1;

                                                if (viewport_options.Length > 2)
                                                {
                                                    navigator.Viewport_Rotation = Convert.ToUInt16("0" + viewport_options[2]);
                                                }
                                            }
                                        }
                                    }

                                    // Check for view port point in the query string
                                    if (QueryString["vp"] != null)
                                    {
                                        string viewport_point = QueryString["vp"];

                                        // Get the viewport point
                                        if ((viewport_point.Length > 0) && (viewport_point.IndexOf(",") > 0))
                                        {
                                            string[] split = viewport_point.Split(",".ToCharArray());
                                            navigator.Viewport_Point_X = Convert.ToInt32(split[0]);
                                            navigator.Viewport_Point_Y = Convert.ToInt32(split[1]);
                                        }
                                    }

                                    // Collect number of thumbnails per page
                                    if (QueryString["nt"] != null)
                                    {
                                        short nt_temp;
                                        if (short.TryParse(QueryString["nt"], out nt_temp))
                                            navigator.Thumbnails_Per_Page = nt_temp;
                                    }

                                    // Collect size of thumbnails per page
                                    if (QueryString["ts"] != null)
                                    {
                                        short ts_temp;
                                        if (short.TryParse(QueryString["ts"], out ts_temp))
                                            navigator.Size_Of_Thumbnails = ts_temp;
                                    }

                                    // Collect the text search string
                                    if (QueryString["search"] != null)
                                        navigator.Text_Search = QueryString["search"].Replace("+"," ");

                                    // If coordinates were here, save them
                                    if (QueryString["coord"] != null)
                                        navigator.Coordinates = QueryString["coord"];

                                    // If a page is requested by filename (rather than sequenc), collect that
                                    if (QueryString["file"] != null)
                                        navigator.Page_By_FileName = QueryString["file"];
                                }
                                else
                                {
                                    // Maybe this is a web content / info page
                                    navigator.Mode = Display_Mode_Enum.Simple_HTML_CMS;
                                    StringBuilder possibleInfoModeBuilder = new StringBuilder();
                                    if (url_relative_list.Count > 0)
                                    {
                                        possibleInfoModeBuilder.Append(url_relative_list[0]);
                                    }
                                    for (int i = 1; i < url_relative_list.Count; i++)
                                    {
                                        possibleInfoModeBuilder.Append("/" + url_relative_list[i]);
                                    }

                                    string possible_info_mode = possibleInfoModeBuilder.ToString().Replace("'", "").Replace("\"", "");
                                    string filename = possible_info_mode;
                                    string base_source = SobekCM_Library_Settings.Base_Directory + "design\\webcontent";
                                    string source = base_source;

                                    if ((possible_info_mode.IndexOf("\\") > 0) || (possible_info_mode.IndexOf("/") > 0))
                                    {
                                        source = source + "\\" + possible_info_mode.Replace("/", "\\");
                                        string[] split = source.Split("\\".ToCharArray());
                                        filename = split[split.Length - 1];
                                        source = source.Substring(0, source.Length - filename.Length);
                                    }

                                    if (Directory.Exists(source))
                                    {
                                        string[] matching_file = Directory.GetFiles(source, filename + ".htm*");
                                        if (matching_file.Length > 0)
                                        {
                                            navigator.Info_Browse_Mode = possible_info_mode;
                                            navigator.Page_By_FileName = matching_file[0];
                                        }
                                    }

                                    if ( navigator.Page_By_FileName.Length == 0 )
                                    {
                                        // This may point to the default html in the parent directory
                                        if ((Directory.Exists(source + "\\" + filename)) && (File.Exists(source + "\\" + filename + "\\default.html")))
                                        {
                                            navigator.Info_Browse_Mode = possible_info_mode;
                                            navigator.Page_By_FileName = source + "\\" + filename + "\\default.html";
                                        }
                                        else
                                        {
                                            if (navigator.Default_Aggregation == "all")
                                            {
                                                navigator.Info_Browse_Mode = "default";
                                                navigator.Page_By_FileName = base_source + "\\default.html";
                                            }
                                        }
                                    }

                                    // Last choice would be if this is a default aggregation
                                    if ((navigator.Page_By_FileName.Length == 0) && (navigator.Default_Aggregation != "all"))
                                    {
                                        aggregation_querystring_analyze(navigator, QueryString, navigator.Default_Aggregation, url_relative_list);
                                    }
                                }
                                break;
                        }
                    }
                }
            }
        }