/// <summary> Returns a built collection viewer matching request </summary>
        /// <param name="ViewType"> Aggregation view type </param>
        /// <param name="Current_Aggregation"> Current item aggregation object </param>
        /// <param name="Current_Mode"> Mode / navigation information for the current request </param>
        /// <returns> Collection viewer that extends the <see cref="abstractAggregationViewer"/> class. </returns>
        public static abstractAggregationViewer Get_Viewer(Item_Aggregation.CollectionViewsAndSearchesEnum ViewType, Item_Aggregation Current_Aggregation, SobekCM_Navigation_Object Current_Mode)
        {
            switch (ViewType)
            {
            case Item_Aggregation.CollectionViewsAndSearchesEnum.Advanced_Search:
                return(new Advanced_Search_AggregationViewer(Current_Aggregation, Current_Mode));

            case Item_Aggregation.CollectionViewsAndSearchesEnum.Advanced_Search_YearRange:
                return(new Advanced_Search_YearRange_AggregationViewer(Current_Aggregation, Current_Mode));


            case Item_Aggregation.CollectionViewsAndSearchesEnum.Basic_Search:
                Item_Aggregation_Front_Banner frontBannerImage = Current_Aggregation.Front_Banner_Image(Current_Mode.Language);
                if ((frontBannerImage != null) && (Current_Aggregation.Highlights.Count > 0))
                {
                    return(new Rotating_Highlight_Search_AggregationViewer(Current_Aggregation, Current_Mode));
                }
                return(new Basic_Search_AggregationViewer(Current_Aggregation, Current_Mode));

            case Item_Aggregation.CollectionViewsAndSearchesEnum.Basic_Search_YearRange:
                return(new Basic_Search_YearRange_AggregationViewer(Current_Aggregation, Current_Mode));

            case Item_Aggregation.CollectionViewsAndSearchesEnum.FullText_Search:
                return(new Full_Text_Search_AggregationViewer(Current_Aggregation, Current_Mode));

            case Item_Aggregation.CollectionViewsAndSearchesEnum.No_Home_Search:
                return(new No_Search_AggregationViewer());

            case Item_Aggregation.CollectionViewsAndSearchesEnum.Newspaper_Search:
                return(new Newspaper_Search_AggregationViewer(Current_Aggregation, Current_Mode));

            case Item_Aggregation.CollectionViewsAndSearchesEnum.Map_Search:
                return(new Map_Search_AggregationViewer(Current_Aggregation, Current_Mode));

            case Item_Aggregation.CollectionViewsAndSearchesEnum.Map_Search_Beta:
                return(new Map_Search_AggregationViewer_Beta(Current_Aggregation, Current_Mode));

            case Item_Aggregation.CollectionViewsAndSearchesEnum.DLOC_FullText_Search:
                return(new dLOC_Search_AggregationViewer(Current_Aggregation, Current_Mode));

            default:
                return(null);
            }
        }
        /// <summary> Returns a built collection viewer matching request </summary>
        /// <param name="SearchType"> Type of search from the current http request </param>
        /// <param name="RequestSpecificValues"> All the necessary, non-global data specific to the current request </param>
        /// <param name="ViewBag"> View bag holds specific data that was pulled for an aggregation request </param>
        /// <returns> Collection viewer that extends the <see cref="abstractAggregationViewer"/> class. </returns>
        public static abstractAggregationViewer Get_Viewer(Search_Type_Enum SearchType, RequestCache RequestSpecificValues, AggregationViewBag ViewBag)
        {
            switch (SearchType)
            {
            case Search_Type_Enum.Advanced:
                if (ViewBag.Hierarchy_Object.Views_And_Searches.Contains(Item_Aggregation_Views_Searches_Enum.Advanced_Search_YearRange))
                {
                    return(new Advanced_Search_YearRange_AggregationViewer(RequestSpecificValues, ViewBag));
                }
                if (ViewBag.Hierarchy_Object.Views_And_Searches.Contains(Item_Aggregation_Views_Searches_Enum.Advanced_Search_MimeType))
                {
                    return(new Advanced_Search_MimeType_AggregationViewer(RequestSpecificValues, ViewBag));
                }
                return(new Advanced_Search_AggregationViewer(RequestSpecificValues, ViewBag));

            case Search_Type_Enum.Basic:
                Item_Aggregation_Front_Banner frontBannerImage = ViewBag.Hierarchy_Object.FrontBannerObj;
                if ((frontBannerImage != null) && (ViewBag.Hierarchy_Object.Highlights != null) && (ViewBag.Hierarchy_Object.Highlights.Count > 0))
                {
                    return(new Rotating_Highlight_Search_AggregationViewer(RequestSpecificValues, ViewBag));
                }
                return(new Basic_Search_AggregationViewer(RequestSpecificValues, ViewBag));

            case Search_Type_Enum.Full_Text:
                return(new Full_Text_Search_AggregationViewer(RequestSpecificValues, ViewBag));

            case Search_Type_Enum.Newspaper:
                return(new Newspaper_Search_AggregationViewer(RequestSpecificValues, ViewBag));

            case Search_Type_Enum.Map:
                return(new Map_Search_AggregationViewer(RequestSpecificValues, ViewBag));

            case Search_Type_Enum.Map_Beta:
                return(new Map_Search_AggregationViewer_Beta(RequestSpecificValues, ViewBag));

            case Search_Type_Enum.dLOC_Full_Text:
                return(new dLOC_Search_AggregationViewer(RequestSpecificValues, ViewBag));

            default:
                return(null);
            }
        }
        /// <summary> Returns a built collection viewer matching request </summary>
        /// <param name="SearchType"> Type of search from the current http request </param>
        /// <param name="Current_Aggregation"> Current item aggregation object </param>
        /// <param name="Current_Mode"> Mode / navigation information for the current request </param>
        /// <param name="Current_User"> Currently logged on user, if there is one </param>
        /// <returns> Collection viewer that extends the <see cref="abstractAggregationViewer"/> class. </returns>
        public static abstractAggregationViewer Get_Viewer(Search_Type_Enum SearchType, Item_Aggregation Current_Aggregation, SobekCM_Navigation_Object Current_Mode, User_Object Current_User)
        {
            switch (SearchType)
            {
            case Search_Type_Enum.Advanced:
                if (Current_Aggregation.Views_And_Searches.Contains(Item_Aggregation.CollectionViewsAndSearchesEnum.Advanced_Search_YearRange))
                {
                    return(new Advanced_Search_YearRange_AggregationViewer(Current_Aggregation, Current_Mode));
                }
                return(new Advanced_Search_AggregationViewer(Current_Aggregation, Current_Mode));

            case Search_Type_Enum.Basic:
                Item_Aggregation_Front_Banner frontBannerImage = Current_Aggregation.Front_Banner_Image(Current_Mode.Language);
                if ((frontBannerImage != null) && (Current_Aggregation.Highlights.Count > 0))
                {
                    return(new Rotating_Highlight_Search_AggregationViewer(Current_Aggregation, Current_Mode));
                }
                return(new Basic_Search_AggregationViewer(Current_Aggregation, Current_Mode));

            case Search_Type_Enum.Full_Text:
                return(new Full_Text_Search_AggregationViewer(Current_Aggregation, Current_Mode));

            case Search_Type_Enum.Newspaper:
                return(new Newspaper_Search_AggregationViewer(Current_Aggregation, Current_Mode));

            case Search_Type_Enum.Map:
                return(new Map_Search_AggregationViewer(Current_Aggregation, Current_Mode));

            case Search_Type_Enum.Map_Beta:
                return(new Map_Search_AggregationViewer_Beta(Current_Aggregation, Current_Mode));

            case Search_Type_Enum.dLOC_Full_Text:
                return(new dLOC_Search_AggregationViewer(Current_Aggregation, Current_Mode));

            default:
                return(null);
            }
        }
        private static void read_banners(XmlNodeReader NodeReader, Complete_Item_Aggregation HierarchyObject)
        {
            while (NodeReader.Read())
            {
                // If this is the beginning tag for an element, assign the next values accordingly
                if (NodeReader.NodeType == XmlNodeType.Element)
                {
                    // Get the node name, trimmed and to upper
                    string nodeName = NodeReader.Name.Trim().ToUpper();

                    // switch the rest based on the tag name
                    switch (nodeName)
                    {
                    case "HI:SOURCE":
                        // Check for any attributes to this banner node
                        string lang    = String.Empty;
                        bool   special = false;
                        Item_Aggregation_Front_Banner_Type_Enum type = Item_Aggregation_Front_Banner_Type_Enum.Left;
                        ushort width  = 550;
                        ushort height = 230;

                        if (NodeReader.HasAttributes)
                        {
                            if (NodeReader.MoveToAttribute("lang"))
                            {
                                lang = NodeReader.Value.Trim().ToUpper();
                            }
                            if (NodeReader.MoveToAttribute("type"))
                            {
                                if ((NodeReader.Value.Trim().ToUpper() == "HIGHLIGHT") || (NodeReader.Value.Trim().ToUpper() == "FRONT"))
                                {
                                    special = true;
                                }
                            }
                            if (NodeReader.MoveToAttribute("side"))
                            {
                                switch (NodeReader.Value.Trim().ToUpper())
                                {
                                case "RIGHT":
                                    type = Item_Aggregation_Front_Banner_Type_Enum.Right;
                                    break;

                                case "LEFT":
                                    type = Item_Aggregation_Front_Banner_Type_Enum.Left;
                                    break;

                                case "FULL":
                                    type = Item_Aggregation_Front_Banner_Type_Enum.Full;
                                    break;
                                }
                            }
                            if (NodeReader.MoveToAttribute("width"))
                            {
                                ushort.TryParse(NodeReader.Value, out width);
                            }
                            if (NodeReader.MoveToAttribute("height"))
                            {
                                ushort.TryParse(NodeReader.Value, out height);
                            }
                        }

                        // Now read the banner information and add to the aggregation object
                        NodeReader.Read();
                        if (special)
                        {
                            Item_Aggregation_Front_Banner bannerObj = HierarchyObject.Add_Front_Banner_Image(NodeReader.Value, Web_Language_Enum_Converter.Code_To_Enum(lang));
                            bannerObj.Width  = width;
                            bannerObj.Height = height;
                            bannerObj.Type   = type;
                        }
                        else
                        {
                            HierarchyObject.Add_Banner_Image(NodeReader.Value, Web_Language_Enum_Converter.Code_To_Enum(lang));
                        }


                        break;
                    }
                }

                if ((NodeReader.NodeType == XmlNodeType.EndElement) && (NodeReader.Name.Trim().ToUpper() == "HI:BANNER"))
                {
                    return;
                }
            }
        }
        /// <summary> Returns a built collection viewer matching request </summary>
        /// <param name="ViewType"> Aggregation view type </param>
        /// <param name="RequestSpecificValues"> All the necessary, non-global data specific to the current request </param>
        /// <param name="ViewBag"> View bag holds specific data that was pulled for an aggregation request </param>
        /// <returns> Collection viewer that extends the <see cref="abstractAggregationViewer"/> class. </returns>
        public static abstractAggregationViewer Get_Viewer(Item_Aggregation_Views_Searches_Enum ViewType, RequestCache RequestSpecificValues, AggregationViewBag ViewBag)
        {
            switch (ViewType)
            {
            case Item_Aggregation_Views_Searches_Enum.Advanced_Search:
                return(new Advanced_Search_AggregationViewer(RequestSpecificValues, ViewBag));

            case Item_Aggregation_Views_Searches_Enum.Advanced_Search_MimeType:
                return(new Advanced_Search_MimeType_AggregationViewer(RequestSpecificValues, ViewBag));

            case Item_Aggregation_Views_Searches_Enum.Advanced_Search_YearRange:
                return(new Advanced_Search_YearRange_AggregationViewer(RequestSpecificValues, ViewBag));


            case Item_Aggregation_Views_Searches_Enum.Basic_Search:
                Item_Aggregation_Front_Banner frontBannerImage = ViewBag.Hierarchy_Object.FrontBannerObj;
                if ((frontBannerImage != null) && (ViewBag.Hierarchy_Object.Highlights != null) && (ViewBag.Hierarchy_Object.Highlights.Count > 0))
                {
                    return(new Rotating_Highlight_Search_AggregationViewer(RequestSpecificValues, ViewBag));
                }
                return(new Basic_Search_AggregationViewer(RequestSpecificValues, ViewBag));

            case Item_Aggregation_Views_Searches_Enum.Basic_Search_YearRange:
                return(new Basic_Search_YearRange_AggregationViewer(RequestSpecificValues, ViewBag));

            case Item_Aggregation_Views_Searches_Enum.Basic_Search_FullTextOption:
                return(new Basic_Text_Search_Combined_AggregationViewer(RequestSpecificValues, ViewBag));

            case Item_Aggregation_Views_Searches_Enum.Basic_Search_MimeType:
                Item_Aggregation_Front_Banner frontBannerImage2 = ViewBag.Hierarchy_Object.FrontBannerObj;
                if ((frontBannerImage2 != null) && (ViewBag.Hierarchy_Object.Highlights != null) && (ViewBag.Hierarchy_Object.Highlights.Count > 0))
                {
                    return(new Rotating_Highlight_MimeType_AggregationViewer(RequestSpecificValues, ViewBag));
                }
                return(new Basic_Search_MimeType_AggregationViewer(RequestSpecificValues, ViewBag));

            case Item_Aggregation_Views_Searches_Enum.FullText_Search:
                return(new Full_Text_Search_AggregationViewer(RequestSpecificValues, ViewBag));

            case Item_Aggregation_Views_Searches_Enum.No_Home_Search:
                return(new No_Search_AggregationViewer(RequestSpecificValues, ViewBag));

            case Item_Aggregation_Views_Searches_Enum.Newspaper_Search:
                return(new Newspaper_Search_AggregationViewer(RequestSpecificValues, ViewBag));

            case Item_Aggregation_Views_Searches_Enum.Map_Search:
                return(new Map_Search_AggregationViewer(RequestSpecificValues, ViewBag));

            case Item_Aggregation_Views_Searches_Enum.Map_Search_Beta:
                return(new Map_Search_AggregationViewer_Beta(RequestSpecificValues, ViewBag));

            case Item_Aggregation_Views_Searches_Enum.DLOC_FullText_Search:
                return(new dLOC_Search_AggregationViewer(RequestSpecificValues, ViewBag));

            case Item_Aggregation_Views_Searches_Enum.Empty:
                return(new Empty_AggregationViewer(RequestSpecificValues, ViewBag));


            default:
                return(null);
            }
        }