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_d791582f151247db9fac8a9de134d061.Execute() in D:\dynamicweb.net\Solutions\mobler.LIVE\Files\Templates\Designs\Mobler2018\eCom\Product\Product.cshtml:line 1082
   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 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"> 717 <div class="slides"></div> 718 <h3 class="title"></h3> 719 <a class="prev">‹</a> 720 <a class="next">›</a> 721 <a class="close">×</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 780 <h1 class="header mb-4" data-bind="text: ProductName">@ProductName</h1> 781 782 <div class="d-flex flex-wrap"> 783 784 <div class="image-container position-relative overflow-hidden"> 785 786 <div class="discount-splash unimportant-hidden" data-bind="css: { 'd-flex': SplashType() == 1 }"><p class="m-0">@Translate("ProductOffer", "Tilbud")</p></div> 787 <div class="discount-splash unimportant-hidden new-item" data-bind="css: { 'd-flex': SplashType() == 2 }"><p class="m-0">@Translate("ProductNew", "Nyhed")</p></div> 788 <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> 789 <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> 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 }, foreach: Images()"> 866 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 882 </div> 883 } 884 885 </div> 886 887 <div class="pl-lg-4 description-container d-flex flex-wrap flex-column mt-3 mt-lg-0 position-relative"> 888 889 <div class="mb-2">@ShortDescription</div> 890 891 <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> 892 893 <div class="w-100"> 894 <p class="color-subtle m-0">@Translate("ProductProductNumber", "Produktnummer:") <span data-bind="text: ProductNumber">@ProductNumber</span></p> 895 <p class="color-subtle m-0"> 896 @if (!string.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.dybdeint.Value.Clean"))) 897 { 898 if (GetString("Ecom:Product:Field.dybdeint.Value.Clean") != "0") 899 { 900 <span>D/L: @GetValue("Ecom:Product:Field.dybdeint.Value.Clean")</span> 901 } 902 } 903 @if (!string.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.hoejdeint.Value.Clean"))) 904 { 905 if (GetString("Ecom:Product:Field.hoejdeint.Value.Clean") != "0") 906 { 907 <span>H: @GetValue("Ecom:Product:Field.hoejdeint.Value.Clean")</span> 908 } 909 } 910 @if (!string.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.breddeint.Value.Clean"))) 911 { 912 if (GetString("Ecom:Product:Field.breddeint.Value.Clean") != "0") 913 { 914 <span>B: @GetValue("Ecom:Product:Field.breddeint.Value.Clean")</span> 915 } 916 } 917 </p> 918 </div> 919 920 @if ((QuickDelivery || DisplayAverageDeliveryTime) && !HideDelivery) 921 { 922 <div class="w-100 mt-3"> 923 924 <div class="delivery-information"> 925 <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"> 926 <g> 927 <g> 928 <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" /> 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 </g> 945 </g> 946 </svg> 947 <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> 948 </div> 949 950 </div> 951 } 952 953 @if (CostPrice > 0) 954 { 955 <div class="w-100 mt-3"> 956 957 <div class="delivery-information"> 958 <div class="live-price-animation"></div> 959 <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> 960 </div> 961 962 </div> 963 } 964 965 966 <div class="w-100"> 967 @if (GetBoolean("Ecom:Product:Field.Farvevarianter1.Value")) 968 { 969 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver1.png" /> 970 <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> 971 } 972 else if (GetBoolean("Ecom:Product:Field.Farvevarianter2.Value")) 973 { 974 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver2.png" /> 975 <p class="mb-0">@Translate("ProductColor2Text", "Farve 2 hj&aelig;lpetekst")</p> 976 } 977 else if (GetBoolean("Ecom:Product:Field.Farvevarianter3.Value")) 978 { 979 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver3.png" /> 980 <p class="mb-0">@Translate("ProductColor3Text", "Farve 3 hj&aelig;lpetekst")</p> 981 } 982 else if (GetBoolean("Ecom:Product:Field.Farvevarianter4.Value")) 983 { 984 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver4.png" /> 985 <p class="mb-0">@Translate("ProductColor4Text", "Farve 4 hj&aelig;lpetekst")</p> 986 } 987 else if (GetBoolean("Ecom:Product:Field.Farvevarianter5.Value")) 988 { 989 <img class="img-fluid mb-3 mt-5" src="/Files/Images/Farver/farver5.png" /> 990 <p class="mb-0">@Translate("ProductColor5Text", "Farve 5 hj&aelig;lpetekst")</p> 991 } 992 </div> 993 @if (GetLoop("VariantCombinations").Count > 0) 994 { 995 var VariantGroupsWithMultipleOptions = GetLoop("VariantGroups").Where(x => x.GetLoop("VariantAvailableOptions").Count > 1); 996 int VariantGroupCount = VariantGroupsWithMultipleOptions.Count(); 997 int VariantCombinationsCount = GetLoop("VariantCombinations").Count; 998 int PossibleVariantCombinations = 1; 999 foreach (var VG in GetLoop("VariantGroups")) 1000 { 1001 PossibleVariantCombinations *= VG.GetLoop("VariantAvailableOptions").Count; 1002 } 1003 if (VariantGroupCount == 1) 1004 { 1005 var RelevantVariantGroup = VariantGroupsWithMultipleOptions.FirstOrDefault(); 1006 var SelectedVariant = RelevantVariantGroup.GetLoop("VariantAvailableOptions").Where(x => x.GetBoolean("Ecom:VariantOption.Selected")).FirstOrDefault(); 1007 <div class="position-relative"> 1008 <div class="variant-dropdown p-2 box-shadow mt-3 d-flex justify-content-between align-items-center pointer js-variant-dropdown"> 1009 <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> 1010 <i class="fas fa-chevron-down"></i> 1011 </div> 1012 <div class="variant-options bg-white"> 1013 @foreach (var Variant in RelevantVariantGroup.GetLoop("VariantAvailableOptions")) 1014 { 1015 var VariantCombination = GetLoop("VariantCombinations").Where(x => x.GetString("Ecom:VariantCombination.VariantID").ToString().Contains(Variant.GetString("Ecom:VariantOption.ID"))).FirstOrDefault(); 1016 string VariantName = Variant.GetString("Ecom:VariantOption.Name"); 1017 string VariantIdentifier = Variant.GetString("Ecom:VariantOption.ID"); 1018 string VariantLink = VariantCombination.GetString("Ecom:VariantCombination.Link.Clean"); 1019 string VariantPreview = String.Empty; 1020 var ObservableToSet = "SelectedVariantOption0"; 1021 var ObservableToSetId = "SelectedVariantOptionId0"; 1022 bool ShowPreview = RelevantVariantGroup.GetString("Ecom:VariantGroup.Name").ToString().ToLower().Contains("farve") || RelevantVariantGroup.GetString("Ecom:VariantGroup.Name").ToString().ToLower().Contains("materiale") ? true : false; 1023 if (!String.IsNullOrEmpty(Variant.GetString("Ecom:VariantOption.ImgSmall.Clean")) && ShowPreview) 1024 { 1025 if (Variant.GetString("Ecom:VariantOption.ImgSmall.Clean").StartsWith("#")) 1026 { 1027 VariantPreview = "style= \"background-color: " + Variant.GetString("Ecom:VariantOption.ImgSmall.Clean") + ";\""; 1028 } 1029 else 1030 { 1031 VariantPreview = "style=\"background-image: url('" + Variant.GetString("Ecom:VariantOption.ImgSmall.Clean") + "');\""; 1032 } 1033 } 1034 <div class="option pointer color-primary d-flex w-100 p-2 bg-grey" data-bind="click: UpdateVariantAndSetObservable.bind($data, '@VariantIdentifier', @ObservableToSet, '@VariantName', @ObservableToSetId)"> 1035 @if (!String.IsNullOrEmpty(VariantPreview)) 1036 { 1037 <span class="option-preview mr-2" @VariantPreview></span> 1038 } 1039 <span>@VariantName</span> 1040 </div> 1041 <div class="d-none" data-bind="setInitValue: { observable: @ObservableToSet, value: '@SelectedVariant.GetString("Ecom:VariantOption.Name")' }"></div> 1042 <div class="d-none" data-bind="setInitValue: { observable: @ObservableToSetId, value: '@SelectedVariant.GetString("Ecom:VariantOption.ID")' }"></div> 1043 1044 } 1045 </div> 1046 </div> 1047 } 1048 else if (PossibleVariantCombinations == VariantCombinationsCount) 1049 { 1050 Dictionary<string, string> CurrentlySelectedVariantOptions = new Dictionary<string, string>(); 1051 foreach (var VG in GetLoop("VariantGroups")) 1052 { 1053 foreach (var VO in VG.GetLoop("VariantAvailableOptions").Where(x => x.GetBoolean("Ecom:VariantOption.Selected"))) 1054 { 1055 CurrentlySelectedVariantOptions.Add(VG.GetString("Ecom:VariantGroup.Name"), VO.GetString("Ecom:VariantOption.ID")); 1056 } 1057 } 1058 int VGLoopCounter = 0; 1059 foreach (var VG in GetLoop("VariantGroups")) 1060 { 1061 List<LoopItem> RelevantVariantCombinations = new List<LoopItem>(); 1062 var VariantCombinationLink = GetLoop("VariantCombinations"); 1063 var SelectedVariant = VG.GetLoop("VariantAvailableOptions").Where(x => x.GetBoolean("Ecom:VariantOption.Selected")).FirstOrDefault(); 1064 var ObservableToSet = "SelectedVariantOption" + VGLoopCounter.ToString(); 1065 var ObservableToSetId = "SelectedVariantOptionId" + VGLoopCounter.ToString(); 1066 VGLoopCounter++; 1067 foreach (var VC in VariantCombinationLink) 1068 { 1069 var Add = true; 1070 foreach (var KVP in CurrentlySelectedVariantOptions.Where(s => s.Key != VG.GetString("Ecom:VariantGroup.Name"))) 1071 { 1072 if (!VC.GetString("Ecom:VariantCombination.VariantID").ToString().Contains(KVP.Value)) 1073 { 1074 Add = false; 1075 } 1076 } 1077 if (Add) 1078 { 1079 RelevantVariantCombinations.Add(VC); 1080 } 1081 } 1082 <div class="d-none" data-bind="setInitValue: { observable: @ObservableToSet, value: '@SelectedVariant.GetString("Ecom:VariantOption.Name")' }"></div> 1083 <div class="d-none" data-bind="setInitValue: { observable: @ObservableToSetId, value: '@SelectedVariant.GetString("Ecom:VariantOption.ID")' }"></div> 1084 1085 1086 <div class="position-relative"> 1087 <div class="variant-dropdown p-2 box-shadow mt-3 d-flex justify-content-between align-items-center pointer js-variant-dropdown"> 1088 <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> 1089 <i class="fas fa-chevron-down"></i> 1090 </div> 1091 <div class="variant-options bg-white"> 1092 @foreach (var VO in VG.GetLoop("VariantAvailableOptions")) 1093 { 1094 var VariantCombination = RelevantVariantCombinations.Where(vc => vc.GetString("Ecom:VariantCombination.VariantID").ToString().Contains(VO.GetString("Ecom:VariantOption.ID"))).FirstOrDefault(); 1095 string VariantLink = VariantCombination.GetString("Ecom:VariantCombination.Link.Clean"); 1096 string VariandOptionId = VariantCombination.GetString("Ecom:VariantCombination.VariantID"); 1097 string VariantPreview = String.Empty; 1098 string VOName = VO.GetString("Ecom:VariantOption.Name"); 1099 string VOId = VO.GetString("Ecom:VariantOption.ID"); 1100 bool ShowPreview = VG.GetString("Ecom:VariantGroup.Name").ToString().ToLower().Contains("farve") || VG.GetString("Ecom:VariantGroup.Name").ToString().ToLower().Contains("materiale") ? true : false; 1101 if (!String.IsNullOrEmpty(VO.GetString("Ecom:VariantOption.ImgSmall.Clean")) && ShowPreview) 1102 { 1103 if (VO.GetString("Ecom:VariantOption.ImgSmall.Clean").StartsWith("#")) 1104 { 1105 VariantPreview = "style= \"background-color: " + VO.GetString("Ecom:VariantOption.ImgSmall.Clean") + ";\""; 1106 } 1107 else 1108 { 1109 VariantPreview = "style=\"background-image: url('" + VO.GetString("Ecom:VariantOption.ImgSmall.Clean") + "');\""; 1110 } 1111 } 1112 <div class="option d-flex w-100 p-2 bg-grey color-primary pointer" data-bind="click: UpdateVariantAndSetObservable.bind($data, '@VOId', @ObservableToSet, '@VOName', @ObservableToSetId)"> 1113 @if (!String.IsNullOrEmpty(VariantPreview)) 1114 { 1115 <span class="option-preview mr-2" @VariantPreview></span> 1116 } 1117 @VOName 1118 </div> 1119 } 1120 </div> 1121 </div> 1122 } 1123 } 1124 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) 1125 { 1126 <div class="mt-3"> 1127 <p class="mb-1">@Translate("CurrentDesignName", "Valgte design: ")</p> 1128 <p class="font-weight-bold">@CurrentVariantName</p> 1129 </div> 1130 <div class="d-flex"> 1131 <div class="btn btn-primary" data-bind="click: ToggleVariantPicker">@Translate("ChooseNewDesign", "V&aelig;lg design")</div> 1132 </div> 1133 } 1134 else 1135 { 1136 var SelectedVariant = GetLoop("VariantCombinations").Where(x => x.GetBoolean("Ecom:VariantCombination.Selected")).FirstOrDefault(); 1137 var SelectedVariantName = SelectedVariant.GetString("Ecom:VariantCombination.VariantText"); 1138 var SelectedVariantId = SelectedVariant.GetString("Ecom:VariantOption.ID"); 1139 <div class="d-none" data-bind="setInitValue: { observable: SelectedVariantOption0, value: '@SelectedVariantName' }"></div> 1140 <div class="d-none" data-bind="setInitValue: { observable: SelectedVariantOptionId0, value: '@SelectedVariantId' }"></div> 1141 <div class="position-relative"> 1142 <div class="variant-dropdown p-2 box-shadow mt-3 d-flex justify-content-between align-items-center pointer js-variant-dropdown"> 1143 <p class="m-0"><span class="font-weight-bold">@Translate("FallbackVariantsText", "VARIANTER")</span> - <span data-bind="text: SelectedVariantOption0">@SelectedVariantName</span></p> 1144 <i class="fas fa-chevron-down"></i> 1145 </div> 1146 <div class="variant-options bg-white"> 1147 @foreach (var Variant in GetLoop("VariantCombinations")) 1148 { 1149 string VariantName = Variant.GetString("Ecom:VariantCombination.VariantText"); 1150 string VariantLink = Variant.GetString("Ecom:VariantCombination.Link.Clean"); 1151 string VCId = Variant.GetString("Ecom:Product.VariantID"); 1152 <div class="option color-primary pointer d-block p-2 bg-grey" data-bind="click: UpdateVariantAndSetObservable.bind($data, '@VCId', SelectedVariantOption0, '@VariantName', SelectedVariantOptionId0)">@VariantName</div> 1153 } 1154 </div> 1155 </div> 1156 } 1157 1158 } 1159 1160 <div class="row align-items-end f-grow-1"> 1161 <div class="col-10 offset-1 col-sm-12 offset-sm-0 d-flex justify-content-center justify-content-lg-start"> 1162 1163 <div class="mt-5 d-flex flex-wrap flex-column justify-content-end"> 1164 @if (CostPrice > 0) 1165 { 1166 var PriceShapePrices = Firstweb.Custom.CustomCode.Frontend.Helpers.PriceShapeHelpers.GetProductPrice(ProductNumber, EAN); 1167 <div class="d-none" data-bind="setInitValue: { observable: SplashType, value: 4 }"></div> 1168 if (PriceShapePrices != null && price < PriceShapePrices.MoblerPrice) 1169 { 1170 <div class="d-none" data-bind="setInitValue: { observable: ShowSaving, value: true }"></div> 1171 <div class="d-none" data-bind="setInitValue: { observable: CostPrice, value: '@MoblerHelpers.formatPrice(PriceShapePrices.MoblerPrice)' }"></div> 1172 } 1173 } 1174 else if (spar > 0) 1175 { 1176 <div class="d-none" data-bind="setInitValue: { observable: SplashType, value: 1 }"></div> 1177 <div class="d-none" data-bind="setInitValue: { observable: BeforePrice, value: '@normalPriceFormatted' }"></div> 1178 <div class="d-none" data-bind="setInitValue: { observable: Saving, value: '@sparFormatted' }"></div> 1179 } 1180 else if (NewItem) 1181 { 1182 <div class="d-none" data-bind="setInitValue: { observable: SplashType, value: 2 }"></div> 1183 } 1184 else if (LowPrice) 1185 { 1186 <div class="d-none" data-bind="setInitValue: { observable: SplashType, value: 3 }"></div> 1187 } 1188 1189 <div class="w-100 unimportant-hidden" data-bind="css: { 'd-flex': SplashType() == 1 }"> 1190 <p class="color-subtle fs0 m-0 text-uppercase mr-3">@Translate("PriceBefore", "Før") <span data-bind="text: BeforePrice"></span></p> 1191 <p class="bg-discount fs0 text-uppercase m-0 px-2 font-weight-bold">@Translate("PriceSaving", "Spar") <span data-bind="text: Saving"></span></p> 1192 </div> 1193 <div class="w-100 unimportant-hidden" data-bind="css: { 'd-flex': SplashType() == 4 && ShowSaving }"> 1194 @if (GetLoop("VariantCombinations").Count > 0) 1195 { 1196 <p class="color-subtle fs0 m-0 text-uppercase mr-3">@Translate("PriceRecommendPriceFrom", "Vejl. pris fra") <span data-bind="text: CostPrice"></span></p> 1197 } 1198 else 1199 { 1200 <p class="color-subtle fs0 m-0 text-uppercase mr-3">@Translate("PriceRecommendPrice", "Vejl. pris") <span data-bind="text: CostPrice"></span></p> 1201 } 1202 </div> 1203 <p class="price font-weight-bold m-0"> 1204 <span class="unimportant-hidden" data-bind="css: { 'd-inline': SplashType() == 1 }">@Translate("ProductNow", "NU") </span> 1205 <span data-bind="text: Price"></span> 1206 1207 1208 </p> 1209 1210 @if (!string.IsNullOrEmpty(campaignDateStart) && !string.IsNullOrEmpty(campaignDateEnd)) 1211 { 1212 <p><span>@Translate("Campaign.BeforeDate.Text", "Gældende fra:") @campaignDateStart @Translate("Campaign.BeforeDate.Text2", "t.o.m.") @campaignDateEnd</span></p> 1213 } 1214 1215 <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> 1216 <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> 1217 1218 @if (ForSale) 1219 { 1220 <div class="d-flex align-items-center mt-3"> 1221 <p class="m-0 font-weight-bold fs1 mr-2">@Translate("Product.Quantity", "Antal")</p> 1222 <div class="d-flex"> 1223 <div class="quantity-controls d-flex align-items-center mr-3"> 1224 <div class="control minus" data-bind="click: DecreaseQuantity"> 1225 - 1226 </div> 1227 <input type="text" name="Quantity" value="1" data-bind="value: Quantity" /> 1228 <div class="control plus" data-bind="click: IncrementQuantity"> 1229 + 1230 </div> 1231 </div> 1232 @if (BlackFridayTheme == "True") 1233 { 1234 <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')"> 1235 @Translate("ProductAddToCart", "L&aelig;g i kurv") 1236 </p> 1237 } 1238 else 1239 { 1240 <p class="btn btn-primary add-to-cart m-0 d-flex align-items-center px-4" data-bind="click: AddToCart.bind($data, '@DataLayerPrice')"> 1241 @Translate("ProductAddToCart", "L&aelig;g i kurv") 1242 </p> 1243 } 1244 </div> 1245 </div> 1246 } 1247 else 1248 { 1249 <p>@Translate("Ecom:Product.NotForSaleMessage", "Produktet kan ikke købes.")</p> 1250 } 1251 </div> 1252 </div> 1253 </div> 1254 1255 </div> 1256 1257 </div> 1258 1259 <div class="d-flex flex-wrap justify-content-center external-ctas"> 1260 1261 @if (!String.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.ProviderLink.Value.Clean"))) 1262 { 1263 <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"> 1264 <span>@Translate("Product.DesignSelf", "Design selv")</span> 1265 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/Pencil1.svg" /> 1266 </a> 1267 } 1268 1269 @if (!String.IsNullOrEmpty(ProductCatalogLink)) 1270 { 1271 <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"> 1272 <span>@Translate("ProductProductCatalogLink", "Se inspirationsbrochure")</span> 1273 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/Brochure.svg" /> 1274 </a> 1275 } 1276 1277 </div> 1278 1279 <div class="d-flex flex-wrap mt-5"> 1280 1281 <div id="js-full-description"> 1282 <p class="fs3 mb-2 font-weight-bold">@Translate("ProductDescriptionHeader", "Beskrivelse")</p> 1283 <div class="unimportant-hidden" data-bind="html: FullDescription, css: { 'd-block': FullDescription().length > 0 }"> 1284 </div> 1285 <div data-bind="css: { 'd-none': FullDescription().length > 0 }"> 1286 @LongDescription 1287 1288 @if (!string.IsNullOrEmpty(productionDescription)) 1289 { 1290 <br/><br /> 1291 <h4>@Translate("Product.ProductionDescription.Headline", "Produktionsbeskrivelse")</h4> 1292 @:@productionDescription 1293 } 1294 </div> 1295 </div> 1296 1297 </div> 1298 1299 <div class="d-flex flex-wrap my-5"> 1300 1301 <div class="description-container mt-5 mt-lg-0"> 1302 <div class="bg-brand color-white box-shadow p-3 pb-5 questions"> 1303 <img class="staff-img" src="/Files/Templates/Designs/Mobler2018/assets/img/sovnmand.png" /> 1304 1305 @if (!String.IsNullOrWhiteSpace(shopInfo.ShopName) && shopInfo.ShopName != "Møblér") 1306 { 1307 <div class="shop-info"> 1308 <h4 class="fs45">@Translate("ProductQuestionsHeader", "Har du sp&oslash;rsm&aring;l?")</h4> 1309 <p class="mb-1">@shopInfo.Address, @shopInfo.PostalAndCity</p> 1310 <p class="mb-1">@shopInfo.Phone</p> 1311 @if (!String.IsNullOrEmpty(shopInfo.Email)) 1312 { 1313 <p class="mb-1"><a class="color-white" href="mailto:@shopInfo.Email">@shopInfo.Email</a></p> 1314 } 1315 @if (!String.IsNullOrEmpty(shopInfo.ShopName1)) 1316 { 1317 <p class="mb-1 mt-2">@shopInfo.Address1, @shopInfo.PostalAndCity1</p> 1318 <p class="mb-2">@shopInfo.Phone1</p> 1319 } 1320 @if (!String.IsNullOrEmpty(shopInfo.ShopName2)) 1321 { 1322 <p class="mb-1 mt-2">@shopInfo.Address2, @shopInfo.PostalAndCity2</p> 1323 <p class="mb-2">@shopInfo.Phone2</p> 1324 } 1325 @shopInfo.OpeningHours 1326 </div> 1327 } 1328 else 1329 { 1330 <h4 class="fs45">@Translate("ProductQuestionsHeader", "Har du sp&oslash;rsm&aring;l?")</h4> 1331 <p class="fs2 text">@Translate("ProductSelectNearestShop", "V&aelig;lg n&aelig;rmeste M&oslash;bler bolighus")</p> 1332 <select style="width: 280px;" data-bind="select2SelectShop: { overlay: 'find-dealer-overlay', placeholder: '@SelectPlaceholder' }"> 1333 @if (shopname == "Møblér") 1334 { 1335 <option selected disabled>@Translate("HeaderFindShop", "Find forhandler")</option> 1336 } 1337 else 1338 { 1339 foreach (var Shop in AllShops.Where(x => x.MenuText == shopname)) 1340 { 1341 <option selected disabled value="@HttpUtility.UrlEncode(Shop.MenuText)">@Shop.ShopName</option> 1342 } 1343 } 1344 @foreach (var Shop in AllShops) 1345 { 1346 if (Shop.MenuText != "Møblér" && Shop.MenuText != shopname) 1347 { 1348 var Address = "<div>" + Shop.Address + "</div><div>" + Shop.PostalAndCity + "</div>"; 1349 <option title="@Address" value="@HttpUtility.UrlEncode(Shop.MenuText)">@Shop.ShopName {{@Shop.PostalAndCity @Shop.SearchKeyWords}}</option> 1350 } 1351 } 1352 </select> 1353 } 1354 </div> 1355 </div> 1356 1357 </div> 1358 1359 @if (GetInteger("Ecom:Product.RelatedCount") > 0) 1360 { 1361 foreach (var Group in GetLoop("ProductRelatedGroups").Where(g => g.GetLoop("Products").Count > 0)) 1362 { 1363 <div class="py-3 mt-5" data-bind="viewModel: 'ProductListViewModel'"> 1364 1365 <div class="delivery-information-popup" data-bind="css: { 'd-flex': QuickDeliveryInfoOpen }, click: ToggleQuickDeliveryInfo"> 1366 <div class="description-content bg-white px-3 py-4 px-lg-4 position-relative" data-bind="click: OpenQuickDeliveryInfo, clickBubble: false"> 1367 <div class="modal-closer-custom" data-bind="click: ToggleQuickDeliveryInfo, clickBubble: false"> 1368 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/close.svg" /> 1369 </div> 1370 <div> 1371 @QuickDeliveryDescription 1372 </div> 1373 </div> 1374 </div> 1375 <div class="delivery-information-popup" data-bind="css: { 'd-flex': NormalDeliveryInfoOpen }, click: ToggleNormalDeliveryInfo"> 1376 <div class="description-content bg-white px-3 py-4 px-lg-4 position-relative" data-bind="click: OpenNormalDeliveryInfo, clickBubble: false"> 1377 <div class="modal-closer-custom" data-bind="click: ToggleNormalDeliveryInfo, clickBubble: false"> 1378 <img src="/Files/Templates/Designs/Mobler2018/assets/img/icons/close.svg" /> 1379 </div> 1380 <div> 1381 @NormalDeliveryDescription 1382 </div> 1383 </div> 1384 </div> 1385 1386 <div class="line-through-header mb-3"> 1387 <h4>@Group.GetString("Ecom:Product:RelatedGroup.Name")</h4> 1388 </div> 1389 1390 <div class="row"> 1391 1392 @foreach (var Product in Group.GetLoop("Products")) 1393 { 1394 var productToRender = Product; 1395 string productId = Product.GetString("Ecom:Product.ID"); 1396 string variantIdLoop = productsDisplayVariant.GetDisplayVariantId(productId); 1397 1398 if (Product.GetLoop("VariantCombinations").Count > 0 && Product.GetLoop("VariantCombinations").Any(x => x.GetString("Ecom:Product.VariantID").Equals(variantIdLoop))) 1399 { 1400 productToRender = Product.GetLoop("VariantCombinations").FirstOrDefault(x => x.GetString("Ecom:Product.VariantID").Equals(variantIdLoop)); 1401 } 1402 1403 @RenderProduct(productToRender) 1404 } 1405 </div> 1406 </div> 1407 } 1408 } 1409 1410 @if (RelatedBlogs.Count > 0) 1411 { 1412 string ImagePosition = "Left"; 1413 <div class="feature-blogs my-5"> 1414 1415 <div class="row"> 1416 1417 @foreach (var Blog in RelatedBlogs) 1418 { 1419 @RenderLargeBlogTeaser(Blog, ImagePosition) 1420 if (ImagePosition == "Left") 1421 { 1422 ImagePosition = "Right"; 1423 } 1424 else 1425 { 1426 ImagePosition = "Left"; 1427 } 1428 } 1429 1430 </div> 1431 1432 </div> 1433 } 1434 1435 1436 <div class="after-add-to-cart bg-white box-shadow" data-bind="css: { 'd-block': ProductAddedToCart }"> 1437 <div class="closer fs3 pointer" data-bind="click: ProductAddedToCart(false)"> 1438 <i class="fas fa-times-circle color-primary"></i> 1439 </div> 1440 <div class="p-3"> 1441 <p class="font-weight-bold fs4 text-uppercase m-0"> 1442 <i class="fas fa-check-circle color-primary"></i> 1443 @Translate("ProductProductAddedToCart", "Varen er lagt i indk&oslash;bskurven") 1444 </p> 1445 </div> 1446 <div class="mini-cart large-cart power-step"> 1447 1448 <div class="position-relative"> 1449 <div class="cart-command-loader unimportant-hidden justify-content-center align-items-center" data-bind="css: { 'd-flex': Loading }"> 1450 <div class="d-flex align-items-center"> 1451 <p class="m-0 mr-2">@Translate("Cart.UpdatingCart", "Opdaterer kurv")</p> 1452 <i class="fas fa-spinner fa-spin"></i> 1453 </div> 1454 </div> 1455 1456 <div class="lines" data-bind="foreach: Orderlines"> 1457 <div class="cartline d-flex justify-content-between align-items-center px-3 py-2 position-relative bg-grey"> 1458 <span class="delete-orderline color-subtle cursor-pointer mr-2" data-bind="click: $parent.DeleteOrderline.bind($data, OrderlineId)"> 1459 <i class="fas fa-times"></i> 1460 </span> 1461 <div class="product-image w-10"> 1462 <img class="img-fluid" data-bind="attr: { src: ImagePath }" /> 1463 </div> 1464 <div class="flex-fill px-3 w-75"> 1465 <p class="font-weight-bold m-0" data-bind="text: ProductName"></p> 1466 <p class="m-0 color-subtle small-quantity-indicator"><span data-bind="text: Quantity"></span> stk. a <span data-bind="text: QuantityPrice"></span></p> 1467 <div class="variant-dimensions" data-bind="foreach: VariantDimensions"> 1468 <p class="m-0 color-subtle color-dark-grey font-weight-bold"> 1469 <span data-bind="text: Label"></span> 1470 <span class="font-weight-normal" data-bind="text: Value"></span> 1471 </p> 1472 </div> 1473 </div> 1474 <div class="qty-counter w-10"> 1475 <div class="d-flex"> 1476 <div class="quantity-controls d-flex align-items-center mr-3"> 1477 <div class="control minus" data-bind="click: $parent.QuantityControl.bind($data, -1, OrderlineId)"> 1478 - 1479 </div> 1480 <input disabled type="text" name="Quantity" value="1" data-bind="value: Quantity, attr: { 'data-id': 'js-input-' + OrderlineId }" /> 1481 <div class="control plus" data-bind="click: $parent.QuantityControl.bind($data, 1, OrderlineId)"> 1482 + 1483 </div> 1484 </div> 1485 </div> 1486 </div> 1487 1488 <p class="fs0 m-0 orderline-price" data-bind="text: OrderlinePrice"></p> 1489 </div> 1490 </div> 1491 @if (BlackFridayTheme == "True") 1492 { 1493 <div class="bf-bg-black p-3 d-flex justify-content-between align-items-center price-summary"> 1494 <p class="m-0 color-white fs-12px font-weight-semibold">@Translate("MiniCartTotal", "Din kurv i alt (ex. fragt)")</p> 1495 <p class="m-0 color-white fs1 font-weight-bold" data-bind="text: CartTotalNoFees"></p> 1496 </div> 1497 } 1498 else 1499 { 1500 <div class="bg-brand p-3 d-flex justify-content-between align-items-center price-summary"> 1501 <p class="m-0 color-white fs-12px font-weight-semibold">@Translate("MiniCartTotal", "Din kurv i alt (ex. fragt)")</p> 1502 <p class="m-0 color-white fs1 font-extra-bold" data-bind="text: CartTotalNoFees"></p> 1503 </div> 1504 } 1505 </div> 1506 1507 </div> 1508 <div class="p-3 d-flex justify-content-between"> 1509 <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> 1510 1511 @if (BlackFridayTheme == "True") 1512 { 1513 <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> 1514 } 1515 else 1516 { 1517 <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> 1518 } 1519 1520 </div> 1521 <div class="js-customers-also-saw-lines"></div> 1522 1523 </div> 1524 <div class="variant-picker" data-bind="css: { 'open': VariantPickerOpen }"> 1525 <div class="closer color-primary fs5 pointer" data-bind="click: ToggleVariantPicker"> 1526 <i class="fas fa-times-circle"></i> 1527 </div> 1528 <div class="container py-5 position-relative"> 1529 <h3 class="fs4 text-center">Design din @ProductName</h3> 1530 @{ 1531 var ColorDimensions = GetLoop("VariantGroups").Where(g => g.GetString("Ecom:VariantGroup.Name").ToLower().Contains("farve")); 1532 var NonColorDimensions = GetLoop("VariantGroups").Where(g => !g.GetString("Ecom:VariantGroup.Name").ToLower().Contains("farve")); 1533 int FilterCounter = 0; 1534 string RowClass = NonColorDimensions.Any() && ColorDimensions.Any() ? "flex-row-reverse" : ""; 1535 } 1536 <div class="row mt-5 @RowClass"> 1537 @if (ColorDimensions.Any()) 1538 { 1539 <div class="col-12 col-md-8"> 1540 @foreach (var VariantDimension in ColorDimensions) 1541 { 1542 string DimensionName = VariantDimension.GetString("Ecom:VariantGroup.Name"); 1543 string FilterName = "filter-" + FilterCounter; 1544 FilterCounter++; 1545 <div class="mb-5 mb-md-0"> 1546 <p class="font-weight-bold fs2 mb-2">@DimensionName</p> 1547 <div class="row custom-row"> 1548 @foreach (var VariantOption in VariantDimension.GetLoop("VariantAvailableOptions").OrderBy(v => v.GetString("Ecom:VariantOption.Name"))) 1549 { 1550 string VariantOptionName = VariantOption.GetString("Ecom:VariantOption.Name"); 1551 string VariantOptionId = VariantOption.GetString("Ecom:VariantOption.ID"); 1552 string Preview = VariantOption.GetString("Ecom:VariantOption.ImgSmall.Clean"); 1553 string PreviewCss = ""; 1554 if (!String.IsNullOrEmpty(Preview)) 1555 { 1556 if (Preview.StartsWith("#")) 1557 { 1558 PreviewCss = "style= \"background-color: " + Preview + ";\""; 1559 } 1560 else 1561 { 1562 PreviewCss = "style=\"background-image: url('" + Preview + "');\""; 1563 } 1564 } 1565 <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')"> 1566 <p class="mb-0 color-variant-name d-none d-sm-block">@VariantOptionName</p> 1567 <div class="variant-preview position-relative d-flex" @PreviewCss></div> 1568 </div> 1569 } 1570 </div> 1571 </div> 1572 } 1573 </div> 1574 } 1575 @if (NonColorDimensions.Any()) 1576 { 1577 <div class="col-12 col-sm-6 col-md-4"> 1578 @foreach (var VariantDimension in NonColorDimensions) 1579 { 1580 string DimensionName = VariantDimension.GetString("Ecom:VariantGroup.Name"); 1581 string FilterName = "filter-" + FilterCounter; 1582 FilterCounter++; 1583 <div class="mb-5"> 1584 <p class="font-weight-bold fs2 mb-2">@DimensionName</p> 1585 <div class="row custom-row"> 1586 @foreach (var VariantOption in VariantDimension.GetLoop("VariantAvailableOptions").OrderBy(v => v.GetString("Ecom:VariantOption.Name"))) 1587 { 1588 string VariantOptionName = VariantOption.GetString("Ecom:VariantOption.Name"); 1589 string VariantOptionId = VariantOption.GetString("Ecom:VariantOption.ID"); 1590 string Preview = VariantOption.GetString("Ecom:VariantOption.ImgSmall.Clean"); 1591 string PreviewCss = ""; 1592 if (!String.IsNullOrEmpty(Preview)) 1593 { 1594 if (Preview.StartsWith("#")) 1595 { 1596 PreviewCss = "style= \"background-color: " + Preview + ";\""; 1597 } 1598 else 1599 { 1600 PreviewCss = "style=\"background-image: url('/Files" + Preview + "');\""; 1601 } 1602 } 1603 if (DimensionName == "STØRRELSE") 1604 { 1605 <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')"> 1606 <div class="variant-preview position-relative d-flex justify-content-center align-items-center" @PreviewCss> 1607 <p class="mb-0 color-variant-name font-weight-bold">@VariantOptionName</p> 1608 </div> 1609 </div> 1610 } 1611 else 1612 { 1613 <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')"> 1614 <p class="mb-0 color-variant-name">@VariantOptionName</p> 1615 <div class="variant-preview position-relative d-flex" @PreviewCss></div> 1616 </div> 1617 } 1618 } 1619 </div> 1620 </div> 1621 } 1622 </div> 1623 } 1624 1625 <div class="col-12 d-flex justify-content-end"> 1626 <p class="color-primary pointer my-3" data-bind="click: ResetFilters">Nulstil</p> 1627 </div> 1628 </div> 1629 <p class="font-weight-bold fs2 mt-5"> 1630 @Translate("ChooseProduct", "V&aelig;lg produkt") 1631 </p> 1632 <div class="row align-items-end" data-bind="foreach: FilteredVariants"> 1633 <div class="col-12 col-sm-6 col-md-3 mb-3"> 1634 <a class="color-black no-underline" data-bind="attr: { href: Link }"> 1635 <p class="fs0 font-weight-bold m-0" data-bind="text: Name"></p> 1636 <img class="img-fluid box-shadow my-1" data-bind="attr: { src: Image }" /> 1637 <div class="d-flex justify-content-center mt-2"> 1638 <div class="btn btn-primary">@Translate("VariantChooseProduct", "V&aelig;lg")</div> 1639 </div> 1640 </a> 1641 </div> 1642 </div> 1643 <div data-bind="visible: FilteredVariants().length == 0"> 1644 <p class="font-weight-bold mt-3 fs3">@Translate("VariantsNoResults", "Filtreringen gav ingen resultater")</p> 1645 </div> 1646 </div> 1647 </div> 1648 </div> 1649 1650 @SnippetStart("DataLayerOverwrites") 1651 <script> 1652 ecomm_pagetype = "Product"; 1653 ecomm_totalvalue = @GetString("Ecom:Product.Price.Price").Replace(".","").Replace(",","."); 1654 ecomm_prodid = "@GetString("Ecom:Product.ID")"; 1655 </script> 1656 @SnippetEnd("DataLayerOverwrites") 1657 1658 <script> 1659 var dataLayer = window.dataLayer || []; 1660 dataLayer.push({ 1661 'event': 'product', 1662 'ecommerce': { 1663 'detail': { 1664 'actionField': { 1665 'list': '@DataLayerParentGroups' 1666 }, 1667 'products': [{ 1668 'id': '@ProductID', 1669 'name': '@ProductName', 1670 'image': '@OgImage', 1671 'brand': '@BrandName', 1672 'variant': '@CurrentVariantName', 1673 'category': '@DataLayerParentGroup', 1674 'price': '@DataLayerPrice' 1675 }] 1676 } 1677 }, 1678 'page': { 1679 'type': 'product', 1680 'environment': 'production' 1681 } 1682 }); 1683 </script> 1684

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.