public ActionResult Index(int id = 0, int sortingOrder = 0)
        {
            ViewBag.SortingOrder = sortingOrder;
            if (id == 0)
            {
                var efRootCategories = _categoryRepository.GetRootCategoriesWithSubs();

                var modelRootCategories = AllCategoriesViewModel.ToModelEnumerable(efRootCategories);

                ViewBag.MetaTitle = "Категории";
                return(View("ViewRootCategories", modelRootCategories));
            }
            SearchParamsCategory searchParamsCategory;

            var curCookieName = this.HttpContext.Request.Cookies.AllKeys.FirstOrDefault(i => i == "category_" + id.ToString());

            var curCookie = this.HttpContext.Request.Cookies.Get(curCookieName);
            CategoryViewModel viewModel;

            if (curCookie != null)
            {
                var jsonObj = JsonConvert.DeserializeObject <CategoryFiltersJsonModel>(curCookie.Value);

                var checkedEnumValueIds = new List <int>();
                var filterSearchModel   = new List <FilterSearchModel>();
                foreach (var item in jsonObj.Filters)
                {
                    filterSearchModel.Add(new FilterSearchModel()
                    {
                        Id            = item.Id,
                        EventValueIds = item.EnumValueIds,
                    });
                    checkedEnumValueIds.AddRange(item.EnumValueIds);
                }
                searchParamsCategory = new SearchParamsCategory(null, id, (int)jsonObj.MaxPrice, (int)jsonObj.MinPrice, filterSearchModel);

                viewModel = CategoryViewModel.ToModel(_categoryRepository.GetBySearchParams(searchParamsCategory));
                viewModel.CurrentMaxPrice = (int)jsonObj.MaxPrice;
                viewModel.CurrentMinPrice = (int)jsonObj.MinPrice;

                foreach (var item in viewModel.Filters)
                {
                    foreach (var enumVal in item.EnumValues)
                    {
                        if (checkedEnumValueIds.Contains(enumVal.Id))
                        {
                            enumVal.Checked = true;
                        }
                    }
                }
            }
            else
            {
                searchParamsCategory = new SearchParamsCategory(id)
                {
                    IsSearchOnlyPublicProduct = true
                };
                var t = _categoryRepository.GetBySearchParams(searchParamsCategory);
                viewModel = CategoryViewModel.ToModel(t);
            }
            //var productsEnumValues = new List<int>();
            //foreach (var item in viewModel.Products)
            //{
            //    productsEnumValues.AddRange(item.EnumValues.Select(s => s.Id));
            //}
            foreach (var item in viewModel.Filters)
            {
                item.EnumValues = (item.EnumValues).Where(w => searchParamsCategory.OutEnumValueIds.Contains(w.Id)).OrderBy(o => o, new Tools.Compare.CompareCategoryEnumValueViewModel()).ToList();
            }
            viewModel.ExistProducts = searchParamsCategory.ExistProductsInBd;
            if (sortingOrder != 0)
            {
                switch (sortingOrder)
                {
                case (int)Common.TypeSort.Price:
                    viewModel.Products.Sort(new Tools.Compare.ProductCompareByPrice());
                    break;

                case (int)Common.TypeSort.Name:
                    viewModel.Products.Sort(new Tools.Compare.ProductCompareByTitle());
                    break;

                case (int)Common.TypeSort.Popular:
                    viewModel.Products.Sort(new Tools.Compare.ProductCompareByPopular());
                    break;

                default:
                    break;
                }
            }

            var tmpBreadCrumbs = _categoryRepository.GetBreadCrumbs(id);

            if (tmpBreadCrumbs.Count() == 2)
            {
                foreach (var item in tmpBreadCrumbs)
                {
                    var tmpIndx = item.FriendlyUrl.LastIndexOf('/');
                    if (tmpIndx != 0)
                    {
                        item.FriendlyUrl = item.FriendlyUrl.Substring(0, tmpIndx);
                    }
                    break;
                }
            }

            ViewBag.BredCrumbs = tmpBreadCrumbs;

            viewModel.NestedCategories = _categoryRepository.GetNestedCategories(id).Select(s => CategoryShortViewModel.ToModel(s)).ToList();
            viewModel.MaxPrice         = _categoryRepository.GetMaxPriceFromCategory(id);
            viewModel.MinPrice         = _categoryRepository.GetMinPriceFromCategory(id);
            ViewBag.MetaTitle          = viewModel.Seo != null ? viewModel.Seo.MetaTitle : viewModel.Title;
            ViewBag.Keywords           = viewModel.Seo != null ? viewModel.Seo.MetaKeywords : null;
            ViewBag.Description        = viewModel.Seo != null ? viewModel.Seo.MetaDescription : null;

            bool WillBeAddedFlag = viewModel.Products.Any(i => i.TypeStatusProduct == Common.TypeStatusProduct.WillBeAdded);

            ViewBag.WillBeAddedFlag = WillBeAddedFlag;
            if (WillBeAddedFlag)
            {
                ViewBag.WillBeAddedFlagText = _globalRepository.Get("footnote");
            }
            return(View(viewModel));
        }
        public ActionResult Index(CategoryViewModel model, int sortingOrder = 0)
        {
            CategoryFiltersJsonModel cookieModel = CategoryFiltersJsonModel.ConvertToJsonModel(model);

            var jsonObj = JsonConvert.SerializeObject(cookieModel);

            HttpCookie cookie = new HttpCookie("category_" + cookieModel.CategoryId, jsonObj);

            cookie.Expires = DateTime.Now.AddDays(10);

            this.HttpContext.Response.Cookies.Add(cookie);
            //var obj = JsonConvert.DeserializeObject<CategoryViewModel>(cookie.Value);

            ViewBag.SortingOrder = sortingOrder;

            var max = model.CurrentMaxPrice;
            var min = model.CurrentMinPrice;

            var Filters = model.Filters.Where(i => i.EnumValues.Any(t => t.Checked == true) && i.EnumValues.Count > 0).ToList();
            //var checkedEnumValueIds = new List<int>();
            var filterSearchModel = new List <FilterSearchModel>();

            foreach (var item in Filters)
            {
                filterSearchModel.Add(new FilterSearchModel()
                {
                    Id            = item.Id,
                    Title         = item.Title,
                    EventValueIds = item.EnumValues.Where(i => i.Checked).Select(i => i.Id)
                });

                //checkedEnumValueIds.AddRange(item.EnumValues.Where(t => t.Checked == true).Select(s => s.Id));
            }

            SearchParamsCategory searchParamsCategory = new SearchParamsCategory(null, model.Id, model.CurrentMaxPrice, model.CurrentMinPrice, filterSearchModel);
            var viewModel = CategoryViewModel.ToModel(_categoryRepository.GetBySearchParams(searchParamsCategory));

            viewModel.ExistProducts = searchParamsCategory.ExistProductsInBd;
            foreach (var item in viewModel.Filters)
            {
                item.EnumValues = (item.EnumValues).Where(w => searchParamsCategory.OutEnumValueIds.Contains(w.Id)).ToList();
            }
            if (sortingOrder != 0)
            {
                switch (sortingOrder)
                {
                case (int)Common.TypeSort.Price:
                    viewModel.Products.Sort(new Tools.Compare.ProductCompareByPrice());
                    break;

                case (int)Common.TypeSort.Name:
                    viewModel.Products.Sort(new Tools.Compare.ProductCompareByTitle());
                    break;

                case (int)Common.TypeSort.Popular:
                    viewModel.Products.Sort(new Tools.Compare.ProductCompareByPopular());
                    break;

                default:
                    break;
                }
            }
            ViewBag.BredCrumbs  = _categoryRepository.GetBreadCrumbs(model.Id);
            ViewBag.MetaTitle   = viewModel.Seo != null ? viewModel.Seo.MetaTitle : viewModel.Title;
            ViewBag.Keywords    = viewModel.Seo != null ? viewModel.Seo.MetaKeywords : null;
            ViewBag.Description = viewModel.Seo != null ? viewModel.Seo.MetaDescription : null;

            viewModel.MaxPrice        = _categoryRepository.GetMaxPriceFromCategory(model.Id);
            viewModel.MinPrice        = _categoryRepository.GetMinPriceFromCategory(model.Id);
            viewModel.CurrentMaxPrice = max;
            viewModel.CurrentMinPrice = min;
            bool WillBeAddedFlag = viewModel.Products.Any(i => i.TypeStatusProduct == Common.TypeStatusProduct.WillBeAdded);

            ViewBag.WillBeAddedFlag = WillBeAddedFlag;
            if (WillBeAddedFlag)
            {
                ViewBag.WillBeAddedFlagText = _globalRepository.Get("footnote");
            }
            return(View(viewModel));
        }