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

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.