public ActionResult ProductDetails(int productId, string attributes)
		{
			var product = _productService.GetProductById(productId);
			if (product == null || product.Deleted)
				return HttpNotFound();

			//Is published?
			//Check whether the current user has a "Manage catalog" permission
			//It allows him to preview a product before publishing
			if (!product.Published && !_services.Permissions.Authorize(StandardPermissionProvider.ManageCatalog))
				return HttpNotFound();

			//ACL (access control list)
			if (!_aclService.Authorize(product))
				return HttpNotFound();

			//Store mapping
			if (!_storeMappingService.Authorize(product))
				return HttpNotFound();

			//visible individually?
			if (!product.VisibleIndividually)
			{
				//is this one an associated products?
				var parentGroupedProduct = _productService.GetProductById(product.ParentGroupedProductId);
				if (parentGroupedProduct != null)
				{
					return RedirectToRoute("Product", new { SeName = parentGroupedProduct.GetSeName() });
				}
				else
				{
					return HttpNotFound();
				}
			}

			//prepare the model
			var selectedAttributes = new FormCollection();
			selectedAttributes.ConvertAttributeQueryData(_productAttributeParser.DeserializeQueryData(attributes), product.Id);

			var model = _helper.PrepareProductDetailsPageModel(product, selectedAttributes: selectedAttributes);

			//save as recently viewed
			_recentlyViewedProductsService.AddProductToRecentlyViewedList(product.Id);

			//activity log
			_services.CustomerActivity.InsertActivity("PublicStore.ViewProduct", T("ActivityLog.PublicStore.ViewProduct"), product.Name);

			return View(model.ProductTemplateViewPath, model);
		}