public productAddResult addProductBasket(int productId, int userId, string guestCode, string optionValueList)
        {
            productShared pc = new productShared(db);

            var productItem = db.tbl_product.Include("tbl_stock").Include("tbl_productCritear.tbl_critear").Where(a => a.productId == productId).FirstOrDefault();

            if (!productItem.statu)
            {
                return productAddResult.statuError;
            }

            var optionList = pc.getOptionListByProductItem(productItem);

            if (optionList != null && optionList.Count > 0 && string.IsNullOrWhiteSpace(optionValueList))
            {
                return productAddResult.hasOption;
            }

            if (!productItem.tbl_stock.Any(a => a.stockCount > 0 && a.optionList == optionValueList))
            {
                return productAddResult.stockError;
            }

            var sameItemList = db.tbl_basket.Where(a => a.userId == userId && a.productId == productId).ToList().Where(a => a.guestCode == guestCode && a.optionList == optionValueList).FirstOrDefault();

            if (sameItemList != null)
            {
                var basketItemEdited = db.tbl_basket.Where(a => a.basketId == sameItemList.basketId).FirstOrDefault();
                basketItemEdited.quantity = basketItemEdited.quantity + 1;
                db.SaveChanges();
            }
            else
            {
                var basketItem = new tbl_basket();
                basketItem.createTime = DateTime.Now;
                basketItem.discountCode = null;
                basketItem.guestCode = guestCode;
                basketItem.optionList = optionValueList;
                basketItem.productId = productId;
                basketItem.userId = userId;
                basketItem.quantity = 1;

                db.tbl_basket.Add(basketItem);
                db.SaveChanges();
            }

            return productAddResult.added;
        }
        public List<searchResultItem> getSearchResultList(string searchWord)
        {
            List<searchResultItem> helperList = new List<searchResultItem>();

            productShared ps = new productShared(db);
            pageShared pas = new pageShared(db);

            //Regex regexItem = new Regex(pattern, RegexOptions.None);

            var currentCultureInfo = CultureInfo.CreateSpecificCulture(langCulture);
            var enCulture = CultureInfo.CreateSpecificCulture("en-US");

            string productUrl = "";
            var productPage = pas.getPageByType(pageType.productList, langId);

            if (productPage != null)
            {
                productUrl = productPage.url;
            }

            string searchText = "";

            #region Product

            // Search Product List
            var newProductList = db.tbl_product.Include("tbl_stock").Include("tbl_gallery").Include("tbl_carModelProduct.tbl_carModel.tbl_carBrand").Where(a => a.statu && a.tbl_stock.Any(b => b.stockCount > 0) && a.tbl_carModelProduct.Any(c => c.tbl_carModel != null) && a.tbl_carModelProduct.Any(c => c.tbl_carModel != null) && a.tbl_carModelProduct.Any(c => c.tbl_carModel.tbl_carBrand != null) && a.langId == langId).OrderByDescending(a => a.sequence).ToList();

            foreach (var item in newProductList)
            {
                searchText = item.name + item.detail + item.shortDescription + item.metaKeyword + item.metaDescription;
                searchText = generateSearchText(searchText, new CultureInfo[] { currentCultureInfo, enCulture });

                if (isMatchSearchWord(searchText, searchWord.ToLower(currentCultureInfo)))
                {
                    searchResultItem searchItem = new searchResultItem();

                    searchItem.objType = searchObjType.product;
                    searchItem.resultTitle = item.name;
                    searchItem.resultSubTitle = item.metaDescription;
                    searchItem.productItem = ps.getProductSummaryOneItem(productUrl, item, currentCultureInfo, langCode, "150", "100");
                    helperList.Add(searchItem);
                }
            }

            #endregion

            #region Brand

            var brandList = db.tbl_carBrand.Where(a => a.statu).ToList();

            foreach (var item in brandList)
            {
                searchText = item.name + item.metaDescription + item.metaKeyword;
                searchText = generateSearchText(searchText, new CultureInfo[] { currentCultureInfo, enCulture });

                if (isMatchSearchWord(searchText, searchWord.ToLower(currentCultureInfo)))
                {
                    searchResultItem searchItem = new searchResultItem();

                    searchItem.objType = searchObjType.brand;
                    searchItem.resultTitle = item.name;
                    searchItem.resultSubTitle = item.metaDescription;
                    searchItem.photo = "ImageShow/carBrand/" + item.photo + "/" + item.photoCoordinate + "/60/60/1";
                    searchItem.url = langCode + "/" + productUrl + "/" + item.url + ".html";

                    helperList.Add(searchItem);
                }
            }

            #endregion

            #region Model

            var modelList = db.tbl_carModel.Include("tbl_carBrand").Where(a => a.statu).ToList();

            foreach (var item in modelList)
            {
                searchText = item.name + item.metaDescription + item.metaKeyword;
                searchText = generateSearchText(searchText, new CultureInfo[] { currentCultureInfo, enCulture });

                if (isMatchSearchWord(searchText, searchWord.ToLower(currentCultureInfo)))
                {
                    searchResultItem searchItem = new searchResultItem();

                    searchItem.objType = searchObjType.model;
                    searchItem.resultTitle = item.name;
                    searchItem.resultSubTitle = item.metaDescription;
                    searchItem.photo = "ImageShow/carBrand/" + item.tbl_carBrand.photo + "/" + item.tbl_carBrand.photoCoordinate + "/60/60/1";
                    searchItem.url = langCode + "/" + productUrl + "/" + item.tbl_carBrand.url + "/" + item.url + ".html";

                    helperList.Add(searchItem);
                }
            }

            #endregion

            #region Page

            var pageList = db.tbl_page.Where(a => a.statu).ToList();

            foreach (var item in pageList)
            {
                searchText = item.name + item.detail + item.metaKeyword + item.metaDescription;
                searchText = generateSearchText(searchText, new CultureInfo[] { currentCultureInfo, enCulture });

                if (isMatchSearchWord(searchText, searchWord.ToLower(currentCultureInfo)))
                {

                    switch ((pageType)item.pageTypeId)
                    {

                        case pageType.activation:

                            continue;

                        case pageType.resetPassword:

                            continue;

                        case pageType.search:

                            continue;

                        case pageType.yonlendirmeIcerik:

                            continue;

                        default:

                            var accountPageList = new pageType[] { pageType.accountDashboard, pageType.accountUserInfo, pageType.accountPassword, pageType.accountAddress, pageType.accountOrders, pageType.accountDiscount };

                            searchResultItem searchItem = new searchResultItem();

                            searchItem.resultTitle = item.name;
                            searchItem.resultSubTitle = item.metaDescription;
                            searchItem.objType = searchObjType.staticPage;

                            if (accountPageList.Contains((pageType)item.pageTypeId))
                            {
                                var accountPage = pas.getPageByType(pageType.account, langId);
                                searchItem.url = langCode + "/" + accountPage.url + "/" + item.url + ".html";
                            }
                            else
                            {
                                searchItem.url = langCode + "/" + item.url + ".html";
                            }

                            helperList.Add(searchItem);

                            break;
                    }
                }

            }

            #endregion

            return helperList;
        }
        public JsonResult SearchModal(string keyWord)
        {
            helperSearchModal helperItem = new helperSearchModal();
            pageShared ps = new pageShared(db);
            productShared pc = new productShared(db);

            var searchPage = ps.getPageByType(pageType.search, langId);
            helperItem.searchLink = Url.Content("~/") + langCode + "/" + searchPage.url + ".html?keyWord=" + keyWord;

            helperItem.searchList = getSearchResultList(keyWord);
            helperItem.totalSearch = helperItem.searchList.Count;

            helperItem.searchList = helperItem.searchList.Take(5).ToList();

            string isResultCome = "no";
            if (helperItem.totalSearch > 0)
            {
                isResultCome = "yes";
            }

            string htmlText = RenderRazorViewToString("SearchModal", helperItem);

            return Json(new { html = htmlText, keywordList = getSearchKeywordList(keyWord), isResultCome = isResultCome });
        }
        public ActionResult Index(int pageId)
        {
            if (Request.QueryString["keyWord"] == null)
            {
                return null;
            }

            string searchWord = Request.QueryString["keyWord"];

            helperSearch helperItem = new helperSearch();
            pageShared ps = new pageShared(db);
            productShared pc = new productShared(db);

            var searchPage = ps.getPageByType(pageType.search, langId);
            helperItem.searchLink = Url.Content("~/") + langCode + "/" + searchPage.url + ".html";

            var item = db.tbl_page.Include("tbl_category").Where(a => a.pageId == pageId).FirstOrDefault();

            if (item == null)
            {
                return null;
            }

            helperItem.breadCrumbItem = getBreadCrumbStaticPage(item.name);
            helperItem.setTitle(item.name);
            helperItem.detail = item.detail;

            //Title
            ps.pageTitleBind(item, helperItem, langId);

            //string pattern = getPatternBySearchWord(searchWord);
            helperItem.searchWord = searchWord;

            //helperItem.searchList = new List<searchResultItem>();
            helperItem.searchList = getSearchResultList(searchWord);

            if (helperItem.searchList.Count > 0)
            {
                helperItem.resultFound = string.Format(App_GlobalResources.lang.totalResultFound, helperItem.searchList.Count);
            }
            else
            {
                helperItem.resultFound = App_GlobalResources.lang.noResultFound;
            }

            int productCount = helperItem.searchList.Count;
            int currentPage = pc.getCurrentPage(Request, productCount, 10);
            helperItem.pagingItem = pc.getPageItem(productCount, currentPage, 10, "?keyWord=" + searchWord + "&sayfa=");
            helperItem.searchList = helperItem.searchList.Skip((currentPage - 1) * 10).Take(10).ToList();
            helperItem.searchKeyWordList = Newtonsoft.Json.JsonConvert.SerializeObject(getSearchKeywordList(searchWord));

            return View(helperItem);
        }
        public ActionResult BrandSelect(int carBrandId, string parentUrl, string parentName)
        {
            var helperPage = new helperBrandSelectProductList();

            var carBrand = db.tbl_carBrand.Include("tbl_carModel").Where(a => a.carBrandId == carBrandId).FirstOrDefault();

            helperPage.breadCrumbItem = getBrandSelectBreadCrumbProductList(parentName, parentUrl, carBrand.name);
            helperPage.header = carBrand.name;

            if (!string.IsNullOrEmpty(carBrand.title))
            {
                helperPage.header = carBrand.title;
            }

            helperPage.brandWithModelList = getBrandWithModelList(carBrand, parentUrl, null);

            //productList
            var productListWithBrandId = db.tbl_product.Include("tbl_stock").Include("tbl_gallery").Include("tbl_carModelProduct.tbl_carModel.tbl_carBrand").Where(a => a.statu && a.isDeleted == false && a.tbl_stock.Any(b => b.stockCount > 0) && a.tbl_carModelProduct.Any(c => c.tbl_carModel != null) && a.tbl_carModelProduct.Any(c => c.tbl_carModel != null) && a.tbl_carModelProduct.Any(c => c.tbl_carModel.tbl_carBrand != null) && a.tbl_carModelProduct.All(c => c.tbl_carModel.tbl_carBrand.carBrandId == carBrandId) && a.langId == langId).OrderBy(a => a.sequence).ToList();

            productShared pc = new productShared(db);
            int productCount = productListWithBrandId.Count;
            int currentPage = pc.getCurrentPage(Request, productCount, 6);
            helperPage.pagingItem = pc.getPageItem(productCount, currentPage, 6, "?sayfa=");

            helperPage.productList = pc.getProductSummary(parentUrl, productListWithBrandId.Skip((currentPage - 1) * 6).Take(6).ToList(), langCulture, langCode, "240", "160");

            // Title
            var settingItem = db.tbl_settings.Where(a => a.langId == langId).FirstOrDefault();
            if (settingItem != null)
            {
                helperPage.setBrowserTitle(helperPage.header + settingItem.allPageTitle);
            }

            return View(helperPage);
        }
        public ActionResult Index(int pageId)
        {
            var helperPage = new helperProductList();

            // mainProductUrl
            pageShared ps = new pageShared(db);
            var item = ps.getPageById(pageId);

            helperPage.breadCrumbItem = getIndexBreadCrumbProductList(item.name);
            helperPage.header = item.name;

            var newProductList = db.tbl_product.Include("tbl_stock").Include("tbl_gallery").Include("tbl_carModelProduct.tbl_carModel.tbl_carBrand").Where(a => a.statu && a.isDeleted == false && a.tbl_stock.Any(b => b.stockCount > 0) && a.tbl_carModelProduct.Any(c => c.tbl_carModel != null) && a.tbl_carModelProduct.Any(c => c.tbl_carModel != null) && a.tbl_carModelProduct.Any(c => c.tbl_carModel.tbl_carBrand != null) && a.langId == langId).OrderByDescending(a => a.sequence).ToList();

            productShared pc = new productShared(db);

            int productCount = newProductList.Count;
            int currentPage = pc.getCurrentPage(Request, productCount, 6);
            helperPage.pagingItem = pc.getPageItem(productCount, currentPage, 6, "?sayfa=");

            helperPage.productList = pc.getProductSummary(item.url, newProductList.Skip((currentPage - 1) * 6).Take(6).ToList(), langCulture, langCode, "240", "160");

            // Title
            ps.pageTitleBind(item, helperPage, langId);

            return View(helperPage);
        }
        private Tuple<List<basketItem>, basketActionResult> getBasketListByTblBasket(List<tbl_basket> list,bool isDeletedInclude)
        {
            productShared pc = new productShared(db);

            basketActionResult basketAction = basketActionResult.success;
            List<basketItem> helperList = new List<basketItem>();

            foreach (var item in list)
            {
                basketItem helperItem = new basketItem();
                var productItem = item.tbl_product;

                // delete Basket
                if (productItem == null || productItem.statu == false || productItem.isDeleted)
                {
                    deleteBasketById(item.basketId);
                    return new Tuple<List<basketItem>, basketActionResult>(null, basketActionResult.redirect);

                }

                if (item.quantity < 1)
                {
                    deleteBasketById(item.basketId);
                    return new Tuple<List<basketItem>, basketActionResult>(null, basketActionResult.redirect);
                }

                //option
                var optionList = pc.getOptionListByProductItem(productItem);
                if (optionList != null && optionList.Count > 0)
                {
                    // delete Basket
                    if (!pc.isProductOptionValid(optionList, item.optionList, isDeletedInclude))
                    {
                        deleteBasketById(item.basketId);
                        return new Tuple<List<basketItem>, basketActionResult>(null, basketActionResult.redirect);
                    }

                    // Renk Seçimi Metalik
                    helperItem.optionItemList = getBasketOptionListByOptionStr(optionList, item.optionList);
                    helperItem.optionCode = item.optionList;
                }

                // stock
                int stockCount = pc.getProductStockAvailableCount(item.productId, item.optionList);
                if (stockCount < 1)
                {
                    deleteBasketById(item.basketId);
                    return new Tuple<List<basketItem>, basketActionResult>(null, basketActionResult.redirect);
                }

                if (stockCount < item.quantity)
                {
                    helperItem.quantity = stockCount;
                    updateStockCount(item.basketId, stockCount);
                    basketAction = basketActionResult.stockAdjust;
                }
                else
                {
                    helperItem.quantity = item.quantity;
                }

                // name
                helperItem.description = productItem.name;

                // price
                helperItem.productPriceDec = pc.calcPriceProduct(productItem);
                helperItem.productTotalPriceDec = helperItem.productPriceDec * helperItem.quantity;

                // image
                var photoItem = pc.getProductGallery(productItem, "110", "74").Where(a => a.Item2 == item.optionList).FirstOrDefault();
                if (photoItem != null)
                {
                    helperItem.photo = photoItem.Item1;
                }

                // discount
                helperItem.discountCode = item.discountCode;

                // basketId
                helperItem.basketId = item.basketId;

                // productId
                helperItem.productId = item.productId;

                helperList.Add(helperItem);

            }

            return new Tuple<List<basketItem>, basketActionResult>(helperList, basketAction);
        }
        // New Product List
        private List<productSmall> getNewProductList(string productUrl)
        {
            var list = db.tbl_product.Include("tbl_stock").Include("tbl_gallery").Include("tbl_carModelProduct.tbl_carModel.tbl_carBrand").Where(a => a.isShowCase && a.statu && a.tbl_stock.Any(b => b.stockCount > 0) && a.tbl_carModelProduct.Any(c => c.tbl_carModel != null) && a.tbl_carModelProduct.Any(c => c.tbl_carModel != null) && a.tbl_carModelProduct.Any(c => c.tbl_carModel.tbl_carBrand != null) && a.langId == langId).Take(6).ToList();

            productShared pc = new productShared(db);

            return pc.getProductSummary(productUrl, list, langCulture, langCode);
        }
        public ActionResult Detail(int productId, int carModelId, int carBrandId, string parentUrl, string parentName)
        {
            helperProductDetail helperPage = new helperProductDetail();

            var productItem = db.tbl_product.Include("tbl_stock").Include("tbl_gallery").Include("tbl_productCritear.tbl_critear").Where(a => a.productId == productId).FirstOrDefault();
            var carBrandItem = db.tbl_carBrand.Where(a => a.carBrandId == carBrandId).FirstOrDefault();
            var carModelItem = db.tbl_carModel.Include("tbl_carModelProduct.tbl_product.tbl_stock").Where(a => a.carModelId == carModelId).FirstOrDefault();

            var baseUrl = mainPath + langCode + "/" + parentUrl + "/" + carBrandItem.url + "/" + carModelItem.url;

            // statu Control
            if (productItem.statu == false)
            {
                return RedirectPermanent(baseUrl + ".html");
            }

            // stockControl
            if (!productItem.tbl_stock.Any(a => a.stockCount > 0))
            {
                return RedirectPermanent(baseUrl + ".html");
            }

            //PrevAndNextUrl
            var productList = carModelItem.tbl_carModelProduct.Select(a => a.tbl_product).Where(a => a != null && a.statu && a.tbl_stock.Any(b => b.stockCount > 0)).OrderBy(a => a.sequence).ToList();

            var sequenceCurrenProduct = productList.IndexOf(productItem);
            helperPage = getPrevAndNextUrl(helperPage, sequenceCurrenProduct, productList, baseUrl);

            //backLink
            helperPage.backLink = baseUrl + ".html";
            if (Request.QueryString["page"] != null)
            {
                // ToDo: Add Pageing Back Link
            }

            productShared pc = new productShared(db);
            CultureInfo priceFormat = CultureInfo.CreateSpecificCulture(langCulture);

            //breadcrumb
            helperPage.breadCrumbItem = getProductDetailBreadCrumbProductList(parentName, parentUrl, carBrandItem.name, carBrandItem.url, carModelItem.name, carModelItem.url, productItem.name);

            helperPage.imageList = pc.getProductGallery(productItem, "500", "350");
            helperPage.productName = productItem.name;
            helperPage.productId = productItem.productId;

            decimal price = pc.calcPriceProduct(productItem);
            helperPage.price = price.ToString("F2", priceFormat) + " TL";

            var taxpriceItem = pc.getProductWithoutTaxPriceAndTaxPrice(productItem, priceFormat);
            helperPage.withoutTaxPrice = taxpriceItem.Item2;

            helperPage.detail = productItem.detail;

            //OptionList
            helperPage.optionList = pc.getOptionListByProductItem(productItem);

            if (Request.QueryString["action"] != null && Request.QueryString["action"] == "optionSelect")
            {
                helperPage.isOptionMsgExist = true;
            }

            //Title
            var settingItem = db.tbl_settings.Where(a => a.langId == langId).FirstOrDefault();
            if (settingItem != null)
            {
                helperPage.setBrowserTitle(helperPage.productName + settingItem.allPageTitle);
                helperPage.setDescription(productItem.metaDescription);
                helperPage.setKeywords(productItem.metaKeyword);
            }

            if (settingItem.isCrediCardEnable.HasValue && settingItem.isCrediCardEnable.Value)
            {
                helperPage.isInstallmenTableVisible = true;
            }

            return View(helperPage);
        }
        public ActionResult OptionList(int productId)
        {
            productShared pc = new productShared(db);

            var item = db.tbl_product.Where(a => a.productId == productId).FirstOrDefault();

            if (item == null)
            {
                return null;
            }

            var amount = pc.calcPriceProduct(item);
            var helperPage = getOptionList(amount);
            string viewHtml = RenderRazorViewToString("OptionList", helperPage);
            return Json(new { html = viewHtml });
        }