Error executing template "Designs/Rapido/_parsed/NZNewsArticle.parsed.cshtml"
System.AggregateException: One or more errors occurred. ---> System.AggregateException: One or more errors occurred. ---> System.InvalidOperationException: Exception of type 'System.InvalidOperationException' was thrown.
at System.Runtime.CompilerServices.ConditionalWeakTable`2.VerifyIntegrity()
at System.Runtime.CompilerServices.ConditionalWeakTable`2.TryGetValue(TKey key, TValue& value)
at System.Runtime.CompilerServices.ConditionalWeakTable`2.GetValue(TKey key, CreateValueCallback createValueCallback)
at System.Runtime.CompilerServices.ConditionalWeakTable`2.GetOrCreateValue(TKey key)
at Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.CSharpSyntaxNode.GetStructure(SyntaxTrivia trivia)
at Microsoft.CodeAnalysis.SyntaxTrivia.GetStructure()
at Microsoft.CodeAnalysis.SyntaxNode.<DescendantTriviaIntoTrivia>d__171.MoveNext()
at Microsoft.CodeAnalysis.SyntaxNodeOrToken.GetDirectives[TDirective](SyntaxNode node, Func`2 filter, List`1& directives)
at Microsoft.CodeAnalysis.SyntaxNodeOrToken.GetDirectives[TDirective](SyntaxNodeOrToken& node, Func`2 filter, List`1& directives)
at Microsoft.CodeAnalysis.CSharp.Syntax.NullableContextStateMap.GetContexts(SyntaxTree tree, Boolean isGeneratedCode)
at Microsoft.CodeAnalysis.CSharp.Syntax.NullableContextStateMap.Create(SyntaxTree tree, Boolean isGeneratedCode)
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxTree.EnsureNullableContextMapInitialized()
at Microsoft.CodeAnalysis.CSharp.Binder.AreNullableAnnotationsEnabled(SyntaxTree syntaxTree, Int32 position)
at Microsoft.CodeAnalysis.CSharp.Binder.AreNullableAnnotationsEnabled(SyntaxToken token)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNonGenericSimpleNamespaceOrTypeOrAliasSymbol(IdentifierNameSyntax node, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved, Boolean suppressUseSiteDiagnostics, NamespaceOrTypeSymbol qualifierOpt)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNamespaceOrTypeOrAliasSymbol(ExpressionSyntax syntax, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved, Boolean suppressUseSiteDiagnostics)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNamespaceOrTypeSymbol(ExpressionSyntax syntax, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved, Boolean suppressUseSiteDiagnostics)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNamespaceOrTypeSymbol(ExpressionSyntax syntax, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved)
at Microsoft.CodeAnalysis.CSharp.Imports.FromSyntax(CSharpSyntaxNode declarationSyntax, InContainerBinder binder, ConsList`1 basesBeingResolved, Boolean inUsing)
at Microsoft.CodeAnalysis.CSharp.InContainerBinder.<>c__DisplayClass6_0.<.ctor>b__0(ConsList`1 basesBeingResolved)
at Microsoft.CodeAnalysis.CSharp.InContainerBinder.GetImports(ConsList`1 basesBeingResolved)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.GetImports(SingleNamespaceDeclaration declaration)
at Microsoft.CodeAnalysis.CSharp.Symbols.SourceNamespaceSymbol.ForceComplete(SourceLocation locationOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.Symbol.ForceCompleteMemberByLocation(SourceLocation locationOpt, Symbol member, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.Symbols.SourceNamespaceSymbol.<>c__DisplayClass49_1.<ForceComplete>b__0(Int32 i)
at Roslyn.Utilities.UICultureUtilities.<>c__DisplayClass6_0`1.<WithCurrentUICulture>b__0(T param)
at System.Threading.Tasks.Parallel.<>c__DisplayClass17_0`1.<ForWorker>b__1()
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask)
at System.Threading.Tasks.Task.<>c__DisplayClass176_0.<ExecuteSelfReplicating>b__0(Object <p0>)
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait()
at System.Threading.Tasks.Parallel.ForWorker[TLocal](Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Func`4 bodyWithLocal, Func`1 localInit, Action`1 localFinally)
at System.Threading.Tasks.Parallel.For(Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body)
at Microsoft.CodeAnalysis.CSharp.Symbols.SourceNamespaceSymbol.ForceComplete(SourceLocation locationOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.Symbol.ForceCompleteMemberByLocation(SourceLocation locationOpt, Symbol member, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.Symbols.SourceNamespaceSymbol.<>c__DisplayClass49_1.<ForceComplete>b__0(Int32 i)
at Roslyn.Utilities.UICultureUtilities.<>c__DisplayClass6_0`1.<WithCurrentUICulture>b__0(T param)
at System.Threading.Tasks.Parallel.<>c__DisplayClass17_0`1.<ForWorker>b__1()
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask)
at System.Threading.Tasks.Task.<>c__DisplayClass176_0.<ExecuteSelfReplicating>b__0(Object <p0>)
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait()
at System.Threading.Tasks.Parallel.ForWorker[TLocal](Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Func`4 bodyWithLocal, Func`1 localInit, Action`1 localFinally)
at System.Threading.Tasks.Parallel.For(Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body)
at Microsoft.CodeAnalysis.CSharp.Symbols.SourceNamespaceSymbol.ForceComplete(SourceLocation locationOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.Symbols.SourceModuleSymbol.ForceComplete(SourceLocation locationOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.Symbols.SourceAssemblySymbol.ForceComplete(SourceLocation locationOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.GetSourceDeclarationDiagnostics(SyntaxTree syntaxTree, Nullable`1 filterSpanWithinTree, Func`4 locationFilterOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.GetDiagnostics(CompilationStage stage, Boolean includeEarlierStages, DiagnosticBag diagnostics, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CompileMethods(CommonPEModuleBuilder moduleBuilder, Boolean emittingPdb, Boolean emitMetadataOnly, Boolean emitTestCoverageData, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream metadataPEStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, CompilationTestData testData, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, Stream metadataPEStream, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, CancellationToken cancellationToken)
at RazorEngine.Roslyn.CSharp.RoslynCompilerServiceBase.CompileType(TypeContext context)
at RazorEngine.Templating.RazorEngineCore.CreateTemplateType(ITemplateSource razorTemplate, Type modelType)
at RazorEngine.Templating.RazorEngineCore.Compile(ITemplateKey key, Type modelType)
at RazorEngine.Templating.RazorEngineService.CompileAndCacheInternal(ITemplateKey key, Type modelType)
at RazorEngine.Templating.RazorEngineService.GetCompiledTemplate(ITemplateKey key, Type modelType, Boolean compileOnCacheMiss)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.DynamicWrapperService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()
---> (Inner Exception #0) System.AggregateException: One or more errors occurred. ---> System.InvalidOperationException: Exception of type 'System.InvalidOperationException' was thrown.
at System.Runtime.CompilerServices.ConditionalWeakTable`2.VerifyIntegrity()
at System.Runtime.CompilerServices.ConditionalWeakTable`2.TryGetValue(TKey key, TValue& value)
at System.Runtime.CompilerServices.ConditionalWeakTable`2.GetValue(TKey key, CreateValueCallback createValueCallback)
at System.Runtime.CompilerServices.ConditionalWeakTable`2.GetOrCreateValue(TKey key)
at Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.CSharpSyntaxNode.GetStructure(SyntaxTrivia trivia)
at Microsoft.CodeAnalysis.SyntaxTrivia.GetStructure()
at Microsoft.CodeAnalysis.SyntaxNode.<DescendantTriviaIntoTrivia>d__171.MoveNext()
at Microsoft.CodeAnalysis.SyntaxNodeOrToken.GetDirectives[TDirective](SyntaxNode node, Func`2 filter, List`1& directives)
at Microsoft.CodeAnalysis.SyntaxNodeOrToken.GetDirectives[TDirective](SyntaxNodeOrToken& node, Func`2 filter, List`1& directives)
at Microsoft.CodeAnalysis.CSharp.Syntax.NullableContextStateMap.GetContexts(SyntaxTree tree, Boolean isGeneratedCode)
at Microsoft.CodeAnalysis.CSharp.Syntax.NullableContextStateMap.Create(SyntaxTree tree, Boolean isGeneratedCode)
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxTree.EnsureNullableContextMapInitialized()
at Microsoft.CodeAnalysis.CSharp.Binder.AreNullableAnnotationsEnabled(SyntaxTree syntaxTree, Int32 position)
at Microsoft.CodeAnalysis.CSharp.Binder.AreNullableAnnotationsEnabled(SyntaxToken token)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNonGenericSimpleNamespaceOrTypeOrAliasSymbol(IdentifierNameSyntax node, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved, Boolean suppressUseSiteDiagnostics, NamespaceOrTypeSymbol qualifierOpt)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNamespaceOrTypeOrAliasSymbol(ExpressionSyntax syntax, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved, Boolean suppressUseSiteDiagnostics)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNamespaceOrTypeSymbol(ExpressionSyntax syntax, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved, Boolean suppressUseSiteDiagnostics)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNamespaceOrTypeSymbol(ExpressionSyntax syntax, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved)
at Microsoft.CodeAnalysis.CSharp.Imports.FromSyntax(CSharpSyntaxNode declarationSyntax, InContainerBinder binder, ConsList`1 basesBeingResolved, Boolean inUsing)
at Microsoft.CodeAnalysis.CSharp.InContainerBinder.<>c__DisplayClass6_0.<.ctor>b__0(ConsList`1 basesBeingResolved)
at Microsoft.CodeAnalysis.CSharp.InContainerBinder.GetImports(ConsList`1 basesBeingResolved)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.GetImports(SingleNamespaceDeclaration declaration)
at Microsoft.CodeAnalysis.CSharp.Symbols.SourceNamespaceSymbol.ForceComplete(SourceLocation locationOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.Symbol.ForceCompleteMemberByLocation(SourceLocation locationOpt, Symbol member, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.Symbols.SourceNamespaceSymbol.<>c__DisplayClass49_1.<ForceComplete>b__0(Int32 i)
at Roslyn.Utilities.UICultureUtilities.<>c__DisplayClass6_0`1.<WithCurrentUICulture>b__0(T param)
at System.Threading.Tasks.Parallel.<>c__DisplayClass17_0`1.<ForWorker>b__1()
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask)
at System.Threading.Tasks.Task.<>c__DisplayClass176_0.<ExecuteSelfReplicating>b__0(Object <p0>)
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait()
at System.Threading.Tasks.Parallel.ForWorker[TLocal](Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Func`4 bodyWithLocal, Func`1 localInit, Action`1 localFinally)
at System.Threading.Tasks.Parallel.For(Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body)
at Microsoft.CodeAnalysis.CSharp.Symbols.SourceNamespaceSymbol.ForceComplete(SourceLocation locationOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.Symbol.ForceCompleteMemberByLocation(SourceLocation locationOpt, Symbol member, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.Symbols.SourceNamespaceSymbol.<>c__DisplayClass49_1.<ForceComplete>b__0(Int32 i)
at Roslyn.Utilities.UICultureUtilities.<>c__DisplayClass6_0`1.<WithCurrentUICulture>b__0(T param)
at System.Threading.Tasks.Parallel.<>c__DisplayClass17_0`1.<ForWorker>b__1()
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask)
at System.Threading.Tasks.Task.<>c__DisplayClass176_0.<ExecuteSelfReplicating>b__0(Object <p0>)
---> (Inner Exception #0) System.InvalidOperationException: Exception of type 'System.InvalidOperationException' was thrown.
at System.Runtime.CompilerServices.ConditionalWeakTable`2.VerifyIntegrity()
at System.Runtime.CompilerServices.ConditionalWeakTable`2.TryGetValue(TKey key, TValue& value)
at System.Runtime.CompilerServices.ConditionalWeakTable`2.GetValue(TKey key, CreateValueCallback createValueCallback)
at System.Runtime.CompilerServices.ConditionalWeakTable`2.GetOrCreateValue(TKey key)
at Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.CSharpSyntaxNode.GetStructure(SyntaxTrivia trivia)
at Microsoft.CodeAnalysis.SyntaxTrivia.GetStructure()
at Microsoft.CodeAnalysis.SyntaxNode.<DescendantTriviaIntoTrivia>d__171.MoveNext()
at Microsoft.CodeAnalysis.SyntaxNodeOrToken.GetDirectives[TDirective](SyntaxNode node, Func`2 filter, List`1& directives)
at Microsoft.CodeAnalysis.SyntaxNodeOrToken.GetDirectives[TDirective](SyntaxNodeOrToken& node, Func`2 filter, List`1& directives)
at Microsoft.CodeAnalysis.CSharp.Syntax.NullableContextStateMap.GetContexts(SyntaxTree tree, Boolean isGeneratedCode)
at Microsoft.CodeAnalysis.CSharp.Syntax.NullableContextStateMap.Create(SyntaxTree tree, Boolean isGeneratedCode)
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxTree.EnsureNullableContextMapInitialized()
at Microsoft.CodeAnalysis.CSharp.Binder.AreNullableAnnotationsEnabled(SyntaxTree syntaxTree, Int32 position)
at Microsoft.CodeAnalysis.CSharp.Binder.AreNullableAnnotationsEnabled(SyntaxToken token)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNonGenericSimpleNamespaceOrTypeOrAliasSymbol(IdentifierNameSyntax node, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved, Boolean suppressUseSiteDiagnostics, NamespaceOrTypeSymbol qualifierOpt)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNamespaceOrTypeOrAliasSymbol(ExpressionSyntax syntax, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved, Boolean suppressUseSiteDiagnostics)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNamespaceOrTypeSymbol(ExpressionSyntax syntax, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved, Boolean suppressUseSiteDiagnostics)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNamespaceOrTypeSymbol(ExpressionSyntax syntax, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved)
at Microsoft.CodeAnalysis.CSharp.Imports.FromSyntax(CSharpSyntaxNode declarationSyntax, InContainerBinder binder, ConsList`1 basesBeingResolved, Boolean inUsing)
at Microsoft.CodeAnalysis.CSharp.InContainerBinder.<>c__DisplayClass6_0.<.ctor>b__0(ConsList`1 basesBeingResolved)
at Microsoft.CodeAnalysis.CSharp.InContainerBinder.GetImports(ConsList`1 basesBeingResolved)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.GetImports(SingleNamespaceDeclaration declaration)
at Microsoft.CodeAnalysis.CSharp.Symbols.SourceNamespaceSymbol.ForceComplete(SourceLocation locationOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.Symbol.ForceCompleteMemberByLocation(SourceLocation locationOpt, Symbol member, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.Symbols.SourceNamespaceSymbol.<>c__DisplayClass49_1.<ForceComplete>b__0(Int32 i)
at Roslyn.Utilities.UICultureUtilities.<>c__DisplayClass6_0`1.<WithCurrentUICulture>b__0(T param)
at System.Threading.Tasks.Parallel.<>c__DisplayClass17_0`1.<ForWorker>b__1()
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask)
at System.Threading.Tasks.Task.<>c__DisplayClass176_0.<ExecuteSelfReplicating>b__0(Object <p0>)<---
<---
1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
2 @using Dynamicweb.Frontend.Devices
3 @using Dynamicweb.Extensibility
4 @using System.Web.UI
5 @using Dynamicweb.Content
6 @using Dynamicweb.Security
7 @using System
8 @using System.Linq
9 @using System.Web
10 @using System.IO
11 @using Dynamicweb.Security.UserManagement;
12 @{
13 //General settings
14 string favicon = Model.Area.Item.GetFile("LogoFavicon") != null ? Model.Area.Item.GetFile("LogoFavicon").Path : "/Files/Images/favicon.ico";
15 string logo = Model.Area.Item.GetFile("LogoImage") != null ? Model.Area.Item.GetFile("LogoImage").Path : "/Files/Images/logo-dynamicweb.png";
16 string logoAltText = Model.Area.Item.GetString("LogoAltText");
17
18 //Tracking
19 string gatagTrackingId = Model.Area.Item.GetItem("CustomSettings").GetField("GATrackingID").GetString();
20
21 if (Path.GetExtension(logo).ToLower() != ".svg")
22 {
23 logo = "/Admin/Public/GetImage.ashx?height=40&crop=5&Compression=75&image=" + @logo;
24 }
25
26 string searchPlaceholder = Translate("Search products", "Search products");
27 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") != null ? HttpContext.Current.Request.QueryString.Get("Search") : "";
28 string wireframeMode = Model.Area.Item.GetBoolean("WireframeMode").ToString();
29
30 //Font settings
31 string navigationFont = Model.Area.Item.GetItem("NavigationFont").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
32 string mobileNavigationFont = Model.Area.Item.GetItem("MobileNavigationFont").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
33 string headerFont = Model.Area.Item.GetItem("ContentLayoutHeaderFont").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
34 string subHeaderFont = Model.Area.Item.GetItem("ContentLayoutSubheaderFont").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
35 string contentFont = Model.Area.Item.GetItem("ContentLayoutBodyText").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
36 string newStickersFont = Model.Area.Item.GetItem("NewStickersFont").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
37 string customStickersFont = Model.Area.Item.GetItem("CustomStickersFont").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
38 string toolsMenuFont = Model.Area.Item.GetItem("ToolsMenuFont").GetGoogleFont("FontFamily").Family.Replace(" ", "+");
39
40
41 //Page IDs for use in the template
42 int pageId = Model.TopPage.ID;
43 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
44 bool firstPageIdBool = Model.Area.FirstActivePage.ID.Equals("GroupdID");
45 string test = HttpContext.Current.Request.Url.ToString();
46
47 int cartPageId = GetPageIdByNavigationTag("CartPage");
48 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
49 int cartFeedPageId = GetPageIdByNavigationTag("CartOrderlinesFeed");
50 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
51 int productsSearchFeedId = productsPageId;
52 int productGroupsPageId = GetPageIdByNavigationTag("ProductGroupsFeed");
53 int impersonationPageId = GetPageIdByNavigationTag("Impersonation");
54
55 bool stickyMenu = Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet" ? true : Model.Area.Item.GetBoolean("NavigationStickyMenu");
56 string stickyTop = stickyMenu ? "top-container--sticky" : "";
57 string pagePos = stickyMenu ? "js-page-pos" : "";
58 string topLayout = Model.Area.Item.GetList("LayoutTop").SelectedValue;
59 bool renderPagesInToolBar = Model.Area.Item.GetBoolean("RenderPagesInToolBar");
60 string toolbarText = Model.Area.Item.GetString("ToolbarText");
61 string toolbarIcon = Model.Area.Item.GetFile("ToolbarIcon") != null ? Model.Area.Item.GetFile("ToolbarIcon").Path : "";
62 string toolbarTextSecond = Model.Area.Item.GetString("ToolbarTextSecond");
63 string toolbarIconSecond = Model.Area.Item.GetFile("ToolbarIconSecond") != null ? Model.Area.Item.GetFile("ToolbarIconSecond").Path : "";
64 string toolbarTextThird = Model.Area.Item.GetString("ToolbarTextThird");
65 string toolbarIconThird = Model.Area.Item.GetFile("ToolbarIconThird") != null ? Model.Area.Item.GetFile("ToolbarIconThird").Path : "";
66 string toolbarTextFourth = Model.Area.Item.GetString("ToolbarTextFourth");
67 string toolbarIconFourth = Model.Area.Item.GetFile("ToolbarIconFourth") != null ? Model.Area.Item.GetFile("ToolBarIconFourth").Path : "";
68 string navigationText = Model.Area.Item.GetString("NavigationPhoneText");
69 string navigationIcon = Model.Area.Item.GetFile("NavigationIcon") != null ? Model.Area.Item.GetFile("NavigationIcon").Path : "";
70 string navigationIconSecond = Model.Area.Item.GetFile("NavigationIconSecond") != null ? Model.Area.Item.GetFile("NavigationIconSecond").Path : "";
71 string navigationIconThird = Model.Area.Item.GetFile("NavigationIconThird") != null ? Model.Area.Item.GetFile("NavigationIconThird").Path : "";
72 string navigationIconFourth = Model.Area.Item.GetFile("NavigationIconFourth") != null ? Model.Area.Item.GetFile("NavigationIconFourth").Path : "";
73 string navigationIconFifth = Model.Area.Item.GetFile("NavigationIconFifth") != null ? Model.Area.Item.GetFile("NavigationIconFifth").Path : "";
74 string navigationIconFifthLink = Model.Area.Item.GetString("navigationIconFifthLink");
75 bool onlyPreviewForAnonymousUsers = Model.Area.Item.GetBoolean("OnlyPreviewForAnonymous");
76 bool onlyPreview = onlyPreviewForAnonymousUsers ? Model.CurrentUser.ID == 0 : false;
77
78 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks;
79
80 string userInitials = Model.CurrentUser.Name;
81
82 string siteURL = Pageview.SearchFriendlyUrl.ToString();
83 string businessPhotoPath = Model.Area.Item.GetFile("BusinessPhoto") != null ? Model.Area.Item.GetFile("BusinessPhoto").Path : "";
84 string businessName = Model.Area.Item.GetString("BusinessName");
85 var address = Model.Area.Item.GetItem("Address");
86 string streetAddress = "";
87 string addressLocality = "";
88 string addressRegion = "";
89 string postalCode = "";
90 string addressCountry = "";
91
92 if (address != null)
93 {
94 streetAddress = address.GetString("StreetAddress");
95 addressLocality = address.GetString("City");
96 addressRegion = address.GetString("Region");
97 postalCode = address.GetString("PostalCode");
98 addressCountry = address.GetString("Country");
99 }
100 string contactEmail = Model.Area.Item.GetString("ContactEmail");
101 string contactNumber = Model.Area.Item.GetString("ContactNumber");
102
103 string testurls = Dynamicweb.Context.Current.Request.Url.ToString();
104 bool isLrtSite = Model.Area.Item.GetBoolean("LRT_Theme");
105 var noFollowBool = Pageview.Page.Nofollow;
106 var noIndexBool = Pageview.Page.Noindex;
107 string assetsVersion = "20";
108 }
109 <!DOCTYPE html>
110 <html lang="@Pageview.Area.CultureInfo">
111 <head>
112 <meta charset="utf-8" />
113
114 @if (isLrtSite)
115 {
116 <meta name="facebook-domain-verification" content="jkwhlhfmivuttu6z964lvpuc65mfjk" />
117 }
118 else
119 {
120 <meta name="facebook-domain-verification" content="f4udlfxqt2oxgqksxhwxnjo93plfi2" />
121 }
122
123 <title>@Model.Title</title>
124 <meta name="description" content="@Model.Description" />
125 <meta name="keywords" content="@Model.Keywords" />
126
127 @if (testurls.Contains("groupid") || testurls.Contains("productid"))
128 {
129 @RenderSnippet("canonical")
130 }
131
132 else
133 {
134 <link rel="canonical" href="@siteURL">
135
136 }
137
138 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
139 @if (Dynamicweb.Context.Current.Request.Url.Host.EndsWith("nozebrahosting.dk"))
140 {
141 <meta name="robots" content="noindex, nofollow">
142 }
143
144 @if (noIndexBool && noFollowBool)
145 {
146 <meta name="robots" content="noindex, nofollow">
147 }
148 else if (noFollowBool)
149 {
150 <meta name="robots" content="nofollow">
151
152 }
153 else if (noIndexBool)
154 {
155 <meta name="robots" content="noindex">
156 }
157 <script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
158 <!-- Favicon -->
159 <link href="@favicon" rel="icon" type="image/png">
160 <!-- Font awesome -->
161 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/rapido/font-awesome.min.css" type="text/css">
162 <!-- Base (Default, wireframe) styles -->
163 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css">
164 <!-- Rapido Css from Website Settings -->
165 <link id="rapidoCss" rel="stylesheet" href="@autoCssLink" type="text/css">
166 <!-- Ignite Css (Custom site specific styles) -->
167 @if (isLrtSite)
168 {
169 <link id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/lrt.min.css?v=@assetsVersion" rel="stylesheet">
170 }
171
172 else
173 {
174 <link id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css?v=@assetsVersion" rel="stylesheet">
175 }
176
177 <!-- Google fonts -->
178 @{
179 var fonts = new string[8] { navigationFont, mobileNavigationFont, headerFont, subHeaderFont, contentFont, newStickersFont, customStickersFont, toolsMenuFont };
180 var family = string.Join("%7C", fonts.Distinct().Select(x => string.Format("{0}:100,200,300,400,500,600,700,800,900", x)));
181
182 }
183 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet">
184 @if (!string.IsNullOrEmpty(businessPhotoPath) && !string.IsNullOrEmpty(businessName) && !string.IsNullOrEmpty(streetAddress) && !string.IsNullOrEmpty(addressLocality) && !string.IsNullOrEmpty(addressRegion) && !string.IsNullOrEmpty(postalCode) && !string.IsNullOrEmpty(addressCountry))
185 {
186 var baseURl = HttpContext.Current.Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Host;
187 var logoUrl = baseURl + logo;
188
189 <script type="application/ld+json">
190
191 {
192
193 "@@context":"https://schema.org/",
194 "@@type": ["Organization", "LocalBusiness"],
195 "url": "@baseURl",
196 "mainEntityOfPage": {
197 "@@type": "WebPage",
198 "id": "@baseURl"
199 },
200 "name": "@businessName",
201 "legalName": "@businessName",
202 "logo": "@logoUrl",
203 "image": [
204 "@baseURl/Admin/Public/GetImage.ashx?width=2509&height=1100&crop=0&Compression=85&DoNotUpscale=true&image=/Files/Images/Lauridsen/img/4026092007839.w293.h293.fill.jpg",
205 "@baseURl/Admin/Public/GetImage.ashx?width=2509&height=1100&crop=0&Compression=85&DoNotUpscale=true&image=/Files/Images/Lauridsen/img/about-bg-img.png",
206 "@baseURl/Admin/Public/GetImage.ashx?width=2500&height=1100&crop=0&Compression=85&DoNotUpscale=true&image=/Files/Images/Lauridsen/img/hero-img.png"
207 ],
208 "openingHours": ["Mo, Tu, We, Th 07:30-16:00", "Fr 07:30-14:30"],
209
210 @if (!string.IsNullOrEmpty(contactNumber))
211 {
212 <text>"telephone": "@Model.Area.Item.GetString("ContactNumber")",</text>
213 }
214
215 @if (!string.IsNullOrEmpty(contactEmail))
216 {
217 <text>"email": "@Model.Area.Item.GetString("ContactEmail")",</text>
218 }
219
220 @if (Model.Area.Item.GetItems("FooterSocialLinks").Count > 0)
221 {
222
223 <text>
224 "sameAs": [
225 </text>
226
227 foreach (var socialitem in Model.Area.Item.GetItems("FooterSocialLinks"))
228 {
229
230 string socialLink = socialitem.GetString("Link");
231 <text>"@socialLink"@(socialitem != Model.Area.Item.GetItems("FooterSocialLinks").Last() ? "," : "")</text>
232 }
233
234 <text>],</text>
235
236 }
237
238 "address": {
239
240 "@@type": "PostalAddress",
241 "streetAddress": "@streetAddress",
242 "addressLocality": "@addressLocality",
243 "addressRegion": "@addressRegion",
244 "postalCode": "@postalCode",
245 "addressCountry": "@addressCountry"
246
247 },
248
249 "contactPoint": [
250
251 {
252 "@@type": "ContactPoint",
253
254 @if (!string.IsNullOrEmpty(contactNumber))
255 {
256 <text>"telephone": "@Model.Area.Item.GetString("ContactNumber")",</text>
257 }
258
259 @if (!string.IsNullOrEmpty(contactEmail))
260 {
261 <text>"email": "@Model.Area.Item.GetString("ContactEmail")",</text>
262 }
263
264 "contactType": "customer service",
265 "areaServed": "DK",
266 "hoursAvailable": [
267 {
268
269 "@@type": "OpeningHoursSpecification",
270 "opens": "07:30:00",
271 "closes": "16:00:00",
272 "dayOfWeek": [
273 "http://schema.org/Monday",
274 "http://schema.org/Tuesday",
275 "http://schema.org/Wednesday",
276 "http://schema.org/Thursday"
277 ]
278 },
279 {
280 "@@type": "OpeningHoursSpecification",
281 "opens": "07:30:00",
282 "closes": "14:30:00",
283 "dayOfWeek": "http://schema.org/Friday"
284 }
285 ]
286 }
287 ]
288 }
289
290 </script>
291
292 }
293
294 @*START GOOGLE TAG MANAGER*@
295
296 <script>
297 (function (w, d, s, l, i) {
298 w[l] = w[l] || []; w[l].push({
299 'gtm.start':
300 new Date().getTime(), event: 'gtm.js'
301 }); var f = d.getElementsByTagName(s)[0],
302 j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src =
303 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f);
304 })(window, document, 'script', 'dataLayer', '@gatagTrackingId');</script>
305
306 @*END GOOGLE TAG MANAGER*@
307 <script id="Cookiebot" src="https://consent.cookiebot.com/uc.js" data-cbid="48ec1431-21ad-425d-bd0a-bd07fe0e0b96" type="text/javascript"></script>
308
309
310 </head>
311 <body class="@isLrtSite">
312 <!-- Google Tag Manager (noscript) -->
313 <noscript>
314 <iframe src="https://www.googletagmanager.com/ns.html?id=@gatagTrackingId"
315 height="0" width="0" style="display:none;visibility:hidden"></iframe>
316 </noscript>
317 <!-- End Google Tag Manager (noscript) -->
318 @*
319 <p>@testurls @pageId @test</p>
320 *@
321 @MobileNavigation(userInitials)
322 @LoginModal()
323 @{
324 string getCurrentUserCurrency = "";
325
326 string parameter = HttpContext.Current.Request.QueryString.Get("LoggedIn");
327 if (User.IsExtranetUserLoggedIn())
328 {
329 var user = User.GetCurrentUser();
330 if (parameter == "true")
331 {
332 if (user != null)
333 {
334 foreach (var value in user.CustomFieldValues)
335 {
336 if (value != null && value.CustomField.SystemName.Equals("AccessUserCurrencyCharacter"))
337 {
338 getCurrentUserCurrency = value.Value.ToString();
339 }
340 }
341 }
342
343 foreach (var item in Dynamicweb.Ecommerce.Common.Application.Currencies)
344 {
345 if (item.Code == getCurrentUserCurrency)
346 {
347 Dynamicweb.Ecommerce.Common.Context.Currency = item;
348 }
349 }
350 }
351 }
352 }
353 <main class="site dw-mod">
354 <header class="top-container @stickyTop dw-mod js-header" id="Top">
355 @if (renderPagesInToolBar && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
356 {
357 <div class="tools-navigation dw-mod d-none d-lg-block">
358 <div class="center-container header-nav grid top-container__center-container dw-mod">
359 <div class="grid grid--align-center grid--justify-space-between u-margin-top u-margin-bottom">
360 <div class="grid__cell--align-middle-left"><img src="@toolbarIcon" class="grid__cell-img" alt="@toolbarText"><span class="u-margin-left">@toolbarText</span></div>
361 <div class="grid__cell--align-middle-left"><img src="@toolbarIconSecond" class="grid__cell-img" alt="@toolbarTextSecond"><span class="u-margin-left">@toolbarTextSecond</span></div>
362 <div class="grid__cell--align-middle-left"><img src="@toolbarIconThird" class="grid__cell-img" alt="@toolbarTextThird"><span class="u-margin-left">@toolbarTextThird</span></div>
363 <div class="grid__cell--align-middle-left"><img src="@toolbarIconFourth" class="grid__cell-img" alt="@toolbarTextFourth"><span class="u-margin-left">@toolbarTextFourth</span></div>
364 </div>
365 </div>
366 </div>
367 }
368 @if (topLayout == "normal")
369 {
370 <!-- Header -->
371 <div class="header header-top dw-mod">
372 <div class="center-container top-container__center-container dw-mod">
373 <div class="grid">
374 @* Logo *@
375 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
376 {
377 <div class="logo d-inline-block dw-mod">
378 <a href="/Default.aspx?ID=@firstPageId">
379 <img class="d-inline-block" src="@logo" alt="@logoAltText" />
380 </a>
381 </div>
382 }
383
384 @if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
385 {
386 <div class="grid__col-12">
387 <div class="grid__cell">
388 <div class="logo u-max-w220px u-middle u-margin-bottom dw-mod">
389 <a href="/Default.aspx?ID=@firstPageId">
390 <img class="grid__cell-img" src="@logo" alt="@logoAltText" />
391 </a>
392 </div>
393 </div>
394 </div>
395 }
396
397 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
398 {
399 @* Search *@
400 <div class="grid__col-6 grid__col--bleed-y grid--align-self-center">
401 <div class="typeahead u-margin u-color-inherit js-typeahead" data-page-size="10" id="TopProductSearch" data-search-feed-id="@productsSearchFeedId&feed=true" data-result-page-id="@productsPageId" data-groups-page-id="@productGroupsPageId">
402 <button type="button" class="btn btn--condensed u-color-light-gray--bg typeahead-group-btn dw-mod js-typeahead-groups-btn" data-group-id="all">@Translate("All")</button>
403 <ul class="dropdown dropdown--absolute-position js-handlebars-root js-typeahead-groups-content u-min-w220px dw-mod" id="TopProductSearchGroupsContent" data-template="SearchGroupsTemplate" data-json-feed="/Default.aspx?ID=@productGroupsPageId&feedType=productGroups" data-init-onload="false" data-preloader="minimal"></ul>
404 <input type="text" class="typeahead-search-field u-no-margin js-typeahead-search-field" placeholder="@searchPlaceholder" value="@searchValue">
405 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content u-full-width dw-mod" id="TopProductSearchContent" data-template="SearchContentTemplate" data-json-feed="/Default.aspx?ID=@productsSearchFeedId&feedType=productsOnly&feed=true" data-init-onload="false" data-preloader="minimal"></ul>
406 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn"><i class="fa fa-search"></i></button>
407 </div>
408 </div>
409
410 <div class="grid__cell grid__cell--align-middle-right">
411 <ul class="menu dw-mod u-pull--right">
412 @RenderSignIn("outsideNavigation", userInitials)
413 @RenderLanguageSelector("outsideNavigation")
414 @RenderFavorites("outsideNavigation")
415 @if (!onlyPreview)
416 {
417 @RenderMiniCart("outsideNavigation")
418 }
419 </ul>
420 </div>
421 }
422
423 @* Mobile search *@
424 @if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
425 {
426 <div class="grid__col-12 grid__col--bleed-y grid--align-self-center">
427 <div class="grid__cell">
428 <div class="js-typeahead" data-page-size="10" id="MobileProductSearch" data-search-feed-id="@productsSearchFeedId&feed=true" data-result-page-id="@productsPageId">
429 <input type="text" class="u-full-width js-typeahead-search-field" placeholder="@searchPlaceholder" value="@searchValue">
430 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-search-content dw-mod" id="MobileProductSearchContent" data-template="SearchContentTemplate" data-json-feed="/Default.aspx?ID=@productsSearchFeedId&feedType=productsOnly&feed=true" data-init-onload="false"></ul>
431 </div>
432 </div>
433 </div>
434 }
435 </div>
436 </div>
437 </div>
438
439 <!-- Main navigation -->
440 <nav class="main-navigation dw-mod">
441 <div class="center-container top-container__center-container dw-mod">
442 <div class="grid">
443 <div class="grid__col-12 grid--align-self-center grid__col--bleed">
444 <div class="grid__cell">
445 @MobileNavigationTrigger()
446 @if ((Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet") && !onlyPreview)
447 {
448 <ul class="menu dw-mod u-pull--right">
449 @RenderMiniCart()
450 </ul>
451 }
452 </div>
453 </div>
454 </div>
455 </div>
456 </nav>
457 }
458 @if (topLayout == "splitted")
459 {
460 <!-- Header -->
461 <div class="header header-top dw-mod">
462 <div class="center-container top-container__center-container dw-mod">
463 <div class="grid">
464 @* Logo *@
465 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
466 {
467 <div class="grid__col-md-3 grid__col-sm-3 grid--align-self-center grid__col--bleed-y">
468 <div class="logo dw-mod">
469 <a href="/Default.aspx?ID=@firstPageId">
470 <img class="grid__cell-img" src="@logo" alt="@logoAltText" />
471 </a>
472 </div>
473 </div>
474 }
475 else
476 {
477 <div class="grid__col-xs-6">
478 <div class="grid__cell">
479 <div class="logo u-max-w220px dw-mod">
480 <a href="/Default.aspx?ID=@firstPageId">
481 <img class="grid__cell-img" src="@logo" alt="@logoAltText" />
482 </a>
483 </div>
484 </div>
485 </div>
486 }
487 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
488 {
489 @* Search *@
490 <div class="grid__cell grid__cell--align-middle-right">
491 <div class="grid__col-sm-8 grid__col--bleed">
492 <div class="typeahead u-margin u-color-inherit js-typeahead" data-page-size="3" id="TopProductSearch" data-search-feed-id="@productsSearchFeedId&feed=true" data-result-page-id="@productsPageId" data-groups-page-id="@productGroupsPageId">
493 <button type="button" class="btn btn--condensed u-color-light-gray--bg typeahead-group-btn dw-mod js-typeahead-groups-btn" data-group-id="all">@Translate("All")</button>
494 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-groups-content dw-mod" id="TopProductSearchGroupsContent" data-template="SearchGroupsTemplate" data-json-feed="/Default.aspx?ID=@productGroupsPageId&feedType=productGroups" data-init-onload="false" data-preloader="minimal"></ul>
495 <input type="text" class="typeahead-search-field u-no-margin js-typeahead-search-field" placeholder="@searchPlaceholder" value="@searchValue">
496 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content u-full-width dw-mod" id="TopProductSearchContent" data-template="SearchContentTemplate" data-json-feed="/Default.aspx?ID=@productsSearchFeedId&feedType=productsOnly&feed=true" data-init-onload="false" data-preloader="minimal"></ul>
497 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn"><i class="fa fa-search"></i></button>
498 </div>
499 </div>
500 </div>
501 }
502 else
503 {
504 @* Mobile search *@
505 <div class="grid__col-xs-6">
506 <div class="grid__cell">
507 <div class="js-typeahead" data-page-size="10" id="MobileProductSearch" data-search-feed-id="@productsSearchFeedId&feed=true" data-result-page-id="@productsPageId">
508 <input type="text" class="u-full-width js-typeahead-search-field u-no-margin" placeholder="@searchPlaceholder" value="@searchValue">
509 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-search-content dw-mod" id="MobileProductSearchContent" data-template="SearchContentTemplate" data-json-feed="/Default.aspx?ID=@productsSearchFeedId&feedType=productsOnly&feed=true" data-init-onload="false"></ul>
510 </div>
511 </div>
512 </div>
513 }
514 </div>
515 </div>
516 </div>
517
518 <!-- Main navigation -->
519 <nav class="main-navigation dw-mod">
520 <div class="center-container top-container__center-container dw-mod">
521 <div class="grid">
522 <div class="u-pull--left">
523 @MobileNavigationTrigger()
524 </div>
525 <div class="grid__cell grid__cell--align-middle-right">
526 <ul class="menu dw-mod u-pull--right">
527 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
528 {
529 @RenderSignIn("inNavigation", userInitials)
530 @RenderLanguageSelector()
531 @RenderFavorites()
532 }
533 @if (!onlyPreview)
534 {
535 @RenderMiniCart()
536 }
537 </ul>
538 </div>
539 </div>
540 </div>
541 </nav>
542 }
543
544 @if (topLayout == "condensed")
545 {
546 <!-- Main navigation -->
547 <nav class="main-navigation dw-mod">
548 <div class="center-container top-container__center-container dw-mod">
549 <div class="grid">
550 @* Navigation *@
551 @MobileNavigationTrigger()
552 <div class="logo d-inline-block dw-mod">
553 <a href="/Default.aspx?ID=@firstPageId">
554 <img class="grid__cell-img d-inline-block" src="@logo" alt="@logoAltText" />
555 </a>
556 </div>
557 <div class="grid__cell grid__cell--align-middle-right">
558 <ul class="menu dw-mod u-pull--right">
559 @RenderSignIn("inNavigation", userInitials)
560 @RenderLanguageSelector()
561 @RenderFavorites()
562 @if (!onlyPreview)
563 {
564 @RenderMiniCart()
565 }
566 </ul>
567 </div>
568 </div>
569 </div>
570 </nav>
571
572 <!-- Searchbar -->
573 <div class="u-box-shadow u-color-light-gray--bg u-inline-block u-full-width">
574 <div class="center-container top-container__center-container dw-mod">
575 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" data-page-size="10" id="ProductSearchBar" data-search-feed-id="@productsSearchFeedId&feed=true" data-result-page-id="@productsPageId" data-groups-page-id="@productGroupsPageId">
576 <button type="button" class="btn btn--condensed u-color-light-gray--bg typeahead-group-btn dw-mod js-typeahead-groups-btn" data-group-id="all">@Translate("All")</button>
577 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-groups-content dw-mod" id="ProductSearchBarGroupsContent" data-template="SearchGroupsTemplate" data-json-feed="/Default.aspx?ID=@productGroupsPageId&feedType=productGroups" data-init-onload="false" data-preloader="minimal"></ul>
578 <div class="typeahead-search-field">
579 <input type="text" class="u-no-margin js-typeahead-search-field font-weight-normal" placeholder="@searchPlaceholder" value="@searchValue">
580 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ProductSearchBarContent" data-template="SearchContentTemplate" data-json-feed="/Default.aspx?ID=@productsSearchFeedId&feedType=productsOnly&feed=true" data-init-onload="false"></ul>
581 </div>
582 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn"><i class="fa fa-search"></i></button>
583 </div>
584 </div>
585 </div>
586 }
587
588 @if (topLayout == "minimal")
589 {
590 <!-- Main navigation -->
591 <nav class="main-navigation dw-mod">
592 <div class="center-container header-nav top-container__center-container dw-mod">
593 <div class="grid">
594 @* Navigation *@
595 @MobileNavigationTrigger()
596 <div class="logo d-inline-block dw-mod">
597 <a href="/Default.aspx?ID=@firstPageId">
598 <img class="header-logo d-inline-block" src="@logo" alt="@logoAltText" />
599 </a>
600 </div>
601
602 <div class="grid__cell grid__cell--align-middle-right">
603 <ul class="menu dw-mod u-pull--right">
604 <li class="menu__item menu__item--horizontal menu__item--top-level u-hidden-xxs dw-mod">
605 <div class="menu__link d-none d-md-block">
606 <a href="@navigationIconFifthLink">
607 <img src="@navigationIconFifth" class="d-inline-block align-text-top" alt="">
608 </a>
609 </div>
610 </li>
611 <!-- HEADSET ICON -->
612 <li class="menu__item menu__item--horizontal menu__item--top-level u-hidden-xxs dw-mod">
613 <div class="menu__link d-none d-md-block">
614 <a href="tel:@contactNumber">
615 <img src="@navigationIcon" class="d-inline-block align-text-top" alt="@navigationText">
616 <span class="small d-inline-block text-black font-weight-semi-bold align-middle">@navigationText</span>
617 </a>
618 </div>
619 </li>
620 <!-- END HEADSET ICON -->
621 @* Search *@
622 <li class="menu__item menu__item--horizontal menu__item--top-level search-icon-navigation menu__item--icon u-hidden-xxs is-dropdown is-dropdown--no-icon dw-mod js-header-nav-item">
623 <a class="openbtn js-toggle-overlay menu__link is-dropdown is-dropdown--no-icon dw-mod">
624 <div class="js-openBtn" style="display:block;">
625 <img src="/Files/Images/Lauridsen/icons/navigation-icons/icon-search.svg" class="d-inline-block align-text-top" alt="">
626 <span class="small d-inline-block text-black text-uppercase font-weight-semi-bold">@Translate("Search")</span>
627 </div>
628 <div class="js-closeBtn" style="display:none;">
629 <div class="closebtn small d-inline-block text-black text-uppercase font-weight-semi-bold" id="closebtn" title="Close Overlay"><span class="modal__close"></span> @Translate("Close")</div>
630 </div>
631 </a>
632 <div id="myOverlay" class="overlay js-overlay">
633 <div class="overlay-content">
634 <div class="menu menu--dropdown-right u-no-padding u-w380px grid__cell dw-mod">
635 <div class="typeahead u-margin u-color-inherit js-typeahead" data-page-size="10" id="ProductSearchBar" data-search-feed-id="@productsSearchFeedId&feed=true" data-result-page-id="@productsPageId" data-groups-page-id="@productGroupsPageId">
636 <input type="text" class="fullscreen-input-field typeahead-search-field u-no-margin js-typeahead-search-field dw-mod" placeholder="@searchPlaceholder" value="@searchValue">
637 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content u-full-width dw-mod" id="ProductSearchBarContent" data-template="SearchContentTemplate" data-json-feed="/Default.aspx?ID=@productsSearchFeedId&feedType=productsOnly&feed=true" data-init-onload="false" data-preloader="minimal"></ul>
638
639 <span class="icon-nz icon-nz-arrow-long-right input-arrow-icon js-typeahead-enter-btn"></span>
640 </div>
641 </div>
642
643 </div>
644 </div>
645 </li>
646
647 @if (!onlyPreview)
648 {
649 @RenderMiniCart()
650 }
651 @RenderSignIn("inNavigation", userInitials)
652 @RenderLanguageSelector()
653 </ul>
654 </div>
655 </div>
656 </div>
657 </nav>
658 }
659
660 @if (renderPagesInToolBar && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
661 {
662 <div class="second-tools-menu dw-mod u-box-shadow">
663 <div class="grid bottom-container__center-container dw-mod u-margin-left">
664 <div class="grid grid--align-center grid--justify-start header-nav center-container">
665 <div>
666 @RenderHeaderNavigation()
667 </div>
668 </div>
669 </div>
670 </div>
671 }
672
673 @* Impersonation bar *@
674 @if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0)
675 {
676 <div class="u-color-warning--bg">
677 <div class="center-container top-container__center-container dw-mod">
678 @*Impersonation*@
679 <div class="grid">
680 <div class="grid--align-self-center grid__col-x">
681 @if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
682 {
683 string stopImpersonateTranslation = Translate("Stop impersonation");
684 string username = "";
685 if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.FirstName) && !string.IsNullOrEmpty(Model.CurrentSecondaryUser.LastName))
686 {
687 username = Model.CurrentSecondaryUser.FirstName + " " + Model.CurrentSecondaryUser.LastName;
688 }
689 else if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.Name))
690 {
691 username = Model.CurrentSecondaryUser.Name;
692 }
693 else if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.Email))
694 {
695 username = Model.CurrentSecondaryUser.Email;
696 }
697 else
698 {
699 username = Model.CurrentSecondaryUser.UserName;
700 }
701 <div class="grid-cell">
702 <div class="u-pull--left u-bold u-margin-top">
703 <i class="fa fa-user-secret"></i>
704 @username<text> </text>@Translate("is impersonated by")<text> </text>@Pageview.User.UserName
705 </div>
706 <form method="post" class="u-pull--right u-no-margin">
707 <input type="submit" class="btn btn--secondary dw-mod u-no-margin" name="DwExtranetRemoveSecondaryUser" value="@stopImpersonateTranslation">
708 </form>
709 </div>
710 }
711
712 else
713 {
714 string viewListTranslation = Translate("View the list of users you can impersonate");
715 <div class="grid-cell u-bold">
716 <i class="fa fa-user-secret"></i>
717 <a href="/Default.aspx?ID=@impersonationPageId" title="@viewListTranslation" class="u-color-font-black">@viewListTranslation</a>
718 </div>
719 }
720 </div>
721 </div>
722 </div>
723 </div>
724 }
725 </header>
726 <!-- Floating mini cart -->
727 @if (!onlyPreview && !stickyMenu && pageId == productsPageId && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
728 {
729 <div class="floating-mini-cart u-hidden dw-mod" id="FloatingMiniCart">
730 <div class="mini-cart m-0 dw-mod">
731 <a href="/Default.aspx?ID=@cartPageId&Purge=True" class="menu-tools__link menu__link--condensed dw-mod js-mini-cart-button" onmouseenter="Cart.UpdateMiniCart(event, 'miniCart', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart&rnd='+ Date.now() +'')">
732 <img src="@navigationIconThird" class="d-inline-block align-text-top" alt="">
733 <div class="mini-cart__counter mini-cart__counter--lg dw-mod">
734 <div class="js-handlebars-root js-mini-cart-counter" id="FloatingCartCounter" data-template="MiniCartCounterContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=Counter" data-preloader="false" data-init-onload="false">
735 <div class="js-mini-cart-counter-content">@Model.Cart.TotalProductsCount</div>
736 </div>
737 </div>
738 </a>
739 <div class="mini-cart-dropdown js-handlebars-root js-mini-cart dw-mod" id="SecondaryMiniCart" data-template="MiniCartContent" data-cart-id="@miniCartFeedPageId" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="true"></div>
740 </div>
741 </div>
742 }
743 <!-- Render the content -->
744 <div id="Page" class="page @pagePos">
745 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
746
747
748 @*
749 @if (Model.PropertyItem.GetList("ShowBreadcrumb").SelectedValue == "True")
750 {
751 <div class="center-container">
752 <div class="grid__col-12 grid__col--bleed-y">
753 <ul class="breadcrumb">
754 <li class="breadcrumb__item dw-mod">
755 <a href="/">@Model.Area.FirstPage.Name</a>
756 </li>
757 @RenderNavigation(new
758 {
759 id = "breadcrumb",
760 template = "Breadcrumb.xslt"
761 })
762 </ul>
763 </div>
764 </div>
765 }
766 *@
767
768 <div class="grid news-article-page center-container">
769 @* Divs count is equal divs in ParagraphContainer.cshtml *@
770 @Model.Placeholder("dwcontent", "content", "default:true;sort:1")
771 </div>
772 <div class="grid news-article-page news-article-page--full-width">
773 @* Divs count is equal divs in ParagraphContainer.cshtml *@
774 @Model.Placeholder("FullWidthContent")
775 </div>
776
777
778
779 </div>
780 </main>
781 @RenderFooter()
782
783
784 <!-- Content rendering helpers -->
785 @helper MobileNavigation(string userInitials)
786 {
787 int pageId = Model.TopPage.ID;
788 string mobileNavigationLevels = Model.Area.Item.GetBoolean("MobileNavigationLevels") ? Model.Area.Item.GetString("MobileNavigationLevels") : "3";
789
790 bool showCreateAccountLink = Model.Area.Item.GetBoolean("ShowCreateAccountLink");
791
792 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
793 int cartFeedPageId = GetPageIdByNavigationTag("CartOrderlinesFeed");
794 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
795 string navigationText = Model.Area.Item.GetString("NavigationPhoneText");
796 string navigationIcon = Model.Area.Item.GetFile("NavigationIcon") != null ? Model.Area.Item.GetFile("NavigationIcon").Path : "";
797 string navigationIconSecond = Model.Area.Item.GetFile("NavigationIconSecond") != null ? Model.Area.Item.GetFile("NavigationIconSecond").Path : "";
798 string navigationIconThird = Model.Area.Item.GetFile("NavigationIconThird") != null ? Model.Area.Item.GetFile("NavigationIconThird").Path : "";
799 string navigationIconFourth = Model.Area.Item.GetFile("NavigationIconFourth") != null ? Model.Area.Item.GetFile("NavigationIconFourth").Path : "";
800 string navigationIconFifth = Model.Area.Item.GetFile("NavigationIconFifth") != null ? Model.Area.Item.GetFile("NavigationIconFifth").Path : "";
801 string navigationIconFifthLink = Model.Area.Item.GetString("navigationIconFifthLink");
802 string navigationIconUserWhite = Model.Area.Item.GetFile("NavigationIconUserWhite") != null ? Model.Area.Item.GetFile("NavigationIconUserWhite").Path : "";
803 string contactNumber = Model.Area.Item.GetString("ContactNumber");
804 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
805 int productsSearchFeedId = productsPageId;
806 string searchPlaceholder = Translate("Search");
807 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") != null ? HttpContext.Current.Request.QueryString.Get("Search") : "";
808 string searchQuery = HttpContext.Current.Request.QueryString.Get("Search");
809 string myDashboardPageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("CustomerDashboard").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("CustomerDashboard").ToString() : GetPageIdByNavigationTag("CustomerDashboard").ToString();
810
811 string myProfilePageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("SignInPage").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("CustomerProfile").ToString() : GetPageIdByNavigationTag("CustomerProfile").ToString();
812 string myOrdersPageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("SignInPage").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("CustomerOrders").ToString() : GetPageIdByNavigationTag("CustomerOrders").ToString();
813 string myFavoritesPageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("SignInPage").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("CustomerFavorites").ToString() : GetPageIdByNavigationTag("CustomerFavorites").ToString();
814 bool showMyProfileLink = Model.Area.Item.GetBoolean("ShowMyProfileLink");
815 bool showMyOrdersLink = Model.Area.Item.GetBoolean("ShowMyOrdersLink");
816 bool showMyFavoritesLink = Model.Area.Item.GetBoolean("ShowMyFavoritesLink");
817
818 bool renderPagesInToolBar = Model.Area.Item.GetBoolean("RenderPagesInToolBar");
819 int startLevel = renderPagesInToolBar ? 1 : 0;
820 bool isLrtSite = Model.Area.Item.GetBoolean("LRT_Theme");
821
822 bool onlyPreview = Model.Area.Item.GetBoolean("OnlyPreviewForAnonymous");
823
824 if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
825 {
826 <!-- Trigger for mobile navigation -->
827 <input type="checkbox" id="MobileNavTrigger" class="mobile-nav-trigger" />
828
829 <!-- Mobile navigation -->
830 <nav class="mobile-navigation dw-mod">
831 @if (Model.CurrentUser.ID > 0)
832 {
833 string userName = Model.CurrentUser.FirstName != null ? Model.CurrentUser.FirstName : "";
834 userName += " " + Model.CurrentUser.LastName != null ? Model.CurrentUser.LastName : "";
835 userName += userName == "" && Model.CurrentUser.UserName != null ? Model.CurrentUser.UserName : "";
836
837 <ul class="menu menu-mobile">
838 <li class="menu-mobile__item w-50 bg-primary menu-mobile__container">
839 <a href="/default.aspx?ID=@myDashboardPageId" class="menu-mobile__link hover-bg-green dw-mod text-white"><img src="@navigationIconUserWhite" class="d-inline-block align-text-top menu-mobile__link-icon" alt="@navigationText">@Translate("My user")</a>
840 </li>
841
842 <li class="menu-mobile__item w-50 js-typeahead" data-page-size="2" id="MobileProductSearch" data-search-feed-id="@productsSearchFeedId&feed=true" data-result-page-id="@productsPageId">
843 <input type="text" class="u-full-width js-typeahead-search-field u-no-margin mobile-search-input" placeholder="@searchPlaceholder" value="@searchValue">
844 <ul class="dropdown dropdown--absolute-position mobile-search-dropdown u-min-w220px js-handlebars-root js-typeahead-search-content dw-mod" id="MobileProductSearchContent" data-template="SearchContentTemplate" data-json-feed="/Default.aspx?ID=@productsSearchFeedId&feedType=productsOnly&feed=true" data-init-onload="false"></ul>
845 </li>
846
847 </ul>
848
849 }
850 <ul class="menu menu-mobile">
851
852 @if (Model.CurrentUser.ID <= 0)
853 {
854 <li class="menu-mobile__item w-50 bg-primary menu-mobile__container">
855 <label for="SignInModalTrigger" onclick="document.getElementById('MobileNavTrigger').checked = false;" class="menu-mobile__link text-white hover-bg-green dw-mod"><img src="@navigationIconUserWhite" class="d-inline-block align-text-top menu-mobile__link-icon" alt="@navigationText">@Translate("Sign in")</label>
856 </li>
857 <li class="menu-mobile__item w-50 js-typeahead" data-page-size="2" id="MobileProductSearch" data-search-feed-id="@productsSearchFeedId&feed=true" data-result-page-id="@productsPageId">
858 <input type="text" class="u-full-width js-typeahead-search-field u-no-margin mobile-search-input" placeholder="@searchPlaceholder" value="@searchValue">
859 <ul class="dropdown dropdown--absolute-position mobile-search-dropdown u-min-w220px js-handlebars-root js-typeahead-search-content dw-mod" id="MobileProductSearchContent" data-template="SearchContentTemplate" data-json-feed="/Default.aspx?ID=@productsSearchFeedId&feedType=productsOnly&feed=true" data-init-onload="false"></ul>
860 </li>
861
862 }
863
864 </ul>
865
866 @RenderNavigation(new
867 {
868 id = "mobilenavigation",
869 cssclass = "menu menu-mobile dwnavigation",
870 startLevel = 0,
871 ecomStartLevel = 1,
872 endlevel = 5,
873 expandmode = "all",
874 template = "BaseMenuForMobile.xslt"
875 })
876
877 <ul class="menu menu-mobile">
878 @if (Model.CurrentUser.ID <= 0)
879 {
880
881 if (showCreateAccountLink)
882 {
883 <li class="menu-mobile__item menu-mobile__container">
884 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Default.aspx?ID=@createAccountPageId"><img src="@navigationIconFourth" class="d-inline-block align-text-top menu-mobile__link-icon" alt="@navigationText">@Translate("Create account")</a>
885 </li>
886 }
887 }
888
889 else
890 {
891 if (showMyProfileLink && User.IsExtranetUserLoggedIn())
892 {
893 <li class="menu-mobile__item">
894 <a href="tel:@contactNumber" class="menu-mobile__link menu-mobile__link--highlighted dw-mod">
895 <img src="@navigationIcon" class="d-inline-block align-text-top menu-mobile__link-icon" alt="@navigationText">
896 <span>@contactNumber</span>
897 </a>
898 </li>
899 }
900
901 <li class="menu-mobile__item">
902 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId"><img src="@navigationIconFourth" class="d-inline-block align-text-top menu-mobile__link-icon" alt="@navigationText"> @Translate("Sign out")</a>
903 </li>
904 }
905
906
907
908 @if (Model.Languages.Count > 0 && !isLrtSite)
909 {
910 string selectedLanguage = "";
911
912 foreach (var lang in Model.Languages)
913 {
914 if (lang.IsCurrent)
915 {
916 selectedLanguage = lang.Name;
917 }
918 }
919
920 <li class="menu-mobile__item dw-mod">
921 <label for="MobileMenuCheck_Language" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"> @selectedLanguage</label>
922 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger">
923 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label>
924 <ul class="menu-mobile menu-mobile__submenu expand-menu">
925 @foreach (var lang in Model.Languages)
926 {
927 if (lang.Name != "Deutcsh")
928 {
929 <li class="menu-mobile__item dw-mod">
930 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1" href="/Default.aspx?ID=@lang.Page.ID&CurrencyCode=@Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCurrencyId">@lang.Name</a>
931 </li>
932 }
933 }
934 </ul>
935 </li>
936 }
937
938 </ul>
939 </nav>
940
941 <label class="mobile-nav-trigger-off" for="MobileNavTrigger"></label>
942 if (!onlyPreview)
943 {
944 <div class="u-visually-hidden js-handlebars-root js-mini-cart" id="miniCart" data-template="MiniCartContent" data-cart-id="@cartFeedPageId" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div>
945 }
946 }
947 }
948
949 @helper LoginModal()
950 {
951 int pageId = Model.TopPage.ID;
952 string topLayout = Model.Area.Item.GetList("LayoutTop").SelectedValue;
953 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
954 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
955 string forgotPasswordPageId = signInProfilePageId.ToString() + "&LoginAction=Recovery";
956 string userSignedInError = !Model.LogOnFailed ? "" : "checked";
957 string userSignedInErrorText = "";
958
959 if (Model.LogOnFailed)
960 {
961 switch (Model.LogOnFailedReason)
962 {
963 case Dynamicweb.Security.UserManagement.LogOnFailedReason.PasswordLengthInvalid:
964 userSignedInErrorText = Translate("Password length is invalid");
965 break;
966 case Dynamicweb.Security.UserManagement.LogOnFailedReason.IncorrectLogin:
967 userSignedInErrorText = Translate("Invalid email or password");
968 break;
969 case Dynamicweb.Security.UserManagement.LogOnFailedReason.ExceededFailedLogOnLimit:
970 userSignedInErrorText = Translate("You have exceeded the limit of allowed login attempts. The user account is temporarily locked");
971 break;
972 case Dynamicweb.Security.UserManagement.LogOnFailedReason.LoginLocked:
973 userSignedInErrorText = Translate("The user account is temporarily locked");
974 break;
975 case Dynamicweb.Security.UserManagement.LogOnFailedReason.PasswordExpired:
976 userSignedInErrorText = Translate("The password has expired and needs to be renewed");
977 break;
978 default:
979 userSignedInErrorText = Translate("An unknown error occured");
980 break;
981 }
982 }
983 <!-- Trigger for the login modal -->
984
985 <input type="checkbox" id="SignInModalTrigger" class="modal-trigger @topLayout" @userSignedInError />
986
987 <!-- Login modal -->
988 <div class="modal-container">
989 <label for="SignInModalTrigger" id="SignInModalOverlay" class="modal-overlay"></label>
990 <div class="modal modal--xs login-modal" id="SignInModal">
991 <label for="SignInModalTrigger" class="modal__close"></label>
992 <div class="modal__header">
993 <h1 class="mb-0">@Translate("Sign in")</h1>
994 </div>
995 <div class="modal__body">
996 <form method="post" id="LoginForm" action="?LoggedIn=true" class="u-no-margin">
997 <input type="hidden" name="ID" value="@pageId" />
998 <input type="hidden" name="DWExtranetUsernameRemember" value="True" />
999 <input type="hidden" name="DWExtranetPasswordRemember" value="True" />
1000 <label for="LoginUsername">@Translate("Type Email")</label>
1001 <input type="text" class="u-full-width" id="LoginUsername" name="username" placeholder="@Translate(" placerholder email")" />
1002 <label for="LoginPassword">@Translate("Type Password")</label>
1003 <input type="password" class="u-full-width" id="LoginPassword" name="password" placeholder="@Translate(" placeholder password")" />
1004 <div class="field-error dw-mod">@userSignedInErrorText</div>
1005 <label>
1006 <input type="checkbox" id="RememberMe" name="Autologin" checked="checked" value="True">
1007 <span>@Translate("Remember me", "Remember me")</span>
1008 </label>
1009 <button type="submit" class="btn btn--primary mb-2 btn--full dw-mod" name="LoginAction" value="Login" onclick="Buttons.LockButton(event)">@Translate("Sign in")</button>
1010 <a class="text-primary float-right btn-sm" href="/Default.aspx?id=@forgotPasswordPageId">@Translate("Forgot your password?", "Forgot your password?")</a>
1011 <div class="splitter mb-3 mt-4">
1012 <span class="splitter__text">@Translate("CreateAccountText")</span>
1013 <hr class="splitter__line">
1014 </div>
1015 <a class="btn btn-secondary bg-black w-100 mt-0" href="/default.aspx?ID=@createAccountPageId">@Translate("Create account")?</a>
1016 </form>
1017 </div>
1018 </div>
1019 </div>
1020
1021 }
1022
1023 @helper RenderHeaderNavigation()
1024 {
1025 bool megaMenu = Model.Area.Item.GetList("NavigationMegaMenu").SelectedValue.ToLower() == "true" ? true : false;
1026 string megamenuPromotionImage = Model.Area.Item.GetFile("NavigationMegamenuPromotionImage") != null ? Model.Area.Item.GetFile("NavigationMegamenuPromotionImage").Path : "";
1027 bool renderPagesInToolBar = Model.Area.Item.GetBoolean("RenderPagesInToolBar");
1028 int startLevel = renderPagesInToolBar ? 1 : 0;
1029
1030 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
1031 {
1032 if (!megaMenu)
1033 {
1034 @RenderNavigation(new
1035 {
1036 id = "topnavigation",
1037 cssclass = "menu dw-mod dwnavigation",
1038 startLevel = 0,
1039 ecomStartLevel = @startLevel,
1040 endlevel = 5,
1041 expandmode = "all",
1042 template = "BaseMenuWithDropdown.xslt"
1043 });
1044 }
1045
1046 else
1047 {
1048 @RenderNavigation(new
1049 {
1050 id = "topnavigation",
1051 cssclass = "menu dw-mod dwnavigation",
1052 startLevel = @startLevel,
1053 ecomStartLevel = @startLevel,
1054 endlevel = 5,
1055 promotionImage = megamenuPromotionImage,
1056 promotionLink = Model.Area.Item.GetString("NavigationMegamenuPromotionLink"),
1057 expandmode = "all",
1058 template = "BaseMegaMenu.xslt"
1059 });
1060 }
1061 }
1062 }
1063
1064 @helper MobileNavigationTrigger()
1065 {
1066 @* Mobile navigation trigger *@
1067 if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
1068 {
1069 <div class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
1070 <label for="MobileNavTrigger" class="mobile-nav-trigger-button menu__link dw-mod"></label>
1071 </div>
1072 }
1073 }
1074
1075
1076
1077 @helper RenderLanguageSelector(string type = "inNavigation")
1078 {
1079
1080 string liClasses = type == "inNavigation" ? "menu__item menu__item--horizontal menu__item--top-level dw-mod u-hidden-xxs" : "menu__item menu__item--horizontal menu--clean dw-mod";
1081 string menuLinkClass = type == "inNavigation" ? "menu__link" : "header-menu__link";
1082 bool isLrtSite = Model.Area.Item.GetBoolean("LRT_Theme");
1083
1084 if (Model.Languages.Count > 1 && !isLrtSite)
1085 {
1086 <li class="@liClasses is-dropdown is-dropdown--no-icon">
1087 <div class="@menuLinkClass menu__link--icon dw-mod text-dark text-uppercase">
1088
1089 @foreach (var langnav in Model.Languages)
1090 {
1091
1092 if (langnav.IsCurrent && langnav.Name != "Deutcsh")
1093 {
1094 string langInfonav = Dynamicweb.Services.Areas.GetArea(langnav.ID).EcomCountryCode.ToLower();
1095
1096 <span class="small d-inline-block text-black text-uppercase font-weight-semi-bold">@langInfonav</span>
1097 <img alt="arrow-down" class="d-inline-block align-text-middle lang-arrow-down" src="/Files/Images/arrow-down.svg" />
1098 }
1099
1100 }
1101
1102 </div>
1103 <div class="menu menu--dropdown dw-mod">
1104 @foreach (var lang in Model.Languages)
1105 {
1106
1107
1108 string langInfo = lang.Name;
1109 if (langInfo != "Deutcsh")
1110 {
1111 <a href="/Default.aspx?AreaID=@Dynamicweb.Services.Pages.GetPage(lang.Page.ID).Area.ID" class="menu-dropdown__item menu-dropdown__item--link dw-mod">@langInfo</a>
1112 }
1113 }
1114 </div>
1115 </li>
1116 }
1117
1118
1119
1120
1121 }
1122
1123 @helper RenderMiniCart(string type = "inNavigation")
1124 {
1125 string liClasses = type == "inNavigation" ? "menu__item menu__item--horizontal menu__item--top-level dw-mod" : "menu__item menu__item--horizontal menu--clean dw-mod";
1126 string menuLinkClass = type == "inNavigation" ? "menu__link" : "header-menu__link";
1127
1128 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
1129 int cartFeedPageId = GetPageIdByNavigationTag("CartOrderlinesFeed");
1130 int cartPageId = GetPageIdByNavigationTag("CartPage");
1131 double cartProductsCount = Model.Cart.TotalProductsCount;
1132 string navigationText = Model.Area.Item.GetString("NavigationPhoneText");
1133 string navigationIcon = Model.Area.Item.GetFile("NavigationIcon") != null ? Model.Area.Item.GetFile("NavigationIcon").Path : "";
1134 string navigationIconSecond = Model.Area.Item.GetFile("NavigationIconSecond") != null ? Model.Area.Item.GetFile("NavigationIconSecond").Path : "";
1135 string navigationIconThird = Model.Area.Item.GetFile("NavigationIconThird") != null ? Model.Area.Item.GetFile("NavigationIconThird").Path : "";
1136 string navigationIconFourth = Model.Area.Item.GetFile("NavigationIconFourth") != null ? Model.Area.Item.GetFile("NavigationIconFourth").Path : "";
1137 string navigationIconFifth = Model.Area.Item.GetFile("NavigationIconFifth") != null ? Model.Area.Item.GetFile("NavigationIconFifth").Path : "";
1138 string navigationIconFifthLink = Model.Area.Item.GetString("navigationIconFifthLink");
1139 string openingBracket = "(";
1140 string closingBracket = ")";
1141
1142 @* Mini cart *@
1143 <li class="@liClasses">
1144 <div class="mini-cart dw-mod m-0">
1145 <a href="/Default.aspx?ID=@cartPageId&Purge=True" id="miniCartCounterWrap" class="@menuLinkClass dw-mod js-mini-cart-button" onmouseenter="Cart.UpdateMiniCart(event, 'miniCart', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart&rnd='+ Date.now() +'')">
1146 <img src="@navigationIconThird" class="d-inline-block align-top" alt="@navigationIconThird">
1147 <div class="mini-cart__counter mini-cart__counter--inline dw-mod">
1148 <div class="js-handlebars-root js-mini-cart-counter" id="cartCounter" data-template="MiniCartCounterContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=Counter" data-init-onload="false" data-preloader="false">
1149 <span class="small d-inline-block text-black text-uppercase font-weight-semi-bold">@Translate("Cart")</span>
1150 <span class="mini-cart__counter-quantity mini-cart__counter-bracket-start">@openingBracket</span>
1151 <span class="js-mini-cart-counter-content mini-cart__counter-quantity">@cartProductsCount</span>
1152 <span class="mini-cart__counter-quantity mini-cart__counter-bracket-close">@closingBracket</span>
1153 </div>
1154 </div>
1155 </a>
1156 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
1157 {
1158 <div class="mini-cart-dropdown js-handlebars-root js-mini-cart dw-mod" id="miniCart" data-template="MiniCartContent" data-cart-id="@miniCartFeedPageId" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div>
1159 }
1160 </div>
1161 </li>
1162 }
1163
1164 @helper RenderSignIn(string type = "inNavigation", string userInitials = "")
1165 {
1166 string liClasses = type == "inNavigation" ? "menu__item menu__item--horizontal menu__item--top-level dw-mod u-hidden-xxs u-margin-left" : "menu__item menu__item--horizontal menu__item--clean dw-mod";
1167 string menuLinkClass = type == "inNavigation" ? "menu__link" : "header-menu__link";
1168
1169 int pageId = Model.TopPage.ID;
1170 string myProfilePageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("SignInPage").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("CustomerProfile").ToString() : GetPageIdByNavigationTag("CustomerProfile").ToString();
1171 string myOrdersPageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("SignInPage").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("CustomerOrders").ToString() : GetPageIdByNavigationTag("CustomerOrders").ToString();
1172 string myDashboardPageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("CustomerDashboard").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("CustomerDashboard").ToString() : GetPageIdByNavigationTag("CustomerDashboard").ToString();
1173 string myFavoritesPageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("SignInPage").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("CustomerFavorites").ToString() : GetPageIdByNavigationTag("CustomerFavorites").ToString();
1174 string mySavedCardsPageId = (Model.CurrentUser.ID <= 0) ? GetPageIdByNavigationTag("SignInPage").ToString() + "&RedirectPageId=" + GetPageIdByNavigationTag("SavedCards").ToString() : GetPageIdByNavigationTag("SavedCards").ToString();
1175 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
1176 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
1177 string forgotPasswordPageId = signInProfilePageId.ToString() + "&LoginAction=Recovery";
1178
1179 bool showCreateAccountLink = Model.Area.Item.GetBoolean("ShowCreateAccountLink");
1180 bool showMyProfileLink = Model.Area.Item.GetBoolean("ShowMyProfileLink");
1181 bool showMyOrdersLink = Model.Area.Item.GetBoolean("ShowMyOrdersLink");
1182 bool showMyFavoritesLink = Model.Area.Item.GetBoolean("ShowMyFavoritesLink");
1183 bool showMySavedCardsLink = Model.Area.Item.GetBoolean("ShowMySavedCardsLink");
1184
1185 string navigationText = Model.Area.Item.GetString("NavigationPhoneText");
1186 string navigationIcon = Model.Area.Item.GetFile("NavigationIcon") != null ? Model.Area.Item.GetFile("NavigationIcon").Path : "";
1187 string navigationIconSecond = Model.Area.Item.GetFile("NavigationIconSecond") != null ? Model.Area.Item.GetFile("NavigationIconSecond").Path : "";
1188 string navigationIconThird = Model.Area.Item.GetFile("NavigationIconThird") != null ? Model.Area.Item.GetFile("NavigationIconThird").Path : "";
1189 string navigationIconFourth = Model.Area.Item.GetFile("NavigationIconFourth") != null ? Model.Area.Item.GetFile("NavigationIconFourth").Path : "";
1190 string navigationIconFifth = Model.Area.Item.GetFile("NavigationIconFifth") != null ? Model.Area.Item.GetFile("NavigationIconFifth").Path : "";
1191 string navigationIconFifthLink = Model.Area.Item.GetString("navigationIconFifthLink");
1192
1193 @* Sign in + Customer center links *@
1194 <li class="@liClasses">
1195 <div class="@menuLinkClass is-dropdown is-dropdown--no-icon dw-mod">
1196 <img src="@navigationIconFourth" class="d-inline-block align-text-top" alt="@Translate(" Userprofile")">
1197 @if (Model.CurrentUser.ID <= 0)
1198 {
1199 <span class="small d-inline-block text-black text-uppercase font-weight-semi-bold">@Translate("Login")</span>
1200 }
1201 else
1202 {
1203 <span class="small d-inline-block text-black text-uppercase font-weight-semi-bold">@Model.CurrentUser.FirstName</span>
1204 }
1205 <div class="menu menu--dropdown sign-in-dropdown dw-mod">
1206 <ul class="list list--clean dw-mod">
1207 @if (Model.CurrentUser.ID <= 0)
1208 {
1209 <li>
1210 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label>
1211 </li>
1212 if (showCreateAccountLink)
1213 {
1214 <li>
1215 <a href="/default.aspx?ID=@createAccountPageId" class="btn btn--secondary u-no-margin">@Translate("Create account")</a>
1216 </li>
1217 }
1218 if (showMyProfileLink || showMyOrdersLink || showMyFavoritesLink || showMySavedCardsLink && User.IsExtranetUserLoggedIn())
1219 {
1220 <li class="list__seperator dw-mod"></li>
1221 }
1222 }
1223
1224 else
1225 {
1226 if (!string.IsNullOrWhiteSpace(myDashboardPageId))
1227 {
1228 <li>
1229 <a href="/default.aspx?ID=@myDashboardPageId" class="list__link dw-mod"><i class="fa fa-user"></i> @Translate("My Account")</a>
1230 </li>
1231 }
1232 }
1233
1234 @if (showMyProfileLink && User.IsExtranetUserLoggedIn())
1235 {
1236 <li>
1237 <a href="/default.aspx?ID=@myProfilePageId" class="list__link dw-mod"><i class="fa fa-user"></i> @Translate("My Profile")</a>
1238 </li>
1239 }
1240
1241 @if (showMyOrdersLink && User.IsExtranetUserLoggedIn())
1242 {
1243 <li>
1244 <a href="/default.aspx?ID=@myOrdersPageId" class="list__link dw-mod"><i class="fa fa-list"></i> @Translate("My Orders")</a>
1245 </li>
1246 }
1247
1248 @if (showMyFavoritesLink && User.IsExtranetUserLoggedIn())
1249 {
1250 <li>
1251 <a href="/default.aspx?ID=@myFavoritesPageId" class="list__link dw-mod"><i class="fa fa-star"></i> @Translate("My Favorites")</a>
1252 </li>
1253 }
1254
1255 @if (showMySavedCardsLink)
1256 {
1257 <li>
1258 <a href="/default.aspx?ID=@mySavedCardsPageId" class="list__link dw-mod"><i class="fa fa-credit-card"></i> @Translate("My Saved cards")</a>
1259 </li>
1260 }
1261
1262 @if (Model.CurrentUser.ID > 0)
1263 {
1264 if (showMyProfileLink || showMyOrdersLink || showMyFavoritesLink || showMySavedCardsLink)
1265 {
1266 <li class="list__seperator dw-mod"></li>
1267 }
1268 <li>
1269 <a href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" class="list__link dw-mod">@Translate("Sign out")</a>
1270 </li>
1271 }
1272 </ul>
1273 </div>
1274 </div>
1275 </li>
1276 }
1277
1278 @helper RenderFavorites(string type = "inNavigation")
1279 {
1280 string liClasses = type == "inNavigation" ? "menu__item menu__item--horizontal menu__item--top-level dw-mod u-hidden-xxs" : "menu__item menu__item--horizontal menu--clean dw-mod";
1281 string menuLinkClass = type == "inNavigation" ? "menu__link" : "header-menu__link";
1282 string myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites").ToString();
1283
1284 @* Favorites *@
1285 if (Model.CurrentUser.ID > 0)
1286 {
1287 <li class="@liClasses">
1288 <a href="/Default.aspx?ID=@myFavoritesPageId" class="@menuLinkClass dw-mod">
1289 <i class="fa fa-star fa-1_5x"></i>
1290 </a>
1291 </li>
1292 }
1293 }
1294
1295 @helper RenderFooter()
1296 {
1297 string footerColumnThreeContent = !string.IsNullOrEmpty(Model.Area.Item.GetString("FooterColumnThree")) ? Model.Area.Item.GetString("FooterColumnThree") : "";
1298 string footerColumnOneHeader = Model.Area.Item.GetString("FooterColumnOneHeader");
1299 string footerColumnTwoHeader = Model.Area.Item.GetString("FooterColumnTwoHeader");
1300 string footerColumnThreeHeader = Model.Area.Item.GetString("FooterColumnThreeHeader");
1301 int newsletterSignUpPageId = GetPageIdByNavigationTag("NewsletterSignUp");
1302 string TextUnderLogo = Model.Area.Item.GetString("TextUnderLogo");
1303 string footerlogo = Model.Area.Item.GetFile("Logo") != null ? Model.Area.Item.GetFile("Logo").Path : "/Files/Images/logo-dynamicweb.png";
1304 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
1305 string logoAltText = Model.Area.Item.GetString("LogoAltText");
1306
1307 string fullBackgroundImage = "";
1308 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetFile("BackgroundImage") != null)
1309 {
1310 fullBackgroundImage = "background-image:url(/Admin/Public/GetImage.ashx?width=2500&height=1100&crop=0&Compression=85&DoNotUpscale=true&image=" + Model.Area.Item.GetFile("BackgroundImage").Path + ");";
1311 fullBackgroundImage += " background-position: center center; background-size: cover; ";
1312 }
1313 else if ((Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet") && Model.Area.Item.GetFile("Mobile_BackgroundImage") != null)
1314 {
1315 fullBackgroundImage = "background-image:url(/Admin/Public/GetImage.ashx?width=2500&height=1100&crop=5&Compression=85&DoNotUpscale=true&image=" + Model.Area.Item.GetFile("Mobile_BackgroundImage").Path + ");";
1316 fullBackgroundImage += " background-position: center center; background-size: cover; ";
1317 }
1318
1319 <!-- Footer section -->
1320 <footer class="footer dw-mod" style="@fullBackgroundImage">
1321 <div class="center-container header-nav top-container__center-container dw-mod">
1322 <div class="grid">
1323 @if (Model.Area.Item.GetItems("FooterSocialLinks").Count > 0)
1324 {
1325 <div class="grid__col-md-auto logo-col">
1326 <div class="footer__content dw-mod">
1327 <div class="collection dw-mod">
1328 <a href="/Default.aspx?ID=@firstPageId">
1329 <img class="grid__cell-img logo-footer dw-mod" src="@footerlogo" alt="@logoAltText" />
1330 </a>
1331 <div class="footer__content social-links-container mt-4 dw-mod">
1332 @foreach (var socialitem in Model.Area.Item.GetItems("FooterSocialLinks"))
1333 {
1334 //Fields.FirstOrDefault(x => x.SystemName == "Icon").GetString()
1335 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel;
1336 string socialIconClass = socialIcon.SelectedValue;
1337 string socialIconTitle = socialIcon.SelectedName;
1338 string socialLink = socialitem.GetString("Link");
1339
1340 <a href="@socialLink" target="_blank" title="@socialIconTitle"><i class="fa @socialIconClass fa-2x"></i></a>
1341 }
1342 </div>
1343 </div>
1344 </div>
1345 </div>
1346 }
1347
1348 @if (!string.IsNullOrEmpty(footerColumnOneHeader))
1349 {
1350 <div class="grid__col-md-auto">
1351 <h4 class="footer__heading dw-mod">@footerColumnOneHeader</h4>
1352 <div class="footer__content dw-mod">
1353 <ul class="small list dw-mod">
1354 @foreach (var footerLink in Model.Area.Item.GetItems("FooterColumnOneLink"))
1355 {
1356 string footerlinkText = footerLink.GetString("LinkText");
1357 string footerlinkUrl = footerLink.GetString("LinkUrl");
1358 <li>
1359 <a class="font-weight-semi-bold" href="@footerlinkUrl">@footerlinkText</a>
1360 </li>
1361 }
1362 </ul>
1363 </div>
1364 </div>
1365 }
1366
1367 @if (!string.IsNullOrEmpty(footerColumnTwoHeader))
1368 {
1369 <div class="grid__col-md-auto">
1370 <h4 class="footer__heading dw-mod">@footerColumnTwoHeader</h4>
1371 <div class="footer__content dw-mod">
1372 <ul class="small list dw-mod">
1373 @foreach (var footerLinkSecond in Model.Area.Item.GetItems("FooterColumnTwoLink"))
1374 {
1375 string footerlinkTextSecondary = footerLinkSecond.GetString("LinkTextSecondary");
1376 string footerlinkUrlSecondary = footerLinkSecond.GetString("LinkUrlSecondary");
1377 <li>
1378 <a class="font-weight-semi-bold" href="@footerlinkUrlSecondary">@footerlinkTextSecondary</a>
1379 </li>
1380 }
1381 </ul>
1382 </div>
1383 </div>
1384 }
1385
1386 @if (!string.IsNullOrEmpty(footerColumnThreeContent) || !string.IsNullOrEmpty(footerColumnThreeHeader))
1387 {
1388 <div class="grid__col-md-auto">
1389 <h4 class="footer__heading dw-mod">@footerColumnThreeHeader</h4>
1390 <div class="footer__content dw-mod">
1391 @footerColumnThreeContent
1392 </div>
1393 </div>
1394 }
1395
1396 @if (Model.Area.Item.GetBoolean("FooterNewsletterSignUp"))
1397 {
1398 <div class="grid__col-md-auto">
1399 <h4 class="footer__heading dw-mod">@Translate("Mailing list", "Mailing list")</h4>
1400 <div class="footer__content dw-mod">
1401 <p>@Translate("Sign up if you would like to receive occasional treats from us", "Sign up if you would like to receive occasional treats from us").</p>
1402 <form class="form dw-mod" name="NewsletterRedirect" action='/Default.aspx' method="get" enctype="multipart/form-data">
1403 <input name="ID" id="ID" value="@newsletterSignUpPageId" type="hidden" />
1404 <div class="form__field-combi">
1405 <input name="NewsletterEmail" id="NewsletterEmail" type="text" class="u-w160px" placeholder='@Translate("Your email address", "Your email address")' />
1406 <input class="btn btn--primary btn--condensed dw-mod" type="submit" id="Submitter" value='@Translate("Go", "Go")' />
1407 </div>
1408 </form>
1409 </div>
1410 </div>
1411 }
1412
1413 <div class="grid__col-12 footer__copyright dw-mod">
1414 <p>@Model.Area.Item.GetString("FooterCopyrightText")</p>
1415 </div>
1416 </div>
1417 </div>
1418 </footer>
1419
1420 }
1421
1422
1423 @* Templates for Typeahead *@
1424 <script id="SearchGroupsTemplate" type="text/x-template">
1425 {{#.}}
1426 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li>
1427 {{/.}}
1428 </script>
1429
1430 <script id="SearchContentTemplate" type="text/x-template">
1431 {{#each .}}
1432 {{#Product}}
1433 {{#ifCond template "!==" "SearchMore"}}
1434 <li class="search-dropdown-item dropdown__item dropdown__item--seperator dw-mod">
1435 <div>
1436 <a href="{{link}}" class="search-dropdown-item__anchor js-typeahead-link u-color-inherit u-pull--left">
1437 <div class="search-dropdown-item__image u-margin-right u-pull--left {{noimage}} u-hidden-xs u-hidden-xxs"><img src="/Admin/Public/GetImage.ashx?width=45&height=36&crop=5&FillCanvas=True&Compression=75&image={{image}}" alt="{{name}}"></div>
1438 <div class="search-dropdown-item__content u-pull--left mb-3">
1439 <div class="small font-weight-normal js-typeahead-name">@Translate("Product number") {{number}}</div>
1440 <div class="small font-weight-normal js-typeahead-name">{{name}}</div>
1441 @if (!onlyPreview)
1442 {
1443 <div class="{{onlyPreview}} search-product-price font-weight-normal">{{price}}</div>
1444 }
1445 </div>
1446 </a>
1447 <div class="u-w80px hidden-xs-down">
1448 <a href="{{link}}" class="btn btn--secondary btn--condensed btn--full u-no-margin dw-mod {{hideViewMore}} js-ignore-click-outside">@Translate("View")</a>
1449 </div>
1450 </div>
1451 </li>
1452 {{/ifCond}}
1453 {{#ifCond template "===" "SearchMore"}}
1454 {{>SearchMore}}
1455 {{/ifCond}}
1456 {{/Product}}
1457 {{else}}
1458 <li class="dropdown__item dropdown__item--seperator dw-mod">
1459 @Translate("No products found")
1460 </li>
1461 {{/each}}
1462 </script>
1463 <script id="SearchMore" type="text/x-template">
1464 <li class="dropdown__item dropdown__item--not-selectable dw-mod">
1465 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link">
1466 @Translate("View all")
1467 </a>
1468 </li>
1469 </script>
1470
1471 @* Templates for the mini cart *@
1472 <script id="MiniCartCounterContent" type="text/x-template">
1473 {{#.}}
1474 <span class="small d-inline-block text-black text-uppercase font-weight-semi-bold">@Translate("Cart")</span>
1475 <span class="mini-cart__counter-quantity mini-cart__counter-bracket-start">(</span>
1476 <span class="js-mini-cart-counter-content mini-cart__counter-quantity">{{numberofproducts}}</span>
1477 <span class="mini-cart__counter-quantity mini-cart__counter-bracket-close">)</span>
1478 {{/.}}
1479 </script>
1480
1481 <script id="MiniCartContent" type="text/x-template">
1482 {{#.}}
1483 <div class="mini-cart-dropdown__inner {{isempty}} dw-mod">
1484 <h4 class="u-ta-left u-no-margin u-margin-bottom u-margin-top font-weight-normal h4">@Translate("Shopping cart")</h4>
1485 <div class="mini-cart-dropdown__body dw-mod">
1486 <table class="table table-responsive mini-cart-table border-bottom dw-mod">
1487 <thead>
1488 <tr class="font-weight-normal h6">
1489 <hr />
1490 <td> </td>
1491 <td>@Translate("Product")</td>
1492 <td class="u-ta-center">@Translate("Qty")</td>
1493 <td class="u-ta-right" width="120">@Translate("Total price excl. vat")</td>
1494 </tr>
1495 </thead>
1496 {{#OrderLines}}
1497 {{#ifCond template "===" "CartOrderline"}}
1498 {{>MiniCartOrderline}}
1499 {{/ifCond}}
1500 {{#ifCond template "===" "CartOrderlineMobile"}}
1501 {{>MiniCartOrderlineMobile}}
1502 {{/ifCond}}
1503 {{#ifCond template "===" "CartOrderlineDiscount"}}
1504 {{>MiniCartOrderlineDiscount}}
1505 {{/ifCond}}
1506 {{/OrderLines}}
1507 <tr>
1508 <td class="h6 font-weight-normal">@Translate("Shipping")</td>
1509 <td colspan="3" class="u-ta-right" width="130">{{shippingfee}}</td>
1510 </tr>
1511 <tr class="mini-cart-totals dw-mod">
1512 <td colspan="2" class="h6 font-weight-semi-bold">@Translate("Total")</td>
1513 <td class="h6 font-weight-semi-bold u-ta-right js-mini-cart-quantity">{{numberofproducts}}</td>
1514 <td class="h6 font-weight-semi-bold u-ta-right" width="130">
1515
1516 {{totalprice}}
1517
1518 </td>
1519 </tr>
1520 </table>
1521 </div>
1522 <table class="table mini-cart-table dw-mod">
1523 <tbody>
1524 <tr class="mini-cart-orderlines__footer dw-mod">
1525 <td colspan="2"><button type="button" class="btn btn--secondary btn--condensed u-pull--left u-no-margin btn--sm" onclick="Cart.UpdateCart('Cart', '/Default.aspx?ID=@miniCartFeedPageId', '&CartCmd=EmptyCart', false);">@Translate("Empty cart")</button></td>
1526 <td colspan="2" class="u-ta-right"><a href="/Default.aspx?ID=@cartPageId" class="btn btn--primary u-pull--right u-no-margin btn--sm">@Translate("Proceed to checkout")</a></td>
1527 </tr>
1528 </tbody>
1529 </table>
1530 </div>
1531 {{/.}}
1532 </script>
1533
1534 <script id="MiniCartOrderline" type="text/x-template">
1535 <tr class="{{isempty}}">
1536 <td class="mini-cart-table__product-image"><a href="{{link}}" class="{{hideimage}}"><img src="/Admin/Public/GetImage.ashx?width=300&height=300&crop=5&Compression=75&image={{image}}" alt="{{name}}"></a></td>
1537 <td>
1538 <a href="{{link}}" class="mini-cart-orderlines__name product-number">@Translate("Product number") {{productnumber}}</a>
1539 <a href="{{link}}" class="mini-cart-orderlines__name font-weight-normal small">{{name}}</a>
1540
1541 @* IF SENTENCE FROM DISCOUNT LIST IN JSON FEED FILE (NZPRODUTLISTFEED.CSHTML) *@
1542
1543 {{#if Discount.[1].discountPrice}}
1544 <div class="js-popup minicart_popup_container">
1545 <a class="js-popup-trigger">@Translate("DiscountText")</a>
1546
1547 <div class="js-popup-modal minicart_popup_modal">
1548 <div class="js-popout-close nz-icon icon-nz-close-circled"></div>
1549
1550 <ul class="grid__col-12 pt-5 p-0 d-flex flex-row flex-wrap">
1551 @* FOREACH DISCOUNT LOOP FROM JSON FEED *@
1552 {{#each Discount}}
1553 {{#unless @@first}}
1554
1555 <li class="p-0 mb-0 grid__col-12 align-items-start">@Translate("UnitPriceText") {{this.discountQuantity}} @Translate("UnitPriceTextStk")</li>
1556 <li class="p-0 pb-3 grid__col-12 align-items-start">{{this.discountPrice}} {{this.discountCurrency}}</li>
1557 {{/unless}}
1558 {{/each}}
1559
1560 </ul>
1561 </div>
1562
1563 </div>
1564 {{/if}}
1565
1566 <div class="item-number">{{unitname}}</div>
1567
1568 <span class="small product-card__quantity-alert js-product-quantity-error-{{id}} {{limitReached}}">@Translate("Max stock level is reached")</span>
1569
1570 </td>
1571 <td class="u-ta-right">
1572 <div class="mini-cart-quantity">
1573 <span onclick="Cart.UpdateCart('Cart', '/Default.aspx?ID=@miniCartFeedPageId', '&CartCmd=DecOrderLine&key={{orderLineId}}', false);" class="mini-cart-quantity__subtract" data-icon-nz="minus"></span>
1574 <input class="mini-cart-quantity__input js-quantity-input text-center" id="Quantity_{{id}}" name="Quantity{{id}}" type="number" value="{{quantity}}" min="1" style="pointer-events:none;" />
1575 <span onclick="Cart.UpdateCart('Cart', '/Default.aspx?ID=@miniCartFeedPageId', '&CartCmd=IncOrderLine&key={{orderLineId}}', false);" class="mini-cart-quantity__add" data-icon-nz="plus"></span>
1576 </div>
1577 </td>
1578 <td class="u-ta-right mini-cart-remove-product-container">
1579 <span class="minicart-totalprice">
1580 <span>
1581 {{totalunitpricewithdiscounts}}
1582 </span>
1583
1584
1585 </span><a class="btn btn--link u-no-margin mini-cart-remove-product mt-1 pt-0 pr-0 text-right" onclick="Cart.UpdateCart('Cart', '/Default.aspx?ID=@miniCartFeedPageId', '&CartCmd=DelOrderLine&key={{orderLineId}}', false);">@Translate("Remove product")</a>
1586 </td>
1587 </tr>
1588 </script>
1589
1590 <script id="MiniCartOrderlineMobile" type="text/x-template">
1591 <tr class="{{isempty}}">
1592 <td class="mini-cart-table__product-image"><a href="{{link}}" class="{{hideimage}}"><img src="/Admin/Public/GetImage.ashx?width=50&height=50&crop=5&Compression=75&image={{image}}" alt="{{name}}"></a></td>
1593 <td>
1594 <a href="{{link}}" class="mini-cart-orderlines__name">{{name}}</a>
1595 <a href="{{link}}" class="mini-cart-orderlines__name item-number">{{variantname}}</a>
1596 <div class="item-number">{{unitname}}</div>
1597 </td>
1598 <td class="u-ta-right">
1599 <div class="mini-cart-quantity">
1600 <span onclick="Cart.UpdateCart('Cart', '/Default.aspx?ID=@miniCartFeedPageId', '&CartCmd=DecOrderLine&key={{orderLineId}}', false);" class="mini-cart-quantity__subtract" data-icon-nz="minus"></span>
1601 <input class="mini-cart-quantity__input js-quantity-input text-center" id="Quantity_{{id}}" name="Quantity{{id}}" type="number" value="{{quantity}}" min="1" />
1602 <span onclick="Cart.UpdateCart('Cart', '/Default.aspx?ID=@miniCartFeedPageId', '&CartCmd=IncOrderLine&key={{orderLineId}}', false);" class="mini-cart-quantity__add" data-icon-nz="plus"></span>
1603 </div>
1604 </td>
1605 <td class="u-ta-right">{{totalprice}}</td>
1606 </tr>
1607 </script>
1608
1609 <script id="MiniCartOrderlineDiscount" type="text/x-template">
1610
1611
1612 </script>
1613
1614 <!-- Javascript -->
1615 <script src="/Files/Templates/Designs/Rapido/js/handlebars-v4.0.11.js"></script>
1616 <script src="/assets/javascripts/lib/searchparams-polyfill.js"></script>
1617 <script src="/Files/Templates/Designs/Rapido/js/master.min.js"></script>
1618
1619 @if (Model.Area.Item.GetBoolean("UseCustomJavascript"))
1620 {
1621 <script>window.jQuery || document.write('<script src="/assets/javascripts/lib/jquery-3.2.1.min.js"><\/script>')</script>
1622 <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
1623 <script src="/assets/javascripts/lib/es6-shim.min.js"></script>
1624 <script src="/Files/Templates/Designs/Rapido/js/custom.min.js?v=@assetsVersion"></script>
1625 }
1626
1627 <script>
1628 Wireframe.Init(@wireframeMode.ToLower());
1629 </script>
1630
1631
1632
1633
1634 <!-- Modal -->
1635 <div class="nz-modal fade js-video-modal" tabindex="-1" role="dialog" aria-hidden="true">
1636 <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
1637 <div class="modal-content">
1638 <div class="modal-header">
1639 <button type="button" class="close btn-primary" data-dismiss="modal" aria-label="Close">
1640 <span aria-hidden="true" data-icon-nz="close"></span>
1641 </button>
1642 </div>
1643 <div class="modal-body js-modal-content p-0">
1644
1645 <div class="embed-responsive embed-responsive-16by9">
1646 <iframe class="js-video-container embed-responsive-item" data-cookieconsent="marketing" data-src="" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
1647 </div>
1648 </div>
1649 </div>
1650 </div>
1651 </div>
1652
1653 <!-- Alert Modal -->
1654 <div class="nz-modal fade alert-modal js-alert-modal" tabindex="-1" role="dialog" aria-hidden="true">
1655 <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
1656 <div class="modal-content">
1657 <div class="modal-header">
1658 <button type="button" class="close btn-primary" data-dismiss="modal" aria-label="Close">
1659 <span aria-hidden="true" data-icon-nz="close"></span>
1660 </button>
1661 </div>
1662 <div class="modal-body js-modal-content p-0">
1663 <div class="cookies-text text-center">
1664 <p>
1665 @Translate("CookiesMarketing", "Please accept marketing cookies to watch this video")
1666 </p>
1667 <a href="javascript:Cookiebot.renew()" class="btn btn-nav-lg btn-outline-secondary ">
1668 @Translate("CookiesSettings", "Update cookie settings")
1669 </a>
1670 </div>
1671
1672 </div>
1673 </div>
1674 </div>
1675 </div>
1676
1677 </body>
1678 </html>
1679