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
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
Relaterte ting