/// <summary>
        /// get pagewise blog teasers based on the filters like category & tag
        /// </summary>
        /// <param name="selectedPage"></param>
        /// <param name="categoryID"></param>
        /// <param name="tagID"></param>
        /// <param name="blogArchivePageItemID"></param>
        /// <param name="totalPages"></param>
        /// <returns></returns>
        private List <Blog> GetBlogTeasersByFilters(int selectedPage, string categoryID, string tagID, string blogArchivePageItemID, out int totalPages)
        {
            List <Item> blogPageItems = new List <Item>();
            List <Blog> blogsByPage   = new List <Blog>();

            totalPages = 1;
            Item blogArchivePageItem = !string.IsNullOrEmpty(blogArchivePageItemID) ? SitecoreUtility.GetItem(new ID(blogArchivePageItemID)) : null;

            if (blogArchivePageItem != null && blogArchivePageItem.HasChildren)
            {
                blogPageItems = SitecoreUtility.GetItemsByTemplate(blogArchivePageItem, References.Templates.BlogPage.ID)
                                .Where(x => x.Fields[References.Templates.Blog.Fields.IsActive].Value == "1").ToList();

                if (blogPageItems != null && blogPageItems.Count > 0)
                {
                    int maxTeasersPerPage = Constants.MaxBlogTeasersPerPage;

                    if (!string.IsNullOrEmpty(categoryID))
                    {
                        Item categoryItem = SitecoreUtility.GetItem(new ID(categoryID));

                        if (categoryItem != null && categoryItem.Fields[References.Templates.BlogCategory.Fields.IsActive].Value == "1")
                        {
                            blogPageItems = blogPageItems.Where(x => x.Fields[References.Templates.Blog.Fields.BlogCategories].Value.Contains(categoryID)).ToList();
                        }
                    }
                    else if (!string.IsNullOrEmpty(tagID))
                    {
                        Item tagItem = SitecoreUtility.GetItem(new ID(tagID));

                        if (tagItem != null && tagItem.Fields[References.Templates.BlogTag.Fields.IsActive].Value == "1")
                        {
                            blogPageItems = blogPageItems.Where(x => x.Fields[References.Templates.Blog.Fields.BlogTags].Value.Contains(tagID)).ToList();
                        }
                    }

                    if (blogPageItems != null && blogPageItems.Count > 0)
                    {
                        foreach (Item item in blogPageItems)
                        {
                            blogsByPage.Add(new Blog(item));
                        }
                    }

                    if (blogsByPage != null && blogsByPage.Count > 0)
                    {
                        blogsByPage = blogsByPage.OrderByDescending(x => x.PostedDateTime).ToList();
                        blogsByPage = SitecoreUtility.GetPagewiseRecords <Blog>(blogsByPage, maxTeasersPerPage, selectedPage, out totalPages);
                    }
                }
            }

            return(blogsByPage);
        }
        public ActionResult RenderCourseTeasersCarousel()
        {
            CourseTeasersCarouselSource viewModel = null;

            try
            {
                //get the datasource item assigned to the rendering
                Item renderingDatasourceItem = SitecoreUtility.GetRenderingDatasourceItem();

                if (renderingDatasourceItem != null && renderingDatasourceItem.TemplateID == References.Templates.CourseTeasersCarouselSource.ID)
                {
                    viewModel = new CourseTeasersCarouselSource(renderingDatasourceItem);

                    if (viewModel.IsActive)
                    {
                        Item courseArchivePageItem = SitecoreUtility.GetItem(new ID(viewModel.CourseArchivePageID));

                        if (courseArchivePageItem != null)
                        {
                            //get all the active course items
                            List <Item> coursePageItems = SitecoreUtility.GetItemsByTemplate(courseArchivePageItem, References.Templates.CourseDetailsPage.ID)
                                                          .Where(x => x.Fields[References.Templates.CourseDetails.Fields.IsActive].Value == "1").ToList();

                            if (coursePageItems != null && coursePageItems.Count > 0)
                            {
                                viewModel.CourseTeasers = new List <CourseDetails>();

                                foreach (Item item in coursePageItems)
                                {
                                    CourseDetails courseDetails = new CourseDetails(item);
                                    courseDetails.Instructor = GetInstructor(courseDetails.SelectedInstructorItemID);
                                    viewModel.CourseTeasers.Add(courseDetails);
                                }
                            }
                        }
                    }
                    else
                    {
                        viewModel = null;
                    }
                }
            }
            catch (System.Exception ex)
            {
                LogManager.SaveLog(System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name, ex, LogManager.LogTypes.Error, string.Empty);
            }

            return(View(GlobalConstants.SUBLAYOUTS_PATH + "PageContent/CourseTeasersCarousel.cshtml", viewModel));
        }
        /// <summary>
        /// gets courses by page
        /// </summary>
        /// <param name="parentItem">If its first page, parent item should be passed. All its child pages will be verified.</param>
        /// <param name="pageNumber">1 is for first page, 2 is for next page & 0 is for previous page</param>
        /// <param name="referenceCourseItemID">the course item id of the first or last course teaser on page</param>
        /// <returns></returns>
        private List <CourseDetails> GetCoursesByPage(string coursesRootItemID, string pageNumber, string referenceCourseItemIDs, out bool showPrevButton, out bool showNextButton)
        {
            showPrevButton = false;
            showNextButton = false;
            List <CourseDetails> lstCourses    = new List <CourseDetails>();
            List <Item>          featuredItems = new List <Item>();
            int maxTeasersPerPage = Constants.MaxCourseTeasersPerPage;
            int itemsInList       = 0;

            if (pageNumber == "1" && !string.IsNullOrEmpty(coursesRootItemID))
            {
                Item coursesRootItem = SitecoreUtility.GetItem(new ID(coursesRootItemID));

                //get the list of courses for first page
                featuredItems = coursesRootItem != null?SitecoreUtility.GetItemsByTemplate(coursesRootItem, References.Templates.CourseDetailsPage.ID) : null;

                if (featuredItems != null && featuredItems.Count > 0)
                {
                    foreach (Item featuredItem in featuredItems)
                    {
                        if (itemsInList < maxTeasersPerPage)
                        {
                            CourseDetails courseDetailsItem = new CourseDetails(featuredItem);

                            if (courseDetailsItem != null && courseDetailsItem.IsActive)
                            {
                                courseDetailsItem.Instructor = GetInstructor(courseDetailsItem.SelectedInstructorItemID);
                                lstCourses.Add(courseDetailsItem);
                                itemsInList++;
                            }
                        }
                    }
                }
            }
            else if (!string.IsNullOrEmpty(referenceCourseItemIDs))
            {
                string[] arrItemIDs = referenceCourseItemIDs.Split(',');

                if (arrItemIDs != null && arrItemIDs.Length > 0)
                {
                    Item referenceCourseItemFirst = !string.IsNullOrEmpty(arrItemIDs[0]) ? SitecoreUtility.GetItem(new ID(arrItemIDs[0])) : null;
                    Item referenceCourseItemLast  = arrItemIDs.Length > 1 && !string.IsNullOrEmpty(arrItemIDs[1]) ? SitecoreUtility.GetItem(new ID(arrItemIDs[1])) : null;
                    Item siblingCourseItem        = null;

                    while (itemsInList < maxTeasersPerPage)
                    {
                        if (pageNumber == "0")
                        {
                            //get previous page items
                            siblingCourseItem = referenceCourseItemFirst != null?SitecoreUtility.GetPreceedingSiblingItemByTemplate(referenceCourseItemFirst, References.Templates.CourseDetailsPage.ID, References.Templates.CourseDetails.Fields.IsActive) : null;
                        }
                        else if (pageNumber == "2")
                        {
                            //get next page items
                            siblingCourseItem = referenceCourseItemLast != null?SitecoreUtility.GetSucceedingSiblingItemByTemplate(referenceCourseItemLast, References.Templates.CourseDetailsPage.ID, References.Templates.CourseDetails.Fields.IsActive) : null;
                        }

                        if (siblingCourseItem != null)
                        {
                            referenceCourseItemFirst = siblingCourseItem;
                            referenceCourseItemLast  = siblingCourseItem;
                            CourseDetails courseDetailsItem = new CourseDetails(siblingCourseItem);

                            if (courseDetailsItem != null && courseDetailsItem.IsActive)
                            {
                                courseDetailsItem.Instructor = GetInstructor(courseDetailsItem.SelectedInstructorItemID);
                                lstCourses.Add(courseDetailsItem);
                                itemsInList++;
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }

            if (lstCourses != null && lstCourses.Count > 0)
            {
                //If the 'Previous' button was clicked, then the sibling items are added with the first item in page as reference.
                //so this list should be reversed ideally.
                if (lstCourses.Count > 1 && pageNumber == "0")
                {
                    lstCourses.Reverse();
                }

                showPrevButton = SitecoreUtility.GetPreceedingSiblingItemByTemplate(lstCourses.FirstOrDefault().InnerItem, References.Templates.CourseDetailsPage.ID, References.Templates.CourseDetails.Fields.IsActive) != null;
                showNextButton = SitecoreUtility.GetSucceedingSiblingItemByTemplate(lstCourses.LastOrDefault().InnerItem, References.Templates.CourseDetailsPage.ID, References.Templates.CourseDetails.Fields.IsActive) != null;
            }

            return(lstCourses);
        }
        public ActionResult RenderTagsOrCategoriesSidebarFilter()
        {
            TagsOrCategoriesSidebarFilter viewModel = null;

            try
            {
                string blogArchivePageItemID = SitecoreUtility.GetRenderingParameters(References.Templates.TagsOrCategoriesSidebarFilter.ID, References.Templates.TagsOrCategoriesSidebarFilter.Fields.BlogArchivePage);

                if (!string.IsNullOrEmpty(blogArchivePageItemID))
                {
                    Item blogArchivePageItem = SitecoreUtility.GetItem(new ID(blogArchivePageItemID));

                    if (blogArchivePageItem != null)
                    {
                        viewModel = new TagsOrCategoriesSidebarFilter();
                        viewModel.SectionTitle       = SitecoreUtility.GetRenderingParameters(References.Templates.TagsOrCategoriesSidebarFilter.ID, References.Templates.TagsOrCategoriesSidebarFilter.Fields.SectionTitle);
                        viewModel.DisplayItemsAsTags = SitecoreUtility.GetRenderingParameters(References.Templates.TagsOrCategoriesSidebarFilter.ID, References.Templates.TagsOrCategoriesSidebarFilter.Fields.DisplayItemsAsTags) == "1";
                        viewModel.BlogArchivePageURL = SitecoreUtility.GetItemURL(blogArchivePageItem);

                        if (!viewModel.DisplayItemsAsTags)
                        {
                            List <BlogCategory> categoriesUsedByBlogs = new List <BlogCategory>();
                            Item blogCategoriesFolderItem             = SitecoreUtility.GetItem(References.Content.BlogCategoriesFolder);

                            if (blogCategoriesFolderItem != null && blogCategoriesFolderItem.HasChildren)
                            {
                                List <Item> activeCategories = SitecoreUtility.GetItemsByTemplate(blogCategoriesFolderItem, References.Templates.BlogCategory.ID)
                                                               .Where(x => x.Fields[References.Templates.BlogCategory.Fields.IsActive].Value == "1").ToList();

                                if (activeCategories != null && activeCategories.Count > 0)
                                {
                                    foreach (Item category in activeCategories)
                                    {
                                        if (SitecoreUtility.HasReferrers(category, References.Templates.BlogPage.ID, References.Templates.Blog.Fields.IsActive))
                                        {
                                            BlogCategory blogCategory = new BlogCategory(category);
                                            categoriesUsedByBlogs.Add(blogCategory);
                                        }
                                    }

                                    viewModel.BlogCategories = categoriesUsedByBlogs;
                                }
                            }
                        }
                        else
                        {
                            List <BlogTag> tagsUsedByBlogs    = new List <BlogTag>();
                            Item           blogTagsFolderItem = SitecoreUtility.GetItem(References.Content.BlogTagsFolder);

                            if (blogTagsFolderItem != null && blogTagsFolderItem.HasChildren)
                            {
                                List <Item> activeTags = SitecoreUtility.GetItemsByTemplate(blogTagsFolderItem, References.Templates.BlogTag.ID)
                                                         .Where(x => x.Fields[References.Templates.BlogTag.Fields.IsActive].Value == "1").ToList();

                                if (activeTags != null && activeTags.Count > 0)
                                {
                                    foreach (Item tag in activeTags)
                                    {
                                        if (SitecoreUtility.HasReferrers(tag, References.Templates.BlogPage.ID, References.Templates.Blog.Fields.IsActive))
                                        {
                                            BlogTag blogTag = new BlogTag(tag);
                                            tagsUsedByBlogs.Add(blogTag);
                                        }
                                    }

                                    viewModel.BlogTags = tagsUsedByBlogs;
                                }
                            }
                        }
                    }
                }
            }
            catch (System.Exception ex)
            {
                LogManager.SaveLog(System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name, ex, LogManager.LogTypes.Error, string.Empty);
            }

            return(View(GlobalConstants.SUBLAYOUTS_PATH + "PageContent/TagsOrCategoriesSidebarFilter.cshtml", viewModel));
        }