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