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));
        }