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_8bb0521b193d47ca900e8794d1f0de19.Execute() in D:\dynamicweb.net\Solutions\mobler.LIVE\Files\Templates\Designs\Mobler2018\eCom\Product\Product.cshtml:line 1078
   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 Group = Dynamicweb.Ecommerce.Products.Group 5 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 6 7 8 @{ 9 string shopname = MoblerHelpers.GetShopName(); 10 string SelectPlaceholder = Translate("ShopSelectPlaceholder", "Indtast by, postnummer eller adresse"); 11 var shopInfo = MoblerHelpers.ShopInfo(); 12 int ShopPageId = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetInt("ShopPageId"); 13 var AllShops = Firstweb.Custom.CustomCode.Frontend.Helpers.Shops.GetAllShops(ShopPageId); 14 int AjaxCartPageId = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetInt("AjaxCartPageId"); 15 int CustomersAlsoSawPageId = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetInt("CustomersAlsoSawPageId"); 16 string CartPage = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("CartPage"); 17 string VariantsEndpoint = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("VariantsUrl"); 18 string VariantDetailsEndpoint = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("VariantDetailsUrl"); 19 string BlackFridayTheme = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("BlackFridayTheme"); 20 string ProductID = GetString("Ecom:Product.ID"); 21 string GroupID = Firstweb.Custom.CustomCode.Frontend.Helpers.EcomGroups.GetProductDefaultShopGroupID(ProductID); //GetString("Ecom:Product.PrimaryOrFirstGroupID"); 22 string DefaultVariantID = GetString("Ecom:Product.DefaultVariantComboID"); 23 string ProductImage = MoblerHelpers.GetProductListImage(ProductID, DefaultVariantID); 24 string ProductName = GetString("Ecom:Product.Name"); 25 string ProductNumber = GetString("Ecom:Product.Number"); 26 string ProductCatalogLink = !String.IsNullOrEmpty(GetString("Ecom:Product:Field.ProductCatelog.Value.Clean")) ? GetString("Ecom:Product:Field.ProductCatelog.Value.Clean") : ""; 27 string VariantId = GetString("Ecom:Product.VariantID"); 28 string ShortDescription = GetString("Ecom:Product.ShortDescription"); 29 string LongDescription = GetString("Ecom:Product.LongDescription").Replace("||", "<br/>"); 30 string CurrentVariantName = GetString("Ecom:Product.SelectedVariantComboName"); 31 var FaqQuestions = MoblerHelpers.GetProductFAQs(ProductID, GroupID); 32 33 string MetaDescription = GetString("Ecom:Product.MetaDescription"); 34 35 if (string.IsNullOrEmpty(MetaDescription)) 36 { 37 MetaDescription = Mobler.Website.CustomCode.Frontend.Helpers.Text.GetFirstLine(LongDescription.Replace("<br/>", " ")); 38 } 39 else 40 { 41 MetaDescription = ""; //Meta data description bliver sat af DW, hvis dette felt er udfyldt, sÃ¥ vi skal ikke opsætte noget. 42 } 43 44 45 var RelatedBlogs = Firstweb.Custom.CustomCode.Frontend.Helpers.Blogs.GetBlogsRelatedToProduct(ProductID); 46 bool NewItem = GetBoolean("Ecom:Product:Field.NewItem"); 47 bool LowPrice = GetBoolean("Ecom:Product:Field.Splash3"); 48 49 50 Mobler.Website.CustomCode.Frontend.ProductsDisplayVariant productsDisplayVariant = Mobler.Website.CustomCode.Frontend.ProductsDisplayVariant.Instance(); 51 52 bool ForSale = !GetBoolean("Ecom:Product:Field.NotForSaleOnline"); 53 54 var MainProdNr = string.Empty; 55 var VariantNr = string.Empty; 56 string FirstImage = ""; 57 if (!string.IsNullOrWhiteSpace(ProductNumber)) 58 { 59 string[] MainProdSplit = ProductNumber.Split('_'); 60 61 62 63 if (MainProdSplit.Length > 1) 64 { 65 MainProdNr = MainProdSplit[0]; 66 VariantNr = MainProdSplit[1]; 67 } 68 else 69 { 70 MainProdNr = ProductNumber; 71 } 72 } 73 var Images = MoblerHelpers.GetProductImages(GetString("Ecom:Product.ID"), VariantId); 74 bool First = true; 75 bool FirstIndicator = true; 76 int IndicatorIncrementer = 0; 77 string ProductLink = GetString("Ecom:Product.Link.Clean"); 78 79 double ActualPrice = GetDouble("Ecom:Product.Price.Price"); 80 double spar = 0; 81 double price = 0; 82 double normalPrice = 0; 83 84 string priceFormatted = ""; 85 string sparFormatted = ""; 86 string normalPriceFormatted = ""; 87 88 string campaignColor = ""; 89 string campaignText = ""; 90 string campaignDate = ""; 91 92 93 string campaignDateStart = ""; 94 string campaignDateEnd = ""; 95 96 97 bool CampaignActiveOnProduct = GetBoolean("CampaignModule:Product.CampaignActiveOnProduct"); 98 if (!CampaignActiveOnProduct) 99 { 100 price = ActualPrice; 101 priceFormatted = MoblerHelpers.formatPrice(price); 102 } 103 else 104 { 105 normalPrice = GetDouble("CampaignModule:Product.CampaignProduct.NormalPrice"); 106 normalPriceFormatted = GetString("CampaignModule:Product.CampaignProduct.NormalPrice.FormattedRetail"); 107 108 price = GetDouble("CampaignModule:Product.CampaignProduct.CampaignPrice"); 109 priceFormatted = GetString("CampaignModule:Product.CampaignProduct.CampaignPrice.FormattedRetail"); 110 111 spar = GetDouble("CampaignModule:Product.CampaignProduct.DiscountAmount"); 112 sparFormatted = GetString("CampaignModule:Product.CampaignProduct.DiscountAmount.FormattedRetail"); 113 114 campaignColor = GetString("CampaignModule:Product.Campaign.Color"); 115 campaignText = GetString("CampaignModule:Product.Campaign.Text"); 116 117 campaignDateStart = GetString("CampaignModule:Product.CampaignProduct.Campaign.Start"); 118 campaignDateEnd = GetString("CampaignModule:Product.CampaignProduct.Campaign.End"); 119 } 120 121 122 string DataLayerPrice = ActualPrice.ToString().Replace(".", "").Replace(",", "."); 123 System.Web.HttpContext.Current.Items["OverrideOgTags"] = true; 124 string OgImage = "https://mobler.dk" + Images.FirstOrDefault(); 125 126 string TrimmedTeaser = Firstweb.Custom.CustomCode.Frontend.Helpers.JSFormatting.TrimLinebreaks(ShortDescription); 127 string TrimmedName = Firstweb.Custom.CustomCode.Frontend.Helpers.JSFormatting.TrimLinebreaks(ProductName); 128 129 var ParentGroups = Firstweb.Custom.CustomCode.Frontend.Helpers.EcomGroups.getBreadCrumbGroupList(GroupID, true); 130 var DataLayerParentGroup = ParentGroups.Last().Name; 131 List<string> DataLayerParentGroupStrings = ParentGroups.Select(group => group.Name).ToList(); 132 string DataLayerParentGroups = string.Join(" > ", DataLayerParentGroupStrings); 133 134 string ShowOnPageUrl = ""; 135 string GetCartEndpoint = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("GetCartJson"); 136 137 string QuickDeliveryColor = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("QuickDeliveryColor"); 138 string QuickDeliveryDescription = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("QuickDeliveryDescription"); 139 string NormalDeliveryDescription = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("NormalDeliveryDescription"); 140 string BrandName = GetString("Ecom:Product:Field.Maerkevarer.Value.Clean"); 141 string DeliveryTime = Translate("DeliveryTime." + BrandName, "Gns. leveringstid 3-12 dage"); 142 bool HideDelivery = DeliveryTime == "Skjul"; 143 string DeliveryColor = "#00AB5D"; 144 bool QuickDelivery = GetBoolean("Ecom:Product:Field.QuickDelivery.Value.Clean"); 145 string CustomDelivery = GetString("Ecom:Product:Field.CustomDeliveryTime.Value.Clean"); 146 if (QuickDelivery) 147 { 148 DeliveryColor = QuickDeliveryColor; 149 DeliveryTime = Translate("DeliveryTime.QuickDelivery", "Ekstra hurtig levering"); 150 } 151 else if (!String.IsNullOrEmpty(CustomDelivery)) 152 { 153 DeliveryTime = CustomDelivery; 154 } 155 string DeliveryFontWeightModifier = QuickDelivery ? "font-weight-bold" : ""; 156 bool DisplayAverageDeliveryTime = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetBoolean("DisplayAverageDeliveryTime"); 157 158 double CostPrice = GetDouble("Ecom:Product:Field.FirstwebCostPrice.Value.Raw"); 159 string DailyPriceBackgroundColor = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("AktuelDagsprisBackgroundColor"); 160 string DailyPriceTextColor = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("AktuelDagsprisTextColor"); 161 string EAN = GetString("Ecom:Product:Field.FirstEan.Value"); 162 163 string productionDescription = GetString("Ecom:Product:Field.FirstwebProductionDescription"); 164 } 165 166 167 @SnippetStart("ProductDetailsMeta") 168 @if (!string.IsNullOrEmpty(MetaDescription)) 169 { 170 <meta name="description" content="@MetaDescription" /> 171 } 172 @SnippetEnd("ProductDetailsMeta") 173 174 @SnippetStart("OgTags") 175 <meta property="og:type" content="product" /> 176 <meta property="og:description" content="@Regex.Replace(ShortDescription, "<.*?>", String.Empty)" /> 177 <meta property="og:image" content="@OgImage" /> 178 @SnippetEnd("OgTags") 179 180 @using Mobler.Website.CustomModules.MoblerHelpers 181 @using Dynamicweb.Ecommerce.Products 182 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 183 184 @helper RenderProduct(LoopItem product) 185 { 186 string BlackFridayTheme = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("BlackFridayTheme"); 187 string CTAbg = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("SeProdukt_CTABaggrundsfarve"); 188 string CTAtextcolor = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("SeProdukt_CTATekstfarve"); 189 string ProductID = product.GetString("Ecom:Product.ID"); 190 string ProductNumber = product.GetString("Ecom:Product.Number"); 191 string DefaultVariantID = product.GetString("Ecom:Product.DefaultVariantComboID"); 192 string VariantId = product.GetString("Ecom:Product.VariantID"); 193 if (String.IsNullOrEmpty(VariantId)) { 194 VariantId = DefaultVariantID; 195 } 196 var Images = MoblerHelpers.GetProductImages(ProductID, VariantId); 197 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); 198 string ProductName = product.GetString("Ecom:Product.Name"); 199 200 bool NewItem = product.GetBoolean("Ecom:Product:Field.NewItem"); 201 bool LowPrice = product.GetBoolean("Ecom:Product:Field.Splash3"); 202 double CostPrice = product.GetDouble("Ecom:Product:Field.FirstwebCostPrice.Value.Raw"); 203 string ShortDescription = product.GetString("Ecom:Product.ShortDescription"); 204 string PriceSaving = product.GetString("Ecom:Product:Field.Spar.Value"); 205 string ProductLink = product.GetString("Ecom:Product.Link.Clean"); 206 207 if (!String.IsNullOrEmpty(VariantId)) { 208 ProductLink = ProductLink + "&variantid=" + VariantId; 209 } 210 211 212 /* 213 double DiscountedPrice = product.GetDouble("Ecom:Product.Discount.Price.Price"); 214 double ActualPrice = product.GetDouble("Ecom:Product.Price.Price"); 215 var TotalDiscount = product.GetDouble("Ecom:Product.Discount.TotalAmount.Price"); 216 double spar = 0; 217 double price = 0; 218 if (!product.GetBoolean("Ecom:Product:Field.Splash3.Value") && !product.GetBoolean("Ecom:Product:Field.Offer.Value")) 219 { 220 if (DiscountedPrice < ActualPrice) 221 { 222 spar = TotalDiscount; 223 price = DiscountedPrice; 224 } 225 else 226 { 227 price = ActualPrice; 228 } 229 } 230 else 231 { 232 spar = product.GetDouble("Ecom:Product:Field.Spar.Value.Clean"); 233 price = product.GetDouble("Ecom:Product.Price.Price"); 234 } 235 double OriginalPrice = spar + price; 236 */ 237 238 double ActualPrice = product.GetDouble("Ecom:Product.Price.Price"); 239 double spar = 0; 240 double price = 0; 241 double normalPrice = 0; 242 243 string priceFormatted = ""; 244 string sparFormatted = ""; 245 string normalPriceFormatted = ""; 246 247 string campaignColor = ""; 248 string campaignText = ""; 249 string campaignDate = ""; 250 251 bool CampaignActiveOnProduct = product.GetBoolean("CampaignModule:Product.CampaignActiveOnProduct"); 252 if (!CampaignActiveOnProduct) 253 { 254 price = ActualPrice; 255 priceFormatted = MoblerHelpers.formatPrice(price); 256 } 257 else 258 { 259 normalPrice = product.GetDouble("CampaignModule:Product.CampaignProduct.NormalPrice"); 260 normalPriceFormatted = product.GetString("CampaignModule:Product.CampaignProduct.NormalPrice.FormattedRetail"); 261 262 price = product.GetDouble("CampaignModule:Product.CampaignProduct.CampaignPrice"); 263 priceFormatted = product.GetString("CampaignModule:Product.CampaignProduct.CampaignPrice.FormattedRetail"); 264 265 spar = product.GetDouble("CampaignModule:Product.CampaignProduct.DiscountAmount"); 266 sparFormatted = product.GetString("CampaignModule:Product.CampaignProduct.DiscountAmount.FormattedRetail"); 267 268 campaignColor = product.GetString("CampaignModule:Product.Campaign.Color"); 269 campaignText = product.GetString("CampaignModule:Product.Campaign.Text"); 270 } 271 272 273 274 var languageId = product.GetString("Ecom:Product.LanguageID"); 275 var dwProduct = Dynamicweb.Ecommerce.Services.Products.GetProductById(ProductID, VariantId, languageId); 276 var VariantCombinations = dwProduct.VariantCombinations.ToList().Where(v => v.GetProduct(languageId) != null && v.GetProduct(languageId).Number != VariantId); 277 bool ManyVariants = VariantCombinations.Count() > 3; 278 if (ManyVariants) 279 { 280 VariantCombinations = VariantCombinations.Take(3).ToList(); 281 } 282 283 string BrandName = product.GetString("Ecom:Product:Field.Maerkevarer.Value.Clean"); 284 bool QuickDelivery = product.GetBoolean("Ecom:Product:Field.QuickDelivery.Value.Clean"); 285 string DeliveryTime = Translate("DeliveryTime." + BrandName, "Gns. leveringstid 3-12 dage"); 286 string DeliveryColor = "#00AB5D"; 287 if (QuickDelivery) { 288 DeliveryTime = Translate("DeliveryTime.QuickDelivery", "Ekstra hurtig levering"); 289 DeliveryColor = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("QuickDeliveryColor"); 290 } 291 292 <div class="col-11 col-sm-6 col-lg-3 mt-3 mx-auto mx-sm-0 mb-3 js-product-list-item"> 293 <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"> 294 <div class="d-flex flex-column align-items-center"> 295 <div class="img-container"> 296 <img class="js-product-image-@ProductID" src="@ProductImage" alt="@ProductName" /> 297 </div> 298 </div> 299 <h3 class="mt-2 mb-0 fs2 text-center mw-100 font-weight-bold">@ProductName</h3> 300 <div class="fs0 color-subtle text-center mw-100 mb-0 product-description">@ShortDescription</div> 301 <div class="d-flex flex-wrap justify-content-center w-100 align-content-end flex-fill"> 302 <p class="color-subtle m-0 fs0 w-100 text-center"> 303 @if (!string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.dybdeint.Value.Clean"))) 304 { 305 if (product.GetString("Ecom:Product:Field.dybdeint.Value.Clean") != "0") 306 { 307 <span>D/L: @product.GetValue("Ecom:Product:Field.dybdeint.Value.Clean")</span> 308 } 309 } 310 @if (!string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.hoejdeint.Value.Clean"))) 311 { 312 if (product.GetString("Ecom:Product:Field.hoejdeint.Value.Clean") != "0") 313 { 314 <span>H: @product.GetValue("Ecom:Product:Field.hoejdeint.Value.Clean")</span> 315 } 316 } 317 @if (!string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.breddeint.Value.Clean"))) 318 { 319 if (product.GetString("Ecom:Product:Field.breddeint.Value.Clean") != "0") 320 { 321 <span>B: @product.GetValue("Ecom:Product:Field.breddeint.Value.Clean")</span> 322 } 323 } 324 </p> 325 @if (QuickDelivery) 326 { 327 <div class="delivery-information my-2 w-100 justify-content-center"> 328 <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"> 329 <g> 330 <g> 331 <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" /> 332 333 </g> 334 </g> 335 </svg> 336 <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> 337 </div> 338 } 339 <p class="fs5 my-0 d-flex align-items-center font-weight-bold"> 340 @if (VariantCombinations.Count() > 0) 341 { 342 <span class="font-weight-semibold fs0 mr-2">@Translate("ProductPrice.From", "Fra")</span> 343 } 344 @priceFormatted 345 </p> 346 @if (CostPrice > 0) 347 { 348 string DailyPriceBackgroundColor = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("AktuelDagsprisBackgroundColor"); 349 string DailyPriceTextColor = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("AktuelDagsprisTextColor"); 350 string EAN = product.GetString("Ecom:Product:Field.FirstEan.Value"); 351 var PriceShapePrices = Firstweb.Custom.CustomCode.Frontend.Helpers.PriceShapeHelpers.GetProductPrice(ProductNumber, EAN); 352 353 <div class="discount-splash price-shape" style="background-color: @DailyPriceBackgroundColor"><p class="m-0" style="color: @DailyPriceTextColor;">@Translate("ProductDailyPriceSplash", "Dagspris")</p></div> 354 if (PriceShapePrices != null) 355 { 356 if (price < PriceShapePrices.MoblerPrice) 357 { 358 <div class="d-flex w-100 mb-2"> 359 @if (VariantCombinations.Count() > 0) 360 { 361 <p class="color-black-w-opacity fs0 m-0 text-uppercase">@Translate("PriceRecommendPriceFrom", "Vejl. pris fra") @MoblerHelpers.formatPrice(PriceShapePrices.MoblerPrice)</p> 362 } 363 else 364 { 365 <p class="color-black-w-opacity fs0 m-0 text-uppercase">@Translate("PriceRecommendPrice", "Vejl. pris") @MoblerHelpers.formatPrice(PriceShapePrices.MoblerPrice)</p> 366 } 367 </div> 368 } 369 } 370 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 CleanLink = Blog.Link.Replace("default.aspx?id", "Default.aspx?Id"); 612 <div class="col-12 col-md-4 px-0 px-md-3 mb-4"> 613 <a href="@CleanLink" class="blog d-block"> 614 <div class="image" style="background-image:url('@Blog.Image')"> 615 <img class="d-none" src="@Blog.Image" alt="Alternate Text" /> 616 </div> 617 <div class="text"> 618 <div class="positioning"> 619 <h4 class="col-10 col-md-9 px-2 pt-3 bg-white font-weight-bold text-center mx-auto">@Blog.Header</h4> 620 <p class="text-center color-subtle">@Blog.Date</p> 621 <p class="text-center font-weight-bold m-0 color-primary">@Translate("BlogReadMore", "L&aelig;s mere her")</p> 622 </div> 623 </div> 624 </a> 625 </div> 626 } 627 628 @helper RenderLargeBlogTeaser(Firstweb.Custom.CustomCode.Frontend.Helpers.Blog Blog, string ImagePosition) 629 { 630 string ImageClass = ImagePosition == "Left" ? "" : "offset-md-4"; 631 string TextClass = ImagePosition == "Left" ? "" : "left"; 632 string Image = "/Admin/Public/GetImage.ashx?Image=" + Blog.Image + "&Height=400&Crop=0"; 633 string CleanLink = Blog.Link.Replace("default.aspx?id", "Default.aspx?Id"); 634 <div class="col-12 blog"> 635 <div class="row"> 636 <div class="col-12 col-md-8 px-0 px-md-3 @ImageClass"> 637 <div class="image-container" style="background-image:url('@Image')"> 638 <img class="img-fluid" src="@Image" alt="@Blog.Header" /> 639 </div> 640 </div> 641 <div class="col-12 col-md-6 text-container mb-5 mb-md-0 @TextClass"> 642 <div class="text bg-white p-3"> 643 <div> 644 <h4>@Blog.Header</h4> 645 @Blog.Teaser 646 </div> 647 <a class="font-weight-bold" href="@CleanLink">@Translate("BlogReadMore", "L&aelig;s mere her")</a> 648 </div> 649 </div> 650 </div> 651 </div> 652 } 653 654 @helper RenderLatestBlogsTeasers() 655 { 656 var LatestBlogs = Firstweb.Custom.CustomCode.Frontend.Helpers.Blogs.GetLatestBlogs(); 657 foreach (var Blog in LatestBlogs) 658 { 659 @RenderBlogTeaser(Blog) 660 } 661 } 662 663 664 <div class="container pt-3 d-none d-md-block"> 665 666 <div class="bread"> 667 <p class="color-subtle">@Translate("Breadcrumb.CurrentPage", "Her er du:")</p> 668 <p class="bread-item color-subtle"> 669 <a href="/"> 670 @Translate("Breadcrumb.Frontpage", "Forside") 671 </a> 672 </p> 673 @foreach (var Group in ParentGroups) 674 { 675 <p class="bread-item color-subtle"> 676 @if (Group == ParentGroups.First()) 677 { 678 @Group.Name 679 ShowOnPageUrl = Group.ProductGroupFieldValues.GetProductGroupFieldValue("FirstwebGroupPrimaryPage").Value.ToString(); 680 } 681 else 682 { 683 <a href="/@ShowOnPageUrl&GroupId=@Group.Id"> 684 @Group.Name 685 </a> 686 } 687 </p> 688 } 689 690 <p class="active color-subtle">@ProductName</p> 691 </div> 692 693 </div> 694 695 <div class="container mt-3 mb-5 product-details position-relative" data-bind="viewModel: 'ProductViewModel'"> 696 697 <div class="d-none" data-bind="setInitValue: { observable: CartPageId, value: '@AjaxCartPageId' }"></div> 698 <div class="d-none" data-bind="setInitValue: { observable: MiniCart, value: '.js-mini-cart-lines' }"></div> 699 <div class="d-none" data-bind="setInitValue: { observable: CartCount, value: '.js-cart-count' }"></div> 700 <div class="d-none" data-bind="setInitValue: { observable: CustomersAlsoSawLines, value: '.js-customers-also-saw-lines' }"></div> 701 <div class="d-none" data-bind="setInitValue: { observable: CustomersAlsoSawPage, value: '@CustomersAlsoSawPageId' }"></div> 702 <div class="d-none" data-bind="setInitValue: { observable: MainProductId, value: '@ProductID' }"></div> 703 <div class="d-none" data-bind="setInitValue: { observable: VariantsEndpoint, value: '@VariantsEndpoint' }"></div> 704 <div class="d-none" data-bind="setInitValue: { observable: VariantDetailsEndpoint, value: '@VariantDetailsEndpoint' }"></div> 705 <div class="d-none" data-bind="setInitValue: { observable: TeaserText, value: '@TrimmedTeaser' }"></div> 706 <div class="d-none" data-bind="setInitValue: { observable: ProductName, value: '@TrimmedName' }"></div> 707 <div class="d-none" data-bind="setInitValue: { observable: ProductNumber, value: '@ProductNumber' }"></div> 708 <div class="d-none" data-bind="setInitValue: { observable: VariantId, value: '@VariantId' }"></div> 709 <div class="d-none" data-bind="setInitValue: { observable: Price, value: '@priceFormatted' }"></div> 710 <div class="d-none js-update-cart" data-bind="setInitValue: { observable: CartEndpoint, value: '@GetCartEndpoint' }, click: GetCart"></div> 711 712 <div id="blueimp-gallery" class="blueimp-gallery blueimp-gallery-controls"> 713 <div class="slides"></div> 714 <h3 class="title"></h3> 715 <a class="prev">‹</a> 716 <a class="next">›</a> 717 <a class="close">×</a> 718 <a class="play-pause"></a> 719 <ol class="indicator"></ol> 720 </div> 721 722 <div class="modal fade video-modal" id="videoModal" tabindex="-1" role="dialog" aria-labelledby="video-modal" aria-hidden="true"> 723 <div class="modal-dialog modal-dialog-centered" role="document"> 724 <div class="modal-content"> 725 <div class="modal-body"> 726 <div id="player"></div> 727 </div> 728 </div> 729 </div> 730 </div> 731 732 <div class="add-to-cart-overlay" data-bind="css: { 'd-block': ProcessingAjax }"> 733 <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> 734 </div> 735 736 <div class="add-to-cart-overlay" data-bind="css: { 'd-block': ProcessingVariantDetailsAjax }"> 737 <p class="fs4 m-0 color-white">@Translate("ProductAjaxGettingVariant", "Henter variant") <i class="fa fa-spinner fa-spin ml-3 fs5"></i></p> 738 </div> 739 740 <div class="delivery-information-popup" data-bind="css: { 'd-flex': DeliveryInfoOpen }, click: ToggleDeliveryInfo"> 741 <div class="description-content bg-white px-3 py-4 px-lg-4 position-relative" data-bind="click: OpenDeliveryInfo, clickBubble: false"> 742 <div class="modal-closer-custom" data-bind="click: ToggleDeliveryInfo, clickBubble: false"> 743 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/close.svg" /> 744 </div> 745 @if (QuickDelivery) 746 { 747 <div> 748 @QuickDeliveryDescription 749 </div> 750 } 751 else if (DisplayAverageDeliveryTime) 752 { 753 <div> 754 @NormalDeliveryDescription 755 </div> 756 } 757 </div> 758 </div> 759 760 @if (CostPrice > 0) 761 { 762 string PriceDescription = Firstweb.Custom.CustomCode.Frontend.Helpers.AreaItems.GetString("DagsprisDescription"); 763 <div class="delivery-information-popup" data-bind="css: { 'd-flex': PriceInfoOpen }, click: TogglePriceInfo"> 764 <div class="description-content bg-white px-3 py-4 px-lg-4 position-relative" data-bind="click: OpenPriceInfo, clickBubble: false"> 765 <div class="modal-closer-custom" data-bind="click: TogglePriceInfo, clickBubble: false"> 766 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/close.svg" /> 767 </div> 768 <div> 769 @PriceDescription 770 </div> 771 </div> 772 </div> 773 } 774 775 776 <h1 class="header mb-4" data-bind="text: ProductName">@ProductName</h1> 777 778 <div class="d-flex flex-wrap"> 779 780 <div class="image-container position-relative overflow-hidden"> 781 782 <div class="discount-splash unimportant-hidden" data-bind="css: { 'd-flex': SplashType() == 1 }"><p class="m-0">@Translate("ProductOffer", "Tilbud")</p></div> 783 <div class="discount-splash unimportant-hidden new-item" data-bind="css: { 'd-flex': SplashType() == 2 }"><p class="m-0">@Translate("ProductNew", "Nyhed")</p></div> 784 <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> 785 <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> 786 787 <div id="imageSlider" class="carousel slide" data-ride="carousel" data-interval="5000"> 788 <div class="carousel-inner align-items-center" data-bind="if: Images().length == 0"> 789 790 @foreach (var Image in Images) 791 { 792 if (First) 793 { 794 <a href="/Admin/Public/GetImage.ashx?Image=@Image&width=2000" class="mb-3 mb-lg-0 carousel-item active" data-gallery> 795 <img class="product-image main-image" src="/Admin/Public/GetImage.ashx?Image=@Image&width=950&height=500&crop=5" alt="@ProductName" /> 796 </a> 797 First = false; 798 FirstImage = "/Admin/Public/GetImage.ashx?Image=" + Image + "&width=950&height=500&crop=5"; 799 } 800 else 801 { 802 <a href="/Admin/Public/GetImage.ashx?Image=@Image&width=2000" class="mb-3 mb-lg-0 carousel-item" data-gallery> 803 <img class="product-image main-image" src="/Admin/Public/GetImage.ashx?Image=@Image&width=950&height=500&crop=5" alt="@ProductName" /> 804 </a> 805 } 806 807 } 808 809 </div> 810 <div class="carousel-inner align-items-center d-flex js-ko-carousel" data-bind="foreach: Images()"> 811 812 <a data-bind="attr: { href: '/Admin/Public/GetImage.ashx?Image=' + $data + '&width=2000' }" class="mb-3 mb-lg-0 carousel-item active" data-gallery> 813 <img class="product-image main-image" data-bind="attr: { src: '/Admin/Public/GetImage.ashx?Image=' + $data + '&width=950&height=500&crop=5' }" /> 814 </a> 815 816 </div> 817 </div> 818 819 @if (Images.Count > 1) 820 { 821 <div class="row small-gutter carousel-row" data-bind="css: { 'd-none': Images().length > 0 }"> 822 823 @foreach (var Image in Images) 824 { 825 if (FirstIndicator) 826 { 827 <div data-target="#imageSlider" data-slide-to="@IndicatorIncrementer" class="col-4 mt-lg-3 cursor-pointer active"> 828 <div class="secondary-image"> 829 <img class="product-image" src="/Admin/Public/GetImage.ashx?Image=@Image&width=400&height=230&crop=5" alt="@ProductName" /> 830 </div> 831 </div> 832 FirstIndicator = false; 833 } 834 else 835 { 836 <div data-target="#imageSlider" data-slide-to="@IndicatorIncrementer" class="col-4 mt-lg-3 cursor-pointer"> 837 <div class="secondary-image"> 838 <img class="product-image" src="/Admin/Public/GetImage.ashx?Image=@Image&width=400&height=230&crop=5" alt="@ProductName" /> 839 </div> 840 </div> 841 } 842 IndicatorIncrementer++; 843 } 844 845 @if (!String.IsNullOrEmpty(GetString("Ecom:Product:Field.VideoKlip.Value"))) 846 { 847 string BackgroundSize = !String.IsNullOrEmpty(GetString("Ecom:Product:Field.VideoBillede.Value.Clean")) ? "cover" : "contain"; 848 string OverlayImage = !String.IsNullOrEmpty(GetString("Ecom:Product:Field.VideoBillede.Value.Clean")) ? GetString("Ecom:Product:Field.VideoBillede.Value.Clean") : FirstImage; 849 <div class="youtube-video-container mt-lg-3" data-bind="youtubeVideo: { videoId: '@GetString("Ecom:Product:Field.VideoKlip.Value")', overlayId: 'js-video-overlay', playerId: 'player' }"> 850 <div id="js-video-overlay" class="video-overlay pointer" style="background-image:url('@OverlayImage');background-size: @BackgroundSize;"> 851 <div class="visual-overlay d-flex flex-column justify-content-center align-items-center h-100 w-100"> 852 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/Play.svg" /> 853 <p class="mt-3 mb-0 color-white">@Translate("Product.WatchVideo", "Se video")</p> 854 </div> 855 </div> 856 </div> 857 } 858 859 </div> 860 861 <div class="row small-gutter carousel-row unimportant-hidden" data-bind="css: { 'd-flex': Images().length > 0 }, foreach: Images()"> 862 863 <!-- ko if: $index() == 0 --> 864 <div data-target="#imageSlider" class="col-4 mt-lg-3 cursor-pointer active" data-bind="click: $parent.ChangeSlide.bind($data, $index())"> 865 <div class="secondary-image"> 866 <img class="product-image" data-bind="attr: { src: '/Admin/Public/GetImage.ashx?Image=' + $data + '&width=400&height=230&crop=5' }" alt="@ProductName" /> 867 </div> 868 </div> 869 <!-- /ko --> 870 <!-- ko if: $index() != 0 --> 871 <div data-target="#imageSlider" class="col-4 mt-lg-3 cursor-pointer" data-bind="click: $parent.ChangeSlide.bind($data, $index())"> 872 <div class="secondary-image"> 873 <img class="product-image" data-bind="attr: { src: '/Admin/Public/GetImage.ashx?Image=' + $data + '&width=400&height=230&crop=5' }" alt="@ProductName" /> 874 </div> 875 </div> 876 <!-- /ko --> 877 878 </div> 879 } 880 881 </div> 882 883 <div class="pl-lg-4 description-container d-flex flex-wrap flex-column mt-3 mt-lg-0 position-relative"> 884 885 <div class="mb-2">@ShortDescription</div> 886 887 <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> 888 889 <div class="w-100"> 890 <p class="color-subtle m-0">@Translate("ProductProductNumber", "Produktnummer:") <span data-bind="text: ProductNumber">@ProductNumber</span></p> 891 <p class="color-subtle m-0"> 892 @if (!string.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.dybdeint.Value.Clean"))) 893 { 894 if (GetString("Ecom:Product:Field.dybdeint.Value.Clean") != "0") 895 { 896 <span>D/L: @GetValue("Ecom:Product:Field.dybdeint.Value.Clean")</span> 897 } 898 } 899 @if (!string.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.hoejdeint.Value.Clean"))) 900 { 901 if (GetString("Ecom:Product:Field.hoejdeint.Value.Clean") != "0") 902 { 903 <span>H: @GetValue("Ecom:Product:Field.hoejdeint.Value.Clean")</span> 904 } 905 } 906 @if (!string.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.breddeint.Value.Clean"))) 907 { 908 if (GetString("Ecom:Product:Field.breddeint.Value.Clean") != "0") 909 { 910 <span>B: @GetValue("Ecom:Product:Field.breddeint.Value.Clean")</span> 911 } 912 } 913 </p> 914 </div> 915 916 @if ((QuickDelivery || DisplayAverageDeliveryTime) && !HideDelivery) 917 { 918 <div class="w-100 mt-3"> 919 920 <div class="delivery-information"> 921 <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"> 922 <g> 923 <g> 924 <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" /> 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 </g> 941 </g> 942 </svg> 943 <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> 944 </div> 945 946 </div> 947 } 948 949 @if (CostPrice > 0) 950 { 951 <div class="w-100 mt-3"> 952 953 <div class="delivery-information"> 954 <div class="live-price-animation"></div> 955 <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> 956 </div> 957 958 </div> 959 } 960 961 962 <div class="w-100"> 963 @if (GetBoolean("Ecom:Product:Field.Farvevarianter1.Value")) 964 { 965 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver1.png" /> 966 <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> 967 } 968 else if (GetBoolean("Ecom:Product:Field.Farvevarianter2.Value")) 969 { 970 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver2.png" /> 971 <p class="mb-0">@Translate("ProductColor2Text", "Farve 2 hj&aelig;lpetekst")</p> 972 } 973 else if (GetBoolean("Ecom:Product:Field.Farvevarianter3.Value")) 974 { 975 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver3.png" /> 976 <p class="mb-0">@Translate("ProductColor3Text", "Farve 3 hj&aelig;lpetekst")</p> 977 } 978 else if (GetBoolean("Ecom:Product:Field.Farvevarianter4.Value")) 979 { 980 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver4.png" /> 981 <p class="mb-0">@Translate("ProductColor4Text", "Farve 4 hj&aelig;lpetekst")</p> 982 } 983 else if (GetBoolean("Ecom:Product:Field.Farvevarianter5.Value")) 984 { 985 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver5.png" /> 986 <p class="mb-0">@Translate("ProductColor5Text", "Farve 5 hj&aelig;lpetekst")</p> 987 } 988 </div> 989 @if (GetLoop("VariantCombinations").Count > 0) 990 { 991 var VariantGroupsWithMultipleOptions = GetLoop("VariantGroups").Where(x => x.GetLoop("VariantAvailableOptions").Count > 1); 992 int VariantGroupCount = VariantGroupsWithMultipleOptions.Count(); 993 int VariantCombinationsCount = GetLoop("VariantCombinations").Count; 994 int PossibleVariantCombinations = 1; 995 foreach (var VG in GetLoop("VariantGroups")) 996 { 997 PossibleVariantCombinations *= VG.GetLoop("VariantAvailableOptions").Count; 998 } 999 if (VariantGroupCount == 1) 1000 { 1001 var RelevantVariantGroup = VariantGroupsWithMultipleOptions.FirstOrDefault(); 1002 var SelectedVariant = RelevantVariantGroup.GetLoop("VariantAvailableOptions").Where(x => x.GetBoolean("Ecom:VariantOption.Selected")).FirstOrDefault(); 1003 <div class="position-relative"> 1004 <div class="variant-dropdown p-2 box-shadow mt-3 d-flex justify-content-between align-items-center pointer js-variant-dropdown"> 1005 <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> 1006 <i class="fas fa-chevron-down"></i> 1007 </div> 1008 <div class="variant-options bg-white"> 1009 @foreach (var Variant in RelevantVariantGroup.GetLoop("VariantAvailableOptions")) 1010 { 1011 var VariantCombination = GetLoop("VariantCombinations").Where(x => x.GetString("Ecom:VariantCombination.VariantID").ToString().Contains(Variant.GetString("Ecom:VariantOption.ID"))).FirstOrDefault(); 1012 string VariantName = Variant.GetString("Ecom:VariantOption.Name"); 1013 string VariantIdentifier = Variant.GetString("Ecom:VariantOption.ID"); 1014 string VariantLink = VariantCombination.GetString("Ecom:VariantCombination.Link.Clean"); 1015 string VariantPreview = String.Empty; 1016 var ObservableToSet = "SelectedVariantOption0"; 1017 var ObservableToSetId = "SelectedVariantOptionId0"; 1018 bool ShowPreview = RelevantVariantGroup.GetString("Ecom:VariantGroup.Name").ToString().ToLower().Contains("farve") || RelevantVariantGroup.GetString("Ecom:VariantGroup.Name").ToString().ToLower().Contains("materiale") ? true : false; 1019 if (!String.IsNullOrEmpty(Variant.GetString("Ecom:VariantOption.ImgSmall.Clean")) && ShowPreview) 1020 { 1021 if (Variant.GetString("Ecom:VariantOption.ImgSmall.Clean").StartsWith("#")) 1022 { 1023 VariantPreview = "style= \"background-color: " + Variant.GetString("Ecom:VariantOption.ImgSmall.Clean") + ";\""; 1024 } 1025 else 1026 { 1027 VariantPreview = "style=\"background-image: url('" + Variant.GetString("Ecom:VariantOption.ImgSmall.Clean") + "');\""; 1028 } 1029 } 1030 <div class="option pointer color-primary d-flex w-100 p-2 bg-grey" data-bind="click: UpdateVariantAndSetObservable.bind($data, '@VariantIdentifier', @ObservableToSet, '@VariantName', @ObservableToSetId)"> 1031 @if (!String.IsNullOrEmpty(VariantPreview)) 1032 { 1033 <span class="option-preview mr-2" @VariantPreview></span> 1034 } 1035 <span>@VariantName</span> 1036 </div> 1037 <div class="d-none" data-bind="setInitValue: { observable: @ObservableToSet, value: '@SelectedVariant.GetString("Ecom:VariantOption.Name")' }"></div> 1038 <div class="d-none" data-bind="setInitValue: { observable: @ObservableToSetId, value: '@SelectedVariant.GetString("Ecom:VariantOption.ID")' }"></div> 1039 1040 } 1041 </div> 1042 </div> 1043 } 1044 else if (PossibleVariantCombinations == VariantCombinationsCount) 1045 { 1046 Dictionary<string, string> CurrentlySelectedVariantOptions = new Dictionary<string, string>(); 1047 foreach (var VG in GetLoop("VariantGroups")) 1048 { 1049 foreach (var VO in VG.GetLoop("VariantAvailableOptions").Where(x => x.GetBoolean("Ecom:VariantOption.Selected"))) 1050 { 1051 CurrentlySelectedVariantOptions.Add(VG.GetString("Ecom:VariantGroup.Name"), VO.GetString("Ecom:VariantOption.ID")); 1052 } 1053 } 1054 int VGLoopCounter = 0; 1055 foreach (var VG in GetLoop("VariantGroups")) 1056 { 1057 List<LoopItem> RelevantVariantCombinations = new List<LoopItem>(); 1058 var VariantCombinationLink = GetLoop("VariantCombinations"); 1059 var SelectedVariant = VG.GetLoop("VariantAvailableOptions").Where(x => x.GetBoolean("Ecom:VariantOption.Selected")).FirstOrDefault(); 1060 var ObservableToSet = "SelectedVariantOption" + VGLoopCounter.ToString(); 1061 var ObservableToSetId = "SelectedVariantOptionId" + VGLoopCounter.ToString(); 1062 VGLoopCounter++; 1063 foreach (var VC in VariantCombinationLink) 1064 { 1065 var Add = true; 1066 foreach (var KVP in CurrentlySelectedVariantOptions.Where(s => s.Key != VG.GetString("Ecom:VariantGroup.Name"))) 1067 { 1068 if (!VC.GetString("Ecom:VariantCombination.VariantID").ToString().Contains(KVP.Value)) 1069 { 1070 Add = false; 1071 } 1072 } 1073 if (Add) 1074 { 1075 RelevantVariantCombinations.Add(VC); 1076 } 1077 } 1078 <div class="d-none" data-bind="setInitValue: { observable: @ObservableToSet, value: '@SelectedVariant.GetString("Ecom:VariantOption.Name")' }"></div> 1079 <div class="d-none" data-bind="setInitValue: { observable: @ObservableToSetId, value: '@SelectedVariant.GetString("Ecom:VariantOption.ID")' }"></div> 1080 1081 1082 <div class="position-relative"> 1083 <div class="variant-dropdown p-2 box-shadow mt-3 d-flex justify-content-between align-items-center pointer js-variant-dropdown"> 1084 <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> 1085 <i class="fas fa-chevron-down"></i> 1086 </div> 1087 <div class="variant-options bg-white"> 1088 @foreach (var VO in VG.GetLoop("VariantAvailableOptions")) 1089 { 1090 var VariantCombination = RelevantVariantCombinations.Where(vc => vc.GetString("Ecom:VariantCombination.VariantID").ToString().Contains(VO.GetString("Ecom:VariantOption.ID"))).FirstOrDefault(); 1091 string VariantLink = VariantCombination.GetString("Ecom:VariantCombination.Link.Clean"); 1092 string VariandOptionId = VariantCombination.GetString("Ecom:VariantCombination.VariantID"); 1093 string VariantPreview = String.Empty; 1094 string VOName = VO.GetString("Ecom:VariantOption.Name"); 1095 string VOId = VO.GetString("Ecom:VariantOption.ID"); 1096 bool ShowPreview = VG.GetString("Ecom:VariantGroup.Name").ToString().ToLower().Contains("farve") || VG.GetString("Ecom:VariantGroup.Name").ToString().ToLower().Contains("materiale") ? true : false; 1097 if (!String.IsNullOrEmpty(VO.GetString("Ecom:VariantOption.ImgSmall.Clean")) && ShowPreview) 1098 { 1099 if (VO.GetString("Ecom:VariantOption.ImgSmall.Clean").StartsWith("#")) 1100 { 1101 VariantPreview = "style= \"background-color: " + VO.GetString("Ecom:VariantOption.ImgSmall.Clean") + ";\""; 1102 } 1103 else 1104 { 1105 VariantPreview = "style=\"background-image: url('" + VO.GetString("Ecom:VariantOption.ImgSmall.Clean") + "');\""; 1106 } 1107 } 1108 <div class="option d-flex w-100 p-2 bg-grey color-primary pointer" data-bind="click: UpdateVariantAndSetObservable.bind($data, '@VOId', @ObservableToSet, '@VOName', @ObservableToSetId)"> 1109 @if (!String.IsNullOrEmpty(VariantPreview)) 1110 { 1111 <span class="option-preview mr-2" @VariantPreview></span> 1112 } 1113 @VOName 1114 </div> 1115 } 1116 </div> 1117 </div> 1118 } 1119 } 1120 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) 1121 { 1122 <div class="mt-3"> 1123 <p class="mb-1">@Translate("CurrentDesignName", "Valgte design: ")</p> 1124 <p class="font-weight-bold">@CurrentVariantName</p> 1125 </div> 1126 <div class="d-flex"> 1127 <div class="btn btn-primary" data-bind="click: ToggleVariantPicker">@Translate("ChooseNewDesign", "V&aelig;lg design")</div> 1128 </div> 1129 } 1130 else 1131 { 1132 var SelectedVariant = GetLoop("VariantCombinations").Where(x => x.GetBoolean("Ecom:VariantCombination.Selected")).FirstOrDefault(); 1133 var SelectedVariantName = SelectedVariant.GetString("Ecom:VariantCombination.VariantText"); 1134 var SelectedVariantId = SelectedVariant.GetString("Ecom:VariantOption.ID"); 1135 <div class="d-none" data-bind="setInitValue: { observable: SelectedVariantOption0, value: '@SelectedVariantName' }"></div> 1136 <div class="d-none" data-bind="setInitValue: { observable: SelectedVariantOptionId0, value: '@SelectedVariantId' }"></div> 1137 <div class="position-relative"> 1138 <div class="variant-dropdown p-2 box-shadow mt-3 d-flex justify-content-between align-items-center pointer js-variant-dropdown"> 1139 <p class="m-0"><span class="font-weight-bold">@Translate("FallbackVariantsText", "VARIANTER")</span> - <span data-bind="text: SelectedVariantOption0">@SelectedVariantName</span></p> 1140 <i class="fas fa-chevron-down"></i> 1141 </div> 1142 <div class="variant-options bg-white"> 1143 @foreach (var Variant in GetLoop("VariantCombinations")) 1144 { 1145 string VariantName = Variant.GetString("Ecom:VariantCombination.VariantText"); 1146 string VariantLink = Variant.GetString("Ecom:VariantCombination.Link.Clean"); 1147 string VCId = Variant.GetString("Ecom:Product.VariantID"); 1148 <div class="option color-primary pointer d-block p-2 bg-grey" data-bind="click: UpdateVariantAndSetObservable.bind($data, '@VCId', SelectedVariantOption0, '@VariantName', SelectedVariantOptionId0)">@VariantName</div> 1149 } 1150 </div> 1151 </div> 1152 } 1153 1154 } 1155 1156 <div class="row align-items-end f-grow-1"> 1157 <div class="col-10 offset-1 col-sm-12 offset-sm-0 d-flex justify-content-center justify-content-lg-start"> 1158 1159 <div class="mt-5 d-flex flex-wrap flex-column justify-content-end"> 1160 @if (CostPrice > 0) 1161 { 1162 var PriceShapePrices = Firstweb.Custom.CustomCode.Frontend.Helpers.PriceShapeHelpers.GetProductPrice(ProductNumber, EAN); 1163 <div class="d-none" data-bind="setInitValue: { observable: SplashType, value: 4 }"></div> 1164 if (PriceShapePrices != null && price < PriceShapePrices.MoblerPrice) 1165 { 1166 <div class="d-none" data-bind="setInitValue: { observable: ShowSaving, value: true }"></div> 1167 <div class="d-none" data-bind="setInitValue: { observable: CostPrice, value: '@MoblerHelpers.formatPrice(PriceShapePrices.MoblerPrice)' }"></div> 1168 } 1169 } 1170 else if (spar > 0) 1171 { 1172 <div class="d-none" data-bind="setInitValue: { observable: SplashType, value: 1 }"></div> 1173 <div class="d-none" data-bind="setInitValue: { observable: BeforePrice, value: '@normalPriceFormatted' }"></div> 1174 <div class="d-none" data-bind="setInitValue: { observable: Saving, value: '@sparFormatted' }"></div> 1175 } 1176 else if (NewItem) 1177 { 1178 <div class="d-none" data-bind="setInitValue: { observable: SplashType, value: 2 }"></div> 1179 } 1180 else if (LowPrice) 1181 { 1182 <div class="d-none" data-bind="setInitValue: { observable: SplashType, value: 3 }"></div> 1183 } 1184 1185 <div class="w-100 unimportant-hidden" data-bind="css: { 'd-flex': SplashType() == 1 }"> 1186 <p class="color-subtle fs0 m-0 text-uppercase mr-3">@Translate("PriceBefore", "Før") <span data-bind="text: BeforePrice"></span></p> 1187 <p class="bg-discount fs0 text-uppercase m-0 px-2 font-weight-bold">@Translate("PriceSaving", "Spar") <span data-bind="text: Saving"></span></p> 1188 </div> 1189 <div class="w-100 unimportant-hidden" data-bind="css: { 'd-flex': SplashType() == 4 && ShowSaving }"> 1190 @if (GetLoop("VariantCombinations").Count > 0) 1191 { 1192 <p class="color-subtle fs0 m-0 text-uppercase mr-3">@Translate("PriceRecommendPriceFrom", "Vejl. pris fra") <span data-bind="text: CostPrice"></span></p> 1193 } 1194 else 1195 { 1196 <p class="color-subtle fs0 m-0 text-uppercase mr-3">@Translate("PriceRecommendPrice", "Vejl. pris") <span data-bind="text: CostPrice"></span></p> 1197 } 1198 </div> 1199 <p class="price font-weight-bold m-0"> 1200 <span class="unimportant-hidden" data-bind="css: { 'd-inline': SplashType() == 1 }">@Translate("ProductNow", "NU") </span> 1201 <span data-bind="text: Price"></span> 1202 1203 1204 </p> 1205 1206 @if (!string.IsNullOrEmpty(campaignDateStart) && !string.IsNullOrEmpty(campaignDateEnd)) 1207 { 1208 <p><span>@Translate("Campaign.BeforeDate.Text", "Gældende fra:") @campaignDateStart @Translate("Campaign.BeforeDate.Text2", "t.o.m.") @campaignDateEnd</span></p> 1209 } 1210 1211 <div class="payever-finance-express payever-button" data-code="@GetString("Ecom:Product.Number")" data-name="@GetString("Ecom:Product.Name")" data-price="@GetString("Ecom:Product.Price.Price").Replace(".", string.Empty).Replace(",", ".")" data-currency="DKK"></div> 1212 <script>(function (p, a, y, e, v, r, f) { p[v] = p[v] || []; p[v][r] = p[v][r] || []; if (!p[v][r][y]) { p[v][r][y] = f = a.createElement(y); f.async = 1; f.src = e; a.head.appendChild(f) } })(window, document, 'script', 'https://mein.payever.de/finances/business/mobler/finance-express/91203/scripts/finance_express.embed.min.js', 'Payever', 'FinanceExpress');</script> 1213 1214 @if (ForSale) 1215 { 1216 <div class="d-flex align-items-center mt-3"> 1217 <p class="m-0 font-weight-bold fs1 mr-2">@Translate("Product.Quantity", "Antal")</p> 1218 <div class="d-flex"> 1219 <div class="quantity-controls d-flex align-items-center mr-3"> 1220 <div class="control minus" data-bind="click: DecreaseQuantity"> 1221 - 1222 </div> 1223 <input type="text" name="Quantity" value="1" data-bind="value: Quantity" /> 1224 <div class="control plus" data-bind="click: IncrementQuantity"> 1225 + 1226 </div> 1227 </div> 1228 @if (BlackFridayTheme == "True") 1229 { 1230 <p class="btn btn-black-friday bf-bg-black add-to-cart m-0 d-flex align-items-center px-4" data-bind="click: AddToCart.bind($data, '@DataLayerPrice')"> 1231 @Translate("ProductAddToCart", "L&aelig;g i kurv") 1232 </p> 1233 } 1234 else 1235 { 1236 <p class="btn btn-primary add-to-cart m-0 d-flex align-items-center px-4" data-bind="click: AddToCart.bind($data, '@DataLayerPrice')"> 1237 @Translate("ProductAddToCart", "L&aelig;g i kurv") 1238 </p> 1239 } 1240 </div> 1241 </div> 1242 } 1243 else 1244 { 1245 <p>@Translate("Ecom:Product.NotForSaleMessage", "Produktet kan ikke købes.")</p> 1246 } 1247 </div> 1248 </div> 1249 </div> 1250 1251 </div> 1252 1253 </div> 1254 1255 <div class="d-flex flex-wrap justify-content-center external-ctas"> 1256 1257 @if (!String.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.ProviderLink.Value.Clean"))) 1258 { 1259 <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"> 1260 <span>@Translate("Product.DesignSelf", "Design selv")</span> 1261 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/Pencil1.svg" /> 1262 </a> 1263 } 1264 1265 @if (!String.IsNullOrEmpty(ProductCatalogLink)) 1266 { 1267 <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"> 1268 <span>@Translate("ProductProductCatalogLink", "Se inspirationsbrochure")</span> 1269 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/Brochure.svg" /> 1270 </a> 1271 } 1272 1273 </div> 1274 1275 <div class="d-flex flex-wrap mt-5"> 1276 1277 <div id="js-full-description"> 1278 <p class="fs3 mb-2 font-weight-bold">@Translate("ProductDescriptionHeader", "Beskrivelse")</p> 1279 <div class="unimportant-hidden" data-bind="html: FullDescription, css: { 'd-block': FullDescription().length > 0 }"> 1280 </div> 1281 <div data-bind="css: { 'd-none': FullDescription().length > 0 }"> 1282 @LongDescription 1283 1284 @if (!string.IsNullOrEmpty(productionDescription)) 1285 { 1286 <br/><br /> 1287 <h4>@Translate("Product.ProductionDescription.Headline", "Produktionsbeskrivelse")</h4> 1288 @:@productionDescription 1289 } 1290 </div> 1291 </div> 1292 1293 </div> 1294 1295 <div class="d-flex flex-wrap my-5"> 1296 1297 <div class="description-container mt-5 mt-lg-0"> 1298 <div class="bg-brand color-white box-shadow p-3 pb-5 questions"> 1299 <img class="staff-img" src="/Files/Templates/Designs/Mobler2018/assets/img/sovnmand.png" /> 1300 1301 @if (!String.IsNullOrWhiteSpace(shopInfo.ShopName) && shopInfo.ShopName != "Møblér") 1302 { 1303 <div class="shop-info"> 1304 <h4 class="fs45">@Translate("ProductQuestionsHeader", "Har du sp&oslash;rsm&aring;l?")</h4> 1305 <p class="mb-1">@shopInfo.Address, @shopInfo.PostalAndCity</p> 1306 <p class="mb-1">@shopInfo.Phone</p> 1307 @if (!String.IsNullOrEmpty(shopInfo.Email)) 1308 { 1309 <p class="mb-1"><a class="color-white" href="mailto:@shopInfo.Email">@shopInfo.Email</a></p> 1310 } 1311 @if (!String.IsNullOrEmpty(shopInfo.ShopName1)) 1312 { 1313 <p class="mb-1 mt-2">@shopInfo.Address1, @shopInfo.PostalAndCity1</p> 1314 <p class="mb-2">@shopInfo.Phone1</p> 1315 } 1316 @if (!String.IsNullOrEmpty(shopInfo.ShopName2)) 1317 { 1318 <p class="mb-1 mt-2">@shopInfo.Address2, @shopInfo.PostalAndCity2</p> 1319 <p class="mb-2">@shopInfo.Phone2</p> 1320 } 1321 @shopInfo.OpeningHours 1322 </div> 1323 } 1324 else 1325 { 1326 <h4 class="fs45">@Translate("ProductQuestionsHeader", "Har du sp&oslash;rsm&aring;l?")</h4> 1327 <p class="fs2 text">@Translate("ProductSelectNearestShop", "V&aelig;lg n&aelig;rmeste M&oslash;bler bolighus")</p> 1328 <select style="width: 280px;" data-bind="select2SelectShop: { overlay: 'find-dealer-overlay', placeholder: '@SelectPlaceholder' }"> 1329 @if (shopname == "Møblér") 1330 { 1331 <option selected disabled>@Translate("HeaderFindShop", "Find forhandler")</option> 1332 } 1333 else 1334 { 1335 foreach (var Shop in AllShops.Where(x => x.MenuText == shopname)) 1336 { 1337 <option selected disabled value="@HttpUtility.UrlEncode(Shop.MenuText)">@Shop.ShopName</option> 1338 } 1339 } 1340 @foreach (var Shop in AllShops) 1341 { 1342 if (Shop.MenuText != "Møblér" && Shop.MenuText != shopname) 1343 { 1344 var Address = "<div>" + Shop.Address + "</div><div>" + Shop.PostalAndCity + "</div>"; 1345 <option title="@Address" value="@HttpUtility.UrlEncode(Shop.MenuText)">@Shop.ShopName {{@Shop.PostalAndCity @Shop.SearchKeyWords}}</option> 1346 } 1347 } 1348 </select> 1349 } 1350 </div> 1351 </div> 1352 1353 </div> 1354 1355 @if (GetInteger("Ecom:Product.RelatedCount") > 0) 1356 { 1357 foreach (var Group in GetLoop("ProductRelatedGroups").Where(g => g.GetLoop("Products").Count > 0)) 1358 { 1359 <div class="py-3 mt-5" data-bind="viewModel: 'ProductListViewModel'"> 1360 1361 <div class="delivery-information-popup" data-bind="css: { 'd-flex': QuickDeliveryInfoOpen }, click: ToggleQuickDeliveryInfo"> 1362 <div class="description-content bg-white px-3 py-4 px-lg-4 position-relative" data-bind="click: OpenQuickDeliveryInfo, clickBubble: false"> 1363 <div class="modal-closer-custom" data-bind="click: ToggleQuickDeliveryInfo, clickBubble: false"> 1364 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/close.svg" /> 1365 </div> 1366 <div> 1367 @QuickDeliveryDescription 1368 </div> 1369 </div> 1370 </div> 1371 <div class="delivery-information-popup" data-bind="css: { 'd-flex': NormalDeliveryInfoOpen }, click: ToggleNormalDeliveryInfo"> 1372 <div class="description-content bg-white px-3 py-4 px-lg-4 position-relative" data-bind="click: OpenNormalDeliveryInfo, clickBubble: false"> 1373 <div class="modal-closer-custom" data-bind="click: ToggleNormalDeliveryInfo, clickBubble: false"> 1374 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/close.svg" /> 1375 </div> 1376 <div> 1377 @NormalDeliveryDescription 1378 </div> 1379 </div> 1380 </div> 1381 1382 <div class="line-through-header mb-3"> 1383 <h4>@Group.GetString("Ecom:Product:RelatedGroup.Name")</h4> 1384 </div> 1385 1386 <div class="row"> 1387 1388 @foreach (var Product in Group.GetLoop("Products")) 1389 { 1390 var productToRender = Product; 1391 string productId = Product.GetString("Ecom:Product.ID"); 1392 string variantIdLoop = productsDisplayVariant.GetDisplayVariantId(productId); 1393 1394 if (Product.GetLoop("VariantCombinations").Count > 0 && Product.GetLoop("VariantCombinations").Any(x => x.GetString("Ecom:Product.VariantID").Equals(variantIdLoop))) 1395 { 1396 productToRender = Product.GetLoop("VariantCombinations").FirstOrDefault(x => x.GetString("Ecom:Product.VariantID").Equals(variantIdLoop)); 1397 } 1398 1399 @RenderProduct(productToRender) 1400 } 1401 </div> 1402 </div> 1403 } 1404 } 1405 1406 @if (RelatedBlogs.Count > 0) 1407 { 1408 string ImagePosition = "Left"; 1409 <div class="feature-blogs my-5"> 1410 1411 <div class="row"> 1412 1413 @foreach (var Blog in RelatedBlogs) 1414 { 1415 @RenderLargeBlogTeaser(Blog, ImagePosition) 1416 if (ImagePosition == "Left") 1417 { 1418 ImagePosition = "Right"; 1419 } 1420 else 1421 { 1422 ImagePosition = "Left"; 1423 } 1424 } 1425 1426 </div> 1427 1428 </div> 1429 } 1430 1431 1432 <div class="after-add-to-cart bg-white box-shadow" data-bind="css: { 'd-block': ProductAddedToCart }"> 1433 <div class="closer fs3 pointer" data-bind="click: ProductAddedToCart(false)"> 1434 <i class="fas fa-times-circle color-primary"></i> 1435 </div> 1436 <div class="p-3"> 1437 <p class="font-weight-bold fs4 text-uppercase m-0"> 1438 <i class="fas fa-check-circle color-primary"></i> 1439 @Translate("ProductProductAddedToCart", "Varen er lagt i indk&oslash;bskurven") 1440 </p> 1441 </div> 1442 <div class="mini-cart large-cart power-step"> 1443 1444 <div class="position-relative"> 1445 <div class="cart-command-loader unimportant-hidden justify-content-center align-items-center" data-bind="css: { 'd-flex': Loading }"> 1446 <div class="d-flex align-items-center"> 1447 <p class="m-0 mr-2">@Translate("Cart.UpdatingCart", "Opdaterer kurv")</p> 1448 <i class="fas fa-spinner fa-spin"></i> 1449 </div> 1450 </div> 1451 1452 <div class="lines" data-bind="foreach: Orderlines"> 1453 <div class="cartline d-flex justify-content-between align-items-center px-3 py-2 position-relative bg-grey"> 1454 <span class="delete-orderline color-subtle cursor-pointer mr-2" data-bind="click: $parent.DeleteOrderline.bind($data, OrderlineId)"> 1455 <i class="fas fa-times"></i> 1456 </span> 1457 <div class="product-image w-10"> 1458 <img class="img-fluid" data-bind="attr: { src: ImagePath }" /> 1459 </div> 1460 <div class="flex-fill px-3 w-75"> 1461 <p class="font-weight-bold m-0" data-bind="text: ProductName"></p> 1462 <p class="m-0 color-subtle small-quantity-indicator"><span data-bind="text: Quantity"></span> stk. a <span data-bind="text: QuantityPrice"></span></p> 1463 <div class="variant-dimensions" data-bind="foreach: VariantDimensions"> 1464 <p class="m-0 color-subtle color-dark-grey font-weight-bold"> 1465 <span data-bind="text: Label"></span> 1466 <span class="font-weight-normal" data-bind="text: Value"></span> 1467 </p> 1468 </div> 1469 </div> 1470 <div class="qty-counter w-10"> 1471 <div class="d-flex"> 1472 <div class="quantity-controls d-flex align-items-center mr-3"> 1473 <div class="control minus" data-bind="click: $parent.QuantityControl.bind($data, -1, OrderlineId)"> 1474 - 1475 </div> 1476 <input disabled type="text" name="Quantity" value="1" data-bind="value: Quantity, attr: { 'data-id': 'js-input-' + OrderlineId }" /> 1477 <div class="control plus" data-bind="click: $parent.QuantityControl.bind($data, 1, OrderlineId)"> 1478 + 1479 </div> 1480 </div> 1481 </div> 1482 </div> 1483 1484 <p class="fs0 m-0 orderline-price" data-bind="text: OrderlinePrice"></p> 1485 </div> 1486 </div> 1487 @if (BlackFridayTheme == "True") 1488 { 1489 <div class="bf-bg-black p-3 d-flex justify-content-between align-items-center price-summary"> 1490 <p class="m-0 color-white fs-12px font-weight-semibold">@Translate("MiniCartTotal", "Din kurv i alt (ex. fragt)")</p> 1491 <p class="m-0 color-white fs1 font-weight-bold" data-bind="text: CartTotalNoFees"></p> 1492 </div> 1493 } 1494 else 1495 { 1496 <div class="bg-brand p-3 d-flex justify-content-between align-items-center price-summary"> 1497 <p class="m-0 color-white fs-12px font-weight-semibold">@Translate("MiniCartTotal", "Din kurv i alt (ex. fragt)")</p> 1498 <p class="m-0 color-white fs1 font-extra-bold" data-bind="text: CartTotalNoFees"></p> 1499 </div> 1500 } 1501 </div> 1502 1503 </div> 1504 <div class="p-3 d-flex justify-content-between"> 1505 <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> 1506 1507 @if (BlackFridayTheme == "True") 1508 { 1509 <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> 1510 } 1511 else 1512 { 1513 <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> 1514 } 1515 1516 </div> 1517 <div class="js-customers-also-saw-lines"></div> 1518 1519 </div> 1520 <div class="variant-picker" data-bind="css: { 'open': VariantPickerOpen }"> 1521 <div class="closer color-primary fs5 pointer" data-bind="click: ToggleVariantPicker"> 1522 <i class="fas fa-times-circle"></i> 1523 </div> 1524 <div class="container py-5 position-relative"> 1525 <h3 class="fs4 text-center">Design din @ProductName</h3> 1526 @{ 1527 var ColorDimensions = GetLoop("VariantGroups").Where(g => g.GetString("Ecom:VariantGroup.Name").ToLower().Contains("farve")); 1528 var NonColorDimensions = GetLoop("VariantGroups").Where(g => !g.GetString("Ecom:VariantGroup.Name").ToLower().Contains("farve")); 1529 int FilterCounter = 0; 1530 string RowClass = NonColorDimensions.Any() && ColorDimensions.Any() ? "flex-row-reverse" : ""; 1531 } 1532 <div class="row mt-5 @RowClass"> 1533 @if (ColorDimensions.Any()) 1534 { 1535 <div class="col-12 col-md-8"> 1536 @foreach (var VariantDimension in ColorDimensions) 1537 { 1538 string DimensionName = VariantDimension.GetString("Ecom:VariantGroup.Name"); 1539 string FilterName = "filter-" + FilterCounter; 1540 FilterCounter++; 1541 <div class="mb-5 mb-md-0"> 1542 <p class="font-weight-bold fs2 mb-2">@DimensionName</p> 1543 <div class="row custom-row"> 1544 @foreach (var VariantOption in VariantDimension.GetLoop("VariantAvailableOptions").OrderBy(v => v.GetString("Ecom:VariantOption.Name"))) 1545 { 1546 string VariantOptionName = VariantOption.GetString("Ecom:VariantOption.Name"); 1547 string VariantOptionId = VariantOption.GetString("Ecom:VariantOption.ID"); 1548 string Preview = VariantOption.GetString("Ecom:VariantOption.ImgSmall.Clean"); 1549 string PreviewCss = ""; 1550 if (!String.IsNullOrEmpty(Preview)) 1551 { 1552 if (Preview.StartsWith("#")) 1553 { 1554 PreviewCss = "style= \"background-color: " + Preview + ";\""; 1555 } 1556 else 1557 { 1558 PreviewCss = "style=\"background-image: url('" + Preview + "');\""; 1559 } 1560 } 1561 <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')"> 1562 <p class="mb-0 color-variant-name d-none d-sm-block">@VariantOptionName</p> 1563 <div class="variant-preview position-relative d-flex" @PreviewCss></div> 1564 </div> 1565 } 1566 </div> 1567 </div> 1568 } 1569 </div> 1570 } 1571 @if (NonColorDimensions.Any()) 1572 { 1573 <div class="col-12 col-sm-6 col-md-4"> 1574 @foreach (var VariantDimension in NonColorDimensions) 1575 { 1576 string DimensionName = VariantDimension.GetString("Ecom:VariantGroup.Name"); 1577 string FilterName = "filter-" + FilterCounter; 1578 FilterCounter++; 1579 <div class="mb-5"> 1580 <p class="font-weight-bold fs2 mb-2">@DimensionName</p> 1581 <div class="row custom-row"> 1582 @foreach (var VariantOption in VariantDimension.GetLoop("VariantAvailableOptions").OrderBy(v => v.GetString("Ecom:VariantOption.Name"))) 1583 { 1584 string VariantOptionName = VariantOption.GetString("Ecom:VariantOption.Name"); 1585 string VariantOptionId = VariantOption.GetString("Ecom:VariantOption.ID"); 1586 string Preview = VariantOption.GetString("Ecom:VariantOption.ImgSmall.Clean"); 1587 string PreviewCss = ""; 1588 if (!String.IsNullOrEmpty(Preview)) 1589 { 1590 if (Preview.StartsWith("#")) 1591 { 1592 PreviewCss = "style= \"background-color: " + Preview + ";\""; 1593 } 1594 else 1595 { 1596 PreviewCss = "style=\"background-image: url('/Files" + Preview + "');\""; 1597 } 1598 } 1599 if (DimensionName == "STØRRELSE") 1600 { 1601 <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')"> 1602 <div class="variant-preview position-relative d-flex justify-content-center align-items-center" @PreviewCss> 1603 <p class="mb-0 color-variant-name font-weight-bold">@VariantOptionName</p> 1604 </div> 1605 </div> 1606 } 1607 else 1608 { 1609 <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')"> 1610 <p class="mb-0 color-variant-name">@VariantOptionName</p> 1611 <div class="variant-preview position-relative d-flex" @PreviewCss></div> 1612 </div> 1613 } 1614 } 1615 </div> 1616 </div> 1617 } 1618 </div> 1619 } 1620 1621 <div class="col-12 d-flex justify-content-end"> 1622 <p class="color-primary pointer my-3" data-bind="click: ResetFilters">Nulstil</p> 1623 </div> 1624 </div> 1625 <p class="font-weight-bold fs2 mt-5"> 1626 @Translate("ChooseProduct", "V&aelig;lg produkt") 1627 </p> 1628 <div class="row align-items-end" data-bind="foreach: FilteredVariants"> 1629 <div class="col-12 col-sm-6 col-md-3 mb-3"> 1630 <a class="color-black no-underline" data-bind="attr: { href: Link }"> 1631 <p class="fs0 font-weight-bold m-0" data-bind="text: Name"></p> 1632 <img class="img-fluid box-shadow my-1" data-bind="attr: { src: Image }" /> 1633 <div class="d-flex justify-content-center mt-2"> 1634 <div class="btn btn-primary">@Translate("VariantChooseProduct", "V&aelig;lg")</div> 1635 </div> 1636 </a> 1637 </div> 1638 </div> 1639 <div data-bind="visible: FilteredVariants().length == 0"> 1640 <p class="font-weight-bold mt-3 fs3">@Translate("VariantsNoResults", "Filtreringen gav ingen resultater")</p> 1641 </div> 1642 </div> 1643 </div> 1644 </div> 1645 1646 @SnippetStart("DataLayerOverwrites") 1647 <script> 1648 ecomm_pagetype = "Product"; 1649 ecomm_totalvalue = @GetString("Ecom:Product.Price.Price").Replace(".","").Replace(",","."); 1650 ecomm_prodid = "@GetString("Ecom:Product.ID")"; 1651 </script> 1652 @SnippetEnd("DataLayerOverwrites") 1653 1654 <script> 1655 var dataLayer = window.dataLayer || []; 1656 dataLayer.push({ 1657 'event': 'product', 1658 'ecommerce': { 1659 'detail': { 1660 'actionField': { 1661 'list': '@DataLayerParentGroups' 1662 }, 1663 'products': [{ 1664 'id': '@ProductID', 1665 'name': '@ProductName', 1666 'image': '@OgImage', 1667 'brand': '@BrandName', 1668 'variant': '@CurrentVariantName', 1669 'category': '@DataLayerParentGroup', 1670 'price': '@DataLayerPrice' 1671 }] 1672 } 1673 }, 1674 'page': { 1675 'type': 'product', 1676 'environment': 'production' 1677 } 1678 }); 1679 </script> 1680

Tilbud, indretningstips og inspiration – tilmeld dig vores nyhedsbrev

Hold dig opdateret om vores nyeste tilbud på senge, sofaer og spiseborde, eller få inspiration til indretningen af dit hjem. Som abonnent på Møblérs nyhedsbrev får du altid besked om udsalg og gode tilbud på vores mange møbler, ligesom vi ligeledes deler ud af vores store erfaring og viden inden for indretning og tidens trends. 

Tak, du er nu tilmeldt Møblérs nyhedsbrev.
Du er allerede tilmeldt Møblérs nyhedsbrev.
Du er allerede tilmeldt Møblérs nyhedsbrev.