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 &copy;") 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