Error executing template "Designs/kabooki-shop/_parsed/espresso.parsed.cshtml"System.ArgumentNullException: Value cannot be null.Parameter name: sourceat System.Linq.Enumerable.Where[TSource](IEnumerable`1 source, Func`2 predicate)at Dynamicweb.Frontend.XmlNavigation.FilterPages(IEnumerable`1 pages)at Dynamicweb.Frontend.XmlNavigation.MakeXml(Int32 parentId, Int32 levelStart, Int32 levelStop, Expand expand, Int32 selectedAreaId)at Dynamicweb.Frontend.XmlNavigation.GetNavigationHtml(Int32 parentId, Int32 levelStart, Int32 levelStop, Expand expand, String name, String xsltPath, Int32 selectedAreaId, Boolean sitemapMode, NameValueCollection settings, NameValueCollection attributes, IncludeMode mode)at Dynamicweb.Frontend.XmlNavigation.GetNavigationHtml(NameValueCollection settings, NameValueCollection attributes)at CompiledRazorTemplates.Dynamic.RazorEngine_01cb0e7376774fc89c146d86ceac239d.Execute() in E:\Dynamicweb.NET\Solutions\kabooki.espresso4.dk\files\Templates\Designs\kabooki-shop\_parsed\espresso.parsed.cshtml:line 1429at 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.b__0(TextWriter writer)at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @inherits Co3.Espresso.Website.TemplateBases.Pages.PageBase 2 @using System.IO 3 @using System.Web 4 @using Dynamicweb.Frontend 5 @using Dynamicweb.Ecommerce.Common 6 @{ 7 string globalAreaLang = PageView.Current().Area.CultureInfo.TwoLetterISOLanguageName; 8 //string currencySeparatorDecimal = PageView.Current().Area.CultureInfo.NumberFormat.CurrencyDecimalSeparator; 9 //string currencySeparatorInteger = PageView.Current().Area.CultureInfo.NumberFormat.CurrencyGroupSeparator; 10 string currencySeparatorDecimal = PageView.Current().Area.CultureInfo.NumberFormat.NumberDecimalSeparator; 11 string currencySeparatorInteger = PageView.Current().Area.CultureInfo.NumberFormat.NumberGroupSeparator; 12 string openGraphUrl = PageView.Current().SearchFriendlyUrl; 13 string openGraphImage = HttpContext.Current.Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Host + Espresso.OpenGraphImage; 14 bool isUserAuthenticated = PageView.Current().User != null; 15 string webfontsSnippetHtml = RenderSnippet( "webfonts" ).ToString().Trim(); 16 int areaID = PageView.Current().Area.ID; 17 bool isImageBankArea = PageView.Current().Area.ID == 24; 18 19 bool isProductPage = string.IsNullOrEmpty( HttpContext.Current.Request[ "productid" ] ) == false; 20 string globalValueUrl = GetGlobalValue( "Global:Pageview.Url" ); 21 22 string canonicalPageView = String.Format( "{0}://{1}{2}", GetGlobalValue( "Global:Request.Scheme" ), GetGlobalValue( "Global:Request.Host" ), globalValueUrl ); 23 string pageCanonical = PageView.Current().Page.MetaCanonical; 24 string eComCanonicalSnippetTag = RenderSnippet( "eComCanonical" ).ToString().Trim(); 25 26 27 if ( GetGlobalValue( "Global:Pageview.Url" ).IndexOf( "?" ) > -1 ) 28 { 29 globalValueUrl = GetGlobalValue( "Global:Pageview.Url" ).Substring( 0, GetGlobalValue( "Global:Pageview.Url" ).IndexOf( "?" ) ); 30 } 31 } 32 <!DOCTYPE html> 33 <html lang="@globalAreaLang" data-separator-integer="@currencySeparatorInteger" data-separator-decimal="@currencySeparatorDecimal"> 34 <head> 35 36 <script id="CookieConsent" src="https://policy.app.cookieinformation.com/uc.js" data-culture="@globalAreaLang" type="text/javascript"></script> 37 38 @GetValue( "CopyRightNotice" ) 39 <meta charset="utf-8"> 40 <meta content="width=device-width, initial-scale=1, shrink-to-fit=no, minimal-ui" name="viewport"> 41 <meta content="ie=edge" http-equiv="x-ua-compatible"> 42 @Espresso.CriticalCSS 43 @if ( webfontsSnippetHtml != "<!--@Snippet(webfonts)-->" ) 44 { 45 @webfontsSnippetHtml 46 } 47 <link href="/Files/Templates/Designs/kabooki-shop/_assets/_dist/css/default.css?v=1.1.1" media="@Espresso.StylesheetAttributeMedia" rel="@Espresso.StylesheetAttributeRel" as="style"> 48 @Espresso.CriticalJS 49 50 <link rel="shortcut icon" href="@Espresso.Area.Item.Favicon"> 51 @GetValue( "MetaTags" ) 52 @if ( Espresso.IsStagingUrl ) 53 { 54 <meta content="noindex,nofollow" name="robots"> 55 } 56 <meta property="og:url" content="@openGraphUrl"> 57 58 59 60 61 62 63 64 @if ( isProductPage ) 65 { 66 <link rel="canonical" href="@eComCanonicalSnippetTag"> 67 } 68 else 69 { 70 <title>@GetValue("Title")</title> 71 @GetValue("MetaTags") 72 @GetValue("CopyRightNotice") 73 74 75 76 if ( string.IsNullOrEmpty( pageCanonical ) == true ) 77 { 78 if ( GetString( "DwPageID" ) == GetString( "DwAreaFirstPageID" ) ) 79 { 80 <link rel="canonical" href="/"> 81 } 82 else 83 { 84 <link rel="canonical" href="@canonicalPageView"> 85 } 86 } 87 else 88 { 89 <link rel="canonical" href="@pageCanonical"> 90 } 91 } 92 93 @if ( isProductPage ) 94 { 95 @RenderSnippet( "productSpecificData" ) 96 } 97 else 98 { 99 if ( !string.IsNullOrEmpty( Espresso.OpenGraphTitle ) )100 {101 <meta property="og:title" content="@Espresso.OpenGraphTitle">102 }103 else104 {105 <meta property="og:title" content="@Espresso.DynamicwebPage.MetaTitle">106 }107108 if ( !string.IsNullOrEmpty( Espresso.OpenGraphDescription ) )109 {110 <meta property="og:description" content="@Espresso.OpenGraphDescription">111 }112 else113 {114 <meta property="og:description" content="@Espresso.DynamicwebPage.Description">115 }116 <meta property="og:image" content="@openGraphImage">117 <meta property="og:type" content="website">118 }119120121122123124 @*<meta property="og:title" content="@Espresso.OpenGraphTitle">125 <meta property="og:description" content="@Espresso.OpenGraphDescription">126 <meta property="og:image" content="@openGraphImage">127 <meta property="og:type" content="website">*@128129 @if ( string.IsNullOrEmpty( Espresso.Area.Item.GoogleSiteVerification ) == false )130 {131 <meta name="google-site-verification" content="@Espresso.Area.Item.GoogleSiteVerification">132 }133 @{134 if ( 1 == 2 )135 {136 @GetValue( "Stylesheets" )137 }138 }139140 @if ( GetString( "LongLang" ) == "da-DK" )141 {142 <script id="CookieConsent" src="https://policy.app.cookieinformation.com/uc.js" data-culture="DA" type="text/javascript"></script>143 <meta name="facebook-domain-verification" content="yhbdpu04igi1dk6144r8nvmntugbwt">144 }145146 @if ( GetString( "LongLang" ) == "en-GB" )147 {148 <script id="CookieConsent" src="https://policy.app.cookieinformation.com/uc.js" data-culture="EN" type="text/javascript"></script>149 <meta name="facebook-domain-verification" content="mx87mtwxtnh2mha9slaj2vyds7r59s">150 }151152 @if ( GetString( "LongLang" ) == "de-DE" )153 {154 <meta name="facebook-domain-verification" content="ydpqtm2ts226kri7jnqtbpvbpyzlq0">155 }156157 @if ( string.IsNullOrEmpty( Espresso.Area.GoogleTagManagerID ) == false && Espresso.Area.GoogleTagManagerID != "GTM-XXXX" )158 {159 <!-- Google Tag Manager -->160 <script>161 (function(w, d, s, l, i) {162 w[l] = w[l] || [];163 w[l].push({164 'gtm.start':165 new Date().getTime(),166 event: 'gtm.js'167 });168 var f = d.getElementsByTagName(s)[0],169 j = d.createElement(s),170 dl = l != 'dataLayer' ? '&l=' + l : '';171 j.async = true;172 j.src =173 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;174 f.parentNode.insertBefore(j, f);175 })(window, document, 'script', 'dataLayer', '@Espresso.Area.GoogleTagManagerID');176 </script>177 <!-- End Google Tag Manager -->178 }179180 <!-- Start of Sleeknote signup and lead generation tool - www.sleeknote.com -->181 <script id='sleeknoteScript' type='text/javascript'>182 (function () {        var sleeknoteScriptTag = document.createElement('script');183 sleeknoteScriptTag.type = 'text/javascript';184 sleeknoteScriptTag.charset = 'utf-8';185 sleeknoteScriptTag.src = ('//sleeknotecustomerscripts.sleeknote.com/13621.js');186 var s = document.getElementById('sleeknoteScript');187 s.parentNode.insertBefore(sleeknoteScriptTag, s);188 })();189 </script>190 <!-- End of Sleeknote signup and lead generation tool - www.sleeknote.com -->191 @GetValue("Stylesheets")192 @GetValue("Javascripts")193 </head>194195 <body class="@Espresso.Item.CustomClasses" data-userauthenticated="@isUserAuthenticated.ToString().ToLower()" data-imagebank-area="@isImageBankArea.ToString().ToLower()">196 @if ( string.IsNullOrEmpty( Espresso.Area.GoogleTagManagerID ) == false && Espresso.Area.GoogleTagManagerID != "GTM-XXXX" )197 {198 <!-- Google Tag Manager (noscript) -->199 <noscript>200 <iframe src="https://www.googletagmanager.com/ns.html?id=@Espresso.Area.GoogleTagManagerID" height="0" width="0" style="display: none; visibility: hidden"></iframe>201 </noscript>202 <!-- End Google Tag Manager (noscript) -->203 }204205 @using Dynamicweb.Ecommerce.Common206 @inherits Co3.Espresso.Website.TemplateBases.Pages.PageBase207 @{208 Espresso.Canvas.ClassList.AddClasses( "js-e-canvas is-loading" );209 if ( Espresso.Item.CanvasFullscreen == "True" )210 {211 Espresso.Canvas.ClassList.AddClasses( "is-fullscreen" );212 }213214 string daDomain = "//www.kabooki.dk/";215 string enDomain = "//www.kabooki.com/";216 string deDomain = "//www.kabooki.de/";217218 string contextCountryCode = Context.Country.Code2;219220 contextCountryCode = contextCountryCode == "GB" ? "IE" : contextCountryCode;221222 if ( Context.Cart != null )223 {224 if ( !string.IsNullOrEmpty( Context.Cart.DeliveryCountryCode ) )225 {226 contextCountryCode = Context.Cart.DeliveryCountryCode;227 }228 }229230 Dictionary< string, dynamic > selectorCountries = new Dictionary< string, dynamic >231 {232 {233 "DK", new234 {235 domain = daDomain,236 title = "Denmark",237 countrycode = "DK",238 currencycode = "DKK"239 }240 },241 {242 "SE", new243 {244 domain = daDomain,245 title = "Sweden",246 countrycode = "SE",247 currencycode = "SEK"248 }249 },250 {251 "IE", new252 {253 domain = enDomain,254 title = "Ireland",255 countrycode = "IE",256 currencycode = "EUR"257 }258 },259 {260 "FI", new261 {262 domain = enDomain,263 title = "Finland",264 countrycode = "FI",265 currencycode = "EUR"266 }267 },268 {269 "FR", new270 {271 domain = enDomain,272 title = "France",273 countrycode = "FR",274 currencycode = "EUR"275 }276 },277 {278 "PT", new279 {280 domain = enDomain,281 title = "Portugal",282 countrycode = "PT",283 currencycode = "EUR"284 }285 },286 {287 "IT", new288 {289 domain = enDomain,290 title = "Italy",291 countrycode = "IT",292 currencycode = "EUR"293 }294 },295 {296 "ES", new297 {298 domain = enDomain,299 title = "Spain",300 countrycode = "ES",301 currencycode = "EUR"302 }303 },304 {305 "NL", new306 {307 domain = enDomain,308 title = "Netherlands",309 countrycode = "NL",310 currencycode = "EUR"311 }312 },313 {314 "BE", new315 {316 domain = enDomain,317 title = "Belgium",318 countrycode = "BE",319 currencycode = "EUR"320 }321 },322 {323 "DE", new324 {325 domain = deDomain,326 title = "Germany",327 countrycode = "DE",328 currencycode = "EUR"329 }330 },331 {332 "AT", new333 {334 domain = deDomain,335 title = "Austria",336 countrycode = "AT",337 currencycode = "EUR"338 }339 }340 };341 dynamic JSONcountrySelector = new342 {343 contextCountryCode = contextCountryCode,344 selectorCountries = selectorCountries345 };346 }347348349350 @using System.Globalization351 @using System.Security.Cryptography.X509Certificates352 @using Co3.Espresso.Base.Extensions353 @using Co3.Espresso.Website.Models.FrontEnd354 @using Co3.Espresso.Website.Services355 @using Dynamicweb.Content356 @using Dynamicweb.Ecommerce.Stocks357 @using Dynamicweb.Frontend358 @using Dynamicweb.Rendering359 @using EcomContext = Dynamicweb.Ecommerce.Common.Context360 @using System.Web361 @using EspressoProductService = Co3.Espresso.Website.Services.ProductService362 @using Co3.Kabooki.Dw.Models363 @using Co3.Espresso.Website.Models.FrontEnd.Elements364 @using Dynamicweb.Rendering.Translation365366 @functions {367368 public string getCountryCodeFromArea( Area area )369 {370 RegionInfo regionInfo = new RegionInfo( area.CultureInfo.LCID );371 return regionInfo.TwoLetterISORegionName;372 }373374 public static string GetStandardCollapseToggleTextExpand()375 {376 return "Se mere";377 }378379 public static string GetStandardCollapseToggleTextCollapse()380 {381 return "Se mindre";382 }383384 public static string getProductlistItemImageColorDot( string variantColorImageName = "" )385 {386 string getImageSyntax = "/admin/public/getimage.ashx?Image={0}&Width=30&Height=140&Format=jpg&Quality=10&Crop=7&AlternativeImage={1}";387 string imagePath = string.Format( "/Files/Images/produkter/{0}_4.jpg", variantColorImageName );388 string altImagePath = string.Format( "/Files/Images/produkter/{0}_3.jpg", variantColorImageName );389 string image = string.Format( getImageSyntax, imagePath, altImagePath );390 return image;391 }392393 public static string getProductImageColorDot(string productNumber = "", string variantImageNumber = "" )394 {395 string getImageSyntax = "/admin/public/getimage.ashx?Image={0}&Width=80&Height=350&Format=jpg&Quality=10&Crop=7&AlternativeImage={1}";396 string imagePath = string.Format( "/Files/Images/produkter/{0}-{1}_4.jpg", productNumber, variantImageNumber );397 string altImagePath = string.Format( "/Files/Images/produkter/{0}-{1}_3.jpg", productNumber, variantImageNumber );398 string image = string.Format( getImageSyntax, imagePath, altImagePath );399 return image;400 }401402 public static string getKabookiProductImageColorDot(string productNumber = "", string variantImageNumber = "" )403 {404 string getImageSyntax = "/admin/public/getimage.ashx?Image={0}&Width=200&Height=200&Format=jpg&Quality=10&Crop=3&AlternativeImage={1}";405 string imagePath = string.Format( "/Files/Images/produkter/{0}-{1}_4.jpg", productNumber, variantImageNumber );406 string altImagePath = string.Format( "/Files/Images/produkter/{0}-{1}_5.jpg", productNumber, variantImageNumber );407 string image = string.Format( getImageSyntax, imagePath, altImagePath );408 return image;409 }410 }411412 @helper ProductDescription( string sectionClasses = "e-section", bool sectionCollapse = false, string contentClasses = null, string heading = null, string content = null, string collapseToggleTextExpand = null, string collapseToggleTextCollapse = null )413 {414 if ( string.IsNullOrEmpty( content ) == false )415 {416 ClassList headingClassList = new ClassList();417 headingClassList.AddClasses( "col-12" );418 ClassList contentClassList = new ClassList();419 contentClassList.AddClasses( "col-12" );420421 @sectionStart( sectionClasses: sectionClasses, sectionCollapse: sectionCollapse, contentClasses: contentClasses, collapseToggleTextCollapse: collapseToggleTextCollapse, collapseToggleTextExpand: collapseToggleTextExpand )422423 if ( string.IsNullOrEmpty( heading ) == false )424 {425 <div class="@headingClassList">426 <h2>@heading</h2>427 </div>428 }429 <div class="@contentClassList">430 @content431 </div>432433 @sectionEnd()434 }435 }436437438 @helper ProductVideo( string sectionClasses = "e-section", string contentClasses = null, string heading = null, string videoURL = null )439 {440 if ( string.IsNullOrEmpty( videoURL ) == false )441 {442 ClassList headingClassList = new ClassList();443 headingClassList.AddClasses( "col-12" );444 ClassList contentClassList = new ClassList();445 contentClassList.AddClasses( "col-12" );446447448 @sectionStart( sectionClasses: sectionClasses, contentClasses: contentClasses )449450 if ( string.IsNullOrEmpty( heading ) == false )451 {452 <div class="@headingClassList">453 <h2>@heading</h2>454 </div>455 }456457 <div class="@contentClassList">458 <div class="embed-responsive embed-responsive-16by9 mb-2">459 <iframe class="embed-responsive-item" src="@videoURL" width="1080" height="608" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>460 </div>461 </div>462 @sectionEnd()463 }464 }465466 @helper ProductRelatedProducts( string sectionClasses = "e-section", string contentClasses = null, string heading = null,467 IEnumerable< RazorTemplateBase< RazorTemplateModel< Template > >.LoopItem > productLoop = null )468 {469 if ( productLoop != null && productLoop.Any() == true )470 {471 ClassList headingClassList = new ClassList();472 headingClassList.AddClasses( "col-12" );473 ClassList contentClassList = new ClassList();474 contentClassList.AddClasses( "col-12" );475476 @sectionStart( sectionClasses: sectionClasses, contentClasses: contentClasses )477478 if ( string.IsNullOrEmpty( heading ) == false )479 {480 <div class="@headingClassList">481 <h2 class="text-center">@heading</h2>482 </div>483 }484 <div class="@contentClassList">485 <div class="e-products mb-2">486 <div class="row">487 @{488 string productlistItemClassList = ProductlistService.Instance.GetGridItemWidth( null ).ToResponsiveClasses();489 }490 @foreach ( RazorTemplateBase< RazorTemplateModel< Template > >.LoopItem product in productLoop )491 {492 @ProductlistItem( product, productlistItemClassList )493 }494 </div>495 </div>496 </div>497498 @sectionEnd()499 }500 }501502 @helper ProductlistItem( RazorTemplateBase< RazorTemplateModel< Template > >.LoopItem product, string productlistItemClassList = null )503 {504 if ( product != null )505 {506 Dynamicweb.Ecommerce.Products.Product dwProduct = Dynamicweb.Ecommerce.Services.Products.GetProductById( product.GetString( "Ecom:Product.ID" ), product.GetString( "Ecom:Product.VariantID" ), EcomContext.LanguageID, false );507508 ProductPriceInfo variantPriceInfo = Co3.Kabooki.Dw.Services.ProductService.Instance.GetProductPriceInfo( dwProduct );509 EspressoPrice espressoPrice = new EspressoPrice(variantPriceInfo.Price.PriceWithVAT);510 EspressoPrice espressoListPrice = new EspressoPrice(variantPriceInfo.ListPrice.PriceWithVAT);511 bool hasDiscount = variantPriceInfo.Price.PriceWithVAT < variantPriceInfo.ListPrice.PriceWithVAT;512513 dynamic colorVariantImages = new List< dynamic >();514 int colorVariantImagesCount = 0;515 foreach ( RazorTemplateBase< RazorTemplateModel< Template > >.LoopItem variantCombination in product.GetLoop( "VariantCombinations" ) )516 {517 string variantColorImageName = variantCombination.GetString( "Ecom:Product:Field.VariantImage.Value.Clean" );518 //string imagePath = ImageService.Instance.GetImageURL( string.Format( "/Files/Images/produkter/{0}_3.jpg", variantColorImageName ), 80, 80, 5, 10, "png" );519 string imagePath = getProductlistItemImageColorDot( variantColorImageName );520 if ( JsonService.Instance.ToJson( colorVariantImages ).ToString().Contains( imagePath ) == false )521 {522 colorVariantImages.Add( new523 {524 path = imagePath525 } );526 ++colorVariantImagesCount;527 }528 }529530 dynamic productData = new531 {532 id = product.GetString( "Ecom:Product.ID" ),533 variantId = product.GetString( "Ecom:Product.VariantID" ),534 url = ProductService.Instance.GetProductLink( product.GetString( "Ecom:Product.PrimaryOrFirstGroupID" ), product.GetString( "Ecom:Product.ID" ) ),535 number = product.GetString( "Ecom:Product.Number" ),536 name = ProductService.Instance.GetName( product.GetString( "Ecom:Product.ID" ), product.GetString( "Ecom:Product.VariantID" ) ),537 imageLarge = ImageService.Instance.GetImageURL( product.GetString("Ecom:Product.ImageDefault.Default.Clean"), 400, 400, 5, 10, "png" ),538 price = espressoPrice,539 beforePrice = espressoListPrice,540 descriptionShortExtra01 = product.GetString( "Ecom:Product:Field.DescriptionShortExtra01" ),541 hasDiscount = hasDiscount,542 stock = dwProduct.Stock,543 stockStatus = dwProduct.get_StockStatus(EcomContext.LanguageID),544 colorVariantImagesCount = colorVariantImagesCount,545 colorVariantImages = colorVariantImages546 };547548 string labelColor = Translation.GetTranslation( "eCom Product - Color - Text" );549 if ( productData.colorVariantImagesCount > 1 )550 {551 labelColor = Translation.GetTranslation( "eCom Product - Colors - Text" );552 }553554 if (PageView.Current().Layout.Design.Name == "kabooki-shop")555 {556557 <div class="@productlistItemClassList">558 <div class="e-products-item js-e-products-item js-e-products-item-@productData.id js-e-block-link e-block-link" data-variant-id="@productData.variantId" style="background-image:url('@productData.imageLarge'); background-position:center; background-size: cover;">559 <div class="e-products-item-container">560 <div class="e-products-item-image-container">561 <a class="e-products-item-image-wrapper" href="@productData.url">562 @*<img src="@productData.imageLarge" alt="" class="e-products-item-image">*@563 @if (productData.hasDiscount)564 {565 <img src="/Files/Images/kabooki/system/lego_wear_badge_percentage.svg" alt="" class="custom-products-item-badge">566 }567 </a>568 </div>569570 </div>571 </div>572 <div class="e-products-item-text-container text-left small">573 <h3 class="e-products-item-name mb-0 mt-0">574 <a href="@productData.url">@productData.name</a>575 </h3>576 <p class="e-products-item-text mb-4">577 <span class="e-products-item-price">578 <a href="@productData.url">579 @productData.price580 @if (productData.hasDiscount)581 {582 <span class="custom-products-item-beforeprice">@productData.beforePrice</span>583 }584 </a>585 </span>586 </p>587 </div>588 </div>589 }590 else591 {592 <div class="@productlistItemClassList">593 <div class="e-products-item js-e-products-item js-e-products-item-@productData.id js-e-block-link e-block-link" data-variant-id="@productData.variantId">594 <div class="e-products-item-container">595 <div class="e-products-item-image-container">596 <a class="e-products-item-image-wrapper" href="@productData.url">597 <img src="@productData.imageLarge" alt="" class="e-products-item-image">598 @if (productData.hasDiscount)599 {600 <img src="/Files/Images/kabooki/system/lego_wear_badge_percentage.svg" alt="" class="custom-products-item-badge">601 }602 </a>603 </div>604605 <div class="e-products-item-text-container text-left small">606 <div class="custom-color-options-wrapper">607 <div class="custom-color-options-text">608 <p class="m-0 p-0">@productData.colorVariantImagesCount @labelColor</p>609 </div>610 <div class="custom-color-options-colors">611 @foreach (dynamic colorVariantImage in colorVariantImages)612 {613 <span class="custom-color-dot" style="background-image: url('@colorVariantImage.path');"></span>614 }615616 </div>617 </div>618619 <h3 class="e-products-item-name mb-0 mt-0">620 <a href="@productData.url">@productData.name</a>621 </h3>622 <p class="e-products-item-text mb-0">623 <span class="e-products-item-price">624 <a href="@productData.url">625 @productData.price626 @if (productData.hasDiscount)627 {628 <span class="custom-products-item-beforeprice">@productData.beforePrice</span>629 }630 </a>631 </span>632 </p>633 </div>634 </div>635 </div>636 </div>637 }638 }639 }640641642 @helper sectionStart( string sectionClasses = "e-section", string contentClasses = null, bool sectionCollapse = false, string sectionId = null, string collapseToggleTextExpand = null, string collapseToggleTextCollapse = null )643 {644 sectionId = string.IsNullOrEmpty( sectionId ) ? Guid.NewGuid().ToString( "N" ) : sectionId;645 ClassList sectionClassList = new ClassList();646 sectionClassList.AddClasses( sectionClasses );647 ClassList contentClassList;648649 if ( contentClasses == null )650 {651 contentClassList = Co3.Espresso.Website.Services.PageService.Instance.GetResponsiveClassesFromPageItem( PageView.Current().Page.Item );652 }653 else654 {655 contentClassList = new ClassList();656 contentClassList.AddClasses( contentClasses );657 }658659 // TODO: Split collapse logic into separate helper function.660 string collapseId = Guid.NewGuid().ToString( "N" );661 ClassList collapseToggleClassList = new ClassList();662 if ( sectionCollapse )663 {664 sectionClassList.AddClasses( "p-section-collapse js-p-section-collapse" );665 collapseToggleClassList.AddClasses( contentClasses );666 collapseToggleClassList.AddClasses( "p-section-collapse-toggle collapsed order-last text-center" );667 contentClassList.AddClasses( "p-section-collapse-content collapse is-md" );668 }669670 @:<section class="@sectionClassList" id="@sectionId">671 @:<div class="container-fluid">672 @:<div class="row">673674 // TODO: Split collapse logic into separate helper function.675 if ( sectionCollapse )676 {677 <div class="@collapseToggleClassList" data-toggle="collapse" data-target="#@collapseId">678 <button class="btn btn-primary p-section-collapse-toggle-btn" type="button">679 <i class="material-icons p-section-collapse-toggle-icon">keyboard_arrow_down</i>680 </button>681 <small class="h4 p-section-collapse-toggle-text" data-expand-text="@( string.IsNullOrEmpty( collapseToggleTextExpand ) ? GetStandardCollapseToggleTextExpand() : collapseToggleTextExpand )" data-collapse-text="@( string.IsNullOrEmpty( collapseToggleTextCollapse ) ? GetStandardCollapseToggleTextCollapse() : collapseToggleTextCollapse )"></small>682 </div>683 }684685 @:<div class="@contentClassList" id="@collapseId">686 @:<div class="row">687 }688689 @helper sectionEnd()690 {691 @:</div>692 @:</div>693 @:</div>694 @:</div>695 @:</section>696 }697698699700701 <div class="e-loading-overlay e-page-loading-overlay is-loading js-e-page-loading-overlay">702 <div class="e-loading-spinner"></div>703 </div>704705706 @* https://medium.com/clio-calliope/making-google-fonts-faster-aadf3c02a36d *@707 @SnippetStart("webfonts")708 <link crossorigin="" href="https://fonts.gstatic.com/" rel="preconnect">709 <link href="https://fonts.googleapis.com/css?family=IBM+Plex+Sans:400,700|Material+Icons" media="@Espresso.StylesheetAttributeMedia" rel="@Espresso.StylesheetAttributeRel" as="style">710 @SnippetEnd("webfonts")711712713714 <div class="@Espresso.Canvas.ClassList">715 @using System.Drawing716 @using Co3.Espresso.Website.Services717 @using Dynamicweb.Core718 @using Dynamicweb.Frontend;719 @using Dynamicweb.Ecommerce.Common720 @using Dynamicweb.Ecommerce.Orders721 @{722723 bool isExtranet = GetGlobalValue( "Global:Extranet.UserID" ) == "0" ? false : true;724 string imageBankLoginPage = Espresso.Area.Item.ImageBankLoginPage;725726 ClassList headerClassList = new ClassList();727 headerClassList.AddClasses( "e-header js-e-header is-sticky" );728 if ( Espresso.Item.HeaderTransparent == "True" )729 {730 headerClassList.AddClasses( "is-transparent" );731 }732733 ClassList logoClassList = new ClassList();734 logoClassList.AddClasses( "e-logo" );735736 string backButtonLink = Espresso.Item.BackButtonLink;737 ClassList backButtonClassList = new ClassList();738 ClassList backButtonIconClassList = new ClassList();739 if ( Espresso.Item.BackButton == "True" )740 {741 backButtonClassList.AddClasses( "btn btn-sm btn-secondary my-1 align-self-center" );742 if ( backButtonLink == "" || backButtonLink == "/" )743 {744 backButtonLink = "/";745 backButtonClassList.AddClasses( "js-e-back-link" );746 }747 backButtonIconClassList.AddClasses( "material-icons material-icons-large" );748 if ( Espresso.Item.BackButtonPosition == "right" )749 {750 backButtonClassList.AddClasses( "mr-0 ml-auto order-last" );751 logoClassList.AddClasses( "order-first" );752 }753 else754 {755 backButtonClassList.AddClasses( "order-first" );756 logoClassList.AddClasses( "mr-0 ml-auto order-last" );757 }758 if ( Espresso.Item.BackButtonIcon == "arrow_back" )759 {760 backButtonClassList.AddClasses( "arrow-left" );761 backButtonIconClassList.AddClasses( "d-none" );762 }763 else if ( Espresso.Item.BackButtonIcon == "arrow_forward" )764 {765 backButtonClassList.AddClasses( "arrow-right" );766 backButtonIconClassList.AddClasses( "d-none" );767 }768 }769770 string logoPrimary = Espresso.Area.Item.LogoPrimary;771 string logoSecondary = Espresso.Area.Item.LogoSecondary;772 if ( string.IsNullOrEmpty( logoSecondary ) == true )773 {774 logoSecondary = logoPrimary;775 }776 string tagline = Espresso.Area.Item.Tagline;777778 string checkoutPage = string.Empty;779 if ( !string.IsNullOrEmpty( Espresso.Area.Item.CheckoutPage ) )780 {781 checkoutPage = string.Format("Default.aspx?ID={0}", Espresso.Area.Item.CheckoutPage);782 checkoutPage = SearchEngineFriendlyURLs.GetFriendlyUrl( checkoutPage );783 }784785 string cartPage = string.Empty;786 if ( !string.IsNullOrEmpty( Espresso.Area.Item.CartPage ) )787 {788 cartPage = string.Format("Default.aspx?ID={0}", Espresso.Area.Item.CartPage);789 cartPage = SearchEngineFriendlyURLs.GetFriendlyUrl( cartPage );790 }791792 string customerServicePage = string.Empty;793 if ( !string.IsNullOrEmpty( Espresso.Area.Item.CustomerServicePage ) )794 {795 customerServicePage = string.Format("Default.aspx?ID={0}", Espresso.Area.Item.CustomerServicePage);796 customerServicePage = SearchEngineFriendlyURLs.GetFriendlyUrl( customerServicePage );797 }798799 Dictionary< string, string > navigationHtml = new Dictionary< string, string >800 {801 {802 "global", RenderNavigation( new803 {804 id = "dwnav-global",805 template = "global.xslt",806 startlevel = 1,807 endlevel = 8,808 expandmode = "all"809 } )810 },811 {812 "utilities-primary", RenderNavigation( new813 {814 id = "dwnav-utilities-primary",815 template = "utilities.xslt",816 startlevel = 4,817 endlevel = 5,818 expandmode = "all",819 parenttag = "utilities-primary"820 } )821 },822 {823 "utilities-secondary", RenderNavigation( new824 {825 id = "dwnav-utilities-secondary",826 template = "utilities.xslt",827 startlevel = 4,828 endlevel = 4,829 expandmode = "all",830 parenttag = "utilities-secondary"831 } )832 },833 {834 "hamburger-header", RenderNavigation( new835 {836 id = "dwnav-hamburger-header",837 template = "utilities.xslt",838 startlevel = 4,839 endlevel = 4,840 expandmode = "all",841 parenttag = "hamburger-header"842 } )843 },844 {845 "hamburger-aside", RenderNavigation( new846 {847 id = "dwnav-hamburger-aside",848 template = "utilities.xslt",849 startlevel = 4,850 endlevel = 4,851 expandmode = "all",852 parenttag = "hamburger-aside"853 } )854 }855 };856857 string logoLink = "/";858 if ( isExtranet )859 {860 logoLink = "/Default.asp?ID=6532";861 }862863864 // STREAMER865866 int pageId = PageView.Current().ID;867 string streamerActive = Espresso.Area.Item.StreamerActive;868 string streamerMarquee = Espresso.Area.Item.StreamerAsMarquee;869 string streamerMessage = Espresso.Area.Item.StreamerMessage;870 string streamerTextColor = Espresso.Area.Item.StreamerTextColor;871 string streamerBackgroundColor = Espresso.Area.Item.StreamerBackgroundColor;872 string streamerLink = Espresso.Area.Item.StreamerLink;873 }874875 @if ( Espresso.Item.HeaderHide != "True" )876 {877 <header class="@headerClassList" data-autohide="true" data-imagebank-area="@isImageBankArea">878879 <div class="e-header-hamburger">880 @sectionStart( "e-header-section e-section", "col-12" )881 <div class="col-12 e-header-section-content">882 <div class="@logoClassList">883 @if ( isImageBankArea == false )884 {885 <a class="e-logo-link" href="/">886 <img src="@logoPrimary" class="e-logo-img e-logo-img-primary" alt="@Espresso.Area.Item.CompanyName">887 <img src="@logoSecondary" class="e-logo-img e-logo-img-secondary" alt="@Espresso.Area.Item.CompanyName">888 @if ( string.IsNullOrEmpty( tagline ) == false )889 {890 <p class="e-logo-tagline">@tagline</p>891 }892 </a>893 }894 else895 {896 <a class="e-logo-link" href="@logoLink">897 <img src="@logoPrimary" class="e-logo-img e-logo-img-primary" alt="@Espresso.Area.Item.CompanyName">898 <img src="@logoSecondary" class="e-logo-img e-logo-img-secondary" alt="@Espresso.Area.Item.CompanyName">899 @if ( string.IsNullOrEmpty( tagline ) == false )900 {901 <p class="e-logo-tagline">@tagline</p>902 }903 </a>904 }905906 </div>907 @if ( Espresso.Item.NavigationHide != "True" )908 {909 <section class="e-nav-hamburger-header">910 <ul class="nav">911 @navigationHtml[ "hamburger-header" ]912 @* TODO: Move to xslt *@913 <li class="e-nav-item-hamburger-open nav-item">914 <a class="nav-link" data-target=".modal.e-nav" data-toggle="modal" href="#">915 <i class="e-nav-pageicon material-icons">menu</i>916 @*<span class="e-nav-pagename">@Translate( "Header - Hamburger menu open - Button", "Menu" )</span>*@917 </a>918 </li>919 </ul>920 </section>921922923924925926 }927 @if ( Espresso.Item.BackButton == "True" )928 {929 <a class="@backButtonClassList" href="@backButtonLink">930 @if ( Espresso.Item.BackButtonIcon != "" )931 {932 <i class="@backButtonIconClassList">@Espresso.Item.BackButtonIcon</i>933 }934 @Espresso.Item.BackButtonText935 </a>936 }937 </div>938 @sectionEnd()939940941 @if ( streamerActive != "False" )942 {943 <section class="e-header-section e-section kabooki-seasonal-streamer" style="background-color: @streamerBackgroundColor;">944945 @if ( streamerLink == "" )946 {947 <div class="container-fluid">948 <div class="row">949 <div class="col-12">950 <div class="row">951 <div class="col-12 d-flex pt-1 pb-1 small @streamerTextColor" style="min-height: 2em;">952 @if ( streamerMarquee == "True" )953 {954 <marquee>@streamerMessage</marquee>955 }956 else957 {958 @streamerMessage959 }960 </div>961 </div>962 </div>963 </div>964 </div>965 }966 else967 {968 <a href="@streamerLink">969 <div class="container-fluid">970 <div class="row">971 <div class="col-12">972 <div class="row">973 <div class="col-12 d-flex pt-1 pb-1 small @streamerTextColor" style="min-height: 2em;">974 @if ( streamerMarquee == "True" )975 {976 <marquee>@streamerMessage</marquee>977 }978 else979 {980 @streamerMessage981 }982 </div>983 </div>984 </div>985 </div>986 </div>987 </a>988 }989 </section>990 }991992 </div>993 <div class="e-nav js-e-nav modal p-0" data-backdrop="false">994 <div class="e-nav-container navbar">995996 @if ( !string.IsNullOrEmpty( Espresso.Area.Item.HeaderPageID ) && isImageBankArea == false )997 {998 @sectionStart( "e-header-section p-section e-section custom-USP-bar bg-light order-4", "col-12" )9991000 @RenderPageContent( int.Parse( Espresso.Area.Item.HeaderPageID ) )10011002 @sectionEnd()1003 }10041005 @if ( string.IsNullOrEmpty( navigationHtml[ "utilities-primary" ] ) == false && isImageBankArea == false )1006 {1007 @sectionStart( "e-header-section e-section order-3 order-lg-1", "col-12" )1008 @:<div class="col-12 e-header-section-content">1009 <nav class="e-nav-utilities-primary js-e-nav-utilities-primary">1010 <ul class="nav">1011 <li class="dropdown nav-item mr-auto">1012 <a href="@selectorCountries[ contextCountryCode ].domain?countrycode=@selectorCountries[ contextCountryCode ].countrycode.ToLower()&currencycode=@selectorCountries[ contextCountryCode ].currencycode.ToLower()" class="dropdown-toggle nav-link icon-flag-@selectorCountries[ contextCountryCode ].countrycode.ToLower() nav-utility-bg-light-gray " data-toggle="dropdown" data-collapse-toggle="true" data-collapse-target="#countries">1013 <i class="e-nav-pageicon e-nav-pageicon-language js-e-nav-pageicon-language"></i><span class="e-nav-pagename ">@selectorCountries[ contextCountryCode ].title</span><i class="material-icons e-nav-pageicon-dropdown ">keyboard_arrow_down</i>1014 </a>1015 <div class="dropdown-menu collapse" id="countries">1016 <ul class="nav">1017 @foreach ( KeyValuePair< string, dynamic > selectorCountry in selectorCountries )1018 {1019 if ( selectorCountry.Value.countrycode.ToLower() != contextCountryCode.ToLower() )1020 {1021 <li class="dropdown-item nav-item ">1022 <form action="@selectorCountry.Value.domain.ToLower()" method="post">1023 <input type="hidden" name="countrycode" value="@selectorCountry.Value.countrycode">1024 <input type="hidden" name="currencycode" value="@selectorCountry.Value.currencycode">1025 <input type="hidden" name="EcomOrderDeliveryCountry" value="@selectorCountry.Value.countrycode">1026 <input type="hidden" name="EcomOrderDeliveryCountryCode" value="@selectorCountry.Value.countrycode">1027 <input type="hidden" name="EcomOrderCustomerCountry" value="@selectorCountry.Value.countrycode">1028 <input type="hidden" name="EcomOrderCustomerCountryCode" value="@selectorCountry.Value.countrycode">1029 <button class="nav-link border-0 bg-transparent icon-flag-@selectorCountry.Value.countrycode.ToLower()" type="submit"><i class="e-nav-pageicon e-nav-pageicon-language js-e-nav-pageicon-language"></i><span class="e-nav-pagename">@selectorCountry.Value.title</span></button>1030 </form>1031 </li>1032 }1033 }1034 </ul>1035 </div>1036 </li>1037 @navigationHtml[ "utilities-primary" ]1038 </ul>1039 </nav>1040 @:</div>1041 @sectionEnd()1042 }10431044 @sectionStart( "e-header-section e-header-section-primary e-section order-2 order-lg-1", "col-12" )1045 <div class="col-12 e-header-section-content">10461047 @if ( isImageBankArea == false )1048 {1049 <div class="@logoClassList">1050 <a class="e-logo-link" href="/">1051 <img src="@logoPrimary" class="e-logo-img e-logo-img-primary" alt="@Espresso.Area.Item.CompanyName">1052 <img src="@logoSecondary" class="e-logo-img e-logo-img-secondary" alt="@Espresso.Area.Item.CompanyName">1053 @if ( string.IsNullOrEmpty( tagline ) == false )1054 {1055 <p class="e-logo-tagline">@tagline</p>1056 }1057 </a>1058 </div>1059 }1060 else1061 {1062 <div class="@logoClassList">1063 <a class="e-logo-link my-2 p-0" href="@logoLink">1064 <img src="@logoPrimary" class="e-logo-img e-logo-img-primary" alt="@Espresso.Area.Item.CompanyName">1065 <img src="@logoSecondary" class="e-logo-img e-logo-img-secondary" alt="@Espresso.Area.Item.CompanyName">1066 @if ( string.IsNullOrEmpty( tagline ) == false )1067 {1068 <p class="e-logo-tagline">@tagline</p>1069 }1070 </a>1071 </div>1072 }107310741075 @if ( Espresso.Item.NavigationHide != "True" )1076 {1077 <nav class="e-nav-global mx-auto js-e-nav-global">1078 <ul class="nav">1079 @navigationHtml[ "global" ]1080 </ul>1081 </nav>10821083 <div class="e-nav-item-hamburger-close">1084 <a class="nav-link" data-target=".modal.e-nav" data-toggle="modal" href="#">1085 <i class="e-nav-pageicon material-icons">close</i>1086 <span class="e-nav-pagename">@Translate( "Header - Hamburger menu close - Button", "Close" )</span>1087 </a>1088 </div>108910901091 if ( isImageBankArea == false )1092 {10931094 }10951096 if ( string.IsNullOrEmpty( navigationHtml[ "hamburger-aside" ] ) == false )1097 {1098 <nav class="e-nav-hamburger-aside">1099 <ul class="nav">1100 @navigationHtml[ "hamburger-aside" ]1101 </ul>1102 </nav>1103 }1104 }1105 @if ( Espresso.Item.BackButton == "True" )1106 {1107 <a class="@backButtonClassList" href="@backButtonLink">1108 @if ( Espresso.Item.BackButtonIcon != "" )1109 {1110 <i class="@backButtonIconClassList">@Espresso.Item.BackButtonIcon</i>1111 }1112 @Espresso.Item.BackButtonText1113 </a>1114 }1115 </div>1116 @sectionEnd()1117111811191120 @if ( isExtranet )1121 {1122 @sectionStart( "e-header-section e-section bg-light", "col-12" )1123 @:<div class="col-12 e-header-section-content kabooki-imagebank-bar">11241125 <p>1126 <i class="material-icons">lock_open</i> @Translate( "Header - Imagebank login - Intro", "Du er logget ind i vores" ) <a href="@imageBankLoginPage">@Translate( "Header - Imagebank login - Imagebank", "image bank" )</a>1127 </p>1128 <p>1129 <a class="btn" href="/Admin/Public/extranetlogoff.aspx">@Translate( "Header - Imagebank login - button", "Log ud" )</a>1130 </p>1131 @:</div>1132 @sectionEnd()1133 }113411351136 @if ( streamerActive != "False" )1137 {1138 <section class="e-header-section e-section kabooki-seasonal-streamer" style="background-color: @streamerBackgroundColor;">11391140 @if ( streamerLink == "" )1141 {1142 <div class="container-fluid">1143 <div class="row">1144 <div class="col-12">1145 <div class="row">1146 <div class="col-12 d-flex pt-1 pb-1 @streamerTextColor" style="min-height: 2em;">1147 @if ( streamerMarquee == "True" )1148 {1149 <marquee>@streamerMessage</marquee>1150 }1151 else1152 {1153 @streamerMessage1154 }1155 </div>1156 </div>1157 </div>1158 </div>1159 </div>1160 }1161 else1162 {1163 <a href="@streamerLink">1164 <div class="container-fluid">1165 <div class="row">1166 <div class="col-12">1167 <div class="row">1168 <div class="col-12 d-flex pt-1 pb-1 @streamerTextColor" style="min-height: 2em;">1169 @if ( streamerMarquee == "True" )1170 {1171 <marquee>@streamerMessage</marquee>1172 }1173 else1174 {1175 @streamerMessage1176 }1177 </div>1178 </div>1179 </div>1180 </div>1181 </div>1182 </a>1183 }1184 </section>1185 }11861187118811891190 </div>1191 </div>11921193 </header>1194 }11951196 @using Dynamicweb.Frontend1197 @using Dynamicweb.Security.UserManagement1198 @{1199 User currentUser = PageView.Current().User;1200 if ( currentUser != null )1201 {1202 User currentSecondaryUser = currentUser.CurrentSecondaryUser;1203 if ( currentSecondaryUser != null )1204 {1205 @sectionStart( "e-section bg-warning e-text-dark js-e-section is-sticky zi-fixed py-1", "col-12 small" )1206 <div class="align-self-center col-12 col-lg-9 col-md-8">1207 <p class="line-height-sm mb-1 mb-md-0 text-center text-md-left">1208 <i class="material-icons material-icons-2x">supervisor_account</i>&nbsp;@Translate( "Extranet Impersonation - Active impersonation message - Text", "You are currently impersonating this user:" ) <strong>@currentUser.Name &mdash; @currentUser.Company </strong>1209 </p>1210 </div>1211 <div class="align-self-center col-12 col-lg-3 col-md-4">1212 <form class="mb-0 small text-center text-md-right" method="post" action="@Espresso.Area.Item.ExtranetImpersonationPage">1213 <button class="btn btn-primary" name="DwExtranetRemoveSecondaryUser" type="submit">@Translate( "Extranet Impersonation - Stop impersonation - Button", "Stop impersonation" )</button>1214 </form>1215 </div>1216 @sectionEnd()1217 }1218 }1219 }122012211222 <main id="dwcontentmain" class="e-content js-e-content @Espresso.ContentArea.ClassList">1223 @using Dynamicweb.Content;1224 @using Dynamicweb.Extensibility;1225 @{1226 string eBreadcrumbClasslist = "e-breadcrumb js-e-breadcrumb d-none d-lg-block";1227 if ( Espresso.Item.Breadcrumb != "auto" && Espresso.Item.Breadcrumb != "none" && String.IsNullOrEmpty( Espresso.Item.Breadcrumb ) == false )1228 {1229 eBreadcrumbClasslist += string.Format( " e-breadcrumb-{0}", Espresso.Item.Breadcrumb );1230 }1231 string navigationHtmlBreadcrumb = RenderNavigation( new1232 {1233 id = "dwnav-breadcrumb",1234 template = "breadcrumb.xslt",1235 startlevel = 1,1236 endlevel = 10,1237 expandmode = "pathonly",1238 sitemapmode = true1239 } );1240 }12411242 @if ( string.IsNullOrEmpty( navigationHtmlBreadcrumb ) == false && Espresso.Item.Breadcrumb != "none" && string.IsNullOrEmpty( Espresso.Item.Breadcrumb ) == false )1243 {1244 <section class="e-section @eBreadcrumbClasslist">1245 <div class="container-fluid">1246 <div class="row">1247 <div class="col-12">1248 <div class="row">12491250 <div class="col-12">1251 <nav class="e-breadcrumb-container">1252 <ol class="breadcrumb nav">1253 <li class="breadcrumb-item m-0 p-0">1254 <a class="arrow-left breadcrumb-back-link js-e-back-link px-0" href="/">@Translate( "Breadcrumb - Back link", "Back" )</a>1255 <span class="breadcrumb-prefix-text">1256 @Translate( "Breadcrumb - Prefix - Text", "You are here:" )1257 </span>1258 <a href="/">1259 @ServiceLocator.Current.GetPageService().GetFirstPageForArea( GetInteger( "DwAreaID" ) ).MenuText1260 </a>1261 </li>1262 @navigationHtmlBreadcrumb1263 </ol>1264 </nav>1265 </div>12661267 </div>1268 </div>1269 </div>1270 </div>1271 </section>1272 }12731274 <article class="e-content-article">1275 @{1276 int NavigationLocalHorizontalParentPageId = 0;1277 if ( !string.IsNullOrEmpty( Espresso.Item.NavigationLocalParentPage ) )1278 {1279 int.TryParse( Espresso.Item.NavigationLocalParentPage, out NavigationLocalHorizontalParentPageId );1280 }1281 if ( NavigationLocalHorizontalParentPageId == 0 )1282 {1283 NavigationLocalHorizontalParentPageId = PageView.Current().Page.ID;1284 if ( !Dynamicweb.Services.Pages.GetPagesByParentID( NavigationLocalHorizontalParentPageId ).Any() )1285 {1286 NavigationLocalHorizontalParentPageId = PageView.Current().Page.ParentPageId;1287 }1288 }1289 string NavigationLocalHorizontalClassList = "e-nav-local e-nav-local-horizontal js-e-nav-local-horizontal";1290 string NavigationLocalHorizontalContainerClassList = "e-nav-local-container";1291 string NavigationLocalHorizontalTemplate = "local-" + Espresso.Item.NavigationLocalLayout + ".xslt";1292 if ( string.IsNullOrEmpty( Espresso.Item.NavigationLocalTemplate ) == false && Path.GetExtension( Espresso.Item.NavigationLocalTemplate ) == ".xslt" )1293 {1294 NavigationLocalHorizontalTemplate = Path.GetFileName( Espresso.Item.NavigationLocalTemplate );1295 }12961297 if ( Espresso.Item.NavigationLocalShow == "True" && Espresso.Item.NavigationLocalLayout == "horizontal" )1298 {1299 NavigationLocalHorizontalClassList += " " + Espresso.Item.NavigationLocalCustomClasses;1300 if ( Espresso.Item.NavigationLocalSticky == "True" )1301 {1302 NavigationLocalHorizontalClassList += " is-sticky";1303 }1304 if ( Espresso.Item.NavigationLocalAbsolute == "True" )1305 {1306 NavigationLocalHorizontalClassList += " is-absolute";1307 }1308 else1309 {1310 if ( Espresso.Item.NavigationLocalMarginTop != "0" && Espresso.Item.NavigationLocalMarginTop != "" )1311 {1312 NavigationLocalHorizontalClassList += " mt-" + Espresso.Item.NavigationLocalMarginTop;1313 }1314 if ( Espresso.Item.NavigationLocalMarginBottom != "0" && Espresso.Item.NavigationLocalMarginBottom != "" )1315 {1316 NavigationLocalHorizontalClassList += " mb-" + Espresso.Item.NavigationLocalMarginBottom;1317 }1318 }1319 }1320 }1321 @if ( Espresso.Item.NavigationLocalShow == "True" && Espresso.Item.NavigationLocalLayout == "horizontal" )1322 {1323 <section class="e-section @NavigationLocalHorizontalClassList">1324 <div class="container-fluid">1325 <div class="row">1326 <div class="col-12">1327 <div class="row">13281329 <div class="col-12">1330 <nav id="dwnav-local-horizontal-@NavigationLocalHorizontalParentPageId" class="@NavigationLocalHorizontalContainerClassList">1331 <ul class="justify-content-start nav">1332 @if ( Espresso.Item.NavigationLocalHeading != "" )1333 {1334 <li class="e-nav-local-heading">1335 <h2>@Espresso.Item.NavigationLocalHeading</h2>1336 </li>1337 }1338 @RenderNavigation( new1339 {1340 id = "dwnav-local-horizontal-" + NavigationLocalHorizontalParentPageId,1341 parentid = NavigationLocalHorizontalParentPageId,1342 template = NavigationLocalHorizontalTemplate,1343 startlevel = Espresso.Item.NavigationLocalLevelStart,1344 endlevel = Espresso.Item.NavigationLocalLevelEnd,1345 expandmode = Espresso.Item.NavigationLocalPageTreeExpand == "True" ? "all" : "path"1346 } )1347 </ul>1348 </nav>1349 </div>13501351 </div>1352 </div>1353 </div>1354 </div>1355 </section>1356 }135713581359 @{1360 int NavigationLocalVerticalParentPageId = 0;1361 if ( !string.IsNullOrEmpty( Espresso.Item.NavigationLocalParentPage ) )1362 {1363 int.TryParse( Espresso.Item.NavigationLocalParentPage, out NavigationLocalVerticalParentPageId );1364 }1365 if ( NavigationLocalVerticalParentPageId == 0 )1366 {1367 NavigationLocalVerticalParentPageId = PageView.Current().Page.ID;1368 if ( !Dynamicweb.Services.Pages.GetPagesByParentID( NavigationLocalVerticalParentPageId ).Any() )1369 {1370 NavigationLocalVerticalParentPageId = PageView.Current().Page.ParentPageId;1371 }1372 }13731374 string NavigationLocalVerticalClassList = "e-nav-local e-nav-local-vertical js-e-nav-local-vertical";1375 string NavigationLocalVerticalContainerClassList = "e-nav-local-container";1376 string NavigationLocalVerticalTemplate = "local-" + Espresso.Item.NavigationLocalLayout + ".xslt";1377 if ( string.IsNullOrEmpty( Espresso.Item.NavigationLocalTemplate ) == false && Path.GetExtension( Espresso.Item.NavigationLocalTemplate ) == ".xslt" )1378 {1379 NavigationLocalVerticalTemplate = Path.GetFileName( Espresso.Item.NavigationLocalTemplate );1380 }13811382 if ( Espresso.Item.NavigationLocalShow == "True" && Espresso.Item.NavigationLocalLayout == "vertical" )1383 {1384 NavigationLocalVerticalClassList += " " + Espresso.Item.NavigationLocalCustomClasses;13851386 if ( Espresso.Item.NavigationLocalMarginTop != "0" && Espresso.Item.NavigationLocalMarginTop != "" )1387 {1388 NavigationLocalVerticalClassList += " mt-" + Espresso.Item.NavigationLocalMarginTop;1389 }1390 if ( Espresso.Item.NavigationLocalMarginBottom != "0" && Espresso.Item.NavigationLocalMarginBottom != "" )1391 {1392 NavigationLocalVerticalClassList += " mb-" + Espresso.Item.NavigationLocalMarginBottom;1393 }13941395 if ( Espresso.Item.NavigationLocalSticky == "True" )1396 {1397 NavigationLocalVerticalClassList += " is-sticky";1398 }13991400 if ( Espresso.Item.NavigationLocalAbsolute == "True" )1401 {1402 NavigationLocalVerticalClassList += " is-absolute";1403 }1404 else1405 {1406 Espresso.ContentSection.ClassList.Clear();1407 Espresso.ContentSection.ClassList.AddClasses( "wtf col-12 col-lg-9 ml-auto" );1408 }1409 }1410 }14111412 @if ( Espresso.Item.NavigationLocalShow == "True" && Espresso.Item.NavigationLocalLayout == "vertical" )1413 {1414 <section class="e-section @NavigationLocalVerticalClassList">1415 <div class="container-fluid">1416 <div class="row">1417 <div class="col-12">1418 <div class="row">14191420 <div class="col-3">1421 <nav id="dwnav-local-@NavigationLocalVerticalParentPageId" class="@NavigationLocalVerticalContainerClassList">1422 <ul class="flex-column nav">1423 @if ( Espresso.Item.NavigationLocalHeading != "" )1424 {1425 <li class="e-nav-local-heading">1426 <h2>@Espresso.Item.NavigationLocalHeading</h2>1427 </li>1428 }1429 @RenderNavigation( new1430 {1431 id = "dwnav-local-" + NavigationLocalVerticalParentPageId,1432 parentid = NavigationLocalVerticalParentPageId,1433 template = NavigationLocalVerticalTemplate,1434 startlevel = Espresso.Item.NavigationLocalLevelStart,1435 endlevel = Espresso.Item.NavigationLocalLevelEnd,1436 expandmode = Espresso.Item.NavigationLocalPageTreeExpand == "True" ? "all" : "path",1437 } )1438 </ul>1439 </nav>1440 </div>14411442 </div>1443 </div>1444 </div>1445 </div>1446 </section>1447 }144814491450 @sectionStart()1451 @GetValue("DwContent(dwcontentmain)")1452 @sectionEnd()1453 </article>1454 </main>1455 @using Dynamicweb.Frontend1456 @{1457 string FooterContentClassList = "e-footer-content e-section";1458 }1459 @if ( Espresso.Item.FooterHide != "True" )1460 {1461 <footer class="e-footer">1462 <article class="e-footer-wrapper">1463 <section class="@FooterContentClassList">1464 <div class="container-fluid">1465 <div class="row">1466 @if ( !string.IsNullOrEmpty( Espresso.Area.Item.FooterPageId ) )1467 {1468 @RenderPageContent( int.Parse( Espresso.Area.Item.FooterPageId ) )1469 }1470 @*1471 @if ( string.IsNullOrEmpty( GetString( "DwNavigation(dwnavutilitiessecondaryfooter)" ) ) == false )1472 {1473 <div class="col-12">1474 <aside class="e-nav-utilities-secondary">1475 <ul class="nav nav-inline">1476 @GetValue("DwNavigation(dwnavutilitiessecondaryfooter)")1477 </ul>1478 </aside>1479 </div>1480 }*@1481 </div>1482 </div>1483 </section>1484 <section class="e-footer-copyright e-section">1485 <div class="container-fluid">1486 <div class="align-items-center row">1487 <div class="col-12 col-sm-9">1488 <p class="e-copyright">1489 &copy; @DateTime.Now.Year.ToString()&nbsp;1490 @Translate( "Footer - Copyright - Text", "Copyright &copy;" )&nbsp;14911492 &nbsp;@Translate( "Footer - All Rights Reserved - Text", "All rights reserved." )1493 </p>1494 </div>1495 @if ( isImageBankArea == false )1496 {1497 string creditcardImage = "creditcards_DK.svg";1498 if ( areaID == 25 )1499 {1500 creditcardImage = "creditcards_EN.svg";1501 }1502 if ( areaID == 27 )1503 {1504 creditcardImage = "creditcards_DE.svg";1505 }1506 <div class="col-12 col-sm-3 text-left text-sm-right custom-creditcards-wrapper">1507 <img class="custom-creditcards" src="/Files/Templates/Designs/legowear/_assets/img/@creditcardImage" alt="">1508 </div>1509 }1510 </div>1511 </div>1512 </section>1513 </article>1514 </footer>1515 }15161517 @if( string.IsNullOrEmpty( GetString("DwContent(dwcontentcta)") ) == false ) {1518 <aside id="dwcontentcta" class="js-e-cta e-cta is-hidden fixed-top">1519 <section class="e-section">1520 <div class="container-fluid">1521 <div class="row no-gutters">1522 <div class="col-12">1523 <div class="row no-gutters justify-content-center align-items-center">1524 @GetValue("DwContent(dwcontentcta)")1525 @* <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> *@1526 </div>1527 </div>1528 </div>1529 </div>1530 </section>1531 </aside>1532 }15331534 <div class="e-cart-msg modal fade small" id="js-e-cart-msg" data-backdrop="false">1535 <div class="modal-dialog e-cart-msg-modal-dialog">1536 <div class="modal-content">1537 <div class="modal-header">1538 <h4 class="js-e-cart-msg-heading modal-title">1539 <i class="material-icons material-icons-large text-success">check_circle</i>1540 <span>@Translate( "eCom Cart - Product Added - Heading", "Added to your cart" )</span>1541 </h4>1542 <button class="close" data-dismiss="modal" type="button">1543 <i class="material-icons">close</i>1544 </button>1545 </div>1546 <div class="modal-body">1547 <div class="js-e-cart-msg-content">1548 <script id="js-e-handlebars-tmpl-cart-msg-lastadded" type="text/x-handlebars-template">1549 <div class="row">1550 {{#each cart.lastAdded}}1551 <div class="col-12 py-1">1552 <div class="row">1553 <div class="col-4">1554 <a class="" href="{{url}}">1555 <img alt="" class="img-fluid" src="{{imageLarge}}">1556 </a>1557 </div>1558 <div class="col-8">1559 <h3 class="mb-0">1560 <a href="{{url}}" class="text-decoration-none">{{name}} {{#if hasTypeRO}}<span>{{typeRO}}</span>{{/if}}</a>1561 </h3>1562 <p class="mb-0 text-muted">{{variantText}}</p>1563 <p class="mb-0">1564 <a href="{{url}}" class="text-auto text-decoration-none">1565 {{{cartMsgPrice}}}<br>1566 {{{stock.text}}}<br>1567 {{{stock.delivery}}}<br>1568 </a>1569 </p>1570 </div>1571 </div>1572 </div>1573 {{/each}}1574 </div>1575 </script>1576 </div>1577 </div>1578 <div class="bg-info e-cart-msg-footer modal-footer border-top-0">1579 <a class="btn btn-secondary mr-1" href="/shop/cart" data-dismiss="modal">@Translate( "eCom Cart - Continue Shopping - Button", "Continue shopping" )</a>1580 <a class="arrow-right btn btn-primary" href="/shop/cart">@Translate( "eCom Cart - Checkout - Button", "Checkout" )</a>1581 </div>1582 </div>1583 </div>1584 </div>15851586 @{1587 string ecomOrderDeliveryCountry = HttpContext.Current.Request.Form[ "EcomOrderDeliveryCountry" ];1588 bool modalDeliveryCountryFormPosted = !string.IsNullOrEmpty(ecomOrderDeliveryCountry);1589 }15901591 <!-- Modal -->1592 <div class="modal fade js-modal-deliverycountry" data-form-posted="@modalDeliveryCountryFormPosted" data-param-ecomorderdeliverycountry="@ecomOrderDeliveryCountry" id="modalDeliveryCountry" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">1593 <div class="modal-dialog" role="document">1594 <div class="modal-content">1595 <div class="modal-body">1596 <div class="" id="countries">1597 <h3 class="text-center mb-2">Select country</h3>1598 <div class="e-nav-utilities-primary kabooki-custom-language-select">1599 @foreach (KeyValuePair<string, dynamic> selectorCountry in selectorCountries)1600 {1601 <div>1602 <form action="@selectorCountry.Value.domain.ToLower()" method="post">1603 <input type="hidden" name="countrycode" value="@selectorCountry.Value.countrycode">1604 <input type="hidden" name="currencycode" value="@selectorCountry.Value.currencycode">1605 <input type="hidden" name="EcomOrderDeliveryCountry" value="@selectorCountry.Value.countrycode">1606 <input type="hidden" name="EcomOrderDeliveryCountryCode" value="@selectorCountry.Value.countrycode">1607 <input type="hidden" name="EcomOrderCustomerCountry" value="@selectorCountry.Value.countrycode">1608 <input type="hidden" name="EcomOrderCustomerCountryCode" value="@selectorCountry.Value.countrycode">1609 <button class="nav-link border-0 bg-transparent icon-flag-@selectorCountry.Value.countrycode.ToLower()" type="submit">1610 <i class="e-nav-pageicon e-nav-pageicon-language js-e-nav-pageicon-language"></i><span class="e-nav-pagename">@selectorCountry.Value.title</span>1611 </button>1612 </form>1613 </div>1614 }1615 </div>1616 </div>1617 </div>1618 </div>1619 </div>1620 </div>16211622 </div>16231624 @using Co3.Espresso.Base.Extensions1625 @using Co3.Espresso.Website.Services1626 <div class="modal fade e-search js-e-search js-e-search-modal modal-fullscreen" data-backdrop="false" data-keyboard="true" data-focus="true">1627 <div class="modal-dialog">1628 <div class="modal-content">16291630 <div class="modal-header">1631 <a class="btn btn-sm btn-secondary js-e-back-link arrow-left" href="/" data-dismiss="modal">1632 @Translate("Search - Back button", "Back")1633 </a>1634 <div class="e-logo">1635 <a href="/" class="e-logo-link my-0">1636 <img src="@logoPrimary" class="e-logo-img e-logo-img-primary" alt="@Espresso.Area.Item.CompanyName">1637 <img src="@logoSecondary" class="e-logo-img e-logo-img-secondary" alt="@Espresso.Area.Item.CompanyName">1638 </a>1639 </div>1640 </div>16411642 <div class="modal-body">16431644 <div class="container-fluid">16451646 <div class="e-search-form-container">1647 <div class="row justify-content-center">1648 <div class="col-12 col-md-10 col-lg-8 col-xl-6 mt-3">1649 <form action="" class="e-search-form js-e-search-form">1650 <div class="js-e-search-input-group e-search-input-group is-empty">1651 <label class="e-search-label" for="e-search-input"><span class="search-custom-search-icon"></span></label>1652 @{ string Translate_Search_InputText = Translate("Search - Input Placeholder - Text", "Search"); }1653 <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">1654 <span class="js-e-search-clear e-search-clear"><i class="material-icons">close</i></span>1655 <button class="e-search-submit btn btn-primary" type="submit"><span class="search-custom-search-icon white"></span></button>1656 </div>1657 </form>1658 </div>1659 </div>1660 </div>16611662 <div class="js-e-search-result-container e-search-result-container">16631664 <div class="row justify-content-center">1665 <div class="col-12 col-md-10 col-lg-8 col-xl-6">1666 <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>1667 </div>1668 </div>16691670 <div class="row justify-content-center">1671 <div class="col-12 col-xl-10">1672 <div class="js-e-search-result-products e-search-result-products is-empty mb-4">1673 @{string productlistItemClassList = ProductlistService.Instance.GetGridItemWidth( null ).ToResponsiveClasses();}1674 <script id="js-e-handlebars-tmpl-search-result-item-product" type="text/x-handlebars-template">1675 <div class="e-products">1676 <div class="row justify-content-center">1677 {{#each products}}1678 <div class="@productlistItemClassList"">1679 <div class="e-products-item js-e-products-item js-e-products-item-{{id}} js-e-block-link e-block-link" data-variant-id="{{variantId}}" style="background-image:url('{{imageLarge}}'); background-position:center; background-size: cover;">1680 <div class="e-products-item-container">1681 <div class="e-products-item-image-container">1682 <a class="e-products-item-image-wrapper" href="{{{url}}}">1683 @*<img src="{{{imageLarge}}}" alt="" class="e-products-item-image">*@1684 {{#if hasDiscount}}1685 <img src="/Files/Images/kabooki/system/lego_wear_badge_percentage.svg" alt="" class="custom-products-item-badge">1686 {{/if}}1687 </a>1688 </div>1689 </div>1690 </div>16911692 <div class="e-products-item-text-container text-left small mb-2">1693 <h3 class="e-products-item-name mb-0 mt-0">1694 <a href="{{{url}}}">{{name}} {{#if hasTypeRO}}<span>{{typeRO}}</span>{{/if}}</a>1695 </h3>1696 <p class="e-products-item-text mb-0">1697 <span class="e-products-item-price">1698 <a href="{{{url}}}">1699 {{{price}}}1700 {{#if hasDiscount}}1701 <span class="custom-products-item-beforeprice">{{{priceBefore}}}</span>1702 {{/if}}1703 </a>1704 </span>1705 </p>1706 </div>17071708 </div>1709 {{/each}}1710 </div>1711 <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>1712 </div>1713 </script>1714 </div>1715 </div>1716 </div>17171718 <div class="row justify-content-center">1719 <div class="col-12 col-md-10 col-lg-8 col-xl-6">1720 <div class="js-e-search-result-pages e-search-result-pages is-empty mb-3">1721 <script id="js-e-handlebars-tmpl-search-result-item-page" type="text/x-handlebars-template">1722 <div class="row">1723 {{#each pages}}1724 <div class="col-12">1725 <p class="mb-0"><a href="{{{url}}}" class="text-bold">{{{title}}}</a></p>1726 <p class="mb-0 small text-truncate">1727 <a href="{{{url}}}" class="text-auto text-muted text-decoration-none"><span class="d-none d-sm-inline">@HttpContext.Current.Request.Url.Host</span>{{{url}}}</a></p>1728 <p class="small">{{{text}}}...</p>1729 </div>1730 {{/each}}1731 </div>1732 </script>1733 </div>1734 </div>1735 </div>17361737 <div class="js-e-search-loading-overlay e-loading-overlay e-search-loading-overlay">1738 <div class="e-loading-spinner"></div>1739 </div>17401741 </div>17421743 </div>1744 </div>1745 </div>1746 </div>1747 </div>17481749 @if( Espresso.Area.Item.BackToTopLink == "True" ){1750 <a href="#top" class="e-back-to-top js-e-back-to-top"><i class="material-icons">keyboard_arrow_up</i></a>1751 }175217531754 @*1755 @using System.Web;1756 @inherits Co3.Espresso.Website.TemplateBases.Pages.PageBase17571758 @{1759 HttpCookie optInLevel = HttpContext.Current.Request.Cookies[ "Dynamicweb.CookieOptInLevel" ];1760 bool showCookieWarning = optInLevel == null;1761 if ( optInLevel != null )1762 {1763 showCookieWarning = optInLevel.Value != "2";1764 }1765 }17661767 @if ( showCookieWarning )1768 {1769 <div class="e-cookie js-e-cookie py-1" hidden="">1770 <aside class="e-cookie-wrapper">1771 <section class="e-section">1772 <div class="container-fluid">1773 <div class="align-items-center row">1774 <div class="col-12 col-lg-10 col-md-9 my-1">1775 <p class="line-height-sm mb-0 small text-center text-md-left">1776 <span class="d-md-inline d-none">1777 @Translate( "Cookie Warning - Message Long - Text", "This website uses cookies to provide necessary site functionality and improve your experience. By using our website, you agree to our" )1778 </span>1779 <span class="d-md-none">1780 @Translate( "Cookie Warning - Message Short - Text", "This website uses cookies to improve your experience. Learn more about our" )1781 </span>1782 &nbsp;1783 <a href="@Espresso.Area.Item.CookieMessage">@Translate( "Cookie Warning - Policy - Link", "cookie policy" )</a>1784 </p>1785 </div>1786 <div class="col-12 col-lg-2 col-md-3 my-1">1787 <p class="mb-0 text-center text-md-right">1788 <button class="btn e-cookie-accept-btn js-e-cookie-accept-btn" type="button">1789 @Translate( "Cookie Warning - Accept - Button", "OKAY" )1790 </button>1791 </p>1792 </div>1793 </div>1794 </div>1795 </section>1796 </aside>1797 </div>1798 }17991800 @if ( 1 == 2 )1801 {1802 @GetValue( "DwCookieWarning" )1803 }18041805 *@180618071808 <script async="" src="/Files/Templates/Designs/kabooki-shop/_assets/_dist/js/default.js?v=1.1.9"></script>18091810 @*<script type="text/javascript">var _lf_popup='00f7213ba4f7722d2117fd8747b47663';"undefined"!=typeof window.lf_popup_runtime?-1===window.lf_popup_runtime.indexOf(_lf_popup)&&window.lf_popup_runtime.push(_lf_popup):window.lf_popup_runtime=[_lf_popup],function(e,d,t){var i,o=e.getElementsByTagName(d)[0];e.getElementById(t)||(i=e.createElement(d),i.id=t,i.async=true,i.src="https://zone-1.cdn.leadfamly.com/campaign/sdk/popup.min.js",o.parentNode.insertBefore(i,o))}(document,"script","lf-popup");</script>*@18111812 <script type="text/javascript">var _lf_popup='00f7213ba4f7722d2117fd8747b47663';"undefined"!=typeof window.lf_popup_runtime?-1===window.lf_popup_runtime.indexOf(_lf_popup)&&window.lf_popup_runtime.push(_lf_popup):window.lf_popup_runtime=[_lf_popup],function(e,d,t){var i,o=e.getElementsByTagName(d)[0];e.getElementById(t)||(i=e.createElement(d),i.id=t,i.async=true,i.src="https://zone-1.cdn.leadfamly.com/campaign/sdk/popup.min.js",o.parentNode.insertBefore(i,o))}(document,"script","lf-popup");</script>1813 </body>18141815 @GetValue( "CopyRightNotice" )1816 </html>1817