0
Din indkøbskurv

Opdaterer kurv

stk. a

-
+

Din kurv i alt (ex. fragt)

Handel videre

Gå til kassen
VISA/DK VISA/DK VISA/DK VISA/DK VISA/DK
Find forhandler

,

Tlf.

Se alle
Error executing template "Designs/Mobler2018/eCom/Product/Product.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_b1e84884c2f747b999f9920bb657bb76.Execute() in D:\dynamicweb.net\Solutions\mobler.LIVE\Files\Templates\Designs\Mobler2018\eCom\Product\Product.cshtml:line 1096
   at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @using System.Web 2 @using Mobler.Website.CustomModules.MoblerHelpers 3 @using System.Text.RegularExpressions 4 @using CampaignModule.Models 5 @using Group = Dynamicweb.Ecommerce.Products.Group 6 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 7 8 9 @{ 10 string shopname = MoblerHelpers.GetShopName(); 11 string SelectPlaceholder = Translate("ShopSelectPlaceholder", "Indtast by, postnummer eller adresse"); 12 var shopInfo = MoblerHelpers.ShopInfo(); 13 int ShopPageId = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetInt("ShopPageId"); 14 var AllShops = Firstweb.Custom.CustomCode.Frontend.Helpers.Shops.GetAllShops(ShopPageId); 15 int AjaxCartPageId = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetInt("AjaxCartPageId"); 16 int CustomersAlsoSawPageId = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetInt("CustomersAlsoSawPageId"); 17 string CartPage = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("CartPage"); 18 string VariantsEndpoint = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("VariantsUrl"); 19 string VariantDetailsEndpoint = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("VariantDetailsUrl"); 20 string BlackFridayTheme = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("BlackFridayTheme"); 21 string ProductID = GetString("Ecom:Product.ID"); 22 string GroupID = Firstweb.Custom.CustomCode.Frontend.Helpers.EcomGroups.GetProductDefaultShopGroupID(ProductID); //GetString("Ecom:Product.PrimaryOrFirstGroupID"); 23 string DefaultVariantID = GetString("Ecom:Product.DefaultVariantComboID"); 24 string ProductImage = MoblerHelpers.GetProductListImage(ProductID, DefaultVariantID); 25 string ProductName = GetString("Ecom:Product.Name"); 26 string ProductNumber = GetString("Ecom:Product.Number"); 27 string ProductCatalogLink = !String.IsNullOrEmpty(GetString("Ecom:Product:Field.ProductCatelog.Value.Clean")) ? GetString("Ecom:Product:Field.ProductCatelog.Value.Clean") : ""; 28 string VariantId = GetString("Ecom:Product.VariantID"); 29 string ShortDescription = GetString("Ecom:Product.ShortDescription"); 30 string LongDescription = GetString("Ecom:Product.LongDescription").Replace("||", "<br/>"); 31 string CurrentVariantName = GetString("Ecom:Product.SelectedVariantComboName"); 32 var FaqQuestions = MoblerHelpers.GetProductFAQs(ProductID, GroupID); 33 34 35 Mobler.Website.CustomCode.Frontend.PayeverHelper payeverHelper = new Mobler.Website.CustomCode.Frontend.PayeverHelper(); 36 Mobler.Website.CustomCode.Models.PayeverWidget PayeverWidget = payeverHelper.GetPayeverWidgetInformation(); 37 38 string MetaDescription = GetString("Ecom:Product.MetaDescription"); 39 40 if (string.IsNullOrEmpty(MetaDescription)) 41 { 42 MetaDescription = Mobler.Website.CustomCode.Frontend.Helpers.Text.GetFirstLine(LongDescription.Replace("<br/>", " ")); 43 } 44 else 45 { 46 MetaDescription = ""; //Meta data description bliver sat af DW, hvis dette felt er udfyldt, så vi skal ikke opsætte noget. 47 } 48 49 50 var RelatedBlogs = Firstweb.Custom.CustomCode.Frontend.Helpers.Blogs.GetBlogsRelatedToProduct(ProductID); 51 bool NewItem = GetBoolean("Ecom:Product:Field.NewItem"); 52 bool LowPrice = GetBoolean("Ecom:Product:Field.Splash3"); 53 54 55 Mobler.Website.CustomCode.Frontend.ProductsDisplayVariant productsDisplayVariant = Mobler.Website.CustomCode.Frontend.ProductsDisplayVariant.Instance(); 56 57 bool ForSale = !GetBoolean("Ecom:Product:Field.NotForSaleOnline"); 58 59 var MainProdNr = string.Empty; 60 var VariantNr = string.Empty; 61 string FirstImage = ""; 62 if (!string.IsNullOrWhiteSpace(ProductNumber)) 63 { 64 string[] MainProdSplit = ProductNumber.Split('_'); 65 66 67 68 if (MainProdSplit.Length > 1) 69 { 70 MainProdNr = MainProdSplit[0]; 71 VariantNr = MainProdSplit[1]; 72 } 73 else 74 { 75 MainProdNr = ProductNumber; 76 } 77 } 78 var Images = MoblerHelpers.GetProductImages(GetString("Ecom:Product.ID"), VariantId); 79 bool First = true; 80 bool FirstIndicator = true; 81 int IndicatorIncrementer = 0; 82 string ProductLink = GetString("Ecom:Product.Link.Clean"); 83 84 double ActualPrice = GetDouble("Ecom:Product.Price.Price"); 85 double spar = 0; 86 double price = 0; 87 double normalPrice = 0; 88 89 string priceFormatted = ""; 90 string sparFormatted = ""; 91 string normalPriceFormatted = ""; 92 93 string campaignColor = ""; 94 string campaignText = ""; 95 string campaignDate = ""; 96 97 98 string campaignDateStart = ""; 99 string campaignDateEnd = ""; 100 101 102 bool CampaignActiveOnProduct = GetBoolean("CampaignModule:Product.CampaignActiveOnProduct"); 103 if (!CampaignActiveOnProduct) 104 { 105 price = ActualPrice; 106 priceFormatted = MoblerHelpers.formatPrice(price); 107 } 108 else 109 { 110 normalPrice = GetDouble("CampaignModule:Product.CampaignProduct.NormalPrice"); 111 normalPriceFormatted = GetString("CampaignModule:Product.CampaignProduct.NormalPrice.FormattedRetail"); 112 113 price = GetDouble("CampaignModule:Product.CampaignProduct.CampaignPrice"); 114 priceFormatted = GetString("CampaignModule:Product.CampaignProduct.CampaignPrice.FormattedRetail"); 115 116 spar = GetDouble("CampaignModule:Product.CampaignProduct.DiscountAmount"); 117 sparFormatted = GetString("CampaignModule:Product.CampaignProduct.DiscountAmount.FormattedRetail"); 118 119 campaignColor = GetString("CampaignModule:Product.Campaign.Color"); 120 campaignText = GetString("CampaignModule:Product.Campaign.Text"); 121 122 campaignDateStart = GetString("CampaignModule:Product.CampaignProduct.Campaign.Start"); 123 campaignDateEnd = GetString("CampaignModule:Product.CampaignProduct.Campaign.End"); 124 } 125 126 127 string DataLayerPrice = ActualPrice.ToString().Replace(".", "").Replace(",", "."); 128 System.Web.HttpContext.Current.Items["OverrideOgTags"] = true; 129 string OgImage = "https://mobler.dk" + Images.FirstOrDefault(); 130 131 string TrimmedTeaser = Firstweb.Custom.CustomCode.Frontend.Helpers.JSFormatting.TrimLinebreaks(ShortDescription); 132 string TrimmedName = Firstweb.Custom.CustomCode.Frontend.Helpers.JSFormatting.TrimLinebreaks(ProductName); 133 134 var ParentGroups = Firstweb.Custom.CustomCode.Frontend.Helpers.EcomGroups.getBreadCrumbGroupList(GroupID, true); 135 var DataLayerParentGroup = ParentGroups.Last().Name; 136 List<string> DataLayerParentGroupStrings = ParentGroups.Select(group => group.Name).ToList(); 137 string DataLayerParentGroups = string.Join(" > ", DataLayerParentGroupStrings); 138 139 string ShowOnPageUrl = ""; 140 string GetCartEndpoint = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("GetCartJson"); 141 142 string QuickDeliveryColor = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("QuickDeliveryColor"); 143 string QuickDeliveryDescription = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("QuickDeliveryDescription"); 144 string NormalDeliveryDescription = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("NormalDeliveryDescription"); 145 string BrandName = GetString("Ecom:Product:Field.Maerkevarer.Value.Clean"); 146 string DeliveryTime = Translate("DeliveryTime." + BrandName, "Gns. leveringstid 3-12 dage"); 147 bool HideDelivery = DeliveryTime == "Skjul"; 148 string DeliveryColor = "#00AB5D"; 149 bool QuickDelivery = GetBoolean("Ecom:Product:Field.QuickDelivery.Value.Clean"); 150 string CustomDelivery = GetString("Ecom:Product:Field.CustomDeliveryTime.Value.Clean"); 151 if (QuickDelivery) 152 { 153 DeliveryColor = QuickDeliveryColor; 154 DeliveryTime = Translate("DeliveryTime.QuickDelivery", "Ekstra hurtig levering"); 155 } 156 else if (!String.IsNullOrEmpty(CustomDelivery)) 157 { 158 DeliveryTime = CustomDelivery; 159 } 160 string DeliveryFontWeightModifier = QuickDelivery ? "font-weight-bold" : ""; 161 bool DisplayAverageDeliveryTime = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetBoolean("DisplayAverageDeliveryTime"); 162 163 double CostPrice = GetDouble("Ecom:Product:Field.FirstwebCostPrice.Value.Raw"); 164 string DailyPriceBackgroundColor = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("AktuelDagsprisBackgroundColor"); 165 string DailyPriceTextColor = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("AktuelDagsprisTextColor"); 166 string EAN = GetString("Ecom:Product:Field.FirstEan.Value"); 167 168 string productionDescription = GetString("Ecom:Product:Field.FirstwebProductionDescription"); 169 170 171 Mobler.Website.CustomCode.RelewiseCustom.RelewiseCaller relewiseCaller = new Mobler.Website.CustomCode.RelewiseCustom.RelewiseCaller(); 172 relewiseCaller.TrackProductView(ProductID, VariantId); 173 174 } 175 176 177 @SnippetStart("ProductDetailsMeta") 178 @if (!string.IsNullOrEmpty(MetaDescription)) 179 { 180 <meta name="description" content="@MetaDescription" /> 181 } 182 @SnippetEnd("ProductDetailsMeta") 183 184 @SnippetStart("OgTags") 185 <meta property="og:type" content="product" /> 186 <meta property="og:description" content="@Regex.Replace(ShortDescription, "<.*?>", String.Empty)" /> 187 <meta property="og:image" content="@OgImage" /> 188 @SnippetEnd("OgTags") 189 190 @using Mobler.Website.CustomModules.MoblerHelpers 191 @using Dynamicweb.Ecommerce.Products 192 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 193 194 @helper RenderProduct(LoopItem product) 195 { 196 string BlackFridayTheme = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("BlackFridayTheme"); 197 string CTAbg = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("SeProdukt_CTABaggrundsfarve"); 198 string CTAtextcolor = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("SeProdukt_CTATekstfarve"); 199 string ProductID = product.GetString("Ecom:Product.ID"); 200 string ProductNumber = product.GetString("Ecom:Product.Number"); 201 string DefaultVariantID = product.GetString("Ecom:Product.DefaultVariantComboID"); 202 string VariantId = product.GetString("Ecom:Product.VariantID"); 203 if (String.IsNullOrEmpty(VariantId)) { 204 VariantId = DefaultVariantID; 205 } 206 var Images = MoblerHelpers.GetProductImages(ProductID, VariantId); 207 string ProductImage = string.Format("/Admin/Public/GetImage.ashx?Image={0}&Width=260&height=200&Format=png&Crop=5&resolution=50", Images.FirstOrDefault()); //MoblerHelpers.GetProductListImageWithMainImage(ProductID, ProductNumber); 208 string ProductName = product.GetString("Ecom:Product.Name"); 209 210 bool NewItem = product.GetBoolean("Ecom:Product:Field.NewItem"); 211 bool LowPrice = product.GetBoolean("Ecom:Product:Field.Splash3"); 212 double CostPrice = product.GetDouble("Ecom:Product:Field.FirstwebCostPrice.Value.Raw"); 213 string ShortDescription = product.GetString("Ecom:Product.ShortDescription"); 214 string PriceSaving = product.GetString("Ecom:Product:Field.Spar.Value"); 215 string ProductLink = product.GetString("Ecom:Product.Link.Clean"); 216 217 if (!String.IsNullOrEmpty(VariantId)) { 218 ProductLink = ProductLink + "&variantid=" + VariantId; 219 } 220 221 222 /* 223 double DiscountedPrice = product.GetDouble("Ecom:Product.Discount.Price.Price"); 224 double ActualPrice = product.GetDouble("Ecom:Product.Price.Price"); 225 var TotalDiscount = product.GetDouble("Ecom:Product.Discount.TotalAmount.Price"); 226 double spar = 0; 227 double price = 0; 228 if (!product.GetBoolean("Ecom:Product:Field.Splash3.Value") && !product.GetBoolean("Ecom:Product:Field.Offer.Value")) 229 { 230 if (DiscountedPrice < ActualPrice) 231 { 232 spar = TotalDiscount; 233 price = DiscountedPrice; 234 } 235 else 236 { 237 price = ActualPrice; 238 } 239 } 240 else 241 { 242 spar = product.GetDouble("Ecom:Product:Field.Spar.Value.Clean"); 243 price = product.GetDouble("Ecom:Product.Price.Price"); 244 } 245 double OriginalPrice = spar + price; 246 */ 247 248 double ActualPrice = product.GetDouble("Ecom:Product.Price.Price"); 249 double spar = 0; 250 double price = 0; 251 double normalPrice = 0; 252 253 string priceFormatted = ""; 254 string sparFormatted = ""; 255 string normalPriceFormatted = ""; 256 257 string campaignColor = ""; 258 string campaignText = ""; 259 string campaignDate = ""; 260 261 bool CampaignActiveOnProduct = product.GetBoolean("CampaignModule:Product.CampaignActiveOnProduct"); 262 if (!CampaignActiveOnProduct) 263 { 264 price = ActualPrice; 265 priceFormatted = MoblerHelpers.formatPrice(price); 266 } 267 else 268 { 269 normalPrice = product.GetDouble("CampaignModule:Product.CampaignProduct.NormalPrice"); 270 normalPriceFormatted = product.GetString("CampaignModule:Product.CampaignProduct.NormalPrice.FormattedRetail"); 271 272 price = product.GetDouble("CampaignModule:Product.CampaignProduct.CampaignPrice"); 273 priceFormatted = product.GetString("CampaignModule:Product.CampaignProduct.CampaignPrice.FormattedRetail"); 274 275 spar = product.GetDouble("CampaignModule:Product.CampaignProduct.DiscountAmount"); 276 sparFormatted = product.GetString("CampaignModule:Product.CampaignProduct.DiscountAmount.FormattedRetail"); 277 278 campaignColor = product.GetString("CampaignModule:Product.Campaign.Color"); 279 campaignText = product.GetString("CampaignModule:Product.Campaign.Text"); 280 } 281 282 283 284 var languageId = product.GetString("Ecom:Product.LanguageID"); 285 var dwProduct = Dynamicweb.Ecommerce.Services.Products.GetProductById(ProductID, VariantId, languageId); 286 var VariantCombinations = dwProduct.VariantCombinations.ToList().Where(v => v.GetProduct(languageId) != null && v.GetProduct(languageId).Number != VariantId); 287 bool ManyVariants = VariantCombinations.Count() > 3; 288 if (ManyVariants) 289 { 290 VariantCombinations = VariantCombinations.Take(3).ToList(); 291 } 292 293 string BrandName = product.GetString("Ecom:Product:Field.Maerkevarer.Value.Clean"); 294 bool QuickDelivery = product.GetBoolean("Ecom:Product:Field.QuickDelivery.Value.Clean"); 295 string DeliveryTime = Translate("DeliveryTime." + BrandName, "Gns. leveringstid 3-12 dage"); 296 string DeliveryColor = "#00AB5D"; 297 if (QuickDelivery) { 298 DeliveryTime = Translate("DeliveryTime.QuickDelivery", "Ekstra hurtig levering"); 299 DeliveryColor = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("QuickDeliveryColor"); 300 } 301 302 <div class="col-11 col-sm-6 col-lg-3 mt-3 mx-auto mx-sm-0 mb-3 js-product-list-item"> 303 <a href="@ProductLink" class="product-list-product box-shadow px-3 pt-3 pb-5 h-100 d-flex flex-column align-items-center mb-3 overflow-hidden"> 304 <div class="d-flex flex-column align-items-center"> 305 <div class="img-container"> 306 <img class="js-product-image-@ProductID" src="@ProductImage" alt="@ProductName" /> 307 </div> 308 </div> 309 <h3 class="mt-2 mb-0 fs2 text-center mw-100 font-weight-bold">@ProductName</h3> 310 <div class="fs0 color-subtle text-center mw-100 mb-0 product-description">@ShortDescription</div> 311 <div class="d-flex flex-wrap justify-content-center w-100 align-content-end flex-fill"> 312 <p class="color-subtle m-0 fs0 w-100 text-center"> 313 @if (!string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.dybdeint.Value.Clean"))) 314 { 315 if (product.GetString("Ecom:Product:Field.dybdeint.Value.Clean") != "0") 316 { 317 <span>D/L: @product.GetValue("Ecom:Product:Field.dybdeint.Value.Clean")</span> 318 } 319 } 320 @if (!string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.hoejdeint.Value.Clean"))) 321 { 322 if (product.GetString("Ecom:Product:Field.hoejdeint.Value.Clean") != "0") 323 { 324 <span>H: @product.GetValue("Ecom:Product:Field.hoejdeint.Value.Clean")</span> 325 } 326 } 327 @if (!string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.breddeint.Value.Clean"))) 328 { 329 if (product.GetString("Ecom:Product:Field.breddeint.Value.Clean") != "0") 330 { 331 <span>B: @product.GetValue("Ecom:Product:Field.breddeint.Value.Clean")</span> 332 } 333 } 334 </p> 335 @if (QuickDelivery) 336 { 337 <div class="delivery-information my-2 w-100 justify-content-center"> 338 <svg class="delivery-icon mr-2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" fill="@DeliveryColor" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 612 612" style="enable-background:new 0 0 612 612;" xml:space="preserve"> 339 <g> 340 <g> 341 <path d="M226.764,375.35c-28.249,0-51.078,22.91-51.078,51.16c0,28.166,22.829,51.078,51.078,51.078s51.078-22.912,51.078-51.078 C277.841,398.26,255.013,375.35,226.764,375.35z M226.764,452.049c-14.125,0-25.54-11.498-25.54-25.541 c0-14.123,11.415-25.539,25.54-25.539c14.124,0,25.539,11.416,25.539,25.539C252.302,440.551,240.888,452.049,226.764,452.049z M612,337.561v54.541c0,13.605-11.029,24.635-24.636,24.635h-26.36c-4.763-32.684-32.929-57.812-66.927-57.812 c-33.914,0-62.082,25.129-66.845,57.812H293.625c-4.763-32.684-32.93-57.812-66.845-57.812c-33.915,0-62.082,25.129-66.844,57.812 h-33.012c-13.606,0-24.635-11.029-24.635-24.635v-54.541H612L612,337.561z M494.143,375.35c-28.249,0-51.16,22.91-51.16,51.16 c0,28.166,22.912,51.078,51.16,51.078c28.166,0,51.077-22.912,51.077-51.078C545.22,398.26,522.309,375.35,494.143,375.35z M494.143,452.049c-14.125,0-25.539-11.498-25.539-25.541c0-14.123,11.414-25.539,25.539-25.539 c14.042,0,25.539,11.416,25.539,25.539C519.682,440.551,508.185,452.049,494.143,452.049z M602.293,282.637l-96.817-95.751 c-6.159-6.077-14.453-9.526-23.076-9.526h-48.86v-18.313c0-13.631-11.004-24.635-24.635-24.635H126.907 c-13.55,0-24.635,11.005-24.635,24.635v3.86L2.3,174.429l177.146,23.068L0,215.323l178.814,25.423L0,256.25l102.278,19.29 l-0.007,48.403h509.712v-17.985C611.983,297.171,608.452,288.796,602.293,282.637z M560.084,285.839h-93.697 c-2.135,0-3.86-1.724-3.86-3.859v-72.347c0-2.135,1.725-3.86,3.86-3.86h17.82c0.985,0,1.971,0.411,2.71,1.068l75.796,72.347 C565.257,281.569,563.532,285.839,560.084,285.839z" /> 342 343 </g> 344 </g> 345 </svg> 346 <p class="delivery-text font-weight-bold">@DeliveryTime - <span class="text-underline cursor-pointer" data-bind="click: ToggleQuickDeliveryInfo" style="color: @DeliveryColor">@Translate("Product.DeliveryInfo.ReadmoreText", "L&aelig;s mere")</span></p> 347 </div> 348 } 349 <p class="fs5 my-0 d-flex align-items-center font-weight-bold"> 350 @if (VariantCombinations.Count() > 0) 351 { 352 <span class="font-weight-semibold fs0 mr-2">@Translate("ProductPrice.From", "Fra")</span> 353 } 354 @priceFormatted 355 </p> 356 @if (campaignText == "KOMBI") 357 { 358 <div class="discount-splash discount-splash--small"><p class="m-0">@Translate("ProductCombinationOffer", "Kombinationstilbud")</p></div> 359 <div class="d-flex justify-content-between w-100 mb-2"> 360 <p class="color-black-w-opacity fs0 m-0 text-uppercase">@Translate("PriceBefore", "Før") @normalPriceFormatted</p> 361 <p class="bg-discount fs0 text-uppercase m-0 px-2 font-weight-bold">@Translate("PriceSaving", "Spar") @sparFormatted</p> 362 </div> 363 } 364 else if (CostPrice > 0) 365 { 366 string DailyPriceBackgroundColor = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("AktuelDagsprisBackgroundColor"); 367 string DailyPriceTextColor = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("AktuelDagsprisTextColor"); 368 string EAN = product.GetString("Ecom:Product:Field.FirstEan.Value"); 369 370 <div class="discount-splash price-shape" style="background-color: @DailyPriceBackgroundColor"><p class="m-0" style="color: @DailyPriceTextColor;">@Translate("ProductDailyPriceSplash", "Dagspris")</p></div> 371 } 372 else if (spar > 0) 373 { 374 if (BlackFridayTheme == "True") 375 { 376 <div class="discount-splash bf-bg-black bf-color-white"><p class="m-0 font-weight-bold">@Translate("ProductOffer", "Tilbud")</p></div> 377 } 378 else 379 { 380 <div class="discount-splash"><p class="m-0 font-weight-bold">@Translate("ProductOffer", "Tilbud")</p></div> 381 } 382 <div class="d-flex justify-content-between w-100 mb-2"> 383 <p class="color-black-w-opacity fs0 m-0 text-uppercase">@Translate("PriceBefore", "Før") @normalPriceFormatted</p> 384 <p class="bg-discount fs0 text-uppercase m-0 px-2 font-weight-bold">@Translate("PriceSaving", "Spar") @sparFormatted</p> 385 </div> 386 } 387 else if (NewItem) 388 { 389 <div class="discount-splash new-item"><p class="m-0 font-weight-bold">@Translate("ProductNew", "Nyhed")</p></div> 390 } 391 else if (LowPrice) 392 { 393 <div class="discount-splash low-price"><p class="m-0 font-weight-bold">@Translate("ProductLowPrice", "Fast lavpris")</p></div> 394 } 395 </div> 396 @if (VariantCombinations.Count() > 0) 397 { 398 <div class="w-100 row align-items-center justify-content-center"> 399 @foreach (var Variant in VariantCombinations) 400 { 401 string VariantLink = product.GetString("Ecom:Product.Link.Clean") + "&variantid=" + Variant.VariantId; 402 string imageProductDetails = string.Format("/Admin/Public/GetImage.ashx?Image={0}&Width=60&height=50&Format=png&Crop=5&resolution=50", MoblerHelpers.GetProductImages(ProductID, Variant.VariantId).First()); 403 string ImageLarge = imageProductDetails.Replace("&Width=60&height=50", "&Width=260&height=200"); 404 <div class="w-25 p-1 mb-2 d-block" data-bind="previewVariant: { variantImage: '@ImageLarge', currentImage: '.js-product-image-@ProductID', originalImage: '@ProductImage', link: '@VariantLink' }"> 405 <img class="img-fluid" src="@imageProductDetails" /> 406 </div> 407 } 408 @if (ManyVariants) 409 { 410 <div class="w-25 p-1 mb-2 d-flex justify-content-center align-items-center fs2"> 411 <span class="see-more-dots"> 412 <i class="fas fa-ellipsis-h"></i> 413 </span> 414 </div> 415 } 416 </div> 417 <div class="variant-price-disclaimer">@Translate("VariantPriceDisclaimer", "Prisen kan variere efter materialevalg")</div> 418 } 419 @if (BlackFridayTheme == "True") 420 { 421 <div class="bf-bg-black product-cta d-block text-center fs2 font-weight-bold">@Translate("GoToProduct", "Se produkt")</div> 422 } else { 423 <div class="bg-brand product-cta d-block text-center fs2 font-weight-bold" style="background-color: @CTAbg;color: @CTAtextcolor;">@Translate("GoToProduct", "Se produkt")</div> 424 } 425 426 </a> 427 428 </div> 429 } 430 431 @helper RenderWideOffer(LoopItem product) 432 { 433 string ProductID = product.GetString("Ecom:Product.ID"); 434 string DefaultVariantID = product.GetString("Ecom:Product.DefaultVariantComboID"); 435 string ProductImage = MoblerHelpers.GetProductListImage(ProductID, DefaultVariantID).Replace("Width=260&height=200", "Width=400&height=230"); 436 string ProductName = product.GetString("Ecom:Product.Name"); 437 string ShortDescription = product.GetString("Ecom:Product.ShortDescription"); 438 string PriceSaving = product.GetString("Ecom:Product:Field.Spar.Value"); 439 string ProductLink = product.GetString("Ecom:Product.Link.Clean"); 440 double DiscountedPrice = product.GetDouble("Ecom:Product.Discount.Price.Price"); 441 double ActualPrice = product.GetDouble("Ecom:Product.Price.Price"); 442 var TotalDiscount = product.GetDouble("Ecom:Product.Discount.TotalAmount.Price"); 443 double spar = 0; 444 double price = 0; 445 if (!product.GetBoolean("Ecom:Product:Field.Splash3.Value") && !product.GetBoolean("Ecom:Product:Field.Offer.Value")) 446 { 447 if (DiscountedPrice < ActualPrice) 448 { 449 spar = TotalDiscount; 450 price = DiscountedPrice; 451 } 452 else 453 { 454 price = ActualPrice; 455 } 456 } 457 else 458 { 459 spar = product.GetDouble("Ecom:Product:Field.Spar.Value.Clean"); 460 price = product.GetDouble("Ecom:Product.Price.Price"); 461 } 462 double OriginalPrice = spar + price; 463 464 <div class="col-12 bg-white box-shadow-grey border-radius-bottom-8px mt-5"> 465 <div class="row"> 466 467 <div class="col-12 col-md-4 d-flex align-items-center justify-content-center p-2"> 468 @if (spar > 0) 469 { 470 <div class="discount-splash d-md-none"> 471 <p class="m-0"> 472 @Translate("ProductOffer", "Tilbud") 473 </p> 474 </div> 475 } 476 <a href="@ProductLink"> 477 <img class="img-fluid" src="@ProductImage" alt="@ProductName" /> 478 </a> 479 </div> 480 <div class="col-12 col-md-8 px-0 pt-4 pb-0 pb-sm-3 d-flex flex-column align-items-center 481 justify-content-end"> 482 @if (spar > 0) 483 { 484 <div class="discount-splash d-none d-md-flex"> 485 <p class="m-0"> 486 @Translate("ProductOffer", "Tilbud") 487 </p> 488 </div> 489 } 490 <div class="px-2"> 491 <h1 class="wide-offer--title mw-100 word-break mt-3 mt-sm-0 font-weight-bold text-uppercase text-center">@ProductName</h1> 492 <div class="wide-offer--subtitle word-break text-center color-dark-grey rte-content"> 493 @ShortDescription 494 </div> 495 </div> 496 <div class="mt-2 fs5 font-weight-bold"> 497 @MoblerHelpers.formatPrice(price) 498 </div> 499 <div class="d-flex flex-column justify-content-center align-items-center flex-sm-row w-100"> 500 501 @if (spar > 0) 502 { 503 <div class="d-flex mb-2 mb-sm-0 justify-content-center"> 504 <p class="color-black-w-opacity m-0 mr-5 p-1 text-uppercase"> 505 @Translate("PriceBefore", "Før") @MoblerHelpers.formatPrice(OriginalPrice) 506 </p> 507 <p class="bg-discount font-weight-bold mb-0 mr-sm-5 px-2 p-1 text-uppercase"> 508 @Translate("PriceSaving", "Spar") @MoblerHelpers.formatPrice(spar) 509 </p> 510 </div> 511 } 512 <a class="wide-offer--button btn btn-primary pl-3 pr-3" href="@ProductLink"> 513 @Translate("GoToProduct", "Se produkt") 514 </a> 515 </div> 516 </div> 517 518 </div> 519 </div> 520 521 } 522 523 @helper Render2ColOffer(LoopItem product) 524 { 525 string ProductID = product.GetString("Ecom:Product.ID"); 526 string DefaultVariantID = product.GetString("Ecom:Product.DefaultVariantComboID"); 527 string ProductImage = MoblerHelpers.GetProductListImage(ProductID, DefaultVariantID).Replace("Width=260", "Width=450").Replace("height=200", "Height=400"); 528 string ProductName = product.GetString("Ecom:Product.Name"); 529 string ShortDescription = product.GetString("Ecom:Product.ShortDescription"); 530 string PriceSaving = product.GetString("Ecom:Product:Field.Spar.Value"); 531 string ProductLink = product.GetString("Ecom:Product.Link.Clean"); 532 double DiscountedPrice = product.GetDouble("Ecom:Product.Discount.Price.Price"); 533 double ActualPrice = product.GetDouble("Ecom:Product.Price.Price"); 534 var TotalDiscount = product.GetDouble("Ecom:Product.Discount.TotalAmount.Price"); 535 double spar = 0; 536 double price = 0; 537 if (!product.GetBoolean("Ecom:Product:Field.Splash3.Value") && !product.GetBoolean("Ecom:Product:Field.Offer.Value")) 538 { 539 if (DiscountedPrice < ActualPrice) 540 { 541 spar = TotalDiscount; 542 price = DiscountedPrice; 543 } 544 else 545 { 546 price = ActualPrice; 547 } 548 } 549 else 550 { 551 spar = product.GetDouble("Ecom:Product:Field.Spar.Value.Clean"); 552 price = product.GetDouble("Ecom:Product.Price.Price"); 553 } 554 double OriginalPrice = spar + price; 555 556 557 <div class="col-12 col-md-6 mt-5"> 558 <a href="@ProductLink" class="offer-2col box-shadow-large border-radius-bottom-10px w-100 h-100 d-flex flex-column color-black"> 559 <div class="d-flex align-items-center justify-content-center offer-2col--img-container"> 560 <img class="img-fluid" src="@ProductImage" alt="@ProductName"> 561 @if (spar > 0) 562 { 563 <div class="discount-splash"> 564 <p class="m-0"> 565 @Translate("ProductOffer", "Tilbud") 566 </p> 567 </div> 568 } 569 </div> 570 <div> 571 <h1 class="offer-2col--title pl-3 pr-3 mb-3 text-center color-black text-uppercase"> 572 @ProductName 573 </h1> 574 <div class="offer-2col--subtitle color-dark-grey pl-3 pr-3 my-3 my-md-5 text-center"> 575 @ShortDescription 576 </div> 577 </div> 578 <div class="d-flex flex-wrap flex-fill justify-content-center align-items-end"> 579 <div class="d-flex flex-wrap flex-fill justify-content-center align-items-end"> 580 <p class="offer-2col--price mb-3 text-center font-weight-bold color-black w-100"> 581 @MoblerHelpers.formatPrice(price) 582 </p> 583 @if (spar > 0) 584 { 585 <div class="d-flex justify-content-center mb-3"> 586 <span class="offer-2col--pricebefore color-black-w-opacity mr-5 p-1 text-uppercase"> 587 @Translate("PriceBefore", "Før") @MoblerHelpers.formatPrice(OriginalPrice) 588 </span> 589 <span class="offer-2col--pricesave color-black bg-discount font-weight-bold p-1 text-uppercase"> 590 @Translate("PriceSaving", "Spar") @MoblerHelpers.formatPrice(spar) 591 </span> 592 </div> 593 } 594 595 <div class="w-100"> 596 <div class="offer-2col--button btn btn-primary p-3 border-radius-bottom-10px w-100 mb-sm-0 font-weight-bold"> 597 @Translate("GoToProduct", "Se produkt") 598 </div> 599 </div> 600 </div> 601 </div> 602 </a> 603 </div> 604 } 605 606 @using Mobler.Website.CustomModules.MoblerHelpers 607 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 608 609 @helper RenderBlogTeaser(Firstweb.Custom.CustomCode.Frontend.Helpers.Blog Blog) 610 { 611 string PageId = GetGlobalValue( "Global:Page.ID" ); 612 string CleanLink = Blog.Link.Replace("default.aspx?id", "Default.aspx?Id"); 613 <div class="col-12 col-md-4 px-0 px-md-3 mb-4"> 614 <a href="@CleanLink" class="blog d-block"> 615 <div class="image" style="background-image:url('@Blog.Image')"> 616 <img class="d-none" src="@Blog.Image" alt="Alternate Text" /> 617 </div> 618 <div class="text"> 619 <div class="positioning"> 620 <h4 class="col-10 col-md-9 px-2 pt-3 bg-white font-weight-bold text-center mx-auto">@Blog.Header</h4> 621 @if ( PageId != "7613" ) 622 { 623 <p class="text-center color-subtle">@Blog.Date</p> 624 } 625 <p class="text-center font-weight-bold m-0 color-primary">@Translate("BlogReadMore", "L&aelig;s mere her")</p> 626 </div> 627 </div> 628 </a> 629 </div> 630 } 631 632 @helper RenderLargeBlogTeaser(Firstweb.Custom.CustomCode.Frontend.Helpers.Blog Blog, string ImagePosition) 633 { 634 string ImageClass = ImagePosition == "Left" ? "" : "offset-md-4"; 635 string TextClass = ImagePosition == "Left" ? "" : "left"; 636 string Image = "/Admin/Public/GetImage.ashx?Image=" + Blog.Image + "&Height=400&Crop=0"; 637 string CleanLink = Blog.Link.Replace("default.aspx?id", "Default.aspx?Id"); 638 <div class="col-12 blog"> 639 <div class="row"> 640 <div class="col-12 col-md-8 px-0 px-md-3 @ImageClass"> 641 <div class="image-container" style="background-image:url('@Image')"> 642 <img class="img-fluid" src="@Image" alt="@Blog.Header" /> 643 </div> 644 </div> 645 <div class="col-12 col-md-6 text-container mb-5 mb-md-0 @TextClass"> 646 <div class="text bg-white p-3"> 647 <div> 648 <h4>@Blog.Header</h4> 649 @Blog.Teaser 650 </div> 651 <a class="font-weight-bold" href="@CleanLink">@Translate("BlogReadMore", "L&aelig;s mere her")</a> 652 </div> 653 </div> 654 </div> 655 </div> 656 } 657 658 @helper RenderLatestBlogsTeasers() 659 { 660 var LatestBlogs = Firstweb.Custom.CustomCode.Frontend.Helpers.Blogs.GetLatestBlogs(); 661 foreach (var Blog in LatestBlogs) 662 { 663 @RenderBlogTeaser(Blog) 664 } 665 } 666 667 668 <div class="container pt-3 d-none d-md-block"> 669 670 <div class="bread"> 671 <p class="color-subtle">@Translate("Breadcrumb.CurrentPage", "Her er du:")</p> 672 <p class="bread-item color-subtle"> 673 <a href="/"> 674 @Translate("Breadcrumb.Frontpage", "Forside") 675 </a> 676 </p> 677 @foreach (var Group in ParentGroups) 678 { 679 <p class="bread-item color-subtle"> 680 @if (Group == ParentGroups.First()) 681 { 682 @Group.Name 683 ShowOnPageUrl = Group.ProductGroupFieldValues.GetProductGroupFieldValue("FirstwebGroupPrimaryPage").Value.ToString(); 684 } 685 else 686 { 687 <a href="/@ShowOnPageUrl&GroupId=@Group.Id"> 688 @Group.Name 689 </a> 690 } 691 </p> 692 } 693 694 <p class="active color-subtle">@ProductName</p> 695 </div> 696 697 </div> 698 699 <div class="container mt-3 mb-5 product-details position-relative" data-bind="viewModel: 'ProductViewModel'"> 700 701 <div class="d-none" data-bind="setInitValue: { observable: CartPageId, value: '@AjaxCartPageId' }"></div> 702 <div class="d-none" data-bind="setInitValue: { observable: MiniCart, value: '.js-mini-cart-lines' }"></div> 703 <div class="d-none" data-bind="setInitValue: { observable: CartCount, value: '.js-cart-count' }"></div> 704 <div class="d-none" data-bind="setInitValue: { observable: CustomersAlsoSawLines, value: '.js-customers-also-saw-lines' }"></div> 705 <div class="d-none" data-bind="setInitValue: { observable: CustomersAlsoSawPage, value: '@CustomersAlsoSawPageId' }"></div> 706 <div class="d-none" data-bind="setInitValue: { observable: MainProductId, value: '@ProductID' }"></div> 707 <div class="d-none" data-bind="setInitValue: { observable: VariantsEndpoint, value: '@VariantsEndpoint' }"></div> 708 <div class="d-none" data-bind="setInitValue: { observable: VariantDetailsEndpoint, value: '@VariantDetailsEndpoint' }"></div> 709 <div class="d-none" data-bind="setInitValue: { observable: TeaserText, value: '@TrimmedTeaser' }"></div> 710 <div class="d-none" data-bind="setInitValue: { observable: ProductName, value: '@TrimmedName' }"></div> 711 <div class="d-none" data-bind="setInitValue: { observable: ProductNumber, value: '@ProductNumber' }"></div> 712 <div class="d-none" data-bind="setInitValue: { observable: VariantId, value: '@VariantId' }"></div> 713 <div class="d-none" data-bind="setInitValue: { observable: Price, value: '@priceFormatted' }"></div> 714 <div class="d-none js-update-cart" data-bind="setInitValue: { observable: CartEndpoint, value: '@GetCartEndpoint' }, click: GetCart"></div> 715 716 <div id="blueimp-gallery" class="blueimp-gallery blueimp-gallery-controls"> 717 <div class="slides"></div> 718 <h3 class="title"></h3> 719 <a class="prev">&#8249;</a> 720 <a class="next">&#8250;</a> 721 <a class="close">x</a> 722 <a class="play-pause"></a> 723 <ol class="indicator"></ol> 724 </div> 725 726 <div class="modal fade video-modal" id="videoModal" tabindex="-1" role="dialog" aria-labelledby="video-modal" aria-hidden="true"> 727 <div class="modal-dialog modal-dialog-centered" role="document"> 728 <div class="modal-content"> 729 <div class="modal-body"> 730 <div id="player"></div> 731 </div> 732 </div> 733 </div> 734 </div> 735 736 <div class="add-to-cart-overlay" data-bind="css: { 'd-block': ProcessingAjax }"> 737 <p class="fs4 m-0 color-white">@Translate("ProductAjaxAddingToCart", "Tilf&oslash;jer til kurv") <i class="fa fa-spinner fa-spin ml-3 fs5"></i></p> 738 </div> 739 740 <div class="add-to-cart-overlay" data-bind="css: { 'd-block': ProcessingVariantDetailsAjax }"> 741 <p class="fs4 m-0 color-white">@Translate("ProductAjaxGettingVariant", "Henter variant") <i class="fa fa-spinner fa-spin ml-3 fs5"></i></p> 742 </div> 743 744 <div class="delivery-information-popup" data-bind="css: { 'd-flex': DeliveryInfoOpen }, click: ToggleDeliveryInfo"> 745 <div class="description-content bg-white px-3 py-4 px-lg-4 position-relative" data-bind="click: OpenDeliveryInfo, clickBubble: false"> 746 <div class="modal-closer-custom" data-bind="click: ToggleDeliveryInfo, clickBubble: false"> 747 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/close.svg" /> 748 </div> 749 @if (QuickDelivery) 750 { 751 <div> 752 @QuickDeliveryDescription 753 </div> 754 } 755 else if (DisplayAverageDeliveryTime) 756 { 757 <div> 758 @NormalDeliveryDescription 759 </div> 760 } 761 </div> 762 </div> 763 764 @if (CostPrice > 0) 765 { 766 string PriceDescription = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("DagsprisDescription"); 767 <div class="delivery-information-popup" data-bind="css: { 'd-flex': PriceInfoOpen }, click: TogglePriceInfo"> 768 <div class="description-content bg-white px-3 py-4 px-lg-4 position-relative" data-bind="click: OpenPriceInfo, clickBubble: false"> 769 <div class="modal-closer-custom" data-bind="click: TogglePriceInfo, clickBubble: false"> 770 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/close.svg" /> 771 </div> 772 <div> 773 @PriceDescription 774 </div> 775 </div> 776 </div> 777 } 778 779 <h1 class="header mb-4" data-bind="text: ProductName">@ProductName</h1> 780 781 <div class="d-flex flex-wrap"> 782 783 <div class="image-container position-relative overflow-hidden"> 784 785 <div class="discount-splash unimportant-hidden" data-bind="css: { 'd-flex': SplashType() == 1 }"><p class="m-0">@Translate("ProductOffer", "Tilbud")</p></div> 786 <div class="discount-splash unimportant-hidden new-item" data-bind="css: { 'd-flex': SplashType() == 2 }"><p class="m-0">@Translate("ProductNew", "Nyhed")</p></div> 787 <div class="discount-splash unimportant-hidden low-price" data-bind="css: { 'd-flex': SplashType() == 3 }"><p class="m-0">@Translate("ProductLowPrice", "Fast lavpris")</p></div> 788 <div class="discount-splash unimportant-hidden price-shape" data-bind="css: { 'd-flex': SplashType() == 4 }" style="background-color: @DailyPriceBackgroundColor;"><p class="m-0" style="color: @DailyPriceTextColor;">@Translate("ProductDailyPriceSplash", "Dagspris")</p></div> 789 <div class="discount-splash unimportant-hidden discount-splash--small" data-bind="css: { 'd-flex': SplashType() == 5}"><p class="m-0">@Translate("ProductCombinationOffer", "Kombinationstilbud")</p></div> 790 791 <div id="imageSlider" class="carousel slide" data-ride="carousel" data-interval="5000"> 792 <div class="carousel-inner align-items-center" data-bind="if: Images().length == 0"> 793 794 @foreach (var Image in Images) 795 { 796 if (First) 797 { 798 <a href="/Admin/Public/GetImage.ashx?Image=@Image&width=2000" class="mb-3 mb-lg-0 carousel-item active" data-gallery> 799 <img class="product-image main-image" src="/Admin/Public/GetImage.ashx?Image=@Image&width=950&height=500&crop=5" alt="@ProductName" /> 800 </a> 801 First = false; 802 FirstImage = "/Admin/Public/GetImage.ashx?Image=" + Image + "&width=950&height=500&crop=5"; 803 } 804 else 805 { 806 <a href="/Admin/Public/GetImage.ashx?Image=@Image&width=2000" class="mb-3 mb-lg-0 carousel-item" data-gallery> 807 <img class="product-image main-image" src="/Admin/Public/GetImage.ashx?Image=@Image&width=950&height=500&crop=5" alt="@ProductName" /> 808 </a> 809 } 810 811 } 812 813 </div> 814 <div class="carousel-inner align-items-center d-flex js-ko-carousel" data-bind="foreach: Images()"> 815 816 <a data-bind="attr: { href: '/Admin/Public/GetImage.ashx?Image=' + $data + '&width=2000' }" class="mb-3 mb-lg-0 carousel-item active" data-gallery> 817 <img class="product-image main-image" data-bind="attr: { src: '/Admin/Public/GetImage.ashx?Image=' + $data + '&width=950&height=500&crop=5' }" /> 818 </a> 819 820 </div> 821 </div> 822 823 @if (Images.Count > 1) 824 { 825 <div class="row small-gutter carousel-row" data-bind="css: { 'd-none': Images().length > 0 }"> 826 827 @foreach (var Image in Images) 828 { 829 if (FirstIndicator) 830 { 831 <div data-target="#imageSlider" data-slide-to="@IndicatorIncrementer" class="col-4 mt-lg-3 cursor-pointer active"> 832 <div class="secondary-image"> 833 <img class="product-image" src="/Admin/Public/GetImage.ashx?Image=@Image&width=400&height=230&crop=5" alt="@ProductName" /> 834 </div> 835 </div> 836 FirstIndicator = false; 837 } 838 else 839 { 840 <div data-target="#imageSlider" data-slide-to="@IndicatorIncrementer" class="col-4 mt-lg-3 cursor-pointer"> 841 <div class="secondary-image"> 842 <img class="product-image" src="/Admin/Public/GetImage.ashx?Image=@Image&width=400&height=230&crop=5" alt="@ProductName" /> 843 </div> 844 </div> 845 } 846 IndicatorIncrementer++; 847 } 848 849 @if (!string.IsNullOrEmpty(GetString("Ecom:Product:Field.VideoKlip.Value"))) 850 { 851 string BackgroundSize = !String.IsNullOrEmpty(GetString("Ecom:Product:Field.VideoBillede.Value.Clean")) ? "cover" : "contain"; 852 string OverlayImage = !String.IsNullOrEmpty(GetString("Ecom:Product:Field.VideoBillede.Value.Clean")) ? GetString("Ecom:Product:Field.VideoBillede.Value.Clean") : FirstImage; 853 <div class="youtube-video-container mt-lg-3" data-bind="youtubeVideo: { videoId: '@GetString("Ecom:Product:Field.VideoKlip.Value")', overlayId: 'js-video-overlay', playerId: 'player' }"> 854 <div id="js-video-overlay" class="video-overlay pointer" style="background-image:url('@OverlayImage');background-size: @BackgroundSize;"> 855 <div class="visual-overlay d-flex flex-column justify-content-center align-items-center h-100 w-100"> 856 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/Play.svg" /> 857 <p class="mt-3 mb-0 color-white">@Translate("Product.WatchVideo", "Se video")</p> 858 </div> 859 </div> 860 </div> 861 } 862 863 </div> 864 865 <div class="row small-gutter carousel-row unimportant-hidden" data-bind="css: { 'd-flex': Images().length > 0 }"> 866 <span class="images" style="display:contents;" data-bind="foreach: Images()"> 867 <!-- ko if: $index() == 0 --> 868 <div data-target="#imageSlider" class="col-4 mt-lg-3 cursor-pointer active" data-bind="click: $parent.ChangeSlide.bind($data, $index())"> 869 <div class="secondary-image"> 870 <img class="product-image" data-bind="attr: { src: '/Admin/Public/GetImage.ashx?Image=' + $data + '&width=400&height=230&crop=5' }" alt="@ProductName" /> 871 </div> 872 </div> 873 <!-- /ko --> 874 <!-- ko if: $index() != 0 --> 875 <div data-target="#imageSlider" class="col-4 mt-lg-3 cursor-pointer" data-bind="click: $parent.ChangeSlide.bind($data, $index())"> 876 <div class="secondary-image"> 877 <img class="product-image" data-bind="attr: { src: '/Admin/Public/GetImage.ashx?Image=' + $data + '&width=400&height=230&crop=5' }" alt="@ProductName" /> 878 </div> 879 </div> 880 <!-- /ko --> 881 </span> 882 883 @if (!String.IsNullOrEmpty(GetString("Ecom:Product:Field.VideoKlip.Value"))) 884 { 885 string BackgroundSize = !String.IsNullOrEmpty(GetString("Ecom:Product:Field.VideoBillede.Value.Clean")) ? "cover" : "contain"; 886 string OverlayImage = !String.IsNullOrEmpty(GetString("Ecom:Product:Field.VideoBillede.Value.Clean")) ? GetString("Ecom:Product:Field.VideoBillede.Value.Clean") : FirstImage; 887 <div class="youtube-video-container mt-lg-3" data-bind="youtubeVideo: { videoId: '@GetString("Ecom:Product:Field.VideoKlip.Value")', overlayId: 'js-videovariant-overlay', playerId: 'player' }"> 888 <div id="js-videovariant-overlay" class="video-overlay pointer" style="background-image:url('@OverlayImage');background-size: @BackgroundSize;"> 889 <div class="visual-overlay d-flex flex-column justify-content-center align-items-center h-100 w-100"> 890 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/Play.svg" /> 891 <p class="mt-3 mb-0 color-white">@Translate("Product.WatchVideo", "Se video")</p> 892 </div> 893 </div> 894 </div> 895 } 896 </div> 897 } 898 899 </div> 900 901 <div class="pl-lg-4 description-container d-flex flex-wrap flex-column mt-3 mt-lg-0 position-relative"> 902 903 <div class="mb-2">@ShortDescription</div> 904 905 <div class="w-100"><p class="color-primary pointer mb-2" data-bind="scrollToElement: { target: '#js-full-description' }">@Translate("ProductReadFullDescription", "L&aelig;s hele beskrivelsen")</p></div> 906 907 <div class="w-100"> 908 <p class="color-subtle m-0">@Translate("ProductProductNumber", "Produktnummer:") <span data-bind="text: ProductNumber">@ProductNumber</span></p> 909 <p class="color-subtle m-0"> 910 @if (!string.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.dybdeint.Value.Clean"))) 911 { 912 if (GetString("Ecom:Product:Field.dybdeint.Value.Clean") != "0") 913 { 914 <span>D/L: @GetValue("Ecom:Product:Field.dybdeint.Value.Clean")</span> 915 } 916 } 917 @if (!string.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.hoejdeint.Value.Clean"))) 918 { 919 if (GetString("Ecom:Product:Field.hoejdeint.Value.Clean") != "0") 920 { 921 <span>H: @GetValue("Ecom:Product:Field.hoejdeint.Value.Clean")</span> 922 } 923 } 924 @if (!string.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.breddeint.Value.Clean"))) 925 { 926 if (GetString("Ecom:Product:Field.breddeint.Value.Clean") != "0") 927 { 928 <span>B: @GetValue("Ecom:Product:Field.breddeint.Value.Clean")</span> 929 } 930 } 931 </p> 932 </div> 933 934 @if ((QuickDelivery || DisplayAverageDeliveryTime) && !HideDelivery) 935 { 936 <div class="w-100 mt-3"> 937 938 <div class="delivery-information"> 939 <svg class="delivery-icon mr-2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" fill="@DeliveryColor" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 612 612" style="enable-background:new 0 0 612 612;" xml:space="preserve"> 940 <g> 941 <g> 942 <path d="M226.764,375.35c-28.249,0-51.078,22.91-51.078,51.16c0,28.166,22.829,51.078,51.078,51.078s51.078-22.912,51.078-51.078 C277.841,398.26,255.013,375.35,226.764,375.35z M226.764,452.049c-14.125,0-25.54-11.498-25.54-25.541 c0-14.123,11.415-25.539,25.54-25.539c14.124,0,25.539,11.416,25.539,25.539C252.302,440.551,240.888,452.049,226.764,452.049z M612,337.561v54.541c0,13.605-11.029,24.635-24.636,24.635h-26.36c-4.763-32.684-32.929-57.812-66.927-57.812 c-33.914,0-62.082,25.129-66.845,57.812H293.625c-4.763-32.684-32.93-57.812-66.845-57.812c-33.915,0-62.082,25.129-66.844,57.812 h-33.012c-13.606,0-24.635-11.029-24.635-24.635v-54.541H612L612,337.561z M494.143,375.35c-28.249,0-51.16,22.91-51.16,51.16 c0,28.166,22.912,51.078,51.16,51.078c28.166,0,51.077-22.912,51.077-51.078C545.22,398.26,522.309,375.35,494.143,375.35z M494.143,452.049c-14.125,0-25.539-11.498-25.539-25.541c0-14.123,11.414-25.539,25.539-25.539 c14.042,0,25.539,11.416,25.539,25.539C519.682,440.551,508.185,452.049,494.143,452.049z M602.293,282.637l-96.817-95.751 c-6.159-6.077-14.453-9.526-23.076-9.526h-48.86v-18.313c0-13.631-11.004-24.635-24.635-24.635H126.907 c-13.55,0-24.635,11.005-24.635,24.635v3.86L2.3,174.429l177.146,23.068L0,215.323l178.814,25.423L0,256.25l102.278,19.29 l-0.007,48.403h509.712v-17.985C611.983,297.171,608.452,288.796,602.293,282.637z M560.084,285.839h-93.697 c-2.135,0-3.86-1.724-3.86-3.859v-72.347c0-2.135,1.725-3.86,3.86-3.86h17.82c0.985,0,1.971,0.411,2.71,1.068l75.796,72.347 C565.257,281.569,563.532,285.839,560.084,285.839z" /> 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 </g> 959 </g> 960 </svg> 961 <p class="delivery-text @DeliveryFontWeightModifier">@DeliveryTime - <a href="#" class="text-underline" data-bind="click: ToggleDeliveryInfo" style="color: @DeliveryColor">@Translate("Product.DeliveryInfo.ReadmoreText", "L&aelig;s mere")</a></p> 962 </div> 963 964 </div> 965 } 966 967 @if (CostPrice > 0) 968 { 969 <div class="w-100 mt-3"> 970 971 <div class="delivery-information"> 972 <div class="live-price-animation"></div> 973 <p class="delivery-text">@Translate("Product.PriceInfo.RecommendedPriceInfo", "Aktuel dagspris - ")<a href="#" class="text-underline" data-bind="click: TogglePriceInfo">@Translate("Product.PriceInfo.RecommendedPriceLink", "L&aelig;s mere")</a></p> 974 </div> 975 976 </div> 977 } 978 979 980 <div class="w-100"> 981 @if (GetBoolean("Ecom:Product:Field.Farvevarianter1.Value")) 982 { 983 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver1.png" /> 984 <p class="mb-0">@Translate("ProductColor1Text", "F&aring;s i flere forskellige varianter og moduler, bes&oslash;g dit lokale M&oslash;blér bolighus og f&aring; vejledning til design af din sofa.")</p> 985 } 986 else if (GetBoolean("Ecom:Product:Field.Farvevarianter2.Value")) 987 { 988 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver2.png" /> 989 <p class="mb-0">@Translate("ProductColor2Text", "Farve 2 hj&aelig;lpetekst")</p> 990 } 991 else if (GetBoolean("Ecom:Product:Field.Farvevarianter3.Value")) 992 { 993 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver3.png" /> 994 <p class="mb-0">@Translate("ProductColor3Text", "Farve 3 hj&aelig;lpetekst")</p> 995 } 996 else if (GetBoolean("Ecom:Product:Field.Farvevarianter4.Value")) 997 { 998 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver4.png" /> 999 <p class="mb-0">@Translate("ProductColor4Text", "Farve 4 hj&aelig;lpetekst")</p> 1000 } 1001 else if (GetBoolean("Ecom:Product:Field.Farvevarianter5.Value")) 1002 { 1003 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver5.png" /> 1004 <p class="mb-0">@Translate("ProductColor5Text", "Farve 5 hj&aelig;lpetekst")</p> 1005 } 1006 </div> 1007 @if (GetLoop("VariantCombinations").Count > 0) 1008 { 1009 var VariantGroupsWithMultipleOptions = GetLoop("VariantGroups").Where(x => x.GetLoop("VariantAvailableOptions").Count > 1); 1010 int VariantGroupCount = VariantGroupsWithMultipleOptions.Count(); 1011 int VariantCombinationsCount = GetLoop("VariantCombinations").Count; 1012 int PossibleVariantCombinations = 1; 1013 foreach (var VG in GetLoop("VariantGroups")) 1014 { 1015 PossibleVariantCombinations *= VG.GetLoop("VariantAvailableOptions").Count; 1016 } 1017 if (VariantGroupCount == 1) 1018 { 1019 var RelevantVariantGroup = VariantGroupsWithMultipleOptions.FirstOrDefault(); 1020 var SelectedVariant = RelevantVariantGroup.GetLoop("VariantAvailableOptions").Where(x => x.GetBoolean("Ecom:VariantOption.Selected")).FirstOrDefault(); 1021 <div class="position-relative"> 1022 <div class="variant-dropdown p-2 box-shadow mt-3 d-flex justify-content-between align-items-center pointer js-variant-dropdown"> 1023 <p class="m-0"><span class="font-weight-bold">@RelevantVariantGroup.GetString("Ecom:VariantGroup.Label")</span> - <span data-bind="text: SelectedVariantOption0">@SelectedVariant.GetString("Ecom:VariantOption.Name")</span></p> 1024 <i class="fas fa-chevron-down"></i> 1025 </div> 1026 <div class="variant-options bg-white"> 1027 @foreach (var Variant in RelevantVariantGroup.GetLoop("VariantAvailableOptions")) 1028 { 1029 var VariantCombination = GetLoop("VariantCombinations").Where(x => x.GetString("Ecom:VariantCombination.VariantID").ToString().Contains(Variant.GetString("Ecom:VariantOption.ID"))).FirstOrDefault(); 1030 string VariantName = Variant.GetString("Ecom:VariantOption.Name"); 1031 string VariantIdentifier = Variant.GetString("Ecom:VariantOption.ID"); 1032 string VariantLink = VariantCombination.GetString("Ecom:VariantCombination.Link.Clean"); 1033 string VariantPreview = String.Empty; 1034 var ObservableToSet = "SelectedVariantOption0"; 1035 var ObservableToSetId = "SelectedVariantOptionId0"; 1036 bool ShowPreview = RelevantVariantGroup.GetString("Ecom:VariantGroup.Name").ToString().ToLower().Contains("farve") || RelevantVariantGroup.GetString("Ecom:VariantGroup.Name").ToString().ToLower().Contains("materiale") ? true : false; 1037 if (!String.IsNullOrEmpty(Variant.GetString("Ecom:VariantOption.ImgSmall.Clean")) && ShowPreview) 1038 { 1039 if (Variant.GetString("Ecom:VariantOption.ImgSmall.Clean").StartsWith("#")) 1040 { 1041 VariantPreview = "style= \"background-color: " + Variant.GetString("Ecom:VariantOption.ImgSmall.Clean") + ";\""; 1042 } 1043 else 1044 { 1045 VariantPreview = "style=\"background-image: url('" + Variant.GetString("Ecom:VariantOption.ImgSmall.Clean") + "');\""; 1046 } 1047 } 1048 <div class="option pointer color-primary d-flex w-100 p-2 bg-grey" data-bind="click: UpdateVariantAndSetObservable.bind($data, '@VariantIdentifier', @ObservableToSet, '@VariantName', @ObservableToSetId)"> 1049 @if (!String.IsNullOrEmpty(VariantPreview)) 1050 { 1051 <span class="option-preview mr-2" @VariantPreview></span> 1052 } 1053 <span>@VariantName</span> 1054 </div> 1055 <div class="d-none" data-bind="setInitValue: { observable: @ObservableToSet, value: '@SelectedVariant.GetString("Ecom:VariantOption.Name")' }"></div> 1056 <div class="d-none" data-bind="setInitValue: { observable: @ObservableToSetId, value: '@SelectedVariant.GetString("Ecom:VariantOption.ID")' }"></div> 1057 1058 } 1059 </div> 1060 </div> 1061 } 1062 else if (PossibleVariantCombinations == VariantCombinationsCount) 1063 { 1064 Dictionary<string, string> CurrentlySelectedVariantOptions = new Dictionary<string, string>(); 1065 foreach (var VG in GetLoop("VariantGroups")) 1066 { 1067 foreach (var VO in VG.GetLoop("VariantAvailableOptions").Where(x => x.GetBoolean("Ecom:VariantOption.Selected"))) 1068 { 1069 CurrentlySelectedVariantOptions.Add(VG.GetString("Ecom:VariantGroup.Name"), VO.GetString("Ecom:VariantOption.ID")); 1070 } 1071 } 1072 int VGLoopCounter = 0; 1073 foreach (var VG in GetLoop("VariantGroups")) 1074 { 1075 List<LoopItem> RelevantVariantCombinations = new List<LoopItem>(); 1076 var VariantCombinationLink = GetLoop("VariantCombinations"); 1077 var SelectedVariant = VG.GetLoop("VariantAvailableOptions").Where(x => x.GetBoolean("Ecom:VariantOption.Selected")).FirstOrDefault(); 1078 var ObservableToSet = "SelectedVariantOption" + VGLoopCounter.ToString(); 1079 var ObservableToSetId = "SelectedVariantOptionId" + VGLoopCounter.ToString(); 1080 VGLoopCounter++; 1081 foreach (var VC in VariantCombinationLink) 1082 { 1083 var Add = true; 1084 foreach (var KVP in CurrentlySelectedVariantOptions.Where(s => s.Key != VG.GetString("Ecom:VariantGroup.Name"))) 1085 { 1086 if (!VC.GetString("Ecom:VariantCombination.VariantID").ToString().Contains(KVP.Value)) 1087 { 1088 Add = false; 1089 } 1090 } 1091 if (Add) 1092 { 1093 RelevantVariantCombinations.Add(VC); 1094 } 1095 } 1096 <div class="d-none" data-bind="setInitValue: { observable: @ObservableToSet, value: '@SelectedVariant.GetString("Ecom:VariantOption.Name")' }"></div> 1097 <div class="d-none" data-bind="setInitValue: { observable: @ObservableToSetId, value: '@SelectedVariant.GetString("Ecom:VariantOption.ID")' }"></div> 1098 1099 1100 <div class="position-relative"> 1101 <div class="variant-dropdown p-2 box-shadow mt-3 d-flex justify-content-between align-items-center pointer js-variant-dropdown"> 1102 <p class="m-0"><span class="font-weight-bold">@VG.GetString("Ecom:VariantGroup.Label")</span> - <span data-bind="text: @ObservableToSet">@SelectedVariant.GetString("Ecom:VariantOption.Name")</span></p> 1103 <i class="fas fa-chevron-down"></i> 1104 </div> 1105 <div class="variant-options bg-white"> 1106 @foreach (var VO in VG.GetLoop("VariantAvailableOptions")) 1107 { 1108 var VariantCombination = RelevantVariantCombinations.Where(vc => vc.GetString("Ecom:VariantCombination.VariantID").ToString().Contains(VO.GetString("Ecom:VariantOption.ID"))).FirstOrDefault(); 1109 string VariantLink = VariantCombination.GetString("Ecom:VariantCombination.Link.Clean"); 1110 string VariandOptionId = VariantCombination.GetString("Ecom:VariantCombination.VariantID"); 1111 string VariantPreview = String.Empty; 1112 string VOName = VO.GetString("Ecom:VariantOption.Name"); 1113 string VOId = VO.GetString("Ecom:VariantOption.ID"); 1114 bool ShowPreview = VG.GetString("Ecom:VariantGroup.Name").ToString().ToLower().Contains("farve") || VG.GetString("Ecom:VariantGroup.Name").ToString().ToLower().Contains("materiale") ? true : false; 1115 if (!String.IsNullOrEmpty(VO.GetString("Ecom:VariantOption.ImgSmall.Clean")) && ShowPreview) 1116 { 1117 if (VO.GetString("Ecom:VariantOption.ImgSmall.Clean").StartsWith("#")) 1118 { 1119 VariantPreview = "style= \"background-color: " + VO.GetString("Ecom:VariantOption.ImgSmall.Clean") + ";\""; 1120 } 1121 else 1122 { 1123 VariantPreview = "style=\"background-image: url('" + VO.GetString("Ecom:VariantOption.ImgSmall.Clean") + "');\""; 1124 } 1125 } 1126 <div class="option d-flex w-100 p-2 bg-grey color-primary pointer" data-bind="click: UpdateVariantAndSetObservable.bind($data, '@VOId', @ObservableToSet, '@VOName', @ObservableToSetId)"> 1127 @if (!String.IsNullOrEmpty(VariantPreview)) 1128 { 1129 <span class="option-preview mr-2" @VariantPreview></span> 1130 } 1131 @VOName 1132 </div> 1133 } 1134 </div> 1135 </div> 1136 } 1137 } 1138 else if (GetLoop("VariantGroups").Where(x => x.GetString("Ecom:VariantGroup.Name").ToString().ToLower().Contains("farve")).Count() > 0 && GetLoop("VariantGroups").Where(x => x.GetString("Ecom:VariantGroup.Name").ToString().ToLower().Contains("materiale")).Count() > 0) 1139 { 1140 <div class="mt-3"> 1141 <p class="mb-1">@Translate("CurrentDesignName", "Valgte design: ")</p> 1142 <p class="font-weight-bold">@CurrentVariantName</p> 1143 </div> 1144 <div class="d-flex"> 1145 <div class="btn btn-primary" data-bind="click: ToggleVariantPicker">@Translate("ChooseNewDesign", "V&aelig;lg design")</div> 1146 </div> 1147 } 1148 else 1149 { 1150 var SelectedVariant = GetLoop("VariantCombinations").Where(x => x.GetBoolean("Ecom:VariantCombination.Selected")).FirstOrDefault(); 1151 var SelectedVariantName = SelectedVariant.GetString("Ecom:VariantCombination.VariantText"); 1152 var SelectedVariantId = SelectedVariant.GetString("Ecom:VariantOption.ID"); 1153 <div class="d-none" data-bind="setInitValue: { observable: SelectedVariantOption0, value: '@SelectedVariantName' }"></div> 1154 <div class="d-none" data-bind="setInitValue: { observable: SelectedVariantOptionId0, value: '@SelectedVariantId' }"></div> 1155 <div class="position-relative"> 1156 <div class="variant-dropdown p-2 box-shadow mt-3 d-flex justify-content-between align-items-center pointer js-variant-dropdown"> 1157 <p class="m-0"><span class="font-weight-bold">@Translate("FallbackVariantsText", "VARIANTER")</span> - <span data-bind="text: SelectedVariantOption0">@SelectedVariantName</span></p> 1158 <i class="fas fa-chevron-down"></i> 1159 </div> 1160 <div class="variant-options bg-white"> 1161 @foreach (var Variant in GetLoop("VariantCombinations")) 1162 { 1163 string VariantName = Variant.GetString("Ecom:VariantCombination.VariantText"); 1164 string VariantLink = Variant.GetString("Ecom:VariantCombination.Link.Clean"); 1165 string VCId = Variant.GetString("Ecom:Product.VariantID"); 1166 <div class="option color-primary pointer d-block p-2 bg-grey" data-bind="click: UpdateVariantAndSetObservable.bind($data, '@VCId', SelectedVariantOption0, '@VariantName', SelectedVariantOptionId0)">@VariantName</div> 1167 } 1168 </div> 1169 </div> 1170 } 1171 1172 } 1173 1174 <div class="row align-items-end f-grow-1"> 1175 <div class="col-10 offset-1 col-sm-12 offset-sm-0 d-flex justify-content-center justify-content-lg-start"> 1176 1177 <div class="mt-5 d-flex flex-wrap flex-column justify-content-end"> 1178 @if (campaignText == "KOMBI") 1179 { 1180 <div class="d-none" data-bind="setInitValue: { observable: SplashType, value: 5 }"></div> 1181 <div class="d-none" data-bind="setInitValue: { observable: BeforePrice, value: '@normalPriceFormatted' }"></div> 1182 <div class="d-none" data-bind="setInitValue: { observable: Saving, value: '@sparFormatted' }"></div> 1183 } 1184 else if (spar > 0) 1185 { 1186 <div class="d-none" data-bind="setInitValue: { observable: SplashType, value: 1 }"></div> 1187 <div class="d-none" data-bind="setInitValue: { observable: BeforePrice, value: '@normalPriceFormatted' }"></div> 1188 <div class="d-none" data-bind="setInitValue: { observable: Saving, value: '@sparFormatted' }"></div> 1189 } 1190 else if (NewItem) 1191 { 1192 <div class="d-none" data-bind="setInitValue: { observable: SplashType, value: 2 }"></div> 1193 } 1194 else if (LowPrice) 1195 { 1196 <div class="d-none" data-bind="setInitValue: { observable: SplashType, value: 3 }"></div> 1197 } 1198 else if (CostPrice > 0) 1199 { 1200 <div class="d-none" data-bind="setInitValue: { observable: SplashType, value: 4 }"></div> 1201 } 1202 1203 <div class="w-100 unimportant-hidden" data-bind="css: { 'd-flex': SplashType() == 1 || SplashType() == 5}"> 1204 <p class="color-subtle fs0 m-0 text-uppercase mr-3">@Translate("PriceBefore", "Før") <span data-bind="text: BeforePrice"></span></p> 1205 <p class="bg-discount fs0 text-uppercase m-0 px-2 font-weight-bold">@Translate("PriceSaving", "Spar") <span data-bind="text: Saving"></span></p> 1206 </div> 1207 <p class="price font-weight-bold m-0"> 1208 <span class="unimportant-hidden" data-bind="css: { 'd-inline': SplashType() == 1 }">@Translate("ProductNow", "NU") </span> 1209 <span data-bind="text: Price"></span> 1210 </p> 1211 1212 1213 @if (!string.IsNullOrEmpty(campaignDateStart) && !string.IsNullOrEmpty(campaignDateEnd)) 1214 { 1215 string CampaignText = $"{Translate("Campaign.BeforeDate.Text", "Gældende fra:")} {campaignDateStart} {Translate("Campaign.BeforeDate.Text2", "t.o.m.")} {campaignDateEnd}"; 1216 <div class="d-none" data-bind="setInitValue: { observable: CampaignText, value: '@CampaignText' }"></div> 1217 } 1218 else 1219 { 1220 <div class="d-none" data-bind="setInitValue: { observable: CampaignText, value: '' }"></div> 1221 } 1222 1223 <p data-bind="text: CampaignText"></p> 1224 1225 @if (!string.IsNullOrEmpty(PayeverWidget.WidgetId) && !string.IsNullOrEmpty(PayeverWidget.BusinessId) && !string.IsNullOrEmpty(PayeverWidget.CheckoutId)) 1226 { 1227 <div> 1228 <div class="payever-widget-finexp" 1229 data-widgetid="@PayeverWidget.WidgetId" 1230 data-checkoutid="@PayeverWidget.CheckoutId" 1231 data-business="@PayeverWidget.BusinessId" 1232 data-type="text" 1233 data-reference="order-id" 1234 data-amount="@GetString("Ecom:Product.Price.Price").Replace(".", string.Empty).Replace(",", ".")"></div> 1235 <script> 1236 var script = document.createElement('script'); 1237 script.src = 'https://widgets.payever.org/finance-express/widget.min.js'; 1238 script.onload = function() { 1239 PayeverPaymentWidgetLoader.init( 1240 '.payever-widget-finexp' 1241 ); 1242 }; 1243 document.head.appendChild(script); 1244 </script> 1245 </div> 1246 } 1247 1248 @if (ForSale) 1249 { 1250 <div class="d-flex align-items-center mt-3"> 1251 <p class="m-0 font-weight-bold fs1 mr-2">@Translate("Product.Quantity", "Antal")</p> 1252 <div class="d-flex"> 1253 <div class="quantity-controls d-flex align-items-center mr-3"> 1254 <div class="control minus" data-bind="click: DecreaseQuantity"> 1255 - 1256 </div> 1257 <input type="text" name="Quantity" value="1" data-bind="value: Quantity" /> 1258 <div class="control plus" data-bind="click: IncrementQuantity"> 1259 + 1260 </div> 1261 </div> 1262 @{ 1263 string addToCartButtonClass = BlackFridayTheme == "True" ? "btn-black-friday bf-bg-black" : "btn-primary"; 1264 } 1265 <p class="btn @addToCartButtonClass add-to-cart m-0 d-flex align-items-center px-4" data-bind="click: AddToCart.bind($data, '@DataLayerPrice')"> 1266 @Translate("ProductAddToCart", "L&aelig;g i kurv") 1267 </p> 1268 1269 </div> 1270 </div> 1271 } 1272 else 1273 { 1274 <p>@Translate("Ecom:Product.NotForSaleMessage", "Produktet kan ikke købes.")</p> 1275 } 1276 </div> 1277 </div> 1278 </div> 1279 1280 </div> 1281 1282 </div> 1283 1284 <div class="d-flex flex-wrap justify-content-center external-ctas"> 1285 1286 @if (!String.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.ProviderLink.Value.Clean"))) 1287 { 1288 <a href="@GetString("Ecom:Product:Field.ProviderLink.Value.Clean")" target="_blank" class="bg-brand font-weight-bold d-flex align-items-center justify-content-center no-underline p-3 color-white"> 1289 <span>@Translate("Product.DesignSelf", "Design selv")</span> 1290 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/Pencil1.svg" /> 1291 </a> 1292 } 1293 1294 @if (!String.IsNullOrEmpty(ProductCatalogLink)) 1295 { 1296 <a class="btn btn-secondary rounded-0 d-flex justify-content-center align-items-center p-3 color-white font-weight-bold" href="@ProductCatalogLink" target="_blank"> 1297 <span>@Translate("ProductProductCatalogLink", "Se inspirationsbrochure")</span> 1298 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/Brochure.svg" /> 1299 </a> 1300 } 1301 1302 </div> 1303 1304 <div class="d-flex flex-wrap mt-5"> 1305 1306 <div id="js-full-description"> 1307 <p class="fs3 mb-2 font-weight-bold">@Translate("ProductDescriptionHeader", "Beskrivelse")</p> 1308 <div class="unimportant-hidden" data-bind="html: FullDescription, css: { 'd-block': FullDescription().length > 0 }"> 1309 </div> 1310 <div data-bind="css: { 'd-none': FullDescription().length > 0 }"> 1311 @LongDescription 1312 1313 @if (!string.IsNullOrEmpty(productionDescription)) 1314 { 1315 <br /><br /> 1316 <h4>@Translate("Product.ProductionDescription.Headline", "Produktionsbeskrivelse")</h4> 1317 @:@productionDescription 1318 } 1319 </div> 1320 </div> 1321 1322 </div> 1323 1324 <div class="d-flex flex-wrap my-5"> 1325 1326 <div class="description-container mt-5 mt-lg-0"> 1327 <div class="bg-brand color-white box-shadow p-3 pb-5 questions"> 1328 <img class="staff-img" src="/Files/Templates/Designs/Mobler2018/assets/img/sovnmand.png" /> 1329 1330 @if (!String.IsNullOrWhiteSpace(shopInfo.ShopName) && shopInfo.ShopName != "Møblér") 1331 { 1332 <div class="shop-info"> 1333 <h4 class="fs45">@Translate("ProductQuestionsHeader", "Har du sp&oslash;rsm&aring;l?")</h4> 1334 <p class="mb-1">@shopInfo.Address, @shopInfo.PostalAndCity</p> 1335 <p class="mb-1">@shopInfo.Phone</p> 1336 @if (!String.IsNullOrEmpty(shopInfo.Email)) 1337 { 1338 <p class="mb-1"><a class="color-white" href="mailto:@shopInfo.Email">@shopInfo.Email</a></p> 1339 } 1340 @if (!String.IsNullOrEmpty(shopInfo.ShopName1)) 1341 { 1342 <p class="mb-1 mt-2">@shopInfo.Address1, @shopInfo.PostalAndCity1</p> 1343 <p class="mb-2">@shopInfo.Phone1</p> 1344 } 1345 @if (!String.IsNullOrEmpty(shopInfo.ShopName2)) 1346 { 1347 <p class="mb-1 mt-2">@shopInfo.Address2, @shopInfo.PostalAndCity2</p> 1348 <p class="mb-2">@shopInfo.Phone2</p> 1349 } 1350 @shopInfo.OpeningHours 1351 </div> 1352 } 1353 else 1354 { 1355 <h4 class="fs45">@Translate("ProductQuestionsHeader", "Har du sp&oslash;rsm&aring;l?")</h4> 1356 <p class="fs2 text">@Translate("ProductSelectNearestShop", "V&aelig;lg n&aelig;rmeste M&oslash;bler bolighus")</p> 1357 <select style="width: 280px;" data-bind="select2SelectShop: { overlay: 'find-dealer-overlay', placeholder: '@SelectPlaceholder' }"> 1358 @if (shopname == "Møblér") 1359 { 1360 <option selected disabled>@Translate("HeaderFindShop", "Find forhandler")</option> 1361 } 1362 else 1363 { 1364 foreach (var Shop in AllShops.Where(x => x.MenuText == shopname)) 1365 { 1366 <option selected disabled value="@HttpUtility.UrlEncode(Shop.MenuText)">@Shop.ShopName</option> 1367 } 1368 } 1369 @foreach (var Shop in AllShops) 1370 { 1371 if (Shop.MenuText != "Møblér" && Shop.MenuText != shopname) 1372 { 1373 var Address = "<div>" + Shop.Address + "</div><div>" + Shop.PostalAndCity + "</div>"; 1374 <option title="@Address" value="@HttpUtility.UrlEncode(Shop.MenuText)">@Shop.ShopName {{@Shop.PostalAndCity @Shop.SearchKeyWords}}</option> 1375 } 1376 } 1377 </select> 1378 } 1379 </div> 1380 </div> 1381 1382 </div> 1383 1384 @if (GetInteger("Ecom:Product.RelatedCount") > 0) 1385 { 1386 foreach (var Group in GetLoop("ProductRelatedGroups").Where(g => g.GetLoop("Products").Count > 0)) 1387 { 1388 <div class="py-3 mt-5" data-bind="viewModel: 'ProductListViewModel'"> 1389 1390 <div class="delivery-information-popup" data-bind="css: { 'd-flex': QuickDeliveryInfoOpen }, click: ToggleQuickDeliveryInfo"> 1391 <div class="description-content bg-white px-3 py-4 px-lg-4 position-relative" data-bind="click: OpenQuickDeliveryInfo, clickBubble: false"> 1392 <div class="modal-closer-custom" data-bind="click: ToggleQuickDeliveryInfo, clickBubble: false"> 1393 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/close.svg" /> 1394 </div> 1395 <div> 1396 @QuickDeliveryDescription 1397 </div> 1398 </div> 1399 </div> 1400 <div class="delivery-information-popup" data-bind="css: { 'd-flex': NormalDeliveryInfoOpen }, click: ToggleNormalDeliveryInfo"> 1401 <div class="description-content bg-white px-3 py-4 px-lg-4 position-relative" data-bind="click: OpenNormalDeliveryInfo, clickBubble: false"> 1402 <div class="modal-closer-custom" data-bind="click: ToggleNormalDeliveryInfo, clickBubble: false"> 1403 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/close.svg" /> 1404 </div> 1405 <div> 1406 @NormalDeliveryDescription 1407 </div> 1408 </div> 1409 </div> 1410 1411 <div class="line-through-header mb-3"> 1412 <h4>@Group.GetString("Ecom:Product:RelatedGroup.Name")</h4> 1413 </div> 1414 1415 <div class="row"> 1416 1417 @foreach (var Product in Group.GetLoop("Products")) 1418 { 1419 var productToRender = Product; 1420 string productId = Product.GetString("Ecom:Product.ID"); 1421 string variantIdLoop = productsDisplayVariant.GetDisplayVariantId(productId); 1422 1423 if (Product.GetLoop("VariantCombinations").Count > 0 && Product.GetLoop("VariantCombinations").Any(x => x.GetString("Ecom:Product.VariantID").Equals(variantIdLoop))) 1424 { 1425 productToRender = Product.GetLoop("VariantCombinations").FirstOrDefault(x => x.GetString("Ecom:Product.VariantID").Equals(variantIdLoop)); 1426 } 1427 1428 @RenderProduct(productToRender) 1429 } 1430 </div> 1431 </div> 1432 } 1433 } 1434 1435 1436 @if(Mobler.Website.CustomCode.RelewiseCustom.RelewiseConnectorSetting.ShowRecommendations) 1437 { 1438 if (GetLoop("RelewiseRecommendationProducts").Count > 0) 1439 { 1440 <div class="py-3 mt-5" data-bind="viewModel: 'ProductListViewModel'"> 1441 1442 1443 <div class="line-through-header mb-3"> 1444 <h4>@Translate("Product:RelewiseRecommendationProducts.Headline", "Vi anbefaler du også tjekker disse produkter ud...")</h4> 1445 </div> 1446 1447 <div class="row"> 1448 1449 @foreach (var Product in GetLoop("RelewiseRecommendationProducts")) 1450 { 1451 var productToRender = Product; 1452 string productId = Product.GetString("Ecom:Product.ID"); 1453 string variantIdLoop = productsDisplayVariant.GetDisplayVariantId(productId); 1454 1455 if (Product.GetLoop("VariantCombinations").Count > 0 && Product.GetLoop("VariantCombinations").Any(x => x.GetString("Ecom:Product.VariantID").Equals(variantIdLoop))) 1456 { 1457 productToRender = Product.GetLoop("VariantCombinations").FirstOrDefault(x => x.GetString("Ecom:Product.VariantID").Equals(variantIdLoop)); 1458 } 1459 1460 @RenderProduct(productToRender) 1461 } 1462 </div> 1463 </div> 1464 } 1465 } 1466 1467 1468 @if (RelatedBlogs.Count > 0) 1469 { 1470 string ImagePosition = "Left"; 1471 <div class="feature-blogs my-5"> 1472 1473 <div class="row"> 1474 1475 @foreach (var Blog in RelatedBlogs) 1476 { 1477 @RenderLargeBlogTeaser(Blog, ImagePosition) 1478 if (ImagePosition == "Left") 1479 { 1480 ImagePosition = "Right"; 1481 } 1482 else 1483 { 1484 ImagePosition = "Left"; 1485 } 1486 } 1487 1488 </div> 1489 1490 </div> 1491 } 1492 1493 1494 <div class="after-add-to-cart bg-white box-shadow" data-bind="css: { 'd-block': ProductAddedToCart }"> 1495 <div class="closer fs3 pointer" data-bind="click: ProductAddedToCart(false)"> 1496 <i class="fas fa-times-circle color-primary"></i> 1497 </div> 1498 <div class="p-3"> 1499 <p class="font-weight-bold fs4 text-uppercase m-0"> 1500 <i class="fas fa-check-circle color-primary"></i> 1501 @Translate("ProductProductAddedToCart", "Varen er lagt i indk&oslash;bskurven") 1502 </p> 1503 </div> 1504 <div class="mini-cart large-cart power-step"> 1505 1506 <div class="position-relative"> 1507 <div class="cart-command-loader unimportant-hidden justify-content-center align-items-center" data-bind="css: { 'd-flex': Loading }"> 1508 <div class="d-flex align-items-center"> 1509 <p class="m-0 mr-2">@Translate("Cart.UpdatingCart", "Opdaterer kurv")</p> 1510 <i class="fas fa-spinner fa-spin"></i> 1511 </div> 1512 </div> 1513 1514 <div class="lines" data-bind="foreach: Orderlines"> 1515 <div class="cartline d-flex justify-content-between align-items-center px-3 py-2 position-relative bg-grey"> 1516 <span class="delete-orderline color-subtle cursor-pointer mr-2" data-bind="click: $parent.DeleteOrderline.bind($data, OrderlineId)"> 1517 <i class="fas fa-times"></i> 1518 </span> 1519 <div class="product-image w-10"> 1520 <img class="img-fluid" data-bind="attr: { src: ImagePath }" /> 1521 </div> 1522 <div class="flex-fill px-3 w-75"> 1523 <p class="font-weight-bold m-0" data-bind="text: ProductName"></p> 1524 <p class="m-0 color-subtle small-quantity-indicator"><span data-bind="text: Quantity"></span> stk. a <span data-bind="text: QuantityPrice"></span></p> 1525 <div class="variant-dimensions" data-bind="foreach: VariantDimensions"> 1526 <p class="m-0 color-subtle color-dark-grey font-weight-bold"> 1527 <span data-bind="text: Label"></span> 1528 <span class="font-weight-normal" data-bind="text: Value"></span> 1529 </p> 1530 </div> 1531 </div> 1532 <div class="qty-counter w-10"> 1533 <div class="d-flex"> 1534 <div class="quantity-controls d-flex align-items-center mr-3"> 1535 <div class="control minus" data-bind="click: $parent.QuantityControl.bind($data, -1, OrderlineId)"> 1536 - 1537 </div> 1538 <input disabled type="text" name="Quantity" value="1" data-bind="value: Quantity, attr: { 'data-id': 'js-input-' + OrderlineId }" /> 1539 <div class="control plus" data-bind="click: $parent.QuantityControl.bind($data, 1, OrderlineId)"> 1540 + 1541 </div> 1542 </div> 1543 </div> 1544 </div> 1545 1546 <p class="fs0 m-0 orderline-price" data-bind="text: OrderlinePrice"></p> 1547 </div> 1548 </div> 1549 @if (BlackFridayTheme == "True") 1550 { 1551 <div class="bf-bg-black p-3 d-flex justify-content-between align-items-center price-summary"> 1552 <p class="m-0 color-white fs-12px font-weight-semibold">@Translate("MiniCartTotal", "Din kurv i alt (ex. fragt)")</p> 1553 <p class="m-0 color-white fs1 font-weight-bold" data-bind="text: CartTotalNoFees"></p> 1554 </div> 1555 } 1556 else 1557 { 1558 <div class="bg-brand p-3 d-flex justify-content-between align-items-center price-summary"> 1559 <p class="m-0 color-white fs-12px font-weight-semibold">@Translate("MiniCartTotal", "Din kurv i alt (ex. fragt)")</p> 1560 <p class="m-0 color-white fs1 font-extra-bold" data-bind="text: CartTotalNoFees"></p> 1561 </div> 1562 } 1563 </div> 1564 1565 </div> 1566 <div class="p-3 d-flex justify-content-between"> 1567 <p class="pointer py-2 px-3 bg-dark-grey color-white rounded m-0" data-bind="click: ProductAddedToCart(false)">@Translate("MiniCartContinueShopping", "Handel videre")</p> 1568 1569 @if (BlackFridayTheme == "True") 1570 { 1571 <a href="@CartPage" class="pointer py-2 px-3 bf-bg-black color-white rounded d-block no-underline">@Translate("MiniCartGoToCheckout", "G&aring; til kassen")</a> 1572 } 1573 else 1574 { 1575 <a href="@CartPage" class="pointer py-2 px-3 bg-brand color-white rounded d-block no-underline">@Translate("MiniCartGoToCheckout", "G&aring; til kassen")</a> 1576 } 1577 1578 </div> 1579 <div class="js-customers-also-saw-lines"></div> 1580 1581 </div> 1582 <div class="variant-picker" data-bind="css: { 'open': VariantPickerOpen }"> 1583 <div class="closer color-primary fs5 pointer" data-bind="click: ToggleVariantPicker"> 1584 <i class="fas fa-times-circle"></i> 1585 </div> 1586 <div class="container py-5 position-relative"> 1587 <h3 class="fs4 text-center">Design din @ProductName</h3> 1588 @{ 1589 var ColorDimensions = GetLoop("VariantGroups").Where(g => g.GetString("Ecom:VariantGroup.Name").ToLower().Contains("farve")); 1590 var NonColorDimensions = GetLoop("VariantGroups").Where(g => !g.GetString("Ecom:VariantGroup.Name").ToLower().Contains("farve")); 1591 int FilterCounter = 0; 1592 string RowClass = NonColorDimensions.Any() && ColorDimensions.Any() ? "flex-row-reverse" : ""; 1593 } 1594 <div class="row mt-5 @RowClass"> 1595 @if (ColorDimensions.Any()) 1596 { 1597 <div class="col-12 col-md-8"> 1598 @foreach (var VariantDimension in ColorDimensions) 1599 { 1600 string DimensionName = VariantDimension.GetString("Ecom:VariantGroup.Name"); 1601 string FilterName = "filter-" + FilterCounter; 1602 FilterCounter++; 1603 <div class="mb-5 mb-md-0"> 1604 <p class="font-weight-bold fs2 mb-2">@DimensionName</p> 1605 <div class="row custom-row"> 1606 @foreach (var VariantOption in VariantDimension.GetLoop("VariantAvailableOptions").OrderBy(v => v.GetString("Ecom:VariantOption.Name"))) 1607 { 1608 string VariantOptionName = VariantOption.GetString("Ecom:VariantOption.Name"); 1609 string VariantOptionId = VariantOption.GetString("Ecom:VariantOption.ID"); 1610 string Preview = VariantOption.GetString("Ecom:VariantOption.ImgSmall.Clean"); 1611 string PreviewCss = ""; 1612 if (!String.IsNullOrEmpty(Preview)) 1613 { 1614 if (Preview.StartsWith("#")) 1615 { 1616 PreviewCss = "style= \"background-color: " + Preview + ";\""; 1617 } 1618 else 1619 { 1620 PreviewCss = "style=\"background-image: url('" + Preview + "');\""; 1621 } 1622 } 1623 <div class="col-2 col-sm-3 col-md-2 mb-3 d-flex flex-column justify-content-end pointer color-variant" data-bind="click: AddToFilter.bind($data, $element, '@FilterName', '@VariantOptionId')"> 1624 <p class="mb-0 color-variant-name d-none d-sm-block">@VariantOptionName</p> 1625 <div class="variant-preview position-relative d-flex" @PreviewCss></div> 1626 </div> 1627 } 1628 </div> 1629 </div> 1630 } 1631 </div> 1632 } 1633 @if (NonColorDimensions.Any()) 1634 { 1635 <div class="col-12 col-sm-6 col-md-4"> 1636 @foreach (var VariantDimension in NonColorDimensions) 1637 { 1638 string DimensionName = VariantDimension.GetString("Ecom:VariantGroup.Name"); 1639 string FilterName = "filter-" + FilterCounter; 1640 FilterCounter++; 1641 <div class="mb-5"> 1642 <p class="font-weight-bold fs2 mb-2">@DimensionName</p> 1643 <div class="row custom-row"> 1644 @foreach (var VariantOption in VariantDimension.GetLoop("VariantAvailableOptions").OrderBy(v => v.GetString("Ecom:VariantOption.Name"))) 1645 { 1646 string VariantOptionName = VariantOption.GetString("Ecom:VariantOption.Name"); 1647 string VariantOptionId = VariantOption.GetString("Ecom:VariantOption.ID"); 1648 string Preview = VariantOption.GetString("Ecom:VariantOption.ImgSmall.Clean"); 1649 string PreviewCss = ""; 1650 if (!String.IsNullOrEmpty(Preview)) 1651 { 1652 if (Preview.StartsWith("#")) 1653 { 1654 PreviewCss = "style= \"background-color: " + Preview + ";\""; 1655 } 1656 else 1657 { 1658 PreviewCss = "style=\"background-image: url('/Files" + Preview + "');\""; 1659 } 1660 } 1661 if (DimensionName == "STØRRELSE") 1662 { 1663 <div class="col-6 col-sm-4 mb-3 d-flex flex-column justify-content-end pointer size-variant" data-bind="click: AddToFilter.bind($data, $element, '@FilterName', '@VariantOptionId')"> 1664 <div class="variant-preview position-relative d-flex justify-content-center align-items-center" @PreviewCss> 1665 <p class="mb-0 color-variant-name font-weight-bold">@VariantOptionName</p> 1666 </div> 1667 </div> 1668 } 1669 else 1670 { 1671 <div class="col-6 col-sm-4 mb-3 d-flex flex-column justify-content-end pointer" data-bind="click: AddToFilter.bind($data, $element, '@FilterName', '@VariantOptionId')"> 1672 <p class="mb-0 color-variant-name">@VariantOptionName</p> 1673 <div class="variant-preview position-relative d-flex" @PreviewCss></div> 1674 </div> 1675 } 1676 } 1677 </div> 1678 </div> 1679 } 1680 </div> 1681 } 1682 1683 <div class="col-12 d-flex justify-content-end"> 1684 <p class="color-primary pointer my-3" data-bind="click: ResetFilters">Nulstil</p> 1685 </div> 1686 </div> 1687 <p class="font-weight-bold fs2 mt-5"> 1688 @Translate("ChooseProduct", "V&aelig;lg produkt") 1689 </p> 1690 <div class="row align-items-end" data-bind="foreach: FilteredVariants"> 1691 <div class="col-12 col-sm-6 col-md-3 mb-3"> 1692 <a class="color-black no-underline" data-bind="attr: { href: Link }"> 1693 <p class="fs0 font-weight-bold m-0" data-bind="text: Name"></p> 1694 <img class="img-fluid box-shadow my-1" data-bind="attr: { src: Image }" /> 1695 <div class="d-flex justify-content-center mt-2"> 1696 <div class="btn btn-primary">@Translate("VariantChooseProduct", "V&aelig;lg")</div> 1697 </div> 1698 </a> 1699 </div> 1700 </div> 1701 <div data-bind="visible: FilteredVariants().length == 0"> 1702 <p class="font-weight-bold mt-3 fs3">@Translate("VariantsNoResults", "Filtreringen gav ingen resultater")</p> 1703 </div> 1704 </div> 1705 </div> 1706 </div> 1707 1708 @SnippetStart("DataLayerOverwrites") 1709 <script> 1710 ecomm_pagetype = "Product"; 1711 ecomm_totalvalue = @GetString("Ecom:Product.Price.Price").Replace(".","").Replace(",","."); 1712 ecomm_prodid = "@GetString("Ecom:Product.ID")"; 1713 </script> 1714 @SnippetEnd("DataLayerOverwrites") 1715 1716 <script> 1717 var dataLayer = window.dataLayer || []; 1718 dataLayer.push({ 1719 'event': 'product', 1720 'ecommerce': { 1721 'detail': { 1722 'actionField': { 1723 'list': '@DataLayerParentGroups' 1724 }, 1725 'products': [{ 1726 'id': '@ProductID', 1727 'name': '@ProductName', 1728 'image': '@OgImage', 1729 'brand': '@BrandName', 1730 'variant': '@CurrentVariantName', 1731 'category': '@DataLayerParentGroup', 1732 'price': '@DataLayerPrice' 1733 }] 1734 } 1735 }, 1736 'page': { 1737 'type': 'product', 1738 'environment': 'production' 1739 } 1740 }); 1741 </script> 1742