/// <summary>
        /// 
        /// </summary>
        /// <param name="pkgType"></param>
        /// <param name="page"></param>
        /// <param name="sortOrder"></param>
        /// <param name="searchVal"></param>
        /// <returns></returns>
        public static IQueryable<PublishedPackage> GetPackages(string pkgType, int page = 1, OrderType sortOrder = OrderType.Newest, string searchVal = "")
        {
            var srs = new PackagingSource {FeedUrl = _feedUrl};

            //TODO: add setting for gallery page size
            var pageSize = BlogSettings.Instance.PostsPerPage;
            var cnt = 0;

            try
            {
                var retPackages = new List<PublishedPackage>();
                var pkgList = GetPublishedPackages(srs);

                foreach (var pkg in pkgList.ToList())
                {
                    if(pkgType != "all"){
                        if (pkg.PackageType != pkgType) continue;
                    }

                    if (!pkg.IsLatestVersion) continue;

                    // for themes, get screenshot isetead of icon
                    // also get screenshot if icon is missing for package
                    if ((pkg.PackageType == "Theme" || string.IsNullOrEmpty(pkg.IconUrl)) && pkg.Screenshots != null && pkg.Screenshots.Count > 0)
                        pkg.IconUrl = pkg.Screenshots[0].ScreenshotUri;

                    // if both icon and screenshot missing, get default image for package type
                    if(string.IsNullOrEmpty(pkg.IconUrl))
                    {
                        switch (pkg.PackageType)
                        {
                            case "Theme":
                                pkg.IconUrl =
                                    "http://dnbegallery.org/cms/Themes/OrchardGallery/Content/Images/themeDefaultIcon.png";
                                break;
                            case "Extension":
                                pkg.IconUrl =
                                    "http://dnbegallery.org/cms/Themes/OrchardGallery/Content/Images/extensionDefaultIcon.png";
                                break;
                            case "Widget":
                                pkg.IconUrl =
                                    "http://dnbegallery.org/cms/Themes/OrchardGallery/Content/Images/widgetDefaultIcon.png";
                                break;
                        }
                    }

                    if (!string.IsNullOrEmpty(pkg.IconUrl) && !pkg.IconUrl.StartsWith("http:"))
                        pkg.IconUrl = "http://dnbegallery.org" + pkg.IconUrl;

                    if(string.IsNullOrEmpty(searchVal))
                    {
                        retPackages.Add(pkg);
                        cnt++;
                    }
                    else
                    {
                        if(pkg.Title.IndexOf(searchVal, StringComparison.OrdinalIgnoreCase) != -1
                           || pkg.Description.IndexOf(searchVal, StringComparison.OrdinalIgnoreCase) != -1
                           || (!string.IsNullOrWhiteSpace(pkg.Tags) && pkg.Tags.IndexOf(searchVal, StringComparison.OrdinalIgnoreCase) != -1))
                        {
                            retPackages.Add(pkg);
                            cnt++;
                        }
                    }
                }

                GalleryPager = new Pager(page, cnt);

                if (cnt > 0)
                {
                    switch (sortOrder)
                    {
                        case OrderType.Downloads:
                            retPackages = retPackages
                                .OrderByDescending(p => p.DownloadCount).ThenBy(p => p.Title)
                                .Skip((page - 1) * pageSize).Take(pageSize).ToList();
                            break;
                        case OrderType.Rating:
                            retPackages = retPackages
                                .OrderByDescending(p => p.Rating).ThenBy(p => p.Title)
                                .Skip((page - 1) * pageSize).Take(pageSize).ToList();
                            break;
                        case OrderType.Newest:
                            retPackages = retPackages
                                .OrderByDescending(p => p.LastUpdated).ThenBy(p => p.Title)
                                .Skip((page - 1) * pageSize).Take(pageSize).ToList();
                            break;
                        case OrderType.Alphanumeric:
                            retPackages = retPackages.OrderBy(p => p.Title)
                                .Skip((page - 1) * pageSize).Take(pageSize).ToList();
                            break;
                    }
                }
                return retPackages.AsQueryable();
            }
            catch (Exception)
            {
                GalleryPager = null;
                return null;
            }
        }