Error executing template "Designs/StandardWebshop/_parsed/StandardPage.parsed.cshtml"
System.ArgumentException: An item with the same key has already been added.
   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at Dynamicweb.Ecommerce.Products.GroupRelation.get_GroupRelationsByChildId(String childId)
   at Dynamicweb.Ecommerce.Products.Group.get_IsTopGroup()
   at Dynamicweb.Ecommerce.Shops.Shop.get_TopLevelGroups(String languageId)
   at Dynamicweb.Ecommerce.Frontend.NavigationProviders.GroupNavigationProvider.MakeGroupTree(Page page, NavigationItem parentNode)
   at Dynamicweb.Ecommerce.Frontend.NavigationProviders.GroupNavigationProvider.Process(NavigationItem node)
   at Dynamicweb.Ecommerce.Frontend.NavigationProviders.GroupNavigationProvider.ProcessTree(RootNavigationItem rootNode, NavigationType navigationType)
   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 Dynamicweb.Rendering.TemplateBase`1.RenderNavigation(Object settings)
   at CompiledRazorTemplates.Dynamic.RazorEngine_f6afed3f24ff4a81bb65e5b0cf769d70.Execute() in E:\Solutions\DermaPharm\Staging\Files\Templates\Designs\StandardWebshop\_parsed\StandardPage.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.b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 2 @using NORRIQ.Common8.Razor 3 @{ 4 var noscriptquery = System.Web.HttpContext.Current.Request.QueryString["notracking"]; 5 var testcss = System.Web.HttpContext.Current.Request.QueryString["testcss"]; 6 } 7 <!DOCTYPE html> 8 <html lang="@Pageview.Area.Culture"> 9 <head> 10 @if (Model.ID == 2) 11 { 12 @RenderSnippet("EcomMeta") 13 } 14 else 15 { 16 <title>@Model.Title</title> 17 <meta name="description" content="@Model.Description" /> 18 } 19 <meta name="robots" content="noindex, nofollow" /> 20 21 @RenderSnippet("AddNoIndex") 22 <meta charset='utf-8' /> 23 <meta name="description" content="@Model.Description" /> 24 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 25 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, shrink-to-fit=no" /> 26 <link rel="icon" type="image/x-icon" href="/Files/Templates/Designs/StandardWebshop/Images/Goodskin_Favicon.png"> 27 <link href="https://fonts.googleapis.com/css?family=Montserrat:300,300i,700,700i" rel="stylesheet"> 28 <link rel="stylesheet" href="https://use.typekit.net/bcz8hat.css"> 29 30 <link href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css' rel='stylesheet' type='text/css' /> 31 <link href='@(Model.Item.GetBoolean("NIQ:JavaScriptDebug") ? "/Files/Templates/Designs/StandardWebshop/css/style.css?v=5" : "/Files/Templates/Designs/StandardWebshop/css/style.css?v=6")' rel='stylesheet' /> 32 @*min*@ 33 <script src="https://www.googleoptimize.com/optimize.js?id=OPT-M2HB526"></script> 34 35 @RenderSnippet("MoveToHead") 36 @if (noscriptquery != "true") 37 { 38 @Model.Area.Item.GetString("GTM_Header_Script") 39 } 40 <!--[if IE]> 41 <style>.productlist-grid { float: left; }</style> 42 <![endif]--> 43 <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> 44 <!--[if lt IE 9]> 45 <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> 46 <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> 47 <![endif]--> 48 49 </head> 50 51 <body data-is-desktop="@(Pageview.Device == Dynamicweb.Frontend.Devices.DeviceType.Desktop ? "true" : "false")" data-is-tablet="@(Pageview.Device == Dynamicweb.Frontend.Devices.DeviceType.Tablet ? "true" : "false")" data-is-phone="@(Pageview.Device == Dynamicweb.Frontend.Devices.DeviceType.Mobile ? "true" : "false")"> 52 @if(noscriptquery != "true") { 53 @Model.Area.Item.GetString("GTM_BodyIFrame") 54 } 55 @using NORRIQ.Common8.Razor; 56 @using Dynamicweb 57 @using Dynamicweb.Ecommerce.Common; 58 @using Dynamicweb.Ecommerce.Prices 59 @using Dynamicweb.Rendering; 60 @using Dynamicweb.Ecommerce.ProductCatalog; 61 @using System.Web; 62 63 64 65 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 66 @{ 67 ProductListViewModel productlist = Pageview.AreaSettings.GetValue("MinicartProducts") as ProductListViewModel; 68 var isCartEmpty = (Dynamicweb.Ecommerce.Common.Context.Cart == null || Dynamicweb.Ecommerce.Common.Context.Cart.OrderLines.CountOnlyProducts == 0); 69 var isMobile = Pageview.Device.ToString() == "Mobile" ? "true" : "false"; 70 71 var ProductCurrency = Dynamicweb.Ecommerce.Common.Context.Currency.Symbol; 72 var cartPage = Dynamicweb.Services.Pages.GetPage(3); 73 var cartPageEmpty = Dynamicweb.Services.Pages.GetPage(2); 74 var cartPageId = 1335; 75 var cartFriendlyUrl = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?ID="+3); 76 var SliderClass = "slick-middle-arrow slick-flex"; 77 } 78 79 80 81 82 83 <header class="header-default"> 84 <div class="container"> 85 <div class="header-wrapper"> 86 <div class="header-default-logo"> 87 <a href="/" title='@Translate("Go to frontpage", "Go to frontpage")'> 88 @{ 89 var logo = Model.Area.Item.GetFile("Logo"); 90 91 if (logo != null) 92 { 93 var extension = logo.Name.Substring(logo.Name.LastIndexOf('.') + 1); 94 var filename = logo.Path.Substring(0, logo.Path.LastIndexOf('.')); 95 <img class="img-responsive" src="@logo.Path" srcset="@filename-2x.@extension 2x" alt='@Translate("Website Logo Alt", "Shutter - Standard Webshop")' /> 96 } 97 else 98 { 99 <i>No logo found, please configure it in the Dynamicweb Administration</i> 100 } 101 } 102 </a> 103 </div> 104 @RenderNavigation(new { Template = "navbar-nav-ecom-goodskin.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 3 }) 105 @RenderNavigation(new { Template = "navbar-nav-pages.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 2 }) 106 <ul class="nav navbar-nav header-default-nav"> 107 <li class="dropdown dropdown-icon"> 108 <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"> 109 <i class="fa fa-search"></i> 110 <span class="dropdown-label">@Translate("Search", "Search")</span> 111 </a> 112 <div class="dropdown-menu instantsearch"> 113 @using NORRIQ.Common8.Razor; 114 @{ 115 var searchLabel = Translate("Search products"); 116 var searchResultPageId = NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("search"); 117 var searchQuery = @System.Web.HttpContext.Current.Request.QueryString["ecomQuery"]; 118 } 119 120 <div class="form-search" id="instantsearch"> 121 <form class="form form-search-form" id="search-form" action="/Default.aspx" method="get"> 122 <input type="hidden" value="@searchQuery" id="searchstring"> 123 <input type="hidden" name="ID" value="@searchResultPageId" /> 124 <label for="searchTerm" class="sr-only"> 125 @searchLabel 126 </label> 127 <div class="input-group"> 128 <input type="search" class="form-control" id="searchTerm" name="eComQuery" placeholder="@searchLabel" autocomplete="off" data-tabindex="0" value="@searchQuery" /> 129 <span class="input-group-btn"> 130 <button type="submit" id="instantSearchBtn" class="btn btn-primary js-search-btn"> 131 <i id="instantSearchIcon" class="icon-search" aria-hidden="true"></i><span class="sr-only">@Translate("Search")</span> 132 </button> 133 </span> 134 </div> 135 </form> 136 <div class="form-search-collapse collapse" id="search-result-foldout"> 137 <div class="form-search-result" id="search-result-container"></div> 138 </div> 139 </div> 140 141 142 <script type="text/x-jsrender" id="quicksearchtemplate"> 143 144 <table class="table table-condensed productlist-table"> 145 <tbody> 146 {{for Products}} 147 <tr data-product-id="{{:Id}}" 148 data-product-key='{{:AutoAddProductKey}}' 149 data-product-language-id="{{:LanguageId}}"> 150 @if (Pageview.Security.UserLoggedIn) 151 { 152 <td class="productlist-table-thumb text-center" width="70"> 153 <img src="/Admin/Public/GetImage.ashx?Image={{:ThumbnailImageName}}&amp;Width=60&amp;Height=60&amp;Crop=5&amp;Compression=80" height="60" class="img-responsive" alt="{{:ThumbnailImageAltText}}" /> 154 </td> 155 <td class="productlist-table-product"> 156 <a href="{{:Link}}" class="productlist-table-name"> 157 {{:Name}} 158 </a> 159 <div class="clearfix"> 160 <div class="pull-left text-small"> 161 @Translate("Product Number"): {{:Number}}<br /> 162 @Translate("Price"): {{:UnitPrice}} 163 </div> 164 <div class="productlist-table-quantity pull-right"> 165 <div class="input-group"> 166 <input type="text" 167 class="form-control qty-input text-center js-qs-qty-input" 168 value="{{:QtyInBasket}}" 169 onclick="this.focus(); this.select();" 170 data-tabindex="{{:#index + 1}}" /> 171 <span class="input-group-addon qty-input-user-feedback js-qs-qty-input-feedback"> 172 {{if QtyInBasket > 0}} 173 <i class="icon-added"></i> 174 {{else}} 175 <i class="icon-minicart"></i> 176 {{/if}} 177 </span> 178 </div> 179 </div> 180 </div> 181 </td> 182 } 183 else 184 { 185 <td class="productlist-table-thumb text-center" width="70"> 186 <img src="{{:ThumbnailImageName}}" height="60" class="img-responsive" alt="{{:ThumbnailImageAltText}}" /> 187 </td> 188 <td class="productlist-table-product"> 189 <a href="{{:Link}}" class="productlist-table-name"> 190 {{:Name}} 191 </a> 192 </td> 193 } 194 </tr> 195 {{/for}} 196 </tbody> 197 </table> 198 {{if MoreResults}} 199 <a href="{{:LinkToFullResults}}" class="btn btn-primary btn-sm">@Translate("Show all results") ({{:NumberOfResults}})</a> 200 {{/if}} 201 </script> 202 <script type="text/x-jsrender" id="quicksearchloadingtemplate"> 203 <p class="product-search-label"> 204 <i class="icon-async icon-pulse" aria-hidden="true"></i> @Translate("Searching") 205 </p> 206 </script> 207 <script type="text/x-jsrender" id="noquerytemplate"> 208 <p class="product-search-label"><i class="icon-keyboard" aria-hidden="true"></i> @Translate("Start typing to search")</p> 209 </script> 210 <script type="text/x-jsrender" id="failedsearchtemplate"> 211 <p class="product-search-label"><i class="icon-warning" aria-hidden="true"></i> @Translate("An error occured")</p> 212 </script> 213 <script type="text/x-jsrender" id="noresultstemplate"> 214 <p class="product-search-label"><i class="icon-warning" aria-hidden="true"></i> @Translate("Search found no products")</p> 215 </script> 216 217 <script type="text/x-jsrender" id="qsautoaddfeedbackloading"> 218 <i class="icon-async icon-pulse"></i> 219 </script> 220 <script type="text/x-jsrender" id="qsautoaddfeedbacksuccess"> 221 <i class="icon-added" title="@Translate("Product added to cart")"></i> 222 </script> 223 <script type="text/x-jsrender" id="qsautoaddfeedbackerror"> 224 {{if error == "badinput"}} 225 <i class="icon-warning" title="@Translate("Please enter a numerical value")"></i> 226 {{else error == "servererror"}} 227 <i class="icon-warning" title="@Translate("An server error occured your cart was not updated")"></i> 228 {{else}} 229 <i class="icon-warning"></i> 230 {{/if}} 231 </script> 232 233 <script append="true"> 234 require(["jquery", "standardwebshop/areas/ecom/instantsearch"], function ($, search) { 235 search.init({ 236 WaitTime: 250, 237 $SearchResultTemplate: $('#quicksearchtemplate'), 238 $SearchInput: $('#searchTerm'), 239 $ResultContainer: $('#search-result-container'), 240 $ResultLoadingTemplate: $('#quicksearchloadingtemplate'), 241 $NoQueryTemplate: $('#noquerytemplate'), 242 $FailedSearchTemplate: $('#failedsearchtemplate'), 243 $CollapseContainer: $('#search-result-foldout'), 244 $NoResulsTemplate: $('#noresultstemplate'), 245 $SearchContainer: $('#instantsearch'), 246 LinkToSearchResults: "/default.aspx?ID=@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("search")", 247 PostPageId: "@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("instant-search")", 248 $searchBtn: $('.js-search-btn') 249 }); 250 }); 251 </script> 252 </div> 253 </li> 254 255 <li class="@(Pageview.Device == Dynamicweb.Frontend.Devices.DeviceType.Desktop ? "dropdown dropdown-hover" : "dropdown") dropdown-icon"> 256 <a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"> 257 <i class="fa fa-user-circle-o" aria-hidden="true"></i> 258 <span class="dropdown-label"> 259 @if (Pageview.Security.UserLoggedIn) 260 { 261 @Translate("Account") 262 } 263 else 264 { 265 @Translate("Sign in") 266 } 267 </span> 268 </a> 269 @if (Pageview.Security.UserLoggedIn) 270 { 271 <ul class="dropdown-menu"> 272 @RenderNavigation(new { Template = "navbar-nav-customer.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 2 }) 273 <li> 274 <a href="/admin/public/extranetlogoff.aspx?ID=@(Pageview.Page.ID)"> 275 <i class="icon-chevron-left" aria-hidden="true"></i> 276 @Translate("Sign out") 277 </a> 278 </li> 279 </ul> 280 } 281 else 282 { 283 <div class="dropdown-menu user"> 284 @using NORRIQ.Common8.Razor; 285 <form name="ExtUserForm" id="loginForm" method="post" class="form" role="form" action="@(System.Web.HttpContext.Current.Request.Url.PathAndQuery)"> 286 <input type="hidden" name="pid" value="@Pageview.Page.ID" /> 287 <div class="form-group"> 288 <label for="Username">@Translate("Username")</label> 289 <input id="Username" name="Username" type="text" value="" class="form-control" autocomplete="off"> 290 </div> 291 <div class="form-group"> 292 <label for="Password">@Translate("Password")</label> 293 <input id="Password" name="Password" type="password" value="" class="form-control" autocomplete="off"> 294 </div> 295 <div class="form-group"> 296 <div id="loginFeedback"></div> 297 <button type="submit" role="button" class="btn btn-primary btn-block" id="loginBtn"> 298 @Translate("Sign in") 299 </button> 300 </div> 301 <ul class="form-login-links"> 302 <li> 303 <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("forgot-password")">@Translate("Forgot password")</a> 304 </li> 305 <li> 306 <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("new-user")">@Translate("Register user")</a> 307 </li> 308 </ul> 309 </form> 310 <script id="loginBtnDefaultTemplate" type="text/x-jsrender"> 311 @Translate("Sign in") 312 </script> 313 <script id="loginBtnLoggingInTemplate" type="text/x-jsrender"> 314 <i class="icon-async icon-pulse" aria-hidden="true"></i> @Translate("Signing in") 315 </script> 316 <script id="loginLoadingTemplate" type="text/x-jsrender"> 317 <p class="user-login-loading"><i class="icon-async icon-pulse" aria-hidden="true"></i> @Translate("Signing in")</p> 318 </script> 319 <script id="loginErrorTemplate" type="text/x-jsrender"> 320 <p class="user-login-error">@Translate("An error occured!")</p> 321 </script> 322 <script id="loginBadLoginInfoTemplate" type="text/x-jsrender"> 323 <p class="user-login-error">@Translate("Username or password is incorrect!")</p> 324 </script> 325 </div> 326 } 327 </li> 328 @{ 329 double quantity = 0; 330 double testquantity = 0; 331 var emptyCart = Translate("Your cart is empty", "Your cart is empty"); 332 var dropdown = string.Format("title=\"{0}\"", emptyCart); 333 var pageTypeDefined = Model.Item.GetValue<ListViewModel>("PageType"); 334 var pageType = "default"; 335 if (pageTypeDefined != null) 336 { 337 pageType = Model.Item.GetValue<ListViewModel>("PageType").SelectedValue; 338 } 339 if (!isCartEmpty) 340 { 341 quantity = Model.Cart.TotalProductsCount; 342 testquantity = Model.Cart.TotalProductsCount; 343 dropdown = "class=\"dropdown-toggle dropdown-minicart\" data-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\""; 344 } 345 } 346 @if (pageType != "cart") 347 { 348 349 <li class="@(Pageview.Device == Dynamicweb.Frontend.Devices.DeviceType.Desktop && !isCartEmpty ? "dropdown" : "dropdown") dropdown-icon" id="cart-information"> 350 <a href="#"> 351 352 <i class="fa fa-shopping-basket" aria-hidden="true"></i> 353 <span class="dropdown-label">@Translate("Cart", "Cart")</span> 354 @if (!isCartEmpty && Pageview.Security.UserLoggedIn || !isCartEmpty) 355 { 356 <span class="dropdown-qty">@quantity</span> 357 } 358 </a> 359 360 </li> 361 362 } 363 <li class="dropdown dropdown-icon dropdown-mobile"> 364 <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"> 365 <i class="fa fa-bars"></i> 366 <span class="dropdown-label">Menu</span> 367 </a> 368 @RenderNavigation(new { Template = "navbar-nav-dropdown-goodskin.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 2 }) 369 </li> 370 </ul> 371 <!-- Mini-cart dropdown --> 372 <div class="cart-dropdown-wrapper"> 373 <div class="backdrop"></div> 374 <div class="mini-cart-dropdown"> 375 <div class="mini-cart-dropdown__inner"> 376 <i class="icon-close" id="cartClose" aria-hidden="true"></i> 377 <p>@Translate("Indkøbskurv")</p> 378 <ul class="cart-items"> 379 @{ 380 Dynamicweb.Ecommerce.Orders.Order cartContext = Dynamicweb.Ecommerce.Common.Context.Cart; 381 382 } 383 @if (cartPage != null && cartContext != null) 384 { 385 <a href="/Default.aspx?ID=@cartPage.ID" class="btn btn-lg btn-cart">@Translate("Gå til kurv")</a> 386 } 387 else 388 { 389 <a href="/Default.aspx?ID=@cartPageEmpty.ID" class="btn btn-lg">@Translate("Gå til shop")</a> 390 } 391 392 @if (cartContext != null) 393 { 394 395 foreach (var ol in cartContext.ProductOrderLines) 396 { 397 var product = ol.Product; 398 var link = "/Default.aspx?ID=2&productid=" + product.Id; 399 var productImage = "/Files" + product.ImageLarge; 400 var productQuant = cartContext.OrderLines.Where(x => x.ProductId == product.Id).FirstOrDefault(); 401 var currentProductCountDec = productQuant.Quantity - 1; 402 var priceInclDiscount = Math.Round(product.Price.Price + productQuant.TotalDiscount.Price, 2); 403 var orderlineTotatPrice = Math.Round(ol.Price.Price + productQuant.TotalDiscount.Price, 2); 404 var price2InclDiscount = orderlineTotatPrice / ol.Quantity; 405 var testProductPrice = Math.Abs(ol.TotalDiscount.PriceWithVAT / ol.Quantity); 406 var unitprice = ol.UnitPrice.PriceWithVAT; 407 var totalPrice = ol.TotalDiscount.PriceWithVAT; 408 409 <li data-id="@product.Id" class="item"> 410 411 <a href="@link"><img src="/admin/Public/GetImage.ashx?Width=86&amp;Height=125&amp;Crop=5&amp;Compression=70&Image=@productImage"></a> 412 413 <div class="right"> 414 <div> 415 <a class="title" href="@link">@product.Name</a> 416 @if (!string.IsNullOrWhiteSpace(product.Manufacturer.Name)) 417 { 418 <p>@product.Manufacturer.Name</p> 419 } 420 </div> 421 <div class="price"> 422 <p class="mini-cart-price">@price2InclDiscount.ToString("0.00") @cartContext.CurrencyCode X</p> 423 424 425 <p class="cart-orderline-quantity input-quantity mini-cart-inputs"> 426 <label for="QuantityOrderLine @ol.Id" class="sr-only">@Translate("Qty", "Qty")</label> 427 <a onclick="RemoveQuantity(@ol.Id)">-</a> 428 <input tabindex="@productQuant.Quantity" type="tel" class="form-control cart-orderline-input mini-cart-input kos" name="" onchange="UpdateQuantity(@ol.Id,this.value)" onblur="location.reload()" id="@ol.Id" value="@productQuant.Quantity" /> 429 <a onclick="AddQuantity(@ol.Id)">+</a> 430 431 </p> 432 433 <p class="mini-cart-price"> @orderlineTotatPrice.ToString("0.00") DKK</p> 434 </div> 435 <div class="options"> 436 <a href="/Default.aspx?Id=@(cartPageId)&OrderContext=@(cartContext.OrderContextId)&CartCmd=DelOrderLine&key=@(ol.Id)&cartrouteid=@(Pageview.ID)&redirect=false"> 437 <i class="icon-trash" aria-hidden="true"></i> @Translate("Slet Vare") 438 </a> 439 </div> 440 </div> 441 </li> 442 } 443 } 444 else 445 { 446 <li class="no-items"> 447 <div> 448 <p>@Translate("Kurven er tom")</p> 449 <p>@Translate("Click og se vores produktudvalg:")</p> 450 </div> 451 </li> 452 } 453 454 </ul> 455 456 <ul class="cart-actions"> 457 @if (cartContext != null) 458 { 459 if (cartContext.ShippingFee.Price > 0) 460 { 461 var rest = Math.Round(220 - cartContext.OrderLines.Price.Price, 2); 462 <li class="shipping-alert"> 463 <div class="alert alert-warning">Køb for @rest DKK mere og få fri fragt</div> 464 </li> 465 } 466 467 <li class="shipping-fee"> 468 <div>Levering</div> 469 <div>@cartContext.ShippingFee</div> 470 </li> 471 <li class="price-total"> 472 <div>Total</div> 473 <div>@Math.Round(Model.Cart.TotalPrice.PriceWithVat.Value, 2) @cartContext.CurrencyCode</div> 474 475 </li> 476 } 477 478 </ul> 479 @{ 480 IEnumerable<ProductViewModel> productlistTemp = Pageview.AreaSettings.GetValue("MinicartProducts") as IEnumerable<ProductViewModel>; 481 } 482 483 484 @if ( productlistTemp != null) 485 { 486 <div class=" frontpage-titles w100"> 487 <h2 class="text-center">@Translate("MinicartHeading")</h2> 488 489 <div class="@SliderClass mini-cart-slider" id="slide-products" itemscope itemtype="http://schema.org/ItemList"> 490 @foreach (var product in productlistTemp) 491 { 492 493 Dynamicweb.Ecommerce.Products.ProductService productService = new Dynamicweb.Ecommerce.Products.ProductService(); 494 495 var productDbModel = productService.GetProductById(product.Id, product.VariantId, product.LanguageId); 496 497 var customFieldProductData1 = productDbModel.ProductFieldValues.FirstOrDefault(x => x.ProductField.SystemName == "ProductData1"); 498 var customFieldCertificates = productDbModel.ProductFieldValues.FirstOrDefault(x => x.ProductField.SystemName == "ProductCertificates"); 499 string[] certificates = customFieldCertificates.Value.ToString().Split(','); 500 var customFieldBackInStock = productDbModel.ProductFieldValues.FirstOrDefault(x => x.ProductField.SystemName == "BackInStock"); 501 var linkToShop = productDbModel.ProductFieldValues.FirstOrDefault(x => x.ProductField.SystemName == "LinkToShop"); 502 var badge = productDbModel.ProductFieldValues.FirstOrDefault(x => x.ProductField.SystemName == "AwardBadge"); 503 // if (customFieldValue.Value != null) 504 // { 505 // <p>@customFieldValue.Value</p> 506 // } 507 508 509 510 <div class="ProductlistGrid col-xs-12 " data-product-display="flex"> 511 <div class="productlist-grid-product" itemscope itemtype="http://schema.org/Product"> 512 <img src="/Files/Images/@badge.Value" alt="" class="AwardBadge"> 513 514 <a class="productlist-grid-image" href="/Default.aspx?ID=2&productid=@product.Id" itemprop="url"> 515 <img src="/Admin/Public/GetImage.ashx?Width=200&amp;Height=200&amp;Crop=5&amp;Compression=80&amp;Image=@productDbModel.ImageLarge" class="img-responsive" alt="@product.Name" itemprop="image" /> 516 @if (@productDbModel.Price.PriceWithVAT != @productDbModel.Discounts.Price.PriceWithVAT) 517 { 518 var DiscountInPercent = 100 - (Convert.ToDouble(productDbModel.Discounts.Price.PriceWithVAT) / Convert.ToDouble(productDbModel.Price.PriceWithVAT) * 100); 519 <div class="discount-badge"> 520 @Translate("Spar") @Convert.ToString(Math.Floor(DiscountInPercent)) <text>%</text> 521 </div> 522 } 523 </a> 524 <span itemprop="manufacturer" class="productlist-grid-manufacturer-name">@productDbModel.Manufacturer.Name</span> 525 <a href="/Default.aspx?ID=2&productid=@product.Id" class="productlist-grid-name" itemprop="url"> 526 <span itemprop="name">@product.Name</span> 527 </a> 528 @if (customFieldProductData1 != null) 529 { 530 <div class="productlist-grid-subheading"> 531 &nbsp;@customFieldProductData1.Value &nbsp; 532 </div> 533 } 534 <ul class="certificates-mini"> 535 536 @if (customFieldCertificates.Value != null) 537 { 538 foreach (var cert in certificates) 539 { 540 541 <li> 542 <img src="@cert.Replace(".png","-mini.png")" title="h" alt="g" /> 543 544 </li> 545 546 } 547 } 548 </ul> 549 550 <div class="productlist-grid-price"> 551 <span class="price" itemprop="price"> 552 @productDbModel.Discounts.Price.PriceWithVAT 553 </span> 554 <span class="currency" itemprop="priceCurrency"> 555 @productDbModel.Price.Currency.Code 556 </span> 557 </div> 558 <div style="width: 100%;" class="product-buying sold"> 559 @if (productDbModel.Stock <= 0) 560 { 561 if (@Math.Ceiling((DateTime.Parse(customFieldBackInStock.Value.ToString()) - DateTime.Now).TotalDays) >= 0) 562 { 563 564 if (@Math.Ceiling((DateTime.Parse(customFieldBackInStock.Value.ToString()) - DateTime.Now).TotalDays) >= 7) 565 { 566 567 <div class="alert alert-stock"><strong>Forventes på lager om @Math.Ceiling((DateTime.Parse(customFieldBackInStock.Value.ToString()) - DateTime.Now).TotalDays / 7) uger</strong> </div>} 568 569 else 570 { 571 if (@Math.Ceiling((DateTime.Parse(customFieldBackInStock.Value.ToString()) - DateTime.Now).TotalDays) == 1) 572 { 573 <div class="alert alert-stock"><strong>Forventes på lager om @Math.Ceiling((DateTime.Parse(customFieldBackInStock.Value.ToString()) - DateTime.Now).TotalDays) dag</strong> </div> 574 } 575 else 576 { 577 <div class="alert alert-stock"><strong>Forventes på lager om @Math.Ceiling((DateTime.Parse(customFieldBackInStock.Value.ToString()) - DateTime.Now).TotalDays) dage</strong> </div> 578 } 579 580 } 581 582 583 <form class="productlist-grid-form form-inline" method="post" action="/Default.aspx"> 584 <input type="hidden" name="ID" value="5" /> 585 <input type="hidden" name="ProductID" value="@product.Id" /> 586 <input type="hidden" name="CartCmd" value="add" /> 587 <input type="hidden" name="ProductURL" id="PageID" value="/Default.aspx?ID=2&productid=@product.Id" /> 588 <input type="hidden" name="UnitID" value="STK" /> 589 <input type="hidden" name="Redirect" id="Redirect" value="/Default.aspx?ID=455" /> 590 <div style="width: 100%;" class="input-group input-group-lg"> 591 <span class="input-group-btn"> 592 @{ // Get the shop page id and primarygroup and build the url for the shopcategorylink 593 HttpContext.Current.Session["shopcategorylink"] = ""; 594 var shopPage = Dynamicweb.Services.Pages.GetPageByNavigationTag(Pageview.AreaID, "canonical-products ecom"); 595 var productlistLinkSession = HttpContext.Current.Session["productlistlink"]; 596 597 var shopcategorylink = ""; 598 599 if (productlistLinkSession != null) 600 { 601 shopcategorylink = HttpContext.Current.Session["productlistlink"].ToString(); 602 HttpContext.Current.Session["shopcategorylink"] = shopcategorylink; 603 } 604 605 else if (shopPage != null && !string.IsNullOrWhiteSpace(productDbModel.PrimaryGroupId)) 606 { 607 shopcategorylink = "Default.aspx" + "?ID=" + shopPage.ID + "&GroupID=" + productDbModel.PrimaryGroupId; 608 HttpContext.Current.Session["shopcategorylink"] = shopcategorylink; 609 } } 610 611 612 <button style="width: 100%;" class="btn btn-add-to-cart sold" id="dataLayer" role="button" disabled type="submit"> 613 <span class="product-added-text">@Translate("SoldOut")</span> 614 </button> 615 </span> 616 </div> 617 </form> 618 } 619 else 620 {<div class="alert alert-stock empty"><strong>&nbsp;</strong> </div> 621 <form class="productlist-grid-form form-inline" method="post" action="/Default.aspx"> 622 <input type="hidden" name="ID" value="5" /> 623 <input type="hidden" name="ProductID" value="@product.Id" /> 624 <input type="hidden" name="CartCmd" value="add" /> 625 <input type="hidden" name="UnitID" value="STK" /> 626 <input type="hidden" name="ProductURL" id="PageID" value="/Default.aspx?ID=2&productid=@product.Id" /> 627 <input type="hidden" name="Redirect" id="Redirect" value="/Default.aspx?ID=455" /> 628 <div style="width: 100%;" class="input-group input-group-lg"> 629 <span class="input-group-btn"> 630 @{ // Get the shop page id and primarygroup and build the url for the shopcategorylink 631 HttpContext.Current.Session["shopcategorylink"] = ""; 632 var shopPage = Dynamicweb.Services.Pages.GetPageByNavigationTag(Pageview.AreaID, "canonical-products ecom"); 633 var productlistLinkSession = HttpContext.Current.Session["productlistlink"]; 634 635 var shopcategorylink = ""; 636 637 if (productlistLinkSession != null) 638 { 639 shopcategorylink = HttpContext.Current.Session["productlistlink"].ToString(); 640 HttpContext.Current.Session["shopcategorylink"] = shopcategorylink; 641 } 642 643 else if (shopPage != null && !string.IsNullOrWhiteSpace(productDbModel.PrimaryGroupId)) 644 { 645 shopcategorylink = "Default.aspx" + "?ID=" + shopPage.ID + "&GroupID=" + productDbModel.PrimaryGroupId; 646 HttpContext.Current.Session["shopcategorylink"] = shopcategorylink; 647 } } 648 649 650 651 <button style="width: 100%;" class="btn btn-add-to-cart sold" id="dataLayer" role="button" disabled type="submit"> 652 <span class="product-added-text">@Translate("SoldOut")</span> 653 </button> 654 </span> 655 </div> 656 </form>} 657 } 658 else 659 {<form class="productlist-grid-form form-inline" method="post" action="/Default.aspx" style="display: none"> 660 <input type="hidden" name="ID" value="5" /> 661 <input type="hidden" name="ProductID" value="@product.Id" /> 662 <input type="hidden" name="CartCmd" value="add" /> 663 <input type="hidden" name="UnitID" value="STK" /> 664 <input type="hidden" name="ProductURL" id="PageID" value="/Default.aspx?ID=2&productid=@product.Id" /> 665 <input type="hidden" name="Redirect" id="Redirect" value="/Default.aspx?ID=455" /> 666 <div style="width: 100%;" class="input-group input-group-lg"> 667 <span class="input-group-btn"> 668 669 670 671 <button style="width: 100%;" class="btn btn-add-to-cart" id="dataLayer" role="button" type="submit"> 672 <span class="product-added-text">@Translate("Add to cart")</span> <i class="fa fa-shopping-basket"></i> 673 </button> 674 </span> 675 </div> 676 </form> 677 678 <div class="alert alert-stock empty"><strong>&nbsp;</strong> </div> 679 <form class="productlist-grid-form form-inline" method="post" action="/Default.aspx"> 680 <input type="hidden" name="ID" value="5" /> 681 <input type="hidden" name="ProductID" value="@product.Id" /> 682 <input type="hidden" name="CartCmd" value="add" /> 683 <input type="hidden" name="UnitID" value="STK" /> 684 <input type="hidden" name="ProductURL" id="PageID" value="/Default.aspx?ID=2&productid=@product.Id" /> 685 <input type="hidden" name="Redirect" id="Redirect" value="/Default.aspx?ID=455" /> 686 <div style="width: 100%;" class="input-group input-group-lg"> 687 <span class="input-group-btn"> 688 689 690 691 <button style="width: 100%;" class="btn btn-add-to-cart" id="dataLayer" role="button" type="submit"> 692 <span class="product-added-text">@Translate("Add to cart")</span> <i class="fa fa-shopping-basket"></i> 693 </button> 694 </span> 695 </div> 696 </form>} 697 </div> 698 699 700 </div> 701 </div> 702 703 } 704 </div> 705 706 @if (productlistTemp != null) 707 { 708 <script append="true"> 709 require(["jquery", "slick"], function ($, log) { 710 $(function () { 711 $('#slide-products').slick({ 712 slidesToShow: 1, 713 slidesToScroll: 1, 714 swipeToSlide: true, 715 infinite: false, 716 dots: false, 717 nextArrow: '<a href="javascript:void()" class="slick-next slick-arrow"><i class="fa fa-angle-right" aria-hidden="true"></a></a>', 718 prevArrow: '<a href="javascript:void()" class="slick-prev slick-arrow"><i class="fa fa-angle-left" aria-hidden="true"></a></a>', 719 responsive: [ 720 { 721 breakpoint: 1025, 722 settings: { 723 slidesToShow: 2 724 } 725 }, 726 { 727 breakpoint: 520, 728 settings: { 729 slidesToShow: 1 730 } 731 }] 732 }); 733 734 }); 735 }); 736 </script> 737 } 738 </div> 739 740 } 741 </div> 742 743 </div> 744 745 </div> 746 <!-- Mini-cart dropdown --> 747 748 </div> 749 <div class="row"> 750 <div class="col-xs-12"> 751 <div class="checkout-assurance-box clearfix"> 752 <div class="col-xs-4 col-md-4"><i class="fa fa-truck fa-flip-horizontal"></i><span><strong>@Translate("FRI FRAGT")</strong><br>@Translate("<br/>På alle ordrer")</span></div> 753 <div class="col-xs-4 col-md-4"><i class="fa fa-clock-o"></i><span><strong>@Translate("HURTIG LEVERING", "HURTIG LEVERING")</strong><br>@Translate("1-3 hverdage", "1-3 hverdage")</span></div> 754 <div class="col-xs-4 col-md-4"><a href="https://certifikat.emaerket.dk/goodskin.dk" class="e-maerket" title='@Translate("Se Goodskins E-mærke", "Se Goodskins E-mærke")' target="_blank"><img alt="Certificeret webshop" src="/Files/Templates/Designs/StandardWebshop/Images/e-maerket.png"></a><span><strong>@Translate("E-MÆRKET", "E-MÆRKET")</strong><br>@Translate("Certificeret webshop", "Certificeret webshop")</span></div> 755 </div> 756 </div> 757 </div> 758 </div> 759 </header> 760 761 762 763 <script append="true"> 764 765 $('#cart-information > a, .cart-dropdown-wrapper').mouseenter(function () { 766 if ($(window).width() >= 1025) { 767 $('.cart-dropdown-wrapper').show(); 768 $('.mini-cart-dropdown').addClass('active'); 769 $('.slick-slider').slick('refresh');} 770 771 772 }).mouseleave(function () { 773 if ($(window).width() >= 1007) { 774 $('.mini-cart-dropdown').removeClass('active'); 775 $('.cart-dropdown-wrapper').hide(); 776 } 777 778 779 }); 780 781 $('#cartClose').click(function() 782 { 783 784 $('.mini-cart-dropdown').removeClass('active'); 785 setTimeout(function() {$('.cart-dropdown-wrapper').hide();}, 400) 786 $('.backdrop').removeClass('active'); 787 }); 788 789 $('#cart-information > a').click(function () { 790 791 if ($(window).width() < 1025) { 792 $('.cart-dropdown-wrapper').show(); 793 setTimeout(function() {$('.mini-cart-dropdown').addClass('active');}, 400); 794 setTimeout(function() {$('.backdrop').addClass('active');}, 400); 795 setTimeout(function() {$('.slick-slider').slick('refresh');}, 400); 796 797 } 798 799 800 }); 801 802 803 804 </script> 805 @if(cartContext != null) 806 { 807 <script append="true"> 808 function UpdateQuantity(orderLineId, quantity) { 809 810 parameter = '&QuantityOrderLine' + orderLineId.id + '=' + quantity; 811 812 $.ajax({ 813 type: "GET", 814 url: "@cartFriendlyUrl?OrderContext=@(cartContext.OrderContextId)&CartCmd=UpdateOrderlines" + parameter +'&redirect=false', 815 data: '', 816 async: false, 817 success: function (data) { 818 console.log($(data).find("#totalQuantity").html()) 819 } 820 }); 821 822 823 } 824 825 function AddQuantity(orderLineId) { 826 var quantityNew = parseInt(document.querySelector("#" + orderLineId.id).value); 827 quantityNew = quantityNew + 1; 828 document.querySelector("#" + orderLineId.id).value = quantityNew; 829 parameter = '&QuantityOrderLine' + orderLineId.id + '=' + quantityNew; 830 $.ajax({ 831 type: "GET", 832 url: "@cartFriendlyUrl?OrderContext=@(cartContext.OrderContextId)&CartCmd=UpdateOrderlines" + parameter +'&redirect=false', 833 data: '', 834 async: false, 835 success: function (data) { 836 837 } 838 }); 839 location.reload(); 840 } 841 function RemoveQuantity(orderLineId) { 842 var quantityNew = parseInt(document.querySelector("#" + orderLineId.id).value); 843 quantityNew = quantityNew - 1; 844 document.querySelector("#" + orderLineId.id).value = quantityNew; 845 parameter = '&QuantityOrderLine' + orderLineId.id + '=' + quantityNew; 846 $.ajax({ 847 type: "GET", 848 url: "@cartFriendlyUrl?OrderContext=@(cartContext.OrderContextId)&CartCmd=UpdateOrderlines" + parameter +'&redirect=false', 849 data: '', 850 async: false, 851 success: function (data) { 852 853 } 854 }); 855 location.reload(); 856 } 857 </script> 858 } 859 860 861 862 @using Dynamicweb.Ecommerce.Products 863 @using Dynamicweb.Frontend 864 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 865 866 @Title("Standad Page") 867 @Description("Page Template") 868 869 @{ 870 var image = Model.Item.GetFile("PageImage"); 871 var ImageHeight = Model.Item.GetValue<ListViewModel>("ImageHeight").SelectedValue; 872 var PageText = Model.Item.GetString("Text"); 873 var PageType = Model.Item.GetValue<ListViewModel>("PageType").SelectedValue; 874 // If Password is enabled on page PageType is empty so set it to default 875 if (string.IsNullOrEmpty(PageType)) 876 { 877 PageType = "default"; 878 } 879 880 var ecomquery = System.Web.HttpContext.Current.Request.QueryString["ecomQuery"]; 881 var prodid = System.Web.HttpContext.Current.Request.QueryString["productid"]; 882 var groupid = System.Web.HttpContext.Current.Request.QueryString["groupid"]; 883 } 884 @if (!Pageview.IsCurrentUserAllowed && !Pageview.Security.UserLoggedIn) 885 { 886 <main data-page-type="protected"> 887 <div class="container"> 888 <h1 class="title-styled" data-align="center"> 889 @Model.Area.Item.GetString("RestrictedTitle") 890 </h1> 891 <div class="row-flex"> 892 @if (!String.IsNullOrEmpty(Model.Area.Item.GetString("NewUserText"))) 893 { 894 <div class="col-xs-12 col-sm-6 col-md-5 col-md-offset-1" data-display="flex"> 895 <div data-align="left" data-content-border="boxed" data-content-type="box"> 896 @Model.Area.Item.GetString("LoginText") 897 @using NORRIQ.Common8.Razor; 898 @{ 899 var ResetPassword = "/kundeservice/glemt-adgangskode"; 900 } 901 <form name="ExtUserForm" id="loginForm" method="post" class="form" role="form" action="@(System.Web.HttpContext.Current.Request.Url.PathAndQuery)"> 902 <div class="form-group"> 903 <label for="Username">@Translate("Username")</label> 904 <input id="Username" name="Username" type="text" value="" class="form-control" autocomplete="off"> 905 </div> 906 <div class="form-group"> 907 <label for="Password">@Translate("Password")</label> 908 <input id="Password" name="Password" type="password" value="" class="form-control" autocomplete="off"> 909 </div> 910 <div id="loginFeedback"></div> 911 912 <a href="@ResetPassword" class="forgot-password">@Translate("Forgot password")</a> 913 914 <button type="submit" role="button" class="btn btn-primary" id="loginBtn" data-float="right"> 915 @Translate("Sign in") 916 </button> 917 </form> 918 <script id="loginBtnDefaultTemplate" type="text/x-jsrender"> 919 @Translate("Sign in") 920 </script> 921 <script id="loginBtnLoggingInTemplate" type="text/x-jsrender"> 922 <i class="icon-async icon-pulse" aria-hidden="true"></i> @Translate("Signing in") 923 </script> 924 <script id="loginLoadingTemplate" type="text/x-jsrender"> 925 <p class="user-login-loading"><i class="icon-async icon-pulse" aria-hidden="true"></i> @Translate("Signing in")</p> 926 </script> 927 <script id="loginErrorTemplate" type="text/x-jsrender"> 928 <p class="user-login-error">@Translate("An error occured!")</p> 929 </script> 930 <script id="loginBadLoginInfoTemplate" type="text/x-jsrender"> 931 <p class="user-login-error">@Translate("Username or password is incorrect!")</p> 932 </script> 933 </div> 934 </div> 935 <div class="col-xs-12 col-sm-6 col-md-5" data-display="flex"> 936 <div data-align="left" data-content-border="boxed" data-content-type="box"> 937 @Model.Area.Item.GetString("NewUserText") 938 </div> 939 </div> 940 } 941 else 942 { 943 <div class="col-xs-12 col-sm-6 col-sm-offset-3 col-md-4 col-md-offset-4" data-display="flex"> 944 <div data-align="left" data-content-border="boxed" data-content-type="box"> 945 @Model.Area.Item.GetString("LoginText") 946 @using NORRIQ.Common8.Razor; 947 @{ 948 var ResetPassword = "/kundeservice/glemt-adgangskode"; 949 } 950 <form name="ExtUserForm" id="loginForm" method="post" class="form" role="form" action="@(System.Web.HttpContext.Current.Request.Url.PathAndQuery)"> 951 <div class="form-group"> 952 <label for="Username">@Translate("Username")</label> 953 <input id="Username" name="Username" type="text" value="" class="form-control" autocomplete="off"> 954 </div> 955 <div class="form-group"> 956 <label for="Password">@Translate("Password")</label> 957 <input id="Password" name="Password" type="password" value="" class="form-control" autocomplete="off"> 958 </div> 959 <div id="loginFeedback"></div> 960 961 <a href="@ResetPassword" class="forgot-password">@Translate("Forgot password")</a> 962 963 <button type="submit" role="button" class="btn btn-primary" id="loginBtn" data-float="right"> 964 @Translate("Sign in") 965 </button> 966 </form> 967 <script id="loginBtnDefaultTemplate" type="text/x-jsrender"> 968 @Translate("Sign in") 969 </script> 970 <script id="loginBtnLoggingInTemplate" type="text/x-jsrender"> 971 <i class="icon-async icon-pulse" aria-hidden="true"></i> @Translate("Signing in") 972 </script> 973 <script id="loginLoadingTemplate" type="text/x-jsrender"> 974 <p class="user-login-loading"><i class="icon-async icon-pulse" aria-hidden="true"></i> @Translate("Signing in")</p> 975 </script> 976 <script id="loginErrorTemplate" type="text/x-jsrender"> 977 <p class="user-login-error">@Translate("An error occured!")</p> 978 </script> 979 <script id="loginBadLoginInfoTemplate" type="text/x-jsrender"> 980 <p class="user-login-error">@Translate("Username or password is incorrect!")</p> 981 </script> 982 </div> 983 </div> 984 } 985 </div> 986 </div> 987 </main> 988 } 989 else 990 { 991 if (image != null) 992 { 993 <div class="pageimage" style="background-image:url(@image.Path);"></div> 994 } 995 @RenderBreadcrumb() 996 <main class="page-content" data-page-type="@PageType"> 997 @if (PageType == "default") 998 { 999 <div class="container"> 1000 <div class="row-flex"> 1001 <div class="col-xs-12 col-sm-12 col-md-3" data-content="sidebar" id="sidebar"> 1002 @RenderNavigation() 1003 @RenderSidebar() 1004 </div> 1005 <div class="col-xs-12 col-sm-12 col-md-9 pull-right"> 1006 @RenderHeader() 1007 @RenderPageText() 1008 @RenderPrimary() 1009 @RenderSecondary() 1010 @RenderTertiary() 1011 </div> 1012 </div> 1013 </div> 1014 } 1015 else if (PageType == "ecom") 1016 { 1017 <div class="container"> 1018 @RenderPageText() 1019 @RenderPrimary() 1020 @RenderSecondary() 1021 @RenderTertiary() 1022 @RenderSidebar() 1023 </div> 1024 } 1025 else if (PageType == "boxed" || PageType == "cart" || PageType == "frontpage") 1026 { 1027 <div class="container"> 1028 @RenderHeader() 1029 @RenderPageText() 1030 @RenderPrimary() 1031 @RenderSecondary() 1032 @RenderTertiary() 1033 @RenderSidebar() 1034 </div> 1035 } 1036 </main> 1037 } 1038 1039 1040 @* Default content for pages *@ 1041 @helper RenderPrimary() 1042 { 1043 if (!String.IsNullOrEmpty(Model.Placeholder("Primary"))) 1044 { 1045 <div class="row-flex"> 1046 @Model.Placeholder("Primary", "Content", "unwrap:true;default:true") 1047 </div> 1048 } 1049 } 1050 @helper RenderSecondary() 1051 { 1052 if (!String.IsNullOrEmpty(Model.Placeholder("Secondary"))) 1053 { 1054 <div class="row-flex"> 1055 @Model.Placeholder("Secondary", "Content", "unwrap:true") 1056 </div> 1057 } 1058 } 1059 @helper RenderTertiary() 1060 { 1061 if (!String.IsNullOrEmpty(Model.Placeholder("Tertiary"))) 1062 { 1063 <div class="row-flex"> 1064 @Model.Placeholder("Tertiary", "Content", "unwrap:true") 1065 </div> 1066 } 1067 } 1068 @helper RenderSidebar() 1069 { 1070 if (!String.IsNullOrEmpty(Model.Placeholder("Sidebar"))) 1071 { 1072 <div class="row-flex"> 1073 @Model.Placeholder("Sidebar", "Sidebar", "unwrap:true") 1074 </div> 1075 } 1076 } 1077 @helper RenderNavigation() 1078 { 1079 <nav id="desktop-menu"> 1080 @RenderNavigation(new { Template = "nav-sidebar.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 4 }) 1081 </nav> 1082 } 1083 @helper RenderBreadcrumb() 1084 { 1085 // Model.PropertyItem may sometimes be null, thus we must check for it. 1086 if (Model.PropertyItem != null) 1087 { 1088 if (!Model.PropertyItem.GetBoolean("HideBreadcrumb")) 1089 { 1090 <nav class="clearfix breadcrumb-container"> 1091 <div class="container"> 1092 1093 <ol class="breadcrumb"> 1094 @RenderNavigation(new {Template = "breadcrumb.xslt", StartLevel = 1, EndLevel = 3}) 1095 @{ 1096 var productId = System.Web.HttpContext.Current.Request.QueryString["ProductID"]; 1097 } 1098 @*@if (productId != null) 1099 { 1100 var product = Product.GetProductById(productId); 1101 if (product != null) 1102 { 1103 <li><span class="disabled">@(product.Name)</span></li> 1104 } 1105 }*@ 1106 </ol> 1107 1108 </div> 1109 </nav> 1110 } 1111 } 1112 } 1113 @helper RenderHeader() 1114 { 1115 if (Model.Item.GetValue<ListViewModel>("TitleStyle").SelectedValue != "hidden") 1116 { 1117 var TitleStyle = Model.Item.GetValue<ListViewModel>("TitleStyle").SelectedValue; 1118 <header> 1119 <h1 class="@TitleStyle"> 1120 @Model.Item.GetString("Title") 1121 </h1> 1122 </header> 1123 } 1124 } 1125 1126 @helper RenderPageText() 1127 { 1128 if (!String.IsNullOrEmpty(Model.Item.GetString("Text"))) 1129 { 1130 <div class="pagetext"> 1131 @Model.Item.GetString("Text") 1132 if (!String.IsNullOrEmpty(Model.Item.GetString("Link")) && !String.IsNullOrEmpty(Model.Item.GetString("LinkText"))) 1133 { 1134 <p> 1135 <a class="btn btn-primary" href="@Model.Item.GetString("Link")"> 1136 @Model.Item.GetString("LinkText") 1137 </a> 1138 </p> 1139 } 1140 <hr /> 1141 </div> 1142 } 1143 } 1144 1145 @RenderItemList(new 1146 { 1147 ItemType = "Footer", 1148 ListSourceType = "SelfArea", 1149 ItemFieldsList = "*", 1150 IncludeParagraphItems = true, 1151 IncludeAllChildItems = true, 1152 ListOrderBy = "Sort", 1153 ListTemplate = "ItemPublisher/List/Footer.cshtml", 1154 ListPageSize = "100", 1155 }) 1156 1157 <script append="true"> 1158 require(['standardwebshop/areas/user/login'], function (AsyncLogin) { 1159 var login = new AsyncLogin({ 1160 $loginForm: $("#loginForm"), 1161 $username: $("#Username"), 1162 $password: $("#Password") 1163 }); 1164 login.init(); 1165 1166 }); 1167 @if(!Dynamicweb.Environment.CookieManager.CookieOptInLevelExists){ 1168 <text> 1169 var cookieText = "@Model.Area.Item.GetString("CookieText").Replace("\"", "'").Replace(Environment.NewLine,"")"; 1170 </text> 1171 } 1172 </script> 1173 1174 @if (!true) 1175 { 1176 <script src="/scripts/require.js"></script> 1177 @StandardWebshop.CustomCode.Razor.TimestampSource.GetJavaScriptWithTimestamp("/scripts/standardwebshop/main.js") 1178 } 1179 else 1180 { 1181 @StandardWebshop.CustomCode.Razor.TimestampSource.GetJavaScriptWithTimestamp("/scripts/standardwebshop/main.min.js") 1182 } 1183 <script> 1184 //Loads master along with the localized validation messages (read from the template tag "lang"). 1185 1186 @* Loading the datepicker localizations via the aliasses in main.js failed and caused them to be loaded from the original files instead of from the minified file. *@ 1187 require(['jQueryUI.localization/jquery.ui.datepicker-en-GB', 'jQueryUI.localization/jquery.ui.datepicker-da'], function () { }); 1188 require(['standardwebshop/areas/master'], function (master) { master.init(); }); 1189 1190 @* Fool the minifier to include all validation localizations, but only trigger the one actually needed. *@ 1191 require([], 1192 function () { 1193 @if (String.Equals(Pageview.Area.Culture.Split('-').First(), "da", StringComparison.OrdinalIgnoreCase)) 1194 { 1195 <text> 1196 require(["jquery.validation-1.13.1/localization/messages_da"], function () { }); 1197 require(["additional-methods.min"], function () { }); 1198 </text> 1199 } else if (String.Equals(Pageview.Area.Culture.Split('-').First(), "en", StringComparison.OrdinalIgnoreCase)) 1200 { 1201 <text> 1202 require(["jquery.validation-1.13.1/localization/messages_en"], function () { }); 1203 require(["additional-methods.min"], function () { }); 1204 </text> 1205 } 1206 }); 1207 </script> 1208 1209 <script> 1210 function setCookie(cname, cvalue, exdays) { 1211 const d = new Date(); 1212 d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); 1213 let expires = "expires=" + d.toUTCString(); 1214 document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; 1215 } 1216 1217 const queryString = window.location.search; 1218 const urlParams = new URLSearchParams(queryString.toLowerCase()); 1219 const paid = urlParams.get('paid'); 1220 const pacid = urlParams.get('pacid'); 1221 1222 if (urlParams.has('paid') && urlParams.has('pacid')) { 1223 // Set the cookies here 1224 setCookie('PAID', paid, 40); 1225 setCookie('PACID', pacid, 40); 1226 } 1227 </script> 1228 1229 <script append="replace"></script> 1230 @*@if (!String.IsNullOrEmpty(Model.Area.Item.GetString("Google"))) 1231 { 1232 <script> 1233 (function (i, s, o, g, r, a, m) { 1234 i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () { 1235 (i[r].q = i[r].q || []).push(arguments) 1236 }, i[r].l = 1 * new Date(); a = s.createElement(o), 1237 m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m) 1238 })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga'); 1239 1240 ga('create', '@Model.Area.Item.GetString("Google")', 'auto'); 1241 ga('send', 'pageview'); 1242 </script> 1243 }*@ 1244 <div class="modal fade" tabindex="-1" role="dialog" id="languages"> 1245 <div class="modal-dialog modal-sm" role="document"> 1246 <div class="modal-content"> 1247 <div class="modal-header"> 1248 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> 1249 <h4 class="modal-title">@Translate("Change language", "Change language")</h4> 1250 </div> 1251 <div class="modal-body"> 1252 @if (Model.Languages.Any()) 1253 { 1254 var areaService = NLWI.Core.Factory.ObjectFactory.GetInstance<Dynamicweb.Content.AreaService>(); 1255 1256 foreach (var lang in Model.Languages) 1257 { 1258 var area = areaService.GetArea(lang.ID); 1259 var Domain = lang.PrimaryDomain; 1260 if (string.IsNullOrEmpty(Domain)) 1261 { 1262 Domain = area.Domain.Split(new char[0]).First(); 1263 } 1264 1265 var Flag = "flag_" + lang.Culture.Split('-').Last() + ".png"; 1266 1267 <a href='//@Domain'> 1268 <img src="/Admin/Images/Flags/@Flag" alt="@lang.Culture.Split('-').Last()-Flag" class="img-responsive lang-select" /> 1269 </a> 1270 } 1271 } 1272 </div> 1273 </div> 1274 </div> 1275 </div> 1276 1277 </body> 1278 </html> 1279