Error executing template "Designs/randers-tegl/eCom/Product/garden.product.cshtml"
System.ArgumentOutOfRangeException: StartIndex cannot be less than zero.
Parameter name: startIndex
   at System.String.Substring(Int32 startIndex, Int32 length)
   at CompiledRazorTemplates.Dynamic.RazorEngine_1d1b1082f7024277b2a76e25de1a6bf6.Execute() in D:\dynamicweb.net\Solutions\Gotcha\randerstegl.dev.gotcha.dk\Files\Templates\Designs\randers-tegl\eCom\Product\garden.product.cshtml:line 276
   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.<RunCompile>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 2 @{ 3 string productId = GetString("Ecom:Product.ID"); 4 string galleryId = "gallery-" + productId; 5 int areaId = GetInteger("Ecom:Product:Area.ID"); 6 string productFolder = "/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ", "").ToLower(); 7 string productName = GetString("Ecom:Product.Name"); 8 string productSeries = GetString("Ecom:Product.CategoryField.Belaegning.ProduktSerie.OptionLabel"); 9 System.Web.HttpContext.Current.Items["currentProductSeries"] = productSeries; 10 string productNumber = GetString("Ecom:Product.Number"); 11 System.Web.HttpContext.Current.Items["currentProductNumber"] = productNumber; 12 string productTeaser = GetString("Ecom:Product:Field.ProductTeaser"); 13 string productDescription = GetString("Ecom:Product.LongDescription"); 14 string productShortDescription = GetString("Ecom:Product.ShortDescription"); 15 string productDisclaimer = Translate("Translate_ProductDisclaimer"); 16 bool disableSample = GetBoolean("Ecom:Product:Field.DisableSample"); 17 18 string stackImagePath = ""; 19 20 // Stack - JPG 21 if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack.jpg"))) { 22 stackImagePath = "/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack.jpg"; 23 } 24 25 if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack_wide.jpg"))) { 26 stackImagePath = "/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack_wide.jpg"; 27 } 28 29 if (Pageview.Area.ID == 9 && System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack_de.jpg"))) { 30 stackImagePath = "/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack_de.jpg"; 31 } 32 33 if (Pageview.Area.ID == 9 && System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack_wide_de.jpg"))) { 34 stackImagePath = "/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack_wide_de.jpg"; 35 } 36 37 // If there's no JPG - look for PNG 38 if (string.IsNullOrWhiteSpace(stackImagePath)) { 39 if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack.png"))) { 40 stackImagePath = "/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack.png"; 41 } 42 43 if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack_wide.png"))) { 44 stackImagePath = "/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack_wide.png"; 45 } 46 47 if (Pageview.Area.ID == 9 && System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack_de.png"))) { 48 stackImagePath = "/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack_de.png"; 49 } 50 51 if (Pageview.Area.ID == 9 && System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack_wide_de.png"))) { 52 stackImagePath = "/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/stack_wide_de.png"; 53 } 54 } 55 56 string stackImageXl = "/admin/public/getimage.ashx?image=" + stackImagePath + "&compression=100&width=370"; 57 string stackImageMd = "/admin/public/getimage.ashx?image=" + stackImagePath + "&compression=100&width=286"; 58 string stackImageSm = "/admin/public/getimage.ashx?image=" + stackImagePath + "&compression=100&width=189"; 59 string stackImageDefault = "/admin/public/getimage.ashx?image=" + stackImagePath + "&compression=100&width=437"; 60 61 string wallImagePath = ""; 62 63 if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/wall.jpg"))) { 64 wallImagePath = "/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/wall.jpg"; 65 } 66 67 if (Pageview.Area.ID == 8 && System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/wall_se.png"))) { 68 wallImagePath = "/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/wall_se.png"; 69 } 70 71 if (Pageview.Area.ID == 9 && System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/wall_de.png"))) { 72 wallImagePath = "/Files/Images/products-v2/" + GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "/wall_de.png"; 73 } 74 75 string wallImageXl = "/admin/public/getimage.ashx?image=" + wallImagePath + "&compression=100&width=732"; 76 string wallImageMd = "/admin/public/getimage.ashx?image=" + wallImagePath + "&compression=100&width=566"; 77 string wallImageSm = "/admin/public/getimage.ashx?image=" + wallImagePath + "&compression=100&width=380"; 78 string wallImageDefault = "/admin/public/getimage.ashx?image=" + wallImagePath + "&compression=100&width=727"; 79 80 string arrowSvg = ""; 81 82 if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Templates/Designs/randers-tegl/images/gallery-arrow.svg"))) { 83 arrowSvg = System.IO.File.ReadAllText(System.Web.HttpContext.Current.Server.MapPath("/Files/Templates/Designs/randers-tegl/images/gallery-arrow.svg")); 84 } 85 86 string lastAddedProductId = GetString("Ecom:LastAddedProduct.ID"); 87 bool sampleIsInCart = GetLoop("ProductRelatedGroups").Where(x => x.GetLoop("Products").Where(y => y.GetString("Ecom:Product.ID") == lastAddedProductId).Any()).Any(); 88 89 System.Web.HttpContext.Current.Items["CurrentSampleInCart"] = sampleIsInCart; 90 } 91 <article class="product-header module module-white"><div class="product-header__text"><span class="product-header__preline">@productSeries</span><h1 class="product-header__headline">@productNumber @productName</h1><div class="product-header__teaser">@productTeaser</div> 92 @if(!String.IsNullOrWhiteSpace(stackImagePath)) { 93 <picture class="product-header__stack-image"><source srcset="@stackImageXl" media="(min-width: 1500px)" /><source srcset="@stackImageMd" media="(min-width: 992px)" /><source srcset="@stackImageSm" media="(min-width: 768px)" /><img src="@stackImageDefault" class="product-header__stack-media" loading="lazy" alt="." /></picture> 94 } 95 <div class="rich-text"> 96 @productShortDescription 97 @productDescription 98 </div><span class="product-header__disclaimer">@productDisclaimer</span> 99 @if (GetInteger("Ecom:Product:Area.ID") == 1 ) { 100 string shopBelaegningPageID = ""; 101 102 if (GetInteger("Ecom:Product:Area.ID") == 1) { 103 shopBelaegningPageID = "147"; 104 } else if (GetInteger("Ecom:Product:Area.ID") == 9) { 105 shopBelaegningPageID = "2346"; 106 } 107 108 <div class="product-header__shop-link"><a href='@("/Default.aspx?Id=")@shopBelaegningPageID@("&ProductID=")@GetString("Ecom:Product.ID")' class="button button-simple">@Translate("RT-2.0_BelaegningShop_KoebBelaegning")</a><br /><br /></div> 109 } 110 @{ 111 bool hasRelatedProduct = false; 112 113 foreach (var relatedGroup in GetLoop("ProductRelatedGroups")) { 114 if (relatedGroup.GetString("Ecom:Product:RelatedGroup.Name").ToLower() == "prøvekasse") { 115 foreach (var relatedProduct in relatedGroup.GetLoop("RelatedProducts")) { 116 hasRelatedProduct = true; 117 118 string relatedLoopCounterName = $"ProductLoopCounter{@relatedProduct.GetString("Ecom:Product.LoopCounter")}"; 119 string relatedLoopCounterValue = relatedProduct.GetString("Ecom:Product.LoopCounter"); 120 string relatedIdName = $"ProductID{@relatedProduct.GetString("Ecom:Product.LoopCounter")}"; 121 string relatedIdValue = relatedProduct.GetString("Ecom:Product.ID"); 122 string relatedQuantityName = $"Quantity{relatedProduct.GetString("Ecom:Product.LoopCounter")}"; 123 124 <form method="post" class="product-samples-form" name="@relatedIdValue" id="@relatedIdValue"><input type="hidden" name="OrderContext" value="ORDERCONTEXT1" /><input type="hidden" name="CartCmd" id="CartCmd" value="addMulti" /><input type="hidden" name="@relatedLoopCounterName" value="@relatedLoopCounterValue" /><input type="hidden" name="@relatedIdName" value="@relatedIdValue" /><input type="hidden" name="@relatedQuantityName" value="1" /><input type="hidden" name="VariantID" id="VariantID" value="" /><input type="hidden" name="UnitID" id="UnitID" value="" /><input type="hidden" name="wishListID" id="wishListID" value="0" /><input type="hidden" name='ProductLoopCounter{@GetString("Ecom:Product.LoopCounter")}' value='@GetString("Ecom:Product.LoopCounter")' /> 125 @{ 126 string mainProductCounterName = $"ProductID{GetString("Ecom:Product.LoopCounter")}"; 127 string mainProductCounterValue = GetString("Ecom:Product.ID"); 128 string mainProductQuantityName = $"Quantity{GetString("Ecom:Product.LoopCounter")}"; 129 } 130 <input type="hidden" name="@mainProductCounterName" value="@mainProductCounterValue" /><input type="hidden" name="@mainProductQuantityName" value="0" /><div class="product-cta"><button type="submit" class="product-cta__link product-cta__link--orange"><span class="product-cta__link-text">@Translate("Translate_Order-sample-private")</span></button><a href="#tabFreeSample-content" class="product-cta__link product-cta__link--white"><span class="product-cta__link-text">@Translate("Translate_Order-sample-business")</span></a></div></form><form method="post" class="product-samples-form" name="@relatedIdValue" id="@relatedIdValue"><input type="hidden" name="OrderContext" value="ORDERCONTEXT2" /><input type="hidden" name="CartCmd" id="CartCmd" value="addMulti" /><input type="hidden" name="@relatedLoopCounterName" value="@relatedLoopCounterValue" /><input type="hidden" name="@relatedIdName" value="@relatedIdValue" /><input type="hidden" name="@relatedQuantityName" value="1" /><input type="hidden" name="VariantID" id="VariantID" value="" /><input type="hidden" name="UnitID" id="UnitID" value="" /><input type="hidden" name="wishListID" id="wishListID" value="0" /><input type="hidden" name='ProductLoopCounter{@GetString("Ecom:Product.LoopCounter")}' value='@GetString("Ecom:Product.LoopCounter")' /> 131 @{ 132 string quoteMainProductCounterName = $"ProductID{GetString("Ecom:Product.LoopCounter")}"; 133 string quoteMainProductCounterValue = GetString("Ecom:Product.ID"); 134 string quoteMainProductQuantityName = $"Quantity{GetString("Ecom:Product.LoopCounter")}"; 135 } 136 <input type="hidden" name="@quoteMainProductCounterName" value="@quoteMainProductCounterValue" /><input type="hidden" name="@quoteMainProductQuantityName" value="0" /><div class="product-cta"><button type="submit" class="product-cta__link product-cta__link--white"><span class="product-cta__link-text">@Translate("Translate_Order-sample-business")</span></button></div></form> 137 } 138 } 139 } 140 } 141 </div><picture class="product-header__wall-image"><source srcset="@wallImageXl" media="(min-width: 1500px)" /><source srcset="@wallImageMd" media="(min-width: 992px)" /><source srcset="@wallImageSm" media="(min-width: 768px)" /><img src="@wallImageDefault" class="product-header__wall-media" loading="lazy" alt="." /></picture></article> 142 143 144 @{ 145 string galleryMain = ""; 146 147 if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath(productFolder + "/gallery_main.jpg"))) { 148 galleryMain = productFolder + "/gallery_main.jpg"; 149 } 150 151 string searchpattern = @"gallery_\d{2}\.jpg"; 152 string[] galleryImages = new string[0]; 153 154 if (System.IO.Directory.Exists(System.Web.HttpContext.Current.Server.MapPath("~\\Files\\Images\\products-v2\\" + @GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "\\"))) { 155 galleryImages = System.IO.Directory.GetFiles(System.Web.HttpContext.Current.Server.MapPath("~\\Files\\Images\\products-v2\\" + @GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "\\")).Where(path => System.Text.RegularExpressions.Regex.Match(path, searchpattern).Success).ToArray(); 156 157 if (GetInteger("Ecom:Product:Area.ID") != 1) { 158 string language = GetString("Ecom:Product:Area.Name").ToString().ToLower(); 159 string languageGalleryMain = ""; 160 161 if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath(productFolder + "/gallery_main_" + language + ".jpg"))) { 162 languageGalleryMain = productFolder + "/gallery_main_" + language +".jpg"; 163 } 164 165 string languageSearchpattern = "gallery_0*_" + language + ".jpg"; 166 string[] languageGalleryImages = new string[0]; 167 168 try { 169 languageGalleryImages = System.IO.Directory.GetFiles(System.Web.HttpContext.Current.Server.MapPath("~\\Files\\Images\\products-v2\\" + @GetString("Ecom:Product.Number").Replace(" ","").ToLower() + "\\"), languageSearchpattern); 170 } catch { 171 172 } 173 174 if (languageGalleryMain != "") { 175 galleryMain = languageGalleryMain; 176 } 177 178 if (languageGalleryImages.Length > 0) { 179 galleryImages = languageGalleryImages; 180 } 181 } 182 } 183 184 string productVideo = GetString("Ecom:Product:Field.Video"); 185 string productVideoEmbed = ""; 186 187 if (!string.IsNullOrWhiteSpace(productVideo)) { 188 string videoId = productVideo.Substring(productVideo.LastIndexOf("/") + 1); 189 productVideoEmbed = "https://player.vimeo.com/video/" + videoId + "?background=1&dnt=1&autoplay=0"; 190 } 191 192 string productVideo2 = GetString("Ecom:Product:Field.Video2"); 193 string productVideoEmbed2 = ""; 194 195 if (!string.IsNullOrWhiteSpace(productVideo2)) { 196 string videoId2 = productVideo2.Substring(productVideo2.LastIndexOf("/") + 1); 197 productVideoEmbed2 = "https://player.vimeo.com/video/" + videoId2 + "?background=1&dnt=1&autoplay=0"; 198 } 199 200 string productVideo3 = GetString("Ecom:Product:Field.Video3"); 201 string productVideoEmbed3 = ""; 202 203 if (!string.IsNullOrWhiteSpace(productVideo3)) { 204 string videoId3 = productVideo3.Substring(productVideo3.LastIndexOf("/") + 1); 205 productVideoEmbed3 = "https://player.vimeo.com/video/" + videoId3 + "?background=1&dnt=1&autoplay=0"; 206 } 207 208 string productVideo4 = GetString("Ecom:Product:Field.Video4"); 209 string productVideoEmbed4 = ""; 210 211 if (!string.IsNullOrWhiteSpace(productVideo4)) { 212 string videoId4 = productVideo4.Substring(productVideo4.LastIndexOf("/") + 1); 213 productVideoEmbed4 = "https://player.vimeo.com/video/" + videoId4 + "?background=1&dnt=1&autoplay=0"; 214 } 215 216 string productVideo5 = GetString("Ecom:Product:Field.Video5"); 217 string productVideoEmbed5 = ""; 218 219 if (!string.IsNullOrWhiteSpace(productVideo5)) { 220 string videoId5 = productVideo5.Substring(productVideo5.LastIndexOf("/") + 1); 221 productVideoEmbed5 = "https://player.vimeo.com/video/" + videoId5 + "?background=1&dnt=1&autoplay=0"; 222 } 223 } 224 @if ( 225 !string.IsNullOrWhiteSpace(productVideoEmbed) || 226 !string.IsNullOrWhiteSpace(productVideoEmbed2) || 227 !string.IsNullOrWhiteSpace(productVideoEmbed3) || 228 !string.IsNullOrWhiteSpace(productVideoEmbed4) || 229 !string.IsNullOrWhiteSpace(productVideoEmbed5) || 230 galleryImages.Length > 0 231 ) { 232 int counter = 0; 233 234 <article class="product-gallery module module-white" id="@galleryId"><span class="product-gallery__preline">@Translate("Translate_Product-gallery_preline")</span><h2 class="product-gallery__headline">@Translate("Translate_Product-gallery_See_projects_with") 235 @productSeries, @productNumber</h2><div class="product-gallery__medias-wrap swiper-container" data-action="swiper"><ul class="product-gallery__medias swiper-wrapper"> 236 @if (!string.IsNullOrWhiteSpace(productVideoEmbed)) { 237 counter++; 238 239 <li class="product-gallery__media product-gallery__media--video swiper-slide"><iframe class="product-gallery__video" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen src="@productVideoEmbed"></iframe></li> 240 } 241 @if (!string.IsNullOrWhiteSpace(productVideoEmbed2)) { 242 counter++; 243 244 <li class="product-gallery__media product-gallery__media--video swiper-slide"><iframe class="product-gallery__video" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen src="@productVideoEmbed2"></iframe></li> 245 } 246 @if (!string.IsNullOrWhiteSpace(productVideoEmbed3)) { 247 counter++; 248 249 <li class="product-gallery__media product-gallery__media--video swiper-slide"><iframe class="product-gallery__video" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen src="@productVideoEmbed3"></iframe></li> 250 } 251 @if (!string.IsNullOrWhiteSpace(productVideoEmbed4)) { 252 if (counter == 3) { 253 <text>@RenderLoadmoreButton(galleryId)</text> 254 } 255 256 counter++; 257 258 <li class="product-gallery__media product-gallery__media--video swiper-slide"><iframe class="product-gallery__video" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen src="@productVideoEmbed4"></iframe></li> 259 } 260 @if (!string.IsNullOrWhiteSpace(productVideoEmbed5)) { 261 if (counter == 3) { 262 <text>@RenderLoadmoreButton(galleryId)</text> 263 } 264 265 counter++; 266 267 <li class="product-gallery__media product-gallery__media--video swiper-slide"><iframe class="product-gallery__video" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen src="@productVideoEmbed5"></iframe></li> 268 } 269 @for (var a = 0; a < galleryImages.Length; a++) { 270 if (counter == 3) { 271 <text>@RenderLoadmoreButton(galleryId)</text> 272 } 273 274 counter++; 275 276 string path = galleryImages[a].Substring(galleryImages[a].IndexOf("\\files")).Replace("\\","/"); 277 string imageXl = "/admin/public/getimage.ashx?image=" + path + "&compression=100&width=1500"; 278 string imageMd = "/admin/public/getimage.ashx?image=" + path + "&compression=100&width=1175"; 279 string imageSm = "/admin/public/getimage.ashx?image=" + path + "&compression=100&width=777"; 280 string imageDefault = "/admin/public/getimage.ashx?image=" + path + "&compression=100&width=640&height=515&Crop=0"; 281 282 <li class="product-gallery__media swiper-slide"><picture class="product-gallery__image-wrap"><source srcset="@imageXl" media="(min-width: 1500px)" /><source srcset="@imageMd" media="(min-width: 992px)" /><source srcset="@imageSm" media="(min-width: 768px)" /><img src="@imageDefault" class="product-gallery__image" loading="lazy" alt="" /></picture></li> 283 } 284 </ul><div class="product-gallery__navigation-wrap"><span class="product-gallery__pagination-fraction-wrap">@Translate("Translate_Product-gallery_Image_x_of_y") <span class="product-gallery__pagination-fraction"></span></span> 285 @if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Templates/Designs/randers-tegl/images/gallery-arrow.svg"))) { 286 <span class="product-gallery__navigation product-gallery__navigation--prev"> 287 @arrowSvg 288 @arrowSvg 289 </span> 290 } 291 @if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Templates/Designs/randers-tegl/images/gallery-arrow.svg"))) { 292 <span class="product-gallery__navigation product-gallery__navigation--next"> 293 @arrowSvg 294 @arrowSvg 295 </span> 296 } 297 </div></div></article> 298 @SnippetStart("JavascriptBottom") 299 <text> 300 @if (System.Web.HttpContext.Current.Items["swiperScriptLoaded"] != "true") { 301 System.Web.HttpContext.Current.Items["swiperScriptLoaded"] = "true"; 302 303 if ( 304 !string.IsNullOrWhiteSpace(productVideoEmbed) || 305 !string.IsNullOrWhiteSpace(productVideoEmbed2) || 306 !string.IsNullOrWhiteSpace(productVideoEmbed3) || 307 !string.IsNullOrWhiteSpace(productVideoEmbed4) || 308 !string.IsNullOrWhiteSpace(productVideoEmbed5) 309 ) { 310 <script src="https://player.vimeo.com/api/player.js"></script><script> 311 let activeVideo; 312 313 function stopVideo(e) { 314 const container = e.currentTarget ? e.currentTarget : e; 315 const video = container.querySelector('iframe'); 316 317 if (video) { 318 const player = new Vimeo.Player(video); 319 player.pause(); 320 } 321 } 322 323 function startVideo(e) { 324 const container = e.currentTarget ? e.currentTarget : e; 325 const video = container.querySelector('iframe'); 326 327 if (video) { 328 if (activeVideo) { 329 activeVideo.pause(); 330 } 331 332 const player = new Vimeo.Player(video); 333 player.play(); 334 activeVideo = player; 335 } 336 } 337 </script> 338 } 339 340 <link rel="stylesheet" href="https://unpkg.com/swiper@8.2.2/swiper.min.css" /><script src="https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.js"></script><script> 341 const swipers = document.querySelectorAll('[data-action="swiper"]'); 342 const loadMoreButtons = document.querySelectorAll('[data-action="load-more"]'); 343 344 if (window.innerWidth > 768) { 345 const swipersWithVideos = Array.from(swipers).filter(x => x.querySelectorAll('.product-gallery__video').length > 0); 346 347 if (swipersWithVideos.length > 0) { 348 function onChange(changes, observer) { 349 changes.forEach(change => { 350 if (change.intersectionRatio > 0.2) { 351 const video = change.target.querySelector('iframe'); 352 const player = new Vimeo.Player(video); 353 player.play(); 354 } 355 }); 356 } 357 358 const config = { 359 root: null, 360 rootMargin: '0px', 361 threshold: [0.2] 362 }; 363 364 const observer = new IntersectionObserver(onChange, config); 365 366 Array.from(swipersWithVideos).forEach(swiperWithVideo => { 367 observer.observe(swiperWithVideo); 368 }); 369 } 370 371 swipers.forEach(swiperContainer => { 372 const swiper = new Swiper(swiperContainer, { 373 slidesPerView: 'auto', // Slide sizes are controlled with css - not here 374 centeredSlides: false, 375 navigation: { 376 nextEl: '.product-gallery__navigation--next', 377 prevEl: '.product-gallery__navigation--prev', 378 }, 379 pagination: { 380 el: '.product-gallery__pagination-fraction', 381 type: 'fraction' 382 }, 383 speed: 500, 384 }); 385 386 swiper.on('activeIndexChange',function(e) { 387 const previousSlide = e.slides[e.previousIndex]; 388 const activeSlide = e.slides[e.activeIndex]; 389 const previousIsVimeo = previousSlide.querySelector('iframe') ? true : false; 390 const activeIsVimeo = activeSlide.querySelector('iframe') ? true : false; 391 392 if (previousIsVimeo) { 393 stopVideo(previousSlide); 394 } 395 396 if (activeIsVimeo) { 397 startVideo(activeSlide); 398 } 399 }); 400 }); 401 } else { 402 const swipersWithVideos = Array.from(swipers).filter(x => x.querySelectorAll('.product-gallery__video').length > 0); 403 404 if (swipersWithVideos.length > 0) { 405 swipersWithVideos.forEach(swiperWithVideo => { 406 const swiperVideoElements = swiperWithVideo.querySelectorAll('.product-gallery__media--video'); 407 408 swiperVideoElements.forEach(swiperVideoElement => { 409 swiperVideoElement.addEventListener('click',startVideo); 410 }); 411 }); 412 } 413 } 414 415 function loadMore(e) { 416 const loadMoreTarget = document.querySelector(e.currentTarget.getAttribute('data-load-more-target')); 417 418 if (loadMoreTarget) { 419 loadMoreTarget.classList.add('js-load-more'); 420 } 421 422 e.currentTarget.removeEventListener('click', loadMore); 423 } 424 425 loadMoreButtons.forEach(loadMoreButton => { 426 loadMoreButton.addEventListener('click',loadMore); 427 }); 428 </script> 429 } 430 </text> 431 @SnippetEnd("JavascriptBottom") 432 } 433 434 435 @{ 436 bool hasDownloads = !string.IsNullOrWhiteSpace(GetString("Ecom:Product.CategoryField.Belaegning.ProduktRelevanteDownloads.Value.Clean")); 437 bool hasLinks = !string.IsNullOrWhiteSpace(GetString("Ecom:Product.CategoryField.Belaegning.ProduktOvrigtLinks.Value.Clean")); 438 } 439 <article class="product-tabs module module-grey-light"><nav class="product-tabs__navigation" role="tablist" data-action="tabs"><ul class="product-tabs__list" role="none"><li class="product-tabs__item" role="none"><a href="#tabVisualization-content" class="product-tabs__tab product-tabs__tab--active" role="tab" id="tabVisualization" aria-controls="tabVisualization-content" aria-selected="true"><span class="product-tabs__item-text">@Translate("Translate_Visualization")</span></a></li> 440 @if(Pageview.Area.ID == 1) { 441 <li class="product-tabs__item" role="none"><a href="#tabPrices-content" class="product-tabs__tab" role="tab" id="tabPrices" aria-controls="tabPrices-content" aria-selected="false"><span class="product-tabs__item-text">@Translate("RT-2.0_Priser_og_levering")</span></a></li> 442 } 443 @if (areaId != 7 && !disableSample) { 444 /* Show on all other than NO site */ 445 446 <li class="product-tabs__item" role="none"><a href="#tabFreeSample-content" class="product-tabs__tab" role="tab" id="tabFreeSample" aria-controls="tabFreeSample-content" aria-selected="false"><span class="product-tabs__item-text">@Translate("Translate_Free_sample")</span></a></li> 447 } 448 <li class="product-tabs__item" role="none"><a href="#tabDatasheets-content" class="product-tabs__tab" role="tab" id="tabDatasheets" aria-controls="tabDatasheets-content" aria-selected="false"><span class="product-tabs__item-text">@Translate("Translate_Datasheets")</span></a></li> 449 @if (hasDownloads) { 450 <li class="product-tabs__item" role="none"><a href="#tabDownloads-content" class="product-tabs__tab" role="tab" id="tabDownloads" aria-controls="tabDownloads-content" aria-selected="false"><span class="product-tabs__item-text">@Translate("Translate_Downloads")</span></a></li> 451 } 452 453 @if (hasLinks && Pageview.Area.ID != 9) { 454 <li class="product-tabs__item" role="none"><a href="#tabOtherLinks-content" class="product-tabs__tab" role="tab" id="tabOtherLinks" aria-controls="tabOtherLinks-content" aria-selected="false"><span class="product-tabs__item-text">@Translate("Translate_Other_links")</span></a></li> 455 } 456 </ul></nav><div id="tabVisualization-content" class="product-tabs__tab-content product-tabs__tab-content--active" role="tabpanel" aria-hidden="false" aria-labelledby="tabVisualization"><div class="product-tabs__content"> 457 @{ 458 string textureHeadline = Translate("Translate_TextureTool_headline"); 459 string textureImagePath = "/Files/Images/UltimaLandingpage/texture-tool.jpg"; 460 string textureImageXl = "/admin/public/getimage.ashx?image=" + textureImagePath + "&compression=100&width=732"; 461 string textureImageMd = "/admin/public/getimage.ashx?image=" + textureImagePath + "&compression=100&width=566"; 462 string textureImageSm = "/admin/public/getimage.ashx?image=" + textureImagePath + "&compression=100&width=327"; 463 string textureImageDefault = "/admin/public/getimage.ashx?image=" + textureImagePath + "&compression=100&width=727"; 464 string texttureLink = "/Default.aspx?Id=" + Pageview.Area.Item["VisualiseringLink"].ToString() + "#brick=" + productNumber.Replace(" ", "") + "&viewmode=Wall"; 465 } 466 <div class="rich-text"><h2 class="product-tabs__headline">@textureHeadline</h2><p>@Translate("Translate_TextureTool_body-text")</p><a href="@texttureLink" class="button button-simple">@Translate("Translate_Try-the-texture-tool")</a></div><picture class="product-tabs__image-wrap"><source srcset="@textureImageXl" media="(min-width: 1500px)" /><source srcset="@textureImageMd" media="(min-width: 992px)" /><source srcset="@textureImageSm" media="(min-width: 768px)" /><img src="@textureImageDefault" class="product-tabs__image" alt="@textureHeadline." loading="lazy" /></picture></div><div class="product-tabs__content"> 467 @{ 468 string visualizationHeadline = Translate("Translate_VisualizationTool_headline"); 469 string visualizationImagePath = "/Files/Images/UltimaLandingpage/visualization-tool-multi.jpg"; 470 string visualizationImageXl = "/admin/public/getimage.ashx?image=" + visualizationImagePath + "&compression=100&width=732"; 471 string visualizationImageMd = "/admin/public/getimage.ashx?image=" + visualizationImagePath + "&compression=100&width=566"; 472 string visualizationImageSm = "/admin/public/getimage.ashx?image=" + visualizationImagePath + "&compression=100&width=327"; 473 string visualizationImageDefault = "/admin/public/getimage.ashx?image=" + visualizationImagePath + "&compression=100&width=727"; 474 string visualizationLink = "/Default.aspx?Id=" + Pageview.Area.Item["VisualiseringLink"].ToString() + "#brick=" + productNumber.Replace(" ","") + "&viewmode=House"; 475 } 476 <div class="rich-text"><h2 class="product-tabs__headline">@visualizationHeadline</h2><p>@Translate("Translate_VisualizationTool_body-text")</p><a href="@visualizationLink" class="button button-simple">@Translate("Translate_Try-the-visualization-tool")</a></div><picture class="product-tabs__image-wrap"><source srcset="@visualizationImageXl" media="(min-width: 1500px)" /><source srcset="@visualizationImageMd" media="(min-width: 992px)" /><source srcset="@visualizationImageSm" media="(min-width: 768px)" /><img src="@visualizationImageDefault" class="product-tabs__image" alt="@visualizationHeadline." loading="lazy" /></picture></div></div> 477 @if (GetInteger("Ecom:Product:Area.ID") != 7 && !disableSample) { 478 /* Show on all other than NO site */ 479 <div id="tabFreeSample-content" class="product-tabs__tab-content" role="tabpanel" aria-hidden="true" aria-labelledby="tabFreeSample"> 480 @RenderSnippet("ProductSampleForm") 481 </div> 482 } 483 <div id="tabDatasheets-content" class="product-tabs__tab-content" role="tabpanel" aria-hidden="true" aria-labelledby="tabDatasheets"><div class="rich-text"><h2 class="product-tabs__headline">@Translate("Translate_Datasheets")</h2><ul> 484 @{ 485 try { 486 string[] files = System.IO.Directory.GetFiles(System.Web.HttpContext.Current.Server.MapPath("~\\files\\files\\varekatalog\\Belaegning\\" + productNumber.Replace(" ", "-") + "\\datablade\\" + GetString("Ecom:Product:Area.Name"))); 487 int counter = 0; 488 489 if (files.Length > 0) { 490 foreach (string s in files) { 491 string filepath = s.Substring(s.IndexOf("\\files"), s.Length - s.IndexOf("\\files")); 492 string filename = filepath.Substring(filepath.IndexOf("datablade"), filepath.Length - filepath.IndexOf("datablade")); 493 494 <li><a href="@filepath" target="_blank">Last ned datablad (@filename.Replace("datablade\\" + GetString("Ecom:Product:Area.Name") + "\\", "").Replace("-", " ").Replace("_", " ").Replace(".pdf", ""))</a></li> 495 496 counter++; 497 } 498 } 499 } catch { 500 501 } 502 } 503 </ul></div></div> 504 @if (hasDownloads) { 505 <div id="tabDownloads-content" class="product-tabs__tab-content" role="tabpanel" aria-hidden="true" aria-labelledby="tabDownloads"><div class="rich-text"><h2 class="product-tabs__headline">@Translate("Translate_Downloads")</h2> 506 @GetString("Ecom:Product.CategoryField.Belaegning.ProduktRelevanteDownloads.Value.Clean") 507 </div></div> 508 } 509 510 <div id="tabFindDealer-content" class="product-tabs__tab-content" role="tabpanel" aria-hidden="true" aria-labelledby="tabFindDealer"><div class="product-tabs__content"> 511 @{ 512 string dealerLink = Pageview.Area.Item["FindForhandlerLink"].ToString(); 513 514 if (areaId != 9) { 515 /* Show on all other than DE site */ 516 string findDealerHeadline = Translate("Translate_Find-dealer_headline"); 517 string findDealerBodyText = Translate("Translate_Find-dealer_bodytext"); 518 string formAction = "/Default.aspx?Id=" + dealerLink; 519 string inputPlaceholder = Translate("Translate_Find_dealer_city-zip"); 520 521 <div class="clickdimensions-form"><div class="rich-text"><h2 class="product-tabs__headline">@findDealerHeadline</h2><p> 522 @findDealerBodyText 523 </p></div><form action="@formAction" method="post" style="display: block;"><div class="form-row"><input type="text" name="adr" id="adr" placeholder=" " /><label for="adr">@inputPlaceholder</label></div><div class="form-row"><button type="submit">@Translate("Translate_Find_dealer")</button></div></form></div> 524 } else { 525 /* Show only on DE site */ 526 string verkaufHeadline = Translate("Translate_Verkauf_mauerziegel_headline"); 527 string verkaufBodyText = Translate("Translate_Verkauf_mauerziegel_bodytext"); 528 string verkaufLinkText = Translate("Translate_Verkauf_mauerziegel_linktext"); 529 string verkaufLink = "/Default.aspx?Id=" + dealerLink; 530 531 <div class="rich-text"> 532 @if (!string.IsNullOrWhiteSpace(verkaufHeadline)) { 533 <h2 class="product-tabs__headline">@verkaufHeadline</h2> 534 } 535 @if (!string.IsNullOrWhiteSpace(verkaufBodyText)) { 536 <p>@verkaufBodyText</p> 537 } 538 <a href="@verkaufLink">@verkaufLinkText</a></div> 539 } 540 } 541 </div></div> 542 @if (hasLinks && Pageview.Area.ID != 9) { 543 <div id="tabOtherLinks-content" class="product-tabs__tab-content" role="tabpanel" aria-hidden="true" aria-labelledby="tabOtherLinks"><div class="rich-text"><h2 class="product-tabs__headline">@Translate("Translate_Other_links")</h2> 544 @GetString("Ecom:Product.CategoryField.Belaegning.ProduktOvrigtLinks.Value.Clean") 545 </div></div> 546 } 547 @if(Pageview.Area.ID == 1) { 548 <div id="tabPrices-content" class="product-tabs__tab-content" role="tabpanel" aria-hidden="true" aria-labelledby="tabPrices"><div class="rich-text"><h2>@Translate("RT-2.0_Priser_og_levering")</h2> 549 @{ 550 double priceprm2 = Convert.ToDouble(GetString("Ecom:Product.Price.PriceWithVAT")) * Convert.ToDouble(GetString("Ecom:Product.CategoryField.Belaegning.ProduktAntalM2.Value")); 551 552 string sPriceprm2 = priceprm2.ToString("0,0.00"); 553 } 554 <div class="price-info"><span>@Translate("RT-2.0_BelaegningShop_PrisPrM2")</span> 555 @if (Pageview.Area.ID == 1) { 556 <span class="price" itemprop="price">@sPriceprm2</span> 557 } else { 558 <span class="price" itemprop="Price">@GetString("Ecom:Product.Price.PriceWithVATFormatted")</span> 559 } 560 <small>@Translate("RT-2.0_BelaegningShop_PrisErInklMomsOgEksklFragt")</small></div><div class="format-and-consumption"> 561 @Translate("RT-2.0_BelaegningShop_Format") @GetString("Ecom:Product.ShortDescription").Replace("<p>","").Replace("</p>","") | @Translate("RT-2.0_BelaegningShop_ForbrugPrM2Ca") @GetString("Ecom:Product.CategoryField.Belaegning.ProduktForbrug.Value") @Translate("RT_2.0_BelaegningShop_ForbrugStk") 562 </div> 563 @if (GetInteger("Ecom:Product:Area.ID") == 1 ) { 564 string shopBelaegningPageID = ""; 565 566 if (GetInteger("Ecom:Product:Area.ID") == 1) { 567 shopBelaegningPageID = "147"; 568 } else if (GetInteger("Ecom:Product:Area.ID") == 9) { 569 shopBelaegningPageID = "2346"; 570 } 571 572 <div class="product-header__shop-link"><a href='@("/Default.aspx?Id=")@shopBelaegningPageID@("&ProductID=")@GetString("Ecom:Product.ID")' class="button button-simple">@Translate("RT-2.0_BelaegningShop_KoebBelaegning")</a></div> 573 } 574 </div></div> 575 } 576 </article> 577 @SnippetStart("JavascriptBottom") 578 @if (System.Web.HttpContext.Current.Items["tabsScriptLoaded"] != "true") { 579 System.Web.HttpContext.Current.Items["tabsScriptLoaded"] = "true"; 580 581 <script> 582 const keycode = { 583 arrowRight: 39, 584 arrowLeft: 37, 585 home: 36, 586 end: 35 587 }; 588 589 function openTab(e) { 590 if (e.currentTarget) { 591 e.preventDefault(); 592 } 593 594 const tab = e.currentTarget ? e.currentTarget : e; 595 const tabContent = document.getElementById(tab.getAttribute('aria-controls').replace('#', '')); 596 597 if (tabContent) { 598 const activeTab = tab.parentNode.parentNode.querySelector('.product-tabs__tab--active'); 599 600 if (activeTab) { 601 activeTab.classList.remove('product-tabs__tab--active'); 602 activeTab.setAttribute('aria-selected', false); 603 activeTab.setAttribute('tabindex', -1); 604 605 const activeTabContent = document.getElementById(activeTab.getAttribute('aria-controls').replace('#', '')); 606 607 if (activeTabContent) { 608 activeTabContent.classList.remove('product-tabs__tab-content--active'); 609 activeTabContent.setAttribute('aria-hidden', true); 610 } 611 } 612 613 tab.classList.add('product-tabs__tab--active'); 614 tab.removeAttribute('tabindex'); 615 tab.setAttribute('aria-selected', true); 616 tab.focus(); 617 tabContent.classList.add('product-tabs__tab-content--active'); 618 tabContent.setAttribute('aria-hidden', false); 619 history.pushState({}, document.title, `#${tab.getAttribute('aria-controls')}`); 620 } 621 } 622 623 function openTabByHashId() { 624 if (window.location.hash.indexOf('tab') > -1) { 625 const tabContent = document.getElementById(window.location.hash.replace('#', '')); 626 627 if (tabContent) { 628 const tab = document.getElementById(tabContent.getAttribute('aria-labelledby')); 629 openTab(tab); 630 } 631 } 632 } 633 634 const tabsContainer = document.body.querySelectorAll('[data-action="tabs"]'); 635 636 if (tabsContainer) { 637 for (let i = 0; i < tabsContainer.length; i++) { 638 const tabs = tabsContainer[i].querySelectorAll('[role="tab"]'); 639 640 for (let t = 0; t < tabs.length; t++) { 641 tabs[t].addEventListener('click', openTab); 642 } 643 } 644 } 645 646 if (window.location.hash.indexOf('tab') > -1) { 647 openTabByHashId(); 648 } 649 650 window.addEventListener('hashchange', openTabByHashId, false); 651 652 window.addEventListener('keydown', event => { 653 const focusedElement = document.activeElement; 654 const tabs = document.activeElement.closest('.product-tabs__navigation'); 655 656 if (focusedElement && tabs) { 657 if (event.keyCode === keycode.arrowLeft) { 658 // Open prevoius tab 659 if (focusedElement.closest('li').previousElementSibling && focusedElement.closest('li').previousElementSibling.querySelector('.tab')) { 660 openTab(focusedElement.closest('li').previousElementSibling.querySelector('.product-tabs__tab')); 661 } 662 } 663 if (event.keyCode === keycode.arrowRight) { 664 // Open next tab 665 if (focusedElement.closest('li').nextElementSibling && focusedElement.closest('li').nextElementSibling.querySelector('.tab')) { 666 openTab(focusedElement.closest('li').nextElementSibling.querySelector('.product-tabs__tab')); 667 } 668 } 669 if (event.keyCode === keycode.home) { 670 // Open first tab 671 if (tabs.querySelector('li:first-child .product-tabs__tab')) { 672 event.preventDefault(); 673 openTab(tabs.querySelector('li:first-child .product-tabs__tab')); 674 } 675 } 676 if (event.keyCode === keycode.end) { 677 // Open last tab 678 if (tabs.querySelector('li:last-child .product-tabs__tab')) { 679 event.preventDefault(); 680 openTab(tabs.querySelector('li:last-child .product-tabs__tab')); 681 } 682 } 683 } 684 }); 685 </script> 686 } 687 @SnippetEnd("JavascriptBottom") 688 689 690 <div class="product-cta"> 691 @if (areaId != 7 && !disableSample) { 692 if (areaId == 1) { 693 <text>@RenderSnippet("ProductSampleCart")</text> 694 } else { 695 <a href="#tabFreeSample-content" class="product-cta__link"> 696 @if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Templates/Designs/randers-tegl/images/gallery-arrow.svg"))) { 697 <span class="icon icon-arrow">@arrowSvg</span> 698 } 699 <span class="product-cta__link-text">@Translate("Translate_Free-sample")</span> 700 @if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath("/Files/Templates/Designs/randers-tegl/images/gallery-arrow.svg"))) { 701 <span class="icon icon-arrow">@arrowSvg</span> 702 } 703 </a> 704 } 705 } 706 @RenderSnippet("ProductQuestionCTA") 707 </div> 708 709 @if (sampleIsInCart && System.Web.HttpContext.Current.Request.Cookies["sampleCartTeaserShown"] == null) { 710 System.Web.HttpCookie sampleCookie = new System.Web.HttpCookie("sampleCartTeaserShown"); 711 sampleCookie.Value = "true"; 712 sampleCookie.Expires = DateTime.Now.AddHours(1); 713 System.Web.HttpContext.Current.Response.Cookies.Add(sampleCookie); 714 715 <style> 716 .sample-cart-teaser { 717 width: 100%; 718 height: 100%; 719 position: fixed; 720 z-index: 100; 721 top: 0; 722 left: 0; 723 display: flex; 724 justify-content: center; 725 align-items: center; 726 background-color: rgba(0, 0, 0, 0.2); 727 } 728 729 .sample-cart-teaser.js-hide { 730 display: none; 731 pointer-events: none; 732 } 733 734 .sample-cart-teaser__message { 735 max-width: 800px; 736 padding: 24px; 737 background-color: #222; 738 position: relative; 739 color: #fff; 740 } 741 742 @@media (min-width: 768px) { 743 .sample-cart-teaser__message { 744 padding: 48px; 745 } 746 } 747 748 @@media (max-width: 880px) { 749 750 .sample-cart-teaser__message { 751 max-width: 80%; 752 } 753 } 754 755 @@media (max-width: 767.98px) { 756 .sample-cart-teaser__message .upper { 757 display: none; 758 } 759 } 760 761 @@media (min-width: 768px) { 762 .sample-cart-teaser__message .lower { 763 display: none; 764 } 765 } 766 767 .sample-cart-teaser__message p:last-of-type { 768 padding-bottom: 0; 769 } 770 771 .sample-cart-teaser__close { 772 position: absolute; 773 top: 24px; 774 right: 24px; 775 cursor: pointer; 776 } 777 778 @@media (min-width: 768px) { 779 .sample-cart-teaser__close { 780 top: 48px; 781 right: 48px; 782 } 783 } 784 785 .sample-cart-teaser__close svg { 786 width: 16px; 787 height: 16px; 788 } 789 790 .sample-cart-teaser__close path { 791 fill: #fff; 792 } 793 </style><div class="sample-cart-teaser"><div class="sample-cart-teaser__message"> 794 @Pageview.Area.Item["SampleCartInfoText"] 795 <span id="sampleCartClose" class="sample-cart-teaser__close"><svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.996 15.996"><path d="M0 1.415L1.414 0l14.578 14.577-1.415 1.414z"></path><path d="M1.418 15.996L.004 14.582 14.58.004l1.414 1.414z"></path></svg></span></div></div><script> 796 const sampleCartCloseBtn = document.getElementById('sampleCartClose'); 797 798 if (sampleCartCloseBtn) { 799 sampleCartCloseBtn.addEventListener('click', function(e) { 800 const teaser = e.currentTarget.closest('.sample-cart-teaser'); 801 802 if (teaser) { 803 teaser.classList.add('js-hide'); 804 } 805 }); 806 } 807 </script> 808 } 809 810 @helper RenderLoadmoreButton(string galleryId) { 811 <li class="product-gallery__media product-gallery__media--load-more"><a data-action="load-more" data-load-more-target="#@galleryId" class="button button-simple">@Translate("Translate_Product_load-more-images")</a></li> 812 } 813
Belegning

Uterom i tegl

Teglbelegg er et ekstremt motstandsdyktig naturmateriale som setter prikken over i-en på stilrene uterom, f.eks. terrasser, hageganger og innkjørsler. Med tiden får belegg i tegl en vakker patina, og det er stort sett vedlikeholdsfritt.

Gjør drømmen om en ny terrasse til virkelighet
Uterom 
i tegl .
Mursten

Sunt inneklima

Et fullmurt hus er som skapt for et dynamisk familieliv og skandinavisk klima, fordi murstein har egenskaper som ingen andre byggematerialer har. Sunt inneklima er bare én av fordelene med et fullmurt hjem. Murstein gir et behagelig klima innendørs uansett årstid, er energivennlig og svært motstandsdyktig.

Se hvorfor trivsel er noe man bygger
Sunt
inneklima.