Error executing template "Designs/junckers/_parsed/espresso.parsed.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_67843a3c73964884a5db2d73d99f0c26.Execute() in D:\dynamicweb.net\Solutions\junckers.espresso4.dk\Files\Templates\Designs\junckers\_parsed\espresso.parsed.cshtml:line 104
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 @inherits Co3.Espresso.Website.TemplateBases.Pages.PageBase
2 @using System.Web;
3 @using System.IO
4 @using Co3.Espresso.Website.Services
5 @using Dynamicweb
6 @using Dynamicweb.Content
7 @using Dynamicweb.Content.Items
8 @using Dynamicweb.Rendering
9 @using Dynamicweb.Frontend
10 @using Page = Dynamicweb.Content.Page
11 @{
12 string globalAreaLang = GetGlobalValue( "Global:Area.Lang" );
13 string globalPageID = GetGlobalValue( "Global:Page.ID" );
14 string baseUrl = GetGlobalValue( "Global:Request.Scheme" ) + "://" + GetGlobalValue( "Global:Request.Host" );
15 string openGraphUrl = baseUrl + GetGlobalValue( "Global:Pageview.Url" );
16 string openGraphImage = baseUrl + Espresso.OpenGraphImage;
17 string productIdParam = "" + HttpContext.Current.Request["productid"];
18 string variantIdParam = "" + Dynamicweb.Context.Current.Request["variantid"];
19 bool isProductPage = string.IsNullOrEmpty(productIdParam) == false;
20 string pdfProductId = HttpUtility.HtmlAttributeEncode(productIdParam);
21 string pdfPageId = HttpUtility.HtmlAttributeEncode( globalPageID );
22 string pageCanonical = PageView.Current().Page.MetaCanonical;
23 string globalValueUrl = GetGlobalValue("Global:Pageview.Url");
24 string canonicalPageView = String.Format("{0}://{1}{2}", GetGlobalValue("Global:Request.Scheme"), GetGlobalValue("Global:Request.Host"), globalValueUrl);
25 bool isRequestingPDF = System.Web.HttpContext.Current.Request[ "pdfgeneratorworking" ] == "true" || System.Web.HttpContext.Current.Request[ "newpdf" ] == "true" || System.Web.HttpContext.Current.Request[ "newpdf" ] == "test";
26 if ( isRequestingPDF )
27 {
28 Espresso.Area.OptimizedLoading = false;
29 Espresso.StylesheetAttributeRel = Espresso.Area.OptimizedLoading ? "preload" : "stylesheet";
30 Espresso.StylesheetAttributeMedia = Espresso.Area.OptimizedLoading ? "only x" : "all";
31 }
32
33 if ( Dynamicweb.Context.Current.Request.Params.AllKeys.Contains( "download" ) )
34 {
35 Dynamicweb.Content.Page currentPage = PageView.Current().Page;
36 string documentationPdf = currentPage.Item["DocumentationPdf"]?.ToString() ?? string.Empty;
37
38 if ( isProductPage && string.IsNullOrEmpty( documentationPdf ) )
39 {
40 string tecDoc1Value = GetString( "Ecom:Product.CategoryField.FloorTechnicalDocuments.TecDoc1.Value.Clean" );
41
42 if ( string.IsNullOrEmpty( tecDoc1Value ) )
43 {
44 Dynamicweb.Ecommerce.Products.Product dwProduct = Dynamicweb.Ecommerce.Services.Products.GetProductById( productIdParam, variantIdParam, false );
45 tecDoc1Value = dwProduct.GetCategoryValue( "FloorTechnicalDocuments", "TecDoc1" )?.ToString() ?? string.Empty;
46 }
47
48 if ( !string.IsNullOrEmpty( tecDoc1Value ) )
49 {
50 string[] valueParts = tecDoc1Value.ToLowerInvariant().Split( new[] { "id=" }, StringSplitOptions.None );
51
52 if ( int.TryParse( valueParts.LastOrDefault(), out int pageId ) )
53 {
54 Page docPage = Dynamicweb.Content.Services.Pages.GetPage( pageId );
55 if ( docPage != null )
56 {
57 documentationPdf = docPage.Item["DocumentationPdf"]?.ToString() ?? string.Empty;
58 }
59 }
60 }
61 }
62
63 if ( !string.IsNullOrEmpty( documentationPdf ) && documentationPdf.ToLowerInvariant().Contains( ".pdf" ) )
64 {
65 Dynamicweb.Context.Current.Response.Redirect( documentationPdf );
66 }
67 }
68
69 string isUsingCookiebot = string.Empty;
70
71 if ( GetBoolean( "Item.Area.IsUsingCookiebot.Value" ) == false )
72 {
73 isUsingCookiebot = "false";
74 }
75 else
76 {
77 isUsingCookiebot = "true";
78 }
79 }
80 <!DOCTYPE html>
81 <html lang="@globalAreaLang">
82 <head>
83 @* @GetValue( "CopyRightNotice" ) *@
84 <meta charset="utf-8">
85 <meta content="width=device-width, initial-scale=1, shrink-to-fit=no, minimal-ui" name="viewport">
86 <meta content="ie=edge" http-equiv="x-ua-compatible">
87
88 @if ( isProductPage == false )
89 {
90 <title>@GetValue("Title")</title>
91 @GetValue("MetaTags")
92 @GetValue("CopyRightNotice")
93
94 if ( string.IsNullOrEmpty(pageCanonical) == true )
95 {
96 <link rel="canonical" href="@canonicalPageView">
97 }
98 }
99 else
100 {
101 @RenderSnippet( "productMetaTags" )
102 }
103
104 @if ( Espresso.Area.OptimizedLoading )
105 {
106 @Espresso.CriticalCSS
107 }
108 <link crossorigin="" href="https://fonts.gstatic.com/" rel="preconnect">
109 <link href="https://fonts.googleapis.com/css?family=Ubuntu:300,400,500%7CMaterial+Icons" media="@Espresso.StylesheetAttributeMedia" rel="@Espresso.StylesheetAttributeRel" as="style">
110 <link href="/Files/Templates/Designs/junckers/_assets/_dist/css/default.css?v=1.1.32" media="@Espresso.StylesheetAttributeMedia" rel="@Espresso.StylesheetAttributeRel" as="style">
111 @if ( isRequestingPDF )
112 {
113 <link href="/Files/Templates/Designs/junckers/_assets/_dist/css/junckers-pdf.css?v=2.026" media="all" rel="stylesheet">
114 }
115
116 @*if ( PageView.Current().Page.ID != 29515 )
117 {
118 <script type='text/javascript' src='https://platform-api.sharethis.com/js/sharethis.js#property=601be95843bf770011180384&product=sop' async='async'></script>
119 }*@
120
121 @if ( Espresso.Area.OptimizedLoading )
122 {
123 @Espresso.CriticalJS
124 }
125 @* *@
126 <link rel="shortcut icon" href="@Espresso.Area.Item.Favicon">
127 @* @GetValue( "MetaTags" ) *@
128 @if ( Espresso.IsStagingUrl == true )
129 {
130 <meta content="noindex,nofollow" name="robots">
131 }
132 <meta property="og:url" content="@openGraphUrl">
133 <meta property="og:title" content="@Espresso.OpenGraphTitle">
134 <meta property="og:description" content="@Espresso.OpenGraphDescription">
135 <meta property="og:image" content="@openGraphImage">
136 <meta content="website" property="og:type">
137 @if ( string.IsNullOrEmpty( Espresso.Area.Item.GoogleSiteVerification ) == false )
138 {
139 <meta name="google-site-verification" content="@Espresso.Area.Item.GoogleSiteVerification">
140 }
141 @{
142 if ( 1 == 2 )
143 {
144 @GetValue( "Stylesheets" )
145 }
146 }
147 @if ( string.IsNullOrEmpty( Espresso.Area.GoogleTagManagerID ) == false && Espresso.Area.GoogleTagManagerID != "GTM-XXXX" )
148 {
149 <!-- Google Tag Manager -->
150 <script data-cookieconsent="ignore">
151 (function(w, d, s, l, i) {
152 w[l] = w[l] || [];
153 w[l].push({
154 'gtm.start':
155 new Date().getTime(),
156 event: 'gtm.js'
157 });
158 var f = d.getElementsByTagName(s)[0],
159 j = d.createElement(s),
160 dl = l != 'dataLayer' ? '&l=' + l : '';
161 j.async = true;
162 j.src =
163 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
164 f.parentNode.insertBefore(j, f);
165 })(window, document, 'script', 'dataLayer', '@Espresso.Area.GoogleTagManagerID');
166 </script>
167 <!-- End Google Tag Manager -->
168 }
169
170 <!-- Hreflang -->
171 @{
172 @* Get areas from service *@
173 Dynamicweb.Content.AreaService areaService = new Dynamicweb.Content.AreaService();
174 Dynamicweb.Ecommerce.Products.ProductService productService = new Dynamicweb.Ecommerce.Products.ProductService();
175 IList< Area > areas = areaService.GetAreas();
176
177 bool pageHasParams = HttpContext.Current.Request.QueryString.HasKeys();
178 string[] expectedParams = new [] { "ID", "productid" };
179 IEnumerable< string > additionalParams = HttpContext.Current.Request.QueryString.AllKeys.Where(k => !expectedParams.Contains(k));
180 bool pageHasAllowedParams = true;
181
182 if ( pageHasParams == true )
183 {
184 if ( additionalParams.Any())
185 {
186 pageHasAllowedParams = false;
187 }
188 }
189
190 bool pageHasXDefault = false;
191 string fallbackXDefaultEnglishPageUrl = string.Empty;
192 string fallbackXDefaultPageUrl = string.Empty;
193
194 @* Get current page's relation-text from page-item *@
195 string currentPageRelation = PageView.Current().Page.Item[ "PageRelation" ] != null ? PageView.Current().Page.Item[ "PageRelation" ].ToString() : string.Empty;
196
197 @* Frontpage must have 'frontpage' as relation-text *@
198 string CONST_frontpageRelation = "frontpage";
199
200 if ( pageHasAllowedParams == true )
201 {
202 @* Iterate areas *@
203 foreach ( Area area in areas.Where(a => a.Active) )
204 {
205 bool excludeFromHrefLang = area.Item.Keys.Contains("ExcludeFromHrefLang") && area.Item["ExcludeFromHrefLang"] != null && area.Item["ExcludeFromHrefLang"].ToString() == "True";
206
207 if ( !excludeFromHrefLang )
208 {
209 @* Get current area's culture *@
210 string culture = area.Culture;
211 @* Check for IsDefault Hreflang on area *@
212 string isDefaultHrefLang = area.Item[ "IsDefaultHrefLang" ] != null ? area.Item[ "IsDefaultHrefLang" ].ToString() : string.Empty;
213 @* Check for override-culture text on area *@
214 string hreflangCultureOverride = area.Item[ "HreflangLanguageOverride" ] != null ? area.Item[ "HreflangLanguageOverride" ].ToString() : string.Empty;
215
216 @* Get scheme and domain *@
217 string scheme = GetGlobalValue( "Global:Request.Scheme" );
218
219 string domain = area.DomainLock;
220 @* If we have a primary domain call pageservice and get pages *@
221 if ( string.IsNullOrEmpty( currentPageRelation ) == false && string.IsNullOrEmpty( domain ) == false )
222 {
223 Dynamicweb.Content.PageService pageService = new Dynamicweb.Content.PageService();
224 IEnumerable< Dynamicweb.Content.Page > pages = pageService.GetPagesByAreaID( area.ID );
225
226 @* Iterate pages in area - check if is active + has item + has item-pagerelation + item-pagerelation equals current pagerelation *@
227 foreach ( Dynamicweb.Content.Page page in pages.Where( p => p.Published && !p.Hidden && p.Item != null && p.Item[ "PageRelation" ] != null && p.Item[ "PageRelation" ].ToString().Equals( currentPageRelation ) ) )
228 {
229 string productId = HttpContext.Current.Request[ "productid" ];
230
231 string url = string.Empty;
232
233 if ( string.IsNullOrEmpty( productId ) == false )
234 {
235 @* Build url to area product page *@
236 Dynamicweb.Ecommerce.Products.Product product = productService.GetProductById( productId, "", area.EcomLanguageId );
237 if ( product != null && product.Active == true )
238 {
239 string prodUrl = string.Format( "Default.aspx?ID={0}&ProductId={1}", page.ID, product.Id );
240 url = string.Format( "{0}://{1}{2}", scheme, domain, SearchEngineFriendlyURLs.GetFriendlyUrl( prodUrl, area.EcomLanguageId) );
241 }
242 }
243 else
244 {
245 @* Build url to area page *@
246 url = string.Format( "{0}://{1}{2}", scheme, domain, SearchEngineFriendlyURLs.GetFriendlyUrl( page.GetPageHrefValue() ) );
247 if ( string.IsNullOrEmpty( fallbackXDefaultPageUrl ) == true )
248 {
249 fallbackXDefaultPageUrl = url;
250 }
251 if ( string.IsNullOrEmpty( fallbackXDefaultEnglishPageUrl ) == true && culture.ToLower().Contains( "en" ) == true )
252 {
253 fallbackXDefaultEnglishPageUrl = url;
254 }
255 }
256
257 @* If our current page relation match frontpage - set link to domain only *@
258 if ( currentPageRelation == CONST_frontpageRelation )
259 {
260 url = string.Format( "{0}://{1}", scheme, domain );
261 }
262 @* If our area item has checked in Default hreflang, we render x-default link *@
263 if ( isDefaultHrefLang == "True" )
264 {
265 <link rel="alternate" hreflang="x-default" href="@url">
266 pageHasXDefault = true;
267 }
268 @* If we have a value in the area-item to overrule the culture, override the value here *@
269 if ( string.IsNullOrEmpty( hreflangCultureOverride ) == false )
270 {
271 culture = hreflangCultureOverride;
272 }
273 @* Render hreflang-link *@
274 if ( string.IsNullOrEmpty( url ) == false )
275 {
276 <link rel="alternate" hreflang="@culture.ToLower()" href="@url">
277 }
278
279 }
280 }
281 }
282 }
283 if ( pageHasXDefault == false )
284 {
285 if ( string.IsNullOrEmpty( fallbackXDefaultEnglishPageUrl ) )
286 {
287 <link rel="alternate" hreflang="x-default" href="@fallbackXDefaultPageUrl">
288 }
289 else
290 {
291 <link rel="alternate" hreflang="x-default" href="@fallbackXDefaultEnglishPageUrl">
292 }
293
294 }
295 }
296 }
297 <!-- End Hreflang -->
298
299
300 @GetValue("Stylesheets")
301 @GetValue("Javascripts")
302 </head>
303
304 @{
305 Item globalPageItem = null;
306
307 if ( string.IsNullOrWhiteSpace( Espresso.DynamicwebPage.ShortCut ) == false )
308 {
309 globalPageItem = Co3.Junckers.Frontend.Services.EnglishLanguagesPageItemService.Instance.GetPageItem( Espresso.DynamicwebPage.ShortCut );
310 }
311
312 string pdfLink = string.Format( "{0}&newpdf=true&gid={1}", GetGlobalValue( "Global:Pageview.Url.Raw" ).Replace( "&newpdf=true", string.Empty ).Replace( "&newpdf=test", string.Empty ), Guid.NewGuid().ToString( "N" ) );
313
314 string junckersHasDocumentationPdfLink = string.Empty;
315
316 if ( globalAreaLang == "en" && globalPageItem != null )
317 {
318 junckersHasDocumentationPdfLink = globalPageItem[ "DocumentationPdf" ] != null ? globalPageItem[ "DocumentationPdf" ].ToString() : string.Empty;
319 }
320 else
321 {
322 junckersHasDocumentationPdfLink = string.IsNullOrEmpty( GetString( "Item.DocumentationPdf.Value" ) ) == false ? GetString( "Item.DocumentationPdf.Value" ) : string.Empty;
323 }
324 }
325
326 <body class="@Espresso.Item.CustomClasses @Espresso.Area.OptimizedLoading" data-pdf="@junckersHasDocumentationPdfLink" data-cookiebot="@isUsingCookiebot">
327
328 @SnippetStart( "PasswordProtectedPage" )
329 @{
330 string pwProtectedPageContent = "";
331 }
332 @foreach ( LoopItem pwProtectedPage in GetLoop( "Item.Area.PasswordProtectedPage" ) )
333 {
334 string pwProtectedPagePageID = pwProtectedPage.GetString( "Item.Area.PasswordProtectedPage.PasswordProtectedPage_PageID" );
335
336 if ( globalPageID == pwProtectedPagePageID )
337 {
338 pwProtectedPageContent = pwProtectedPage.GetString( "Item.Area.PasswordProtectedPage.PasswordProtectedPage_Content" );
339 @pwProtectedPageContent
340 }
341 }
342 @if ( pwProtectedPageContent == "" )
343 {
344 <h1>Login</h1>
345 <p class="lead">@Translate( "Junckers_PasswordPage_Text", "Input password" )</p>
346 }
347 @SnippetEnd( "PasswordProtectedPage" )
348
349 @if ( string.IsNullOrEmpty( Espresso.Area.GoogleTagManagerID ) == false && Espresso.Area.GoogleTagManagerID != "GTM-XXXX" )
350 {
351 <!-- Google Tag Manager (noscript) -->
352 <noscript>
353 <iframe src="https://www.googletagmanager.com/ns.html?id=@Espresso.Area.GoogleTagManagerID" height="0" width="0" style="display: none; visibility: hidden"></iframe>
354 </noscript>
355 <!-- End Google Tag Manager (noscript) -->
356 }
357 @using Co3.Espresso.Website.Models.FrontEnd
358 @{
359 Espresso.Canvas.ClassList.AddClasses( "js-e-canvas is-loading" );
360 if ( Espresso.Item.CanvasFullscreen == "True" )
361 {
362 Espresso.Canvas.ClassList.AddClasses( "is-fullscreen" );
363 }
364 if ( Espresso.Item.DisablePDFHeader != null && Espresso.Item.DisablePDFHeader == "True" )
365 {
366 Espresso.ContentArea.ClassList.AddClasses( "pdf-header-disabled" );
367 }
368 }
369
370
371
372 @using System.Globalization
373 @using Co3.Espresso.Base.Extensions
374 @using Co3.Espresso.DownloadManager.Models
375 @using Co3.Espresso.Website.Models.FrontEnd
376 @using Co3.Espresso.Website.Services
377 @using Dynamicweb.Content
378 @using Dynamicweb.Frontend
379 @using Dynamicweb.Rendering
380 @using EcomContext = Dynamicweb.Ecommerce.Common.Context
381
382 @functions {
383
384 public string getCountryCodeFromArea( Area area )
385 {
386 RegionInfo regionInfo = new RegionInfo( area.CultureInfo.LCID );
387 return regionInfo.TwoLetterISORegionName;
388 }
389
390 public dynamic GetPriceInfo( string beforePrice = "", string basicPrice = "" )
391 {
392 double vat = EcomContext.Country.Vat;
393 double dblBeforePrice = 0;
394 double.TryParse( beforePrice, out dblBeforePrice );
395 double dblBasicPrice = 0;
396 double.TryParse( basicPrice, out dblBasicPrice );
397 double dblBeforePriceWithVat = 0;
398 double dblDiffPrice = 0;
399 int pct = 0;
400
401 if ( dblBeforePrice > 0 )
402 {
403 dblBeforePriceWithVat = dblBeforePrice * ( ( vat / 100d ) + 1 );
404 if ( dblBeforePriceWithVat > dblBasicPrice )
405 {
406 dblDiffPrice = dblBeforePriceWithVat - dblBasicPrice;
407 pct = (int)Math.Ceiling((( 100d / dblBeforePriceWithVat ) * dblDiffPrice));
408 }
409 }
410
411 dynamic returnValue = new
412 {
413 beforePriceWithVat = dblBeforePriceWithVat,
414 beforePriceWithVatFormatted = ProductService.Instance.GetPriceFormatted(dblBeforePriceWithVat),
415 basicPrice = dblBasicPrice,
416 basicPriceFormatted = ProductService.Instance.GetPriceFormatted(dblBasicPrice),
417 diffPrice = dblDiffPrice,
418 diffPriceFormatted = ProductService.Instance.GetPriceFormatted(dblDiffPrice),
419 pct = pct,
420 vat = vat
421 };
422 return returnValue;
423 }
424
425 }
426
427
428 @helper ProductDescription(string sectionClasses = "e-section", bool sectionCollapse = false, string contentClasses = null, string heading = null, string content = null)
429 {
430 if ( string.IsNullOrEmpty( content ) == false )
431 {
432 ClassList headingClassList = new ClassList();
433 headingClassList.AddClasses( "col-12" );
434 ClassList contentClassList = new ClassList();
435 contentClassList.AddClasses( "col-12" );
436
437 @sectionStart( sectionClasses: sectionClasses, sectionCollapse: sectionCollapse, contentClasses: contentClasses )
438
439 if ( string.IsNullOrEmpty( heading ) == false )
440 {
441 <div class="@headingClassList">
442 <h2>@heading</h2>
443 </div>
444 }
445 <div class="@contentClassList">
446 @content
447 </div>
448
449 @sectionEnd()
450 }
451 }
452
453
454 @helper ProductVideo(string sectionClasses = "e-section", string contentClasses = null, string heading = null, string videoURL = null)
455 {
456 if ( string.IsNullOrEmpty( videoURL ) == false )
457 {
458 ClassList headingClassList = new ClassList();
459 headingClassList.AddClasses( "col-12" );
460 ClassList contentClassList = new ClassList();
461 contentClassList.AddClasses( "col-12" );
462
463
464 @sectionStart( sectionClasses: sectionClasses, contentClasses: contentClasses )
465
466 if ( string.IsNullOrEmpty( heading ) == false )
467 {
468 <div class="@headingClassList">
469 <h2>@heading</h2>
470 </div>
471 }
472
473 <div class="@contentClassList">
474 <div class="embed-responsive embed-responsive-16by9 mb-2">
475 <iframe class="embed-responsive-item" src="@videoURL" width="1080" height="608" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
476 </div>
477 </div>
478 @sectionEnd()
479 }
480 }
481
482 @helper ProductRelatedProducts(string sectionClasses = "e-section p-section p-section-bg-white pt-3 border-bottom", string contentClasses = null, string heading = null,
483 IEnumerable<RazorTemplateBase<RazorTemplateModel<Template>>.LoopItem> productLoop = null)
484 {
485 if ( productLoop != null && productLoop.Any() == true )
486 {
487 ClassList headingClassList = new ClassList();
488 headingClassList.AddClasses( "col-10 mx-auto" );
489 ClassList contentClassList = new ClassList();
490 contentClassList.AddClasses( "col-10 mx-auto" );
491
492 @sectionStart( sectionClasses: sectionClasses, contentClasses: contentClasses )
493
494 if ( string.IsNullOrEmpty( heading ) == false )
495 {
496 <div class="@headingClassList">
497 <h2>@heading</h2>
498 </div>
499 }
500
501
502 <div class="@contentClassList">
503 <div class="e-products mb-2">
504 <div class="row">
505 @{
506 string productlistItemClassList = ProductlistService.Instance.GetGridItemWidth( null ).ToResponsiveClasses();
507 }
508 @foreach ( RazorTemplateBase<RazorTemplateModel<Template>>.LoopItem product in productLoop )
509 {
510 @ProductlistItem( product, productlistItemClassList )
511 }
512 </div>
513 </div>
514 </div>
515
516 @sectionEnd()
517 }
518 }
519
520 @helper ProductlistItem(RazorTemplateBase<RazorTemplateModel<Template>>.LoopItem product, string productlistItemClassList = null)
521 {
522 if ( product != null )
523 {
524 dynamic productData = new
525 {
526 id = product.GetString( "Ecom:Product.ID" ),
527 url = ProductService.Instance.GetProductLink( product.GetString( "Ecom:Product.PrimaryOrFirstGroupID" ), product.GetString( "Ecom:Product.ID" ) ),
528 number = product.GetString( "Ecom:Product.Number" ),
529 name = product.GetString( "Ecom:Product.Name" ),
530 imageLarge = ImageService.Instance.GetImageURL( product.GetString( "Ecom:Product.ImageLarge.Clean" ), 450, 350, 5 ),
531 price = ProductService.Instance.GetPriceFormatted( product.GetDouble( "Ecom:Product.Price.Price" ) ),
532 descriptionShortExtra01 = product.GetString( "Ecom:Product:Field.DescriptionShortExtra01" ),
533 descriptionShort = product.GetString( "Ecom:Product.ShortDescription" ),
534 stock = new
535 {
536 id = product.GetString( "Ecom:Product:Stock.ID" ),
537 quantity = product.GetString( "Ecom:Product.Stock" ),
538 text = product.GetString( "Ecom:Product:Stock.Text" ),
539 delivery = product.GetString( "Ecom:Product:Stock.DeliveryText" )
540 }
541 };
542
543 <div class="@productlistItemClassList">
544 <div class="e-products-item js-e-products-item">
545 <div class="e-products-item-container">
546 <div class="junckers-relatedproducts-item-image-container" style="background: url(@productData.imageLarge)">
547 @if ( string.IsNullOrEmpty( productData.descriptionShort ) == false )
548 {<div class="junckers-relatedproducts-item-text-container py-1">
549 <p class="e-products-item-text mb-0 px-2 small">
550 <strong>Package Size</strong>
551 </p>
552 <p class="e-products-item-text mb-0 text-muted px-2 small">
553 @productData.descriptionShort
554 </p>
555 </div>
556 }
557 </div>
558 <div class="e-products-item-text-container text-center">
559 <h3 class="e-products-item-name mb-0">
560 @productData.name
561 </h3>
562 @* <p class="e-products-item-text mb-0"> *@
563 @* <small class="e-products-item-price small text-muted"> *@
564 @* <a href="@productData.url"> *@
565 @* @productData.price *@
566 @* </a> *@
567 @* </small> *@
568 @* </p> *@
569 </div>
570 </div>
571 </div>
572 </div>
573 }
574 }
575
576
577 @helper sectionStart(string sectionClasses = "e-section", string contentClasses = null, bool sectionCollapse = false, string collapseToggleTextExpand = "Se mere", string collapseToggleTextCollapse = "Se mindre")
578 {
579 ClassList sectionClassList = new ClassList();
580 sectionClassList.AddClasses( sectionClasses );
581 ClassList contentClassList;
582 string collapseId = Guid.NewGuid().ToString( "N" );
583 ClassList collapseToggleClassList = new ClassList();
584 if ( contentClasses == null )
585 {
586 contentClassList = Co3.Espresso.Website.Services.PageService.Instance.GetResponsiveClassesFromPageItem( PageView.Current().Page.Item );
587 }
588 else
589 {
590 contentClassList = new ClassList();
591 contentClassList.AddClasses( contentClasses );
592 }
593 if ( sectionCollapse == true )
594 {
595 sectionClassList.AddClasses( "p-section-collapse js-p-section-collapse" );
596 collapseToggleClassList.AddClasses( contentClasses );
597 collapseToggleClassList.AddClasses( "p-section-collapse-toggle collapsed order-last text-center" );
598 contentClassList.AddClasses( "p-section-collapse-content collapse is-md" );
599 }
600 @:<section class="@sectionClassList">
601 @:<div class="container-fluid">
602 @:<div class="row">
603
604 if ( sectionCollapse == true )
605 // TODO: SplitPattern into seperate heler function
606 {
607 <div class="@collapseToggleClassList" data-toggle="collapse" data-target="#@collapseId">
608 <button class="btn btn-primary p-section-collapse-toggle-btn" type="button">
609 <i class="material-icons p-section-collapse-toggle-icon">keyboard_arrow_down</i>
610 </button>
611 <small class="p-section-collapse-toggle-text h4" data-expand-text="@collapseToggleTextExpand" data-collapse-text="@collapseToggleTextCollapse"></small>
612 </div>
613 }
614
615 @:<div class="@contentClassList" id="@collapseId">
616 @:<div class="row">
617 }
618
619 @helper sectionEnd()
620 {
621 @:</div>
622 @:</div>
623 @:</div>
624 @:</div>
625 @:</section>
626 }
627
628
629
630
631 <div class="e-loading-overlay e-page-loading-overlay is-loading js-e-page-loading-overlay">
632 <div class="e-loading-spinner"></div>
633 </div>
634
635
636
637 <div class="@Espresso.Canvas.ClassList">
638 @{
639 ClassList headerClassList = new ClassList();
640 headerClassList.AddClasses( "e-header js-e-header is-sticky" );
641 if ( Espresso.Item.HeaderTransparent == "True" )
642 {
643 headerClassList.AddClasses( "is-transparent" );
644 }
645
646 ClassList logoClassList = new ClassList();
647 logoClassList.AddClasses( "e-logo" );
648
649 string backButtonLink = Espresso.Item.BackButtonLink;
650 ClassList backButtonClassList = new ClassList();
651 ClassList backButtonIconClassList = new ClassList();
652 if ( Espresso.Item.BackButton == "True" )
653 {
654 backButtonClassList.AddClasses( "btn btn-sm btn-secondary my-1 align-self-center" );
655 if ( backButtonLink == "" || backButtonLink == "/" )
656 {
657 backButtonLink = "/";
658 backButtonClassList.AddClasses( "js-e-back-link" );
659 }
660 backButtonIconClassList.AddClasses( "material-icons" );
661 if ( Espresso.Item.BackButtonPosition == "right" )
662 {
663 backButtonClassList.AddClasses( "order-last" );
664 logoClassList.AddClasses( "order-first" );
665 }
666 else
667 {
668 backButtonClassList.AddClasses( "order-first" );
669 logoClassList.AddClasses( "mr-0 ml-auto order-last" );
670 }
671 if ( Espresso.Item.BackButtonIcon == "arrow_back" )
672 {
673 backButtonClassList.AddClasses( "arrow-left" );
674 backButtonIconClassList.AddClasses( "d-none" );
675 }
676 else if ( Espresso.Item.BackButtonIcon == "arrow_forward" )
677 {
678 backButtonClassList.AddClasses( "arrow-right" );
679 backButtonIconClassList.AddClasses( "d-none" );
680 }
681 }
682
683 string logoPrimary = Espresso.Area.Item.LogoPrimary;
684 string logoSecondary = Espresso.Area.Item.LogoSecondary;
685 if ( string.IsNullOrEmpty( logoSecondary ) == true )
686 {
687 logoSecondary = logoPrimary;
688 }
689 string tagline = Espresso.Area.Item.Tagline;
690 Dictionary< string, string > navigationHtml = new Dictionary< string, string >
691 {
692 {
693 "global", RenderNavigation( new
694 {
695 id = "dwnav-global",
696 template = "global.xslt",
697 startlevel = 1,
698 endlevel = 8,
699 expandmode = "all"
700 } )
701 },
702 {
703 "utilities-primary", RenderNavigation( new
704 {
705 id = "dwnav-utilities-primary",
706 template = "utilities.xslt",
707 startlevel = 4,
708 endlevel = 5,
709 expandmode = "all",
710 parenttag = "utilities-primary"
711 } )
712 },
713 {
714 "utilities-secondary", RenderNavigation( new
715 {
716 id = "dwnav-utilities-secondary",
717 template = "utilities.xslt",
718 startlevel = 4,
719 endlevel = 4,
720 expandmode = "all",
721 parenttag = "utilities-secondary"
722 } )
723 },
724 {
725 "hamburger-header", RenderNavigation( new
726 {
727 id = "dwnav-hamburger-header",
728 template = "utilities.xslt",
729 startlevel = 4,
730 endlevel = 4,
731 expandmode = "all",
732 parenttag = "hamburger-header"
733 } )
734 },
735 {
736 "hamburger-aside", RenderNavigation( new
737 {
738 id = "dwnav-hamburger-aside",
739 template = "utilities.xslt",
740 startlevel = 4,
741 endlevel = 4,
742 expandmode = "all",
743 parenttag = "hamburger-aside"
744 } )
745 }
746 };
747 }
748 @if ( Espresso.Item.HeaderHide != "True" )
749 {
750 <header class="@headerClassList" data-autohide="true">
751
752 <div class="e-header-hamburger">
753 @sectionStart( "e-header-section e-section", "col-12" )
754 <div class="col-12 e-header-section-content">
755 <div class="@logoClassList">
756 <a class="e-logo-link" href="/">
757 <img src="@logoPrimary" class="e-logo-img e-logo-img-primary">
758 <img src="@logoSecondary" class="e-logo-img e-logo-img-secondary">
759 @if ( string.IsNullOrEmpty( tagline ) == false )
760 {
761 <p class="e-logo-tagline">@tagline</p>
762 }
763 </a>
764 </div>
765 @if ( Espresso.Item.NavigationHide != "True" )
766 {
767 <section class="e-nav-hamburger-header">
768 <ul class="nav">
769 @navigationHtml[ "hamburger-header" ]
770 @* TODO: Move to xslt *@
771 <li class="e-nav-item-hamburger-open nav-item">
772 <a class="nav-link" data-target=".modal.e-nav" data-toggle="modal" href="#">
773 <i class="e-nav-pageicon material-icons">menu</i>
774 <span class="e-nav-pagename">@Translate( "Header - Hamburger menu open - Button", "Menu" )</span>
775 </a>
776 </li>
777 </ul>
778 </section>
779 }
780 @if ( Espresso.Item.BackButton == "True" )
781 {
782 <a class="@backButtonClassList" href="@backButtonLink">
783 @if ( Espresso.Item.BackButtonIcon != "" )
784 {
785 <i class="@backButtonIconClassList">@Espresso.Item.BackButtonIcon</i>
786 }
787 @Espresso.Item.BackButtonText
788 </a>
789 }
790 </div>
791 @sectionEnd()
792 </div>
793 <div class="e-nav js-e-nav modal p-0" data-backdrop="false">
794 <div class="e-nav-container navbar">
795
796 @sectionStart( "e-header-section e-section", "col-12" )
797 <div class="col-12 e-header-section-content">
798 <div class="@logoClassList">
799 <a class="e-logo-link" href="/">
800 <img src="@logoPrimary" class="e-logo-img e-logo-img-primary" alt="@Espresso.Area.Item.CompanyName">
801 <img src="@logoSecondary" class="e-logo-img e-logo-img-secondary">
802 @if ( string.IsNullOrEmpty( tagline ) == false )
803 {
804 <p class="e-logo-tagline">@tagline</p>
805 }
806 </a>
807 </div>
808
809 @if ( Espresso.Item.NavigationHide != "True" )
810 {
811 <nav class="e-nav-global js-e-nav-global">
812 <ul class="nav">
813 @navigationHtml[ "global" ]
814 </ul>
815 </nav>
816
817 <div class="e-nav-item-hamburger-close">
818 <a class="nav-link" data-target=".modal.e-nav" data-toggle="modal" href="#">
819 <i class="e-nav-pageicon material-icons">close</i>
820 <span class="e-nav-pagename">@Translate( "Header - Hamburger menu close - Button", "Close" )</span>
821 </a>
822 </div>
823
824 if ( string.IsNullOrEmpty( navigationHtml[ "utilities-primary" ] ) == false )
825 {
826 @:</div>
827 @sectionEnd()
828 @sectionStart( "bg-tertiary e-header-section e-section", "col-12" )
829 @:<div class="col-12 e-header-section-content">
830
831 <nav class="e-nav-utilities-primary js-e-nav-utilities-primary">
832 <ul class="nav">
833 @navigationHtml[ "utilities-primary" ]
834 </ul>
835 </nav>
836 }
837 if ( string.IsNullOrEmpty( navigationHtml[ "utilities-secondary" ] ) == false )
838 {
839 <nav class="e-nav-utilities-secondary">
840 <ul class="nav">
841 @navigationHtml[ "utilities-secondary" ]
842 </ul>
843 </nav>
844 }
845 if ( string.IsNullOrEmpty( navigationHtml[ "hamburger-aside" ] ) == false )
846 {
847 <nav class="e-nav-hamburger-aside">
848 <ul class="nav">
849 @navigationHtml[ "hamburger-aside" ]
850 </ul>
851 </nav>
852 }
853 }
854 @if ( Espresso.Item.BackButton == "True" )
855 {
856 <a class="@backButtonClassList" href="@backButtonLink">
857 @if ( Espresso.Item.BackButtonIcon != "" )
858 {
859 <i class="@backButtonIconClassList">@Espresso.Item.BackButtonIcon</i>
860 }
861 @Espresso.Item.BackButtonText
862 </a>
863 }
864 </div>
865 @sectionEnd()
866
867 </div>
868 </div>
869
870 </header>
871 }
872
873
874
875 @using Dynamicweb.Security.UserManagement
876 @{
877 User currentUser = User.get_Current( PagePermissionLevels.Frontend );
878 if ( currentUser != null )
879 {
880 User currentSecondaryUser = currentUser.CurrentSecondaryUser;
881 if ( currentSecondaryUser != null )
882 {
883 @sectionStart( "e-section bg-warning", "col-12" )
884 <div class="align-self-center col-12 col-lg-9 col-md-8 my-1">
885 <p class="line-height-sm mb-0 text-center text-md-left">
886 <i class="material-icons material-icons-2x">supervisor_account</i> You are currently impersonating this user: <strong>@currentUser.Name</strong>
887 </p>
888 </div>
889 <div class="align-self-center col-12 col-lg-3 col-md-4 my-1">
890 <form class="mb-0 small text-center text-md-right" method="post" action="@Espresso.Area.Item.ExtranetImpersonationPage">
891 <button class="btn btn-primary" name="DwExtranetRemoveSecondaryUser" type="submit">Stop impersonation</button>
892 </form>
893 </div>
894 @sectionEnd()
895 }
896 }
897 }
898
899
900 <main class="e-content">
901 @using Dynamicweb.Content;
902 @using Dynamicweb.Extensibility;
903 @{
904 string eBreadcrumbClasslist = "e-breadcrumb js-e-breadcrumb d-none d-lg-block";
905 if ( Espresso.Item.Breadcrumb != "auto" && Espresso.Item.Breadcrumb != "none" && String.IsNullOrEmpty( Espresso.Item.Breadcrumb ) == false )
906 {
907 eBreadcrumbClasslist += string.Format( " e-breadcrumb-{0}", Espresso.Item.Breadcrumb );
908 }
909 string navigationHtmlBreadcrumb = RenderNavigation( new
910 {
911 id = "dwnav-breadcrumb",
912 template = "breadcrumb.xslt",
913 startlevel = 1,
914 endlevel = 10,
915 expandmode = "pathonly"
916 } );
917 }
918
919 @if ( string.IsNullOrEmpty( navigationHtmlBreadcrumb ) == false && Espresso.Item.Breadcrumb != "none" && string.IsNullOrEmpty( Espresso.Item.Breadcrumb ) == false )
920 {
921 <section class="e-section @eBreadcrumbClasslist">
922 <div class="container-fluid">
923 <div class="row">
924 <div class="col-12">
925 <div class="row">
926
927 <div class="col-12">
928 <nav class="e-breadcrumb-container">
929 <ol class="breadcrumb nav text-muted">
930 <li class="breadcrumb-item m-0 p-0">
931 <a class="arrow-left breadcrumb-back-link js-e-back-link px-0" href="/">@Translate( "Breadcrumb - Back link", "Back" )</a>
932 <span class="breadcrumb-prefix-text">
933 @Translate( "Breadcrumb - Prefix - Text", "You are here:" )
934 </span>
935 <a href="/">
936 @ServiceLocator.Current.GetPageService().GetFirstPageForArea( GetInteger( "DwAreaID" ) ).MenuText
937 </a>
938 </li>
939 @navigationHtmlBreadcrumb
940 </ol>
941 </nav>
942 </div>
943
944 </div>
945 </div>
946 </div>
947 </div>
948 </section>
949 }
950
951
952 <article id="dwcontentmain" class="e-content-main @Espresso.ContentArea.ClassList">
953 @{
954 string NavigationLocalHorizontalClassList = "e-nav-local e-nav-local-horizontal js-e-nav-local-horizontal";
955 string NavigationLocalHorizontalContainerClassList = "e-nav-local-container";
956 if( Espresso.Item.NavigationLocalShow == "True" && Espresso.Item.NavigationLocalLayout == "horizontal" ) {
957 NavigationLocalHorizontalClassList += " " + Espresso.Item.NavigationLocalCustomClasses;
958 if( Espresso.Item.NavigationLocalSticky == "True" ) {
959 NavigationLocalHorizontalClassList += " is-sticky";
960 }
961 if( Espresso.Item.NavigationLocalAbsolute == "True" ) {
962 NavigationLocalHorizontalClassList += " is-absolute";
963 }
964 else{
965 if( Espresso.Item.NavigationLocalMarginTop != "0" && Espresso.Item.NavigationLocalMarginTop != "" ) {
966 NavigationLocalHorizontalClassList += " mt-" + Espresso.Item.NavigationLocalMarginTop;
967 }
968 if( Espresso.Item.NavigationLocalMarginBottom != "0" && Espresso.Item.NavigationLocalMarginBottom != "" ) {
969 NavigationLocalHorizontalClassList += " mb-" + Espresso.Item.NavigationLocalMarginBottom;
970 }
971 }
972 }
973 }
974 @if( Espresso.Item.NavigationLocalShow == "True" && Espresso.Item.NavigationLocalLayout == "horizontal" ) {
975 <section class="e-section @NavigationLocalHorizontalClassList">
976 <div class="container-fluid">
977 <div class="row">
978 <div class="col-12">
979 <div class="row">
980
981 <div class="col-12">
982 <nav id="dwnav-local-@Espresso.DynamicwebPage.ID" class="@NavigationLocalHorizontalContainerClassList">
983 <ul class="nav justify-content-start">
984 @if( Espresso.Item.NavigationLocalHeading != "" ){
985 <li class="e-nav-local-heading"><h2>@Espresso.Item.NavigationLocalHeading</h2></li>
986 }
987 @RenderNavigation( new {
988 id = "dwnav-local-" + Espresso.DynamicwebPage.ID,
989 parentid = string.IsNullOrEmpty( Espresso.Item.NavigationLocalParentPage ) == false ? Espresso.Item.NavigationLocalParentPage : Espresso.DynamicwebPage.ID,
990 template = string.IsNullOrEmpty( Espresso.Item.NavigationLocalTemplate ) == false ? Espresso.Item.NavigationLocalTemplate : "local-" + Espresso.Item.NavigationLocalLayout + ".xslt",
991 startlevel = Espresso.Item.NavigationLocalLevelStart,
992 endlevel = Espresso.Item.NavigationLocalLevelEnd,
993 expandmode = Espresso.Item.NavigationLocalPageTreeExpand == "True" ? "all" : "path",
994 } )
995 </ul>
996 </nav>
997 </div>
998
999 </div>
1000 </div>
1001 </div>
1002 </div>
1003 </section>
1004 }
1005
1006
1007 @{
1008 string NavigationLocalVerticalClassList = "e-nav-local e-nav-local-vertical js-e-nav-local-vertical";
1009 string NavigationLocalVerticalContainerClassList = "e-nav-local-container";
1010 string NavigationLocalVerticalTemplate = "local-" + Espresso.Item.NavigationLocalLayout + ".xslt";
1011 if ( string.IsNullOrEmpty( Espresso.Item.NavigationLocalTemplate ) == false && Path.GetExtension( Espresso.Item.NavigationLocalTemplate ) == ".xslt" )
1012 {
1013 NavigationLocalVerticalTemplate = Path.GetFileName( Espresso.Item.NavigationLocalTemplate );
1014 }
1015
1016 if ( Espresso.Item.NavigationLocalShow == "True" && Espresso.Item.NavigationLocalLayout == "vertical" )
1017 {
1018 NavigationLocalVerticalClassList += " " + Espresso.Item.NavigationLocalCustomClasses;
1019 //NavigationLocalVerticalClassList += " col-3";
1020
1021 if ( Espresso.Item.NavigationLocalMarginTop != "0" && Espresso.Item.NavigationLocalMarginTop != "" )
1022 {
1023 NavigationLocalVerticalClassList += " mt-" + Espresso.Item.NavigationLocalMarginTop;
1024 }
1025 if ( Espresso.Item.NavigationLocalMarginBottom != "0" && Espresso.Item.NavigationLocalMarginBottom != "" )
1026 {
1027 NavigationLocalVerticalClassList += " mb-" + Espresso.Item.NavigationLocalMarginBottom;
1028 }
1029
1030 if ( Espresso.Item.NavigationLocalSticky == "True" )
1031 {
1032 NavigationLocalVerticalClassList += " is-sticky";
1033 }
1034
1035 if ( Espresso.Item.NavigationLocalAbsolute == "True" )
1036 {
1037 NavigationLocalVerticalClassList += " is-absolute";
1038 }
1039 else
1040 {
1041 Espresso.ContentSection.ClassList.Clear();
1042 Espresso.ContentSection.ClassList.AddClasses( "wtf col-12 col-lg-9 ml-auto" );
1043 }
1044 }
1045 }
1046
1047 @if ( Espresso.Item.NavigationLocalShow == "True" && Espresso.Item.NavigationLocalLayout == "vertical" )
1048 {
1049 <section class="e-section @NavigationLocalVerticalClassList">
1050 <div class="container-fluid">
1051 <div class="row">
1052 <div class="col-12">
1053 <div class="row">
1054
1055 <div class="col-3">
1056 <nav id="dwnav-local-@Espresso.DynamicwebPage.ID" class="@NavigationLocalVerticalContainerClassList">
1057 <ul class="flex-column nav">
1058 @if ( Espresso.Item.NavigationLocalHeading != "" )
1059 {
1060 <li class="e-nav-local-heading">
1061 <h2>@Espresso.Item.NavigationLocalHeading</h2>
1062 </li>
1063 }
1064 @RenderNavigation( new
1065 {
1066 id = "dwnav-local-" + Espresso.DynamicwebPage.ID,
1067 parentid = string.IsNullOrEmpty( Espresso.Item.NavigationLocalParentPage ) == false ? Espresso.Item.NavigationLocalParentPage : Espresso.DynamicwebPage.ID,
1068 template = NavigationLocalVerticalTemplate,
1069 startlevel = Espresso.Item.NavigationLocalLevelStart,
1070 endlevel = Espresso.Item.NavigationLocalLevelEnd,
1071 expandmode = Espresso.Item.NavigationLocalPageTreeExpand == "True" ? "all" : "path",
1072 } )
1073 </ul>
1074 </nav>
1075 </div>
1076
1077 </div>
1078 </div>
1079 </div>
1080 </div>
1081 </section>
1082 }
1083
1084
1085 @sectionStart()
1086 @GetValue("DwContent(dwcontentmain)")
1087 @sectionEnd()
1088 </article>
1089 </main>
1090 @using System.Globalization
1091 @using Dynamicweb.Frontend
1092 @{
1093 string FooterContentClassList = "e-footer-content e-section";
1094 if( Espresso.Item.ContentAnimate == "True" ){
1095 @* FooterContentClassList += " js-e-scroll-reveal"; *@
1096 }
1097 }
1098 @if( Espresso.Item.FooterHide != "True" ){
1099 <footer class="e-footer">
1100 <article class="e-footer-wrapper">
1101 <section class="@FooterContentClassList">
1102 <div class="container-fluid">
1103 <div class="row">
1104 @if( string.IsNullOrEmpty( Espresso.Area.Item.FooterParagraphs ) == false ){
1105 foreach( string paragraphID in Espresso.Area.Item.FooterParagraphs.Split( new char[]{','}, StringSplitOptions.None ) ){
1106 @RenderParagraphContent( int.Parse( paragraphID ) );
1107 }
1108 }
1109 @if( string.IsNullOrEmpty( GetString("DwNavigation(dwnavutilitiessecondaryfooter)") ) == false ){
1110 <div class="col-12">
1111 <aside class="e-nav-utilities-secondary">
1112 <ul class="nav nav-inline">
1113 @GetValue("DwNavigation(dwnavutilitiessecondaryfooter)")
1114 </ul>
1115 </aside>
1116 </div>
1117 }
1118 </div>
1119 </div>
1120 </section>
1121 <section class="e-footer-copyright e-section">
1122 <div class="container-fluid">
1123 <div class="row align-items-center">
1124 <div class="col-12 col-sm-7">
1125 <p class="e-copyright">
1126 @Translate("Footer - Copyright - Text", "Copyright ©")
1127 @GetGlobalValue("Global:Server.Date.Year")
1128 @Espresso.Area.Item.CompanyName.
1129 @Translate("Footer - All Rights Reserved - Text", "All rights reserved.")
1130 </p>
1131 </div>
1132 <div class="col-12 col-sm-5 text-left text-sm-right">
1133 <p class="website-by-co3"><a href="https://www.co3.dk/pim" target="_blank">Website: Co3</a></p>
1134 <p class="pdf-only">@Translate("Footer - PDF created - Text", "PDf created:") @DateTime.Now.ToString( PageView.Current().Area.CultureInfo )</p>
1135 </div>
1136 </div>
1137 </div>
1138 </section>
1139 </article>
1140
1141 <script data-cookieconsent="statistics" type="text/plain">
1142 (function(e,t,o,n,p,r,i){e.visitorGlobalObjectAlias=n;e[e.visitorGlobalObjectAlias]=e[e.visitorGlobalObjectAlias]||function(){(e[e.visitorGlobalObjectAlias].q=e[e.visitorGlobalObjectAlias].q||[]).push(arguments)};e[e.visitorGlobalObjectAlias].l=(new Date).getTime();r=t.createElement("script");r.src=o;r.async=true;i=t.getElementsByTagName("script")[0];i.parentNode.insertBefore(r,i)})(window,document,"https://diffuser-cdn.app-us1.com/diffuser/diffuser.js","vgo");
1143 vgo('setAccount', '92226054');
1144 vgo('setTrackByDefault', true);
1145
1146 vgo('process');
1147 </script>
1148
1149 </footer>
1150 }
1151
1152 @if( string.IsNullOrEmpty( GetString("DwContent(dwcontentcta)") ) == false ) {
1153 <aside id="dwcontentcta" class="js-e-cta e-cta is-hidden fixed-top">
1154 <section class="e-section">
1155 <div class="container-fluid">
1156 <div class="row no-gutters">
1157 <div class="col-12">
1158 <div class="row no-gutters justify-content-center align-items-center">
1159 @GetValue("DwContent(dwcontentcta)")
1160 @* <p><a class="d-flex align-items-center justify-content-center justify-content-lg-left text-black text-decoration-none small" href="/bliv-ringet-op"><i class="material-icons material-icons-large text-primary mr-1">phone</i>Bliv ringet op</a></p> *@
1161 </div>
1162 </div>
1163 </div>
1164 </div>
1165 </section>
1166 </aside>
1167 }
1168
1169 <div class="e-cart-msg modal fade small" id="js-e-cart-msg" data-backdrop="false">
1170 <div class="modal-dialog e-cart-msg-modal-dialog">
1171 <div class="modal-content">
1172 <div class="modal-header">
1173 <h4 class="m-0 js-e-cart-msg-heading modal-title">
1174 <i class="material-icons material-icons-large text-black">check_circle</i>
1175 <span>@Translate( "eCom Cart - Product Added - Heading", "Added to your cart" )</span>
1176 </h4>
1177 <button class="close" data-dismiss="modal" type="button">
1178 <i class="material-icons">close</i>
1179 </button>
1180 </div>
1181 <div class="modal-body d-none">
1182 <div class="js-e-cart-msg-content">
1183 <script id="js-e-handlebars-tmpl-cart-msg-lastadded" type="text/x-handlebars-template">
1184 <div class="row">
1185 {{#each cart.lastAdded}}
1186 <div class="col-12 py-1">
1187 <div class="row">
1188 <div class="col-4">
1189 <a class="" href="{{url}}">
1190 <img alt="" class="img-fluid" src="{{imageLarge}}">
1191 </a>
1192 </div>
1193 <div class="col-8">
1194 <h3 class="mb-0">
1195 <a href="{{url}}" class="text-decoration-none">{{name}}</a>
1196 </h3>
1197 <p class="mb-0">
1198 <a href="{{url}}" class="text-auto text-decoration-none">
1199 {{{price}}}<br>
1200 {{{stock.text}}}<br>
1201 {{{stock.delivery}}}<br>
1202 </a>
1203 </p>
1204 </div>
1205 </div>
1206 </div>
1207 {{/each}}
1208 </div>
1209 </script>
1210 </div>
1211 </div>
1212 <div class="bg-light e-cart-msg-footer modal-footer border-top-0">
1213 <a class="btn btn-secondary mr-1" href="/shop/cart" data-dismiss="modal">@Translate( "eCom Checkout - Continue Shopping - Button","Continue Shopping" )</a>
1214 <a class="arrow-right btn btn-success" href="/shop/cart">@Translate( "eCom Checkout - Go to cart - Button","Go to cart" )</a>
1215 </div>
1216 </div>
1217 </div>
1218 </div>
1219
1220 </div>
1221
1222 <div class="modal fade e-search js-e-search js-e-search-modal modal-fullscreen" data-backdrop="false" data-keyboard="true" data-focus="true">
1223 <div class="modal-dialog">
1224 <div class="modal-content">
1225
1226 <div class="modal-header">
1227 <a class="btn btn-sm btn-secondary js-e-back-link arrow-left" href="/" data-dismiss="modal">
1228 @Translate("Search - Back button", "Back")
1229 </a>
1230 <div class="e-logo">
1231 <a href="/" class="e-logo-link my-0">
1232 <img src="@logoPrimary" class="e-logo-img e-logo-img-primary">
1233 <img src="@logoSecondary" class="e-logo-img e-logo-img-secondary">
1234 </a>
1235 </div>
1236 </div>
1237
1238 <div class="modal-body">
1239
1240 <div class="container-fluid">
1241
1242 <div class="e-search-form-container">
1243 <div class="row justify-content-center">
1244 <div class="col-12 col-md-10 col-lg-8 col-xl-6 mt-3">
1245 <form action="" class="e-search-form js-e-search-form">
1246 <div class="js-e-search-input-group e-search-input-group is-empty">
1247 <label class="e-search-label" for="e-search-input"><i class="material-icons">search</i></label>
1248 @{ string Translate_Search_InputText = Translate("Search - Input Placeholder - Text", "Search"); }
1249 <input type="text" class="js-e-search-input e-search-input form-control-plaintext border-0" name="q" id="e-search-input" placeholder="@Translate_Search_InputText">
1250 <span class="js-e-search-clear e-search-clear"><i class="material-icons">close</i></span>
1251 <button class="e-search-submit btn btn-primary" type="submit"><i class="material-icons">search</i></button>
1252 </div>
1253 </form>
1254 </div>
1255 </div>
1256 </div>
1257
1258 <div class="js-e-search-result-container e-search-result-container">
1259
1260 <div class="row justify-content-center">
1261 <div class="col-12 col-md-10 col-lg-8 col-xl-6">
1262 <p class="e-search-result-info small text-muted mt-1 mb-3"><span class="js-e-search-result-count">0</span> @Translate("Search - Result Count - Text", "results")</p>
1263 </div>
1264 </div>
1265
1266 <div class="row justify-content-center">
1267 <div class="col-12 col-xl-10">
1268 <div class="js-e-search-result-products e-search-result-products is-empty mb-4">
1269 <script id="js-e-handlebars-tmpl-search-result-item-product" type="text/x-handlebars-template">
1270 <div class="e-products">
1271 <div class="row">
1272 {{#loop products}}
1273 <div class="col-6 col-sm-6 col-md-4 col-lg-4">
1274 <div class="e-products-item">
1275 <div class="e-products-item-container">
1276 <div class="e-products-item-image-container">
1277 <a class="e-products-item-image-wrapper" href="{{url}}">
1278 <img src="{{imageMedium}}" alt="" class="e-products-item-image j-img-productcategory-{{category}}">
1279 </a>
1280 </div>
1281 <div class="e-products-item-text-container text-center small">
1282 <h3 class="e-products-item-name mb-0"><a href="{{url}}">{{name}}</a></h3>
1283 {{#if floorCategoryName}}
1284 <p>{{{floorCategoryName}}}</p>
1285 {{/if}}
1286 {{#if descriptionShortExtra01}}
1287 <p class="e-products-item-text mb-0 small">
1288 <a href="{{url}}">
1289 {{descriptionShortExtra01}}
1290 </a>
1291 </p>
1292 {{/if}}
1293 @* <p class="e-products-item-text mb-0 small"> *@
1294 @* <span class="e-products-item-price"> *@
1295 @* <a href="{{url}}"> *@
1296 @* {{{price}}} *@
1297 @* </a> *@
1298 @* </span> *@
1299 @* </p> *@
1300 </div>
1301 </div>
1302 </div>
1303 </div>
1304 {{/loop}}
1305 </div>
1306 <p class="js-e-search-products-show-all text-center"><a href="" class="btn btn-secondary px-6">@Translate("Search - View All Products - Button", "View All Products")</a></p>
1307 </div>
1308 </script>
1309 </div>
1310 </div>
1311 </div>
1312
1313 <div class="row justify-content-center">
1314 <div class="col-12 col-md-10 col-lg-8 col-xl-6">
1315 <div class="js-e-search-result-pages e-search-result-pages is-empty mb-3">
1316 <script id="js-e-handlebars-tmpl-search-result-item-page" type="text/x-handlebars-template">
1317 <div class="row">
1318 {{#loop pages}}
1319 <div class="col-12">
1320 <p class="mb-0"><a href="{{{url}}}" class="text-bold">{{{title}}}</a></p>
1321 <p class="mb-0 small text-truncate">
1322 <a href="{{{url}}}" class="text-auto text-muted text-decoration-none"><span class="d-none d-sm-inline">@GetGlobalValue( "Global:Request.Host" )</span>{{{url}}}</a></p>
1323 <p class="small">{{{text}}}...</p>
1324 </div>
1325 {{/loop}}
1326 </div>
1327 </script>
1328 </div>
1329 </div>
1330 </div>
1331
1332 <div class="js-e-search-loading-overlay e-loading-overlay e-search-loading-overlay">
1333 <div class="e-loading-spinner"></div>
1334 </div>
1335
1336 </div>
1337
1338 </div>
1339 </div>
1340 </div>
1341 </div>
1342 </div>
1343
1344 @if( Espresso.Area.Item.BackToTopLink == "True" ){
1345 <a href="#top" class="e-back-to-top js-e-back-to-top"><i class="material-icons">keyboard_arrow_up</i></a>
1346 }
1347
1348
1349
1350
1351 <div class="d-none flex-column">
1352 <div class="bg-primary">
1353 <br>
1354 </div>
1355 <div class="bg-secondary">
1356 <br>
1357 </div>
1358 <div class="bg-tertiary">
1359 <br>
1360 </div>
1361 </div>
1362 <script data-cookieconsent="ignore" async="" src="/Files/Templates/Designs/junckers/_assets/_dist/js/default.js?v=1.17.23"></script>
1363
1364 <a class="js-junckers-documentation-link junckers-documentation-pdf-link js-junckers-pdf-link pdf-hidden" href="#" target="_blank" data-product-id="@pdfProductId" data-page-id="@pdfPageId">
1365 <i class="material-icons">picture_as_pdf</i>
1366 </a>
1367 </body>
1368 @GetValue( "CopyRightNotice" )
1369 </html>
1370